|
Оптимальная реализация мультиплексора |
|
|
|
Jan 15 2008, 13:25
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 3-02-05
Пользователь №: 2 391

|
Ситуация такая - в проекте имеется большой мультиплексор к которому подключена куча регистров. 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). Принимаются любые соображения.
|
|
|
|
|
 |
Ответов
|
Jan 15 2008, 15:13
|

Lazy
     
Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76

|
Цитата(DeadMoroz @ Jan 15 2008, 17:25)  Ситуация такая - в проекте имеется большой мультиплексор к которому подключена куча регистров. 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). Принимаются любые соображения. Кстати, осторожно, конвейер может Вам форму сигнала изменить... Точнее, д-триггеры, из которых он состоит. Если конечно, данные не синхронны с частотой конвейера....
--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
|
|
|
|
Сообщений в этой теме
DeadMoroz Оптимальная реализация мультиплексора Jan 15 2008, 13:25 dxp Цитата(DeadMoroz @ Jan 15 2008, 19:25) Ка... Jan 15 2008, 14:02 sazh Т.е. необходимо оптимизировать узкие места. Я проб... Jan 15 2008, 15:33 alex5991 Цитата(DeadMoroz @ Jan 15 2008, 17:25) Си... Jan 15 2008, 15:52 DeadMoroz Victor - не пойму, почему форма сигнала может изме... Jan 15 2008, 23:38 Victor® Цитата(DeadMoroz @ Jan 16 2008, 03:38) Vi... Jan 16 2008, 07:50 des00 2 DeadMoroz.
А не могли бы вы конкретизировать к... Jan 16 2008, 03:32 Postoroniy_V Цитата(DeadMoroz @ Jan 15 2008, 22:25) Си... Jan 16 2008, 04:47 Евгений Николаев DeadMoroz, фактически у Вас 8-битные регистры, но ... Jan 16 2008, 06:17 DeadMoroz des00 - так сразу не скажу где затык - в цепи данн... Jan 16 2008, 14:11 DmitryR Цитата(DeadMoroz @ Jan 16 2008, 17:11) de... Jan 16 2008, 15:07 des00 Цитата(DeadMoroz @ Jan 16 2008, 09:11) de... Jan 17 2008, 03:57 DeadMoroz Как я уже говорил, я пробовал разные варианты. Как... Jan 16 2008, 22:44 DmitryR Цитата(DeadMoroz @ Jan 17 2008, 01:44) Ка... Jan 17 2008, 09:03 yuri_d Цитата(DeadMoroz @ Jan 15 2008, 16:25) Ка... Jan 17 2008, 08:39 DeadMoroz А код с case был такой:
Код-- -- DATAOUT MX reg -... Jan 17 2008, 12:36 DmitryR Надеюсь, значения SREG_XXX идут по порядку? Если н... Jan 17 2008, 13:22 DeadMoroz не по порядку, через два - регистры же 16битные
... Jan 17 2008, 13:37 DmitryR Цитата(DeadMoroz @ Jan 17 2008, 16:37) не... Jan 18 2008, 12:55 Евгений Николаев Если не жалко ресурсов, но важна скорость, то можн... Jan 18 2008, 14:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|