Перейти к содержанию
    

Оптимизация проекта

Помогите оптимизировать. А то большая задержка получается при выводе данных... А сам что-то не могу ничего придумать не могу... :-(

 

out_cnt: block

begin

process(rst_int_n, sys_clk, st_wr)

begin

if rst_int_n = '0' then

nom <= 0;

elsif rising_edge(sys_clk) then

if st_wr then

nom <= 8;

elsif nom/=0 then

nom <= nom - 1;

end if;

end if;

end process;

 

process(sys_clk, rst_int_n)

begin

if rst_int_n = '0' then

SDR_DQ <= (others => 'Z');

elsif falling_edge(sys_clk) then

SDR_DQ <= (others => 'Z');

if nom /= 0 then

SDR_DQ <= shift(nom - 1);

end if;

end if;

end process;

 

end block;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте использовать конструкцию

 

if then

......

else NULL;

....

end if;

 

 

 

Возможно поможет замена условия "if nom /= 0 then" на что то другое

что то вроде "if nom => 0 then"

А вообще все сильно зависит от того каким кампилятором вы пользуетесь.

Если в нем есть возможность посмотреть получаемую схему в виде примитивов,

то попробуйте разные конструкции и выбирите ту которая лучше подходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

out_cnt: block
  begin
     process(rst_int_n, sys_clk, st_wr)
      begin
       if rst_int_n = '0' then
            nom <= 0;
      elsif rising_edge(sys_clk) then
        if st_wr then
         nom <= 8;
        elsif nom/=0 then 
         nom <= nom - 1;
       end if;            
       end if; 
      end process;
      
      process(sys_clk, rst_int_n)
     begin
      if rst_int_n = '0' then
       SDR_DQ <= (others => 'Z');
      elsif falling_edge(sys_clk) then
         SDR_DQ <= (others => 'Z');    
        if nom /= 0 then
        SDR_DQ <= shift(nom - 1);
         end if; 
      end if; 
     end process;
      
   end block;

 

Похоже на блок вывода данных на сдрам %))

 

ИМХО рекомендую :

1. перейти на работу по одному фронту. проиграете в латентности, выиграете в стабильности при более высоких тактовых + не потребуется констрейнить путь. Если будут проблемы с фазировкой данных проинвертируйте клок на сдрам.

2. убрать сброс по по данным

3. и похоже самое главное, перейти на использование one-hot/one-cold счетчика. потеряете в ресурсе 4 триггера но выиграете в комбинационном пути по логике.

 

 

Удачи !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите оптимизировать. А то большая задержка получается при выводе данных... А сам что-то не могу ничего придумать не могу... :-(

 

out_cnt: block
  begin
     process(rst_int_n, sys_clk, st_wr)
      begin
       if rst_int_n = '0' then
            nom <= 0;
      elsif rising_edge(sys_clk) then
        if st_wr then
         nom <= 8;
        elsif nom/=0 then 
         nom <= nom - 1;
       end if;            
       end if; 
      end process;
      
      process(sys_clk, rst_int_n)
     begin
      if rst_int_n = '0' then
       SDR_DQ <= (others => 'Z');
      elsif falling_edge(sys_clk) then
         SDR_DQ <= (others => 'Z');    
        if nom /= 0 then
        SDR_DQ <= shift(nom - 1);
         end if; 
      end if; 
     end process;
      
   end block;

 

Несколько смущает вот эта вот конструкция: SDR_DQ <= shift(nom - 1);

В зависимости от настроек/интеллекта синтезатора может быть добавлен комбинаторный блок вычитателя nom - 1 :). А это та самая лишняя задержка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Упростил уже по последнего... Всё равно задержка почему так? Может не там копаю... Совсем уже сбился с толку..

На рисунках показан Behavioral Sim (Img1.jpg) - т.е. то что нужно.. а на Img2.jpg xxnj имею(Post-Route Sim)..

 

process(rst_int_n, sys_clk)

if rst_int_n = '0' then

....

elsif rising_edge(sys_clk) then

....

 

if start_wr then

wr_ena_q <= '1';

else

wr_ena_q <= '0';

end if;

 

if wr_ena_q = '1' then

shift <= data_in;

end if;

 

....

end process;

 

process(sys_clk, st_wr)

begin

if falling_edge(sys_clk) then

SDR_DQ_OE <= not start_wr;

SDR_DQ2_OE <= SDR_DQ_OE;

end if;

end process;

 

SDR_DQ_int <= shift;

SDR_DQ<=(others =>'Z') when SDR_DQ2_OE else SDR_DQ_int;

 

Img1.jpg

post-16450-1211827631_thumb.jpg

 

Img2.jpg

post-16450-1211827679_thumb.jpg

Изменено пользователем BuTeK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А он разве ещё и SDRAM поддерживает?! А я почему-то считал, что только DDR... Сейчас посмотрим..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...