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

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


Местный
***

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



А код с case был такой:
Код
--  -- DATAOUT MX reg -> registers read
--  process(CLK100, sreg_addr, sreg_test, sreg_pfd0, sreg_pfd1)
--  begin
--    if(rising_edge(CLK100)) then  
--        case(sreg_addr) is
--          when SREG_TEST_ADDR => -- read Test reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_test(7 downto 0);
--          when SREG_PFD0_ADDR => -- read Pulse Freq Div 0 reg                
--            dataout_reg(15 downto 0)<=x"00" & sreg_pfd0(7 downto 0);
--          when SREG_PFD1_ADDR => -- read Pulse Freq Div 1 reg                
--            dataout_reg(15 downto 0)<=x"00" & sreg_pfd1(7 downto 0);
--          when SREG_PW0_ADDR => -- read Pulse Width 0 reg                
--            dataout_reg(15 downto 0)<=x"00" & sreg_pw0(7 downto 0);
--          when SREG_PW1_ADDR => -- read Pulse Width 1 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_pw1(7 downto 0);
--          when SREG_PCTL_ADDR => -- read Pulse Control reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_pctl(7 downto 0);
--          when SREG_NCMD_ADDR => -- read NAND flash command reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_ncmd(7 downto 0);
--          when SREG_NSTA_ADDR => -- read NAND flash status reg                  
--            dataout_reg(15 downto 0)<="0000000" & nand_busy & sreg_nsta(7 downto 0);
--          when SREG_NRWC_ADDR => -- read NAND flash read/write counter reg                  
--            dataout_reg(15 downto 0)<=sreg_nrwc(15 downto 0);
--          when SREG_NADR1_ADDR => -- read NAND flash Address 1 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nadr1(7 downto 0);
--          when SREG_NADR2_ADDR => -- read NAND flash Address 2 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nadr2(7 downto 0);
--          when SREG_NADR3_ADDR => -- read NAND flash Address 3 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nadr3(7 downto 0);
--          when SREG_NADR4_ADDR => -- read NAND flash Address 4 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nadr4(7 downto 0);
--          when SREG_NADR5_ADDR => -- read NAND flash Address 5 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nadr5(7 downto 0);
--          when SREG_NID1_ADDR => -- read NAND flash ID 1 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nid1(7 downto 0);
--          when SREG_NID2_ADDR => -- read NAND flash ID 2 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nid2(7 downto 0);
--          when SREG_NID3_ADDR => -- read NAND flash ID 3 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nid3(7 downto 0);
--          when SREG_NID4_ADDR => -- read NAND flash ID 4 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nid4(7 downto 0);
--          when SREG_NID5_ADDR => -- read NAND flash ID 5 reg                  
--            dataout_reg(15 downto 0)<=x"00" & sreg_nid5(7 downto 0);
--                
--          when others =>                  
--            dataout_reg(15 downto 0)<=x"FF" & x"FF";
--        end case;
--    end if;
--  end process;


Блин, может это все из-за CLK который я вставил вначале, я думал, что это все засинтезируется в mux + reg за ним. Завтра проверю.
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
- - yuri_d   Цитата(DeadMoroz @ Jan 15 2008, 16:25) Ка...   Jan 17 2008, 08:39
|- - 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 Текстовая версия Сейчас: 26th August 2025 - 02:33
Рейтинг@Mail.ru


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