BuTeK 0 22 мая, 2008 Опубликовано 22 мая, 2008 · Жалоба Помогите оптимизировать. А то большая задержка получается при выводе данных... А сам что-то не могу ничего придумать не могу... :-( 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hitower1 0 22 мая, 2008 Опубликовано 22 мая, 2008 · Жалоба Попробуйте использовать конструкцию if then ...... else NULL; .... end if; Возможно поможет замена условия "if nom /= 0 then" на что то другое что то вроде "if nom => 0 then" А вообще все сильно зависит от того каким кампилятором вы пользуетесь. Если в нем есть возможность посмотреть получаемую схему в виде примитивов, то попробуйте разные конструкции и выбирите ту которая лучше подходит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 мая, 2008 Опубликовано 23 мая, 2008 · Жалоба 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 триггера но выиграете в комбинационном пути по логике. Удачи !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 23 мая, 2008 Опубликовано 23 мая, 2008 · Жалоба Помогите оптимизировать. А то большая задержка получается при выводе данных... А сам что-то не могу ничего придумать не могу... :-( 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 :). А это та самая лишняя задержка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BuTeK 0 26 мая, 2008 Опубликовано 26 мая, 2008 (изменено) · Жалоба Упростил уже по последнего... Всё равно задержка почему так? Может не там копаю... Совсем уже сбился с толку.. На рисунках показан 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 Img2.jpg Изменено 26 мая, 2008 пользователем BuTeK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hitower1 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба BuTeK может имеет смысл просто воспользоваться прогой mig_v2_1 из coregen? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BuTeK 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба А он разве ещё и SDRAM поддерживает?! А я почему-то считал, что только DDR... Сейчас посмотрим.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться