имеем:
проц х51, /RD, /WR, ALE, старшая часть адреса AM[7..0], шина AD[7..0], 24 входа данных
Нужно:
По сигналу /RD при AM[7]==1 сохранить данные по 24 входам, в дальнейшем считать их по определенным адресам, выставляя на шину AD сохраненные значения
Младшую часть адреса по стробу ALE я сохраняю в DFFE AL_[7..0]
В результате получаю примерно такую картину:
CONSTANT D7_ADDR = H"4030";
CONSTANT D5_ADDR = H"4031";
CONSTANT D1_ADDR = H"4032";
SUBDESIGN prob
(
AD[WIDTH-1..0] : BIDIR;
/WR : INPUT;
AM[WIDTH-1..0], /RD, ALE : INPUT;
AL[WIDTH-1..0] : OUTPUT;
D7_in[WIDTH-1..0] : INPUT;
D5_in[WIDTH-1..0] : INPUT;
D1_in[WIDTH-1..0] : INPUT;
)
VARIABLE
AL_[WIDTH-1..0] : DFFE;
D7[WIDTH-1..0] : DFFE;
D5[WIDTH-1..0] : DFFE;
D1[WIDTH-1..0] : DFFE;
AD_OUT[WIDTH-1..0] : NODE;
ALL[WIDTH-1..0] : NODE;
AD_EN : NODE;
BEGIN
DEFAULTS
AD_EN = GND;
END DEFAULTS;
--- Address latch ---
AL_[].D = AD[];
AL_[].clk = !ALE;
AL[] = AL_[].Q;
ALL[] = AL_[].Q;
--- Polling data ---
CASE (AM[],ALL[]) IS
WHEN (D7_ADDR) => AD_OUT[] = D7[].Q; AD_EN=VCC;
WHEN (D5_ADDR) => AD_OUT[] = D5[].Q; AD_EN=VCC;
WHEN (D1_ADDR) => AD_OUT[] = D1[].Q; AD_EN=VCC;
END CASE;
FOR i IN 0 to WIDTH-1 GENERATE
AD[i] = TRI(.IN=AD_OUT[i], .OE=(AD_EN AND !/RD));
END GENERATE;
---=== D7 ===---
D7[].D = D7_in[];
D7[].clk = /RD;
D7[].ENA = AM7;
---=== D5 ===---
D5[].D = D5_in[];
D5[].clk = /RD;
D5[].ENA = AM7;
---=== D1 ===---
D1[].D = D1_in[];
D1[].clk = /RD;
D1[].ENA = AM7;
Ну вот примерно так... перенеся /RD из условия CASE в функцию .OE примитива TRI, выиграл порядка 11ns (девайс - EPM3256AQC208-10), ондако все равно общее время прохождения сигнала:
Info: Longest tpd from source pin "AM[7]" to destination pin "AD[4]" is 22.900 ns
Info: 1: + IC(0.000 ns) + CELL(1.200 ns) = 1.200 ns; Loc. = PIN_55; Fanout = 135; PIN Node = 'AM[7]'
Info: 2: + IC(4.500 ns) + CELL(9.000 ns) = 14.700 ns; Loc. = LC195; Fanout = 8; COMB Node = '$00000~50'
Info: 3: + IC(3.200 ns) + CELL(5.000 ns) = 22.900 ns; Loc. = PIN_168; Fanout = 0; PIN Node = 'AD[4]'
Info: Total cell delay = 15.200 ns ( 66.38 % )
Info: Total interconnect delay = 7.700 ns ( 33.62 % )
Собственно, при ширине /WR и /RD в 150ns 23ns - это немного, но все же хотелось бы это дело уменьшить, если возможно. И вообще - может я изначально наворотил ереси страшной :)
Поможите кто чем может :)