Ситуация такая - в проекте имеется большой мультиплексор к которому подключена куча регистров. Timing Analyzer показывает, что это самое тормознутое место в проекте. Сейчас проект растет, при этом Fmax падает. Т.е. необходимо оптимизировать узкие места. Я пробовал несколько способов описания мультиплексора (с помощью case, if, tri-state), но особого изменения по скорости нет. Сейчас использую такое описание:
Код
-- DATA output MX
process(nand_busy, sreg_test_sel, sreg_pfd0_sel, sreg_pfd1_sel, sreg_pw0_sel, sreg_pw1_sel, sreg_pctl_sel,
sreg_ncmd_sel, sreg_nsta_sel, sreg_nrwc_sel, sreg_nadr1_sel, sreg_nadr2_sel, sreg_nadr3_sel,
sreg_nadr4_sel, sreg_nadr5_sel, sreg_nid1_sel, sreg_nid2_sel, sreg_nid3_sel, sreg_nid4_sel, sreg_nid5_sel,
nand_buf_sel,
nand_dout)
begin
if(sreg_test_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_test(7 downto 0);
elsif(sreg_pfd0_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_pfd0(7 downto 0);
elsif(sreg_pfd1_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_pfd1(7 downto 0);
elsif(sreg_pw0_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_pw0(7 downto 0);
elsif(sreg_pw1_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_pw1(7 downto 0);
elsif(sreg_pctl_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_pctl(7 downto 0);
elsif(sreg_ncmd_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_ncmd(7 downto 0);
elsif(sreg_nsta_sel='1') then
dataout_mx(15 downto 0)<=sreg_ncsta(7 downto 0) & sreg_nsta(7 downto 0);
elsif(sreg_nrwc_sel='1') then
dataout_mx(15 downto 0)<=sreg_nrwc(15 downto 0); -- 16 bits
elsif(sreg_nadr1_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nadr1(7 downto 0);
elsif(sreg_nadr2_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nadr2(7 downto 0);
elsif(sreg_nadr3_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nadr3(7 downto 0);
elsif(sreg_nadr4_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nadr4(7 downto 0);
elsif(sreg_nadr5_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nadr5(7 downto 0);
elsif(sreg_nid1_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nid1(7 downto 0);
elsif(sreg_nid2_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nid2(7 downto 0);
elsif(sreg_nid3_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nid3(7 downto 0);
elsif(sreg_nid4_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nid4(7 downto 0);
elsif(sreg_nid5_sel='1') then
dataout_mx(15 downto 0)<=x"00" & sreg_nid5(7 downto 0);
elsif(nand_buf_sel='1') then
dataout_mx(15 downto 0)<=x"00" & nand_dout(7 downto 0);
else
dataout_mx(15 downto 0)<=x"FFFF";
end if;
end process;
-- DATA output reg
process(CLK100, dataout_mx)
begin
if(rising_edge(CLK100)) then
dataout_reg(15 downto 0)<=dataout_mx(15 downto 0);
end if;
end process;
Как можно соптимизировать этого монстра - разбить на кучу маленьких и запайплайнить? Или как?
Сейчас Fmax=106MHz и очень не хочется делать ее меньше. Кстати, использую Spartan-3E(-4).
Принимаются любые соображения.