реклама на сайте
подробности

 
 
> Оптимальная реализация мультиплексора
DeadMoroz
сообщение Jan 15 2008, 13:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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).
Принимаются любые соображения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
des00
сообщение Jan 16 2008, 03:32
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



2 DeadMoroz.

А не могли бы вы конкретизировать критические пути ? Это именно пути данных или пути управления ?

Поясню.

Похоже что вы пользуете альтеру, на альтере мультиплексор 4в1 формируется на 2 лютах = 2 слоя логики. остальное каскадируется из него. Итого муксер 16в1 даст 4 слоя логики, муксер 32в1 5 слоев. Если у вас на входе выходе муксера стоят регистры то проблему с такой тактовой мона решить ручным размещением муксера (хотя тут надо смотреть на вашу фпга может там триггерная частота 150МГц ).

Но бОльшая проблема это декодирование onehot сигналов мультиплексирования ! Т.к. в вашем случае вам нужен декодер из 20 ти сигналов в вектор шириной 5 бит, используемый для мультиплексирования. Тут кол-во слоев логики от onehot сигналов до выходного бита данных будет гораздо больше чем в путе по данным.

В этом случае нужно либо конвееризировать этот декодер или выдержать эти сигналы 2 такта и обозвать их мультицикловыми. Или отказаться от onehot кодирования этих сигналов. сделать обычное бинарное кодирование.

Т.е. определите какой именно путь тормозит.

ЗЫ. У хилых там все намного проще, муксер 32в1 использует аппаратный муксер в пределах CLB и путь по данным там намного короче. За счет более коротких трасс данных.

Удачи.


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DeadMoroz   Оптимальная реализация мультиплексора   Jan 15 2008, 13:25
- - dxp   Цитата(DeadMoroz @ Jan 15 2008, 19:25) Ка...   Jan 15 2008, 14:02
- - Victor®   Цитата(DeadMoroz @ Jan 15 2008, 17:25) Си...   Jan 15 2008, 15:13
- - 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 10:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.02666 секунд с 7
ELECTRONIX ©2004-2016