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

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


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(DeadMoroz @ Jan 15 2008, 16:25) *
Как можно соптимизировать этого монстра - разбить на кучу маленьких и запайплайнить? Или как?
Сейчас Fmax=106MHz и очень не хочется делать ее меньше. Кстати, использую Spartan-3E(-4).

Проблема может быть и в длинне трасс от регистров до регистра после мультиплексора. Так на кристалле XC3S400-4 оринтировочный порог 10 нс. На большем кристалле (Вы не указали размер) будет хуже.

Если не жалко задержать выдачу на 1 такт, то можно предложить такую схему (Dn - данные в регистрах, Sn - выборка региста по методу one-hot):
1) объединяем данные от группы регистров, расположенных недалеко друг от друга и защелкиваем в промежуточный регистр.
Q <= D0 & S0 | D1 & S1 (это ложится в один LUT4+D)
Q <= D0 & S0 | D1 & S1 | D2 & S2 | D3 & S3 (один slice)
2) объединяем выходы промежуточных регистров по "или" и защелкиваем в выходной регистр.
QQ <= Q0 | Q1 | ... Qn

Правда при такой схеме по умолчанию на выходе будет 0 (мы именно такой метод применяем, так как 0 более безопасное значение в случае ошибок программистов). Если принципиально нужно все 1 (FFFF). То используем чуть другую функцию и объединение по "и":
Q <= (D0 | ~S0) & (D1 | ~S1)
QQ <= Q0 & Q1 & ... Qn

Пример логических выражений на языке Verilog. Думаю это не составит проблему.

Использовать мультиплексор (предложения в постах выше) получится только если все регистры идут последовательно в адресном пространстве и выровнены на границу 2 в N. Иными словами адрес представляе собой двоичное число. Иначе всё выродится в схему, предложенную выше (выборка по и, далее объединение по или).
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
- - DeadMoroz   Как я уже говорил, я пробовал разные варианты. Как...   Jan 16 2008, 22:44
|- - DmitryR   Цитата(DeadMoroz @ Jan 17 2008, 01:44) Ка...   Jan 17 2008, 09:03
- - 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 Текстовая версия Сейчас: 24th August 2025 - 09:11
Рейтинг@Mail.ru


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