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

 
 
> Оптимальная реализация мультиплексора
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
Ответов
DeadMoroz
сообщение Jan 16 2008, 22:44
Сообщение #2


Местный
***

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



Как я уже говорил, я пробовал разные варианты. Как не странно, самый быстрый был на тристейтах (я не утверждаю, что mux был самый быстрый, просто при такой реализации Fmax проекта была max)
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
- - 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
|- - 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 Текстовая версия Сейчас: 20th August 2025 - 11:54
Рейтинг@Mail.ru


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