|
Проблема синтеза под Altera, Не моделируется синтезированная схема |
|
|
|
Sep 9 2005, 11:48
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
Дроброго времени суток. Если кто может-помогите Проблема вот в чем: Есть код на VHDL. Вот он: Цитата library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.std_logic_arith.all;
entity imit is port( clk : in STD_LOGIC; enable : in STD_LOGIC; synh_out : out STD_LOGIC; data_strob : out STD_LOGIC; data_out : out STD_LOGIC_VECTOR(31 downto 0) ); end imit;
--}} End of automatically maintained section
architecture rl of imit is constant t_min:integer:=100; --100 ns
begin
p1: process (clk, enable)
constant temp1:STD_LOGIC_VECTOR(31 downto 0):=B"00000001100000000110010000110011"; constant temp2:STD_LOGIC_VECTOR(31 downto 24):=X"02"; constant temp3:STD_LOGIC_VECTOR(31 downto 0):=B"00000011000000010000001010111100"; constant temp4:STD_LOGIC_VECTOR(31 downto 0):=B"11100100000000000000000000001000"; variable count_temp:integer range 0 to 256 :=0; variable t1:integer:=750; variable temp:integer range 0 to 16777215 :=0; variable num:integer range 0 to 32;
begin if enable='0' then count_temp:=0; t1:=750; data_out<=(others=>'0'); data_strob<='1'; synh_out<='1'; temp:=0; num:=0; else if clk'event and clk='1' then --CLK rising edge count_temp:=count_temp+1; end if; if clk'event and clk='0' then case count_temp is when 1 =>data_strob<='0'; when 2 =>synh_out<='0'; data_out<=temp1; when 3 => synh_out<='1'; when 4 =>synh_out<='0'; ------------------------ temp:=temp+t1; data_out<=temp2 & CONV_STD_LOGIC_VECTOR(temp,24); num:=num+1; if t1 = 750 and num = 20 then t1:=1000; num:=0; elsif t1=1000 and num=20 then t1:=750; num:=0; end if; ------------------------ when 5 => synh_out<='1'; when 6 =>synh_out<='0'; data_out<=temp3; when 7 => synh_out<='1'; when 8 =>synh_out<='0'; data_out<=temp4; when 9 => synh_out<='1'; when 11 =>data_strob<='1'; when 150 => if t1=750 then count_temp:=0; end if; when 200 => if t1=1000 then count_temp:=0; end if; when others => null; end case; end if; end if; end process p1; end rl; он замечательно моделируется в A-HDL но при попытке моделировать синтезированое устройство в Quartus не чего не происходит т е результате состояния выходов не меняются. ПЛИС-MAX 7000S Вообщем вопрос что я делаю не так, и если объяснять долго то где посмотреть. PS До этого с ПЛИС не работал. Так что сильно не бейте
|
|
|
|
|
Sep 9 2005, 12:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(des00 @ Sep 9 2005, 15:58) else if clk'event and clk='1' then --CLK rising edge count_temp:=count_temp+1; end if; if clk'event and clk='0' then case count_temp is в одном процесе никогда не заработает, разнесите по разным процессам И еще: Код if clk'event and clk='1' then --CLK rising edge count_temp:=count_temp+1; end if; if clk'event and clk='0' then case count_temp is when 150 => if t1=750 then count_temp:=0; end if; when 200 => if t1=1000 then count_temp:=0; end if; when others => null; end case; end if; Вы меняете count_temp по обоим фронтам Clk. Вы уверены, что это будет работать? Используйте один фронт. Проблем не будет, скорее наоборот. Только count_temp надо сделать сигналом, а не переменной.
|
|
|
|
|
Sep 9 2005, 12:37
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Iouri @ Sep 9 2005, 07:31) count_temp желательно вынести в отдельный процесс тогда будет читабельность лучше. fiting проще и если будут проблемы с timng conctraints проще будет бороться process (clk, enable) begin if enable = '0' then count_temp := 0; elsif (clk = '1' end clk'event) then count_temp := count_temp +1; end if; end process; удачи хмм а вот интересно почему мало кто пользуеться функциями rising_edge falling_edge, а именно event ы пишут ?
--------------------
|
|
|
|
|
Sep 9 2005, 13:08
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(vetal @ Sep 9 2005, 07:58) Код ------------------------------------------------------------------- -- edge detection ------------------------------------------------------------------- FUNCTION rising_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN IS BEGIN RETURN (s'EVENT AND (To_X01(s) = '1') AND (To_X01(s'LAST_VALUE) = '0')); END; Разница на лицо. eventы иногда полезнее при симуляции, к примеру, когда сигнал выходит их 'X' в '1', при использовании *_edge, симулятор отработает только переход из '0' в '1' и наоборот. Иногда это спасает от введения в проект дополнительных цепей тестового сброса/инициализации. На самом деле корректнее использовать *_edge. а по моему даже для симуляции лучше исползовать именно _edge, т.к. лучше видны проблемы с генераторами тестовых сигналов. ИМХО event были заложены для bit_vector у которого всего 2 состояния, но не для std_logic.
--------------------
|
|
|
|
|
Sep 9 2005, 13:25
|

Гуру
     
Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553

|
Цитата(des00 @ Sep 9 2005, 16:08) Цитата(vetal @ Sep 9 2005, 07:58) Код ------------------------------------------------------------------- -- edge detection ------------------------------------------------------------------- FUNCTION rising_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN IS BEGIN RETURN (s'EVENT AND (To_X01(s) = '1') AND (To_X01(s'LAST_VALUE) = '0')); END; Разница на лицо. eventы иногда полезнее при симуляции, к примеру, когда сигнал выходит их 'X' в '1', при использовании *_edge, симулятор отработает только переход из '0' в '1' и наоборот. Иногда это спасает от введения в проект дополнительных цепей тестового сброса/инициализации. На самом деле корректнее использовать *_edge. а по моему даже для симуляции лучше исползовать именно _edge, т.к. лучше видны проблемы с генераторами тестовых сигналов. ИМХО event были заложены для bit_vector у которого всего 2 состояния, но не для std_logic. Согласен на 200%. Все зависит от того как он начинал. Во многом к использованию event приучают авторы учебной литературы, и в результате человек садится на него надолго. Хотя есть такие случаи, в которых можно и не просимулировать, к примеру при post P&R тестировании при наличии "смешных" обратных связей можно и не выползти из 'X' окружения, т.к. в симуляторы триггеры инициализируются в X, а реально на sram lut fpga там всегда нули, по крайней мере у меня из-за этого не было сбоев.
|
|
|
|
|
Sep 12 2005, 13:17
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
К сожалению приходится возобновлять тему  Продолжение истории - все работает вроде как надо (в железе не пробывал) но откуда-то беруться страные сигналы на шине даных data_out см. 1.jpg Может кто-нибудь сказать что это?! Правда работать будет и так скорее всего  Прим.: файлы 1.txt, 2.txt, 3.txt на самом деле jpg  по другому не смог загрузить
Прикрепленные файлы
text.txt ( 2.86 килобайт )
Кол-во скачиваний: 74
1.txt ( 113.98 килобайт )
Кол-во скачиваний: 39
2.txt ( 99.34 килобайт )
Кол-во скачиваний: 29
3.txt ( 97.44 килобайт )
Кол-во скачиваний: 28
|
|
|
|
|
Sep 12 2005, 13:39
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(White @ Sep 12 2005, 08:17) К сожалению приходится возобновлять тему  Продолжение истории - все работает вроде как надо (в железе не пробывал) но откуда-то беруться страные сигналы на шине даных data_out см. 1.jpg Может кто-нибудь сказать что это?! Правда работать будет и так скорее всего  Прим.: файлы 1.txt, 2.txt, 3.txt на самом деле jpg  по другому не смог загрузить не вижу ничего странного, кроме может быть того, что вы используете сигнал разрешения enable как асинхронный ресет. и еще рекомендую отличать сигналы с активным нулем и активной единицей каким небудь постфиксом например _n или _b, но это на будующее. а по вашему вопросу у тригера есть время переключения и это время может быть различным у разных тригеров, вот вы это и наблюдаете.
--------------------
|
|
|
|
|
Sep 12 2005, 13:48
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
Цитата не вижу ничего странного, кроме может быть того, что вы используете сигнал разрешения enable как асинхронный ресет. асинхронный ресет это в данном случае вроде не проблема, хотя если есть достаточно жесткие мрекомендации можно и в синхронный переделать Цитата и еще рекомендую отличать сигналы с активным нулем и активной единицей каким небудь постфиксом например _n или _b, но это на будующее. Учту Цитата а по вашему вопросу у тригера есть время переключения и это время может быть различным у разных тригеров, вот вы это и наблюдаете. так и что же с этим делать? или это не есть большая проблема?
|
|
|
|
|
Sep 12 2005, 14:05
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(White @ Sep 12 2005, 08:48) так и что же с этим делать? или это не есть большая проблема? а ИМХО ничего, если для вашей переферии это не помешает. тут нужно смотереть на требования по thold, tsetup вашей переферии(что вы не привели) и вот если вы не будете укладываться в эти параметры тогда уже нужно будет смотреть. ИМХО в вашем дизайне для МАКСОВ 7000 я бы проверил пакует ли он тригеры в выходные ячейки, т.е. делает ли он регистровые выходы и все же переделал бы все на 1 фронт, либо положительный либо отрицательный. ПЛИС это не рассыпуха. Однофазная синхронизация здесь хорошо работатет. Удачи.
--------------------
|
|
|
|
|
Sep 12 2005, 14:27
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
Ок посмотрим в железе, а там видно будет. При однотактной синхнонизации получалось тоже самое (вроде менялось много точно не уверен). И как посмотреть Цитата пакует ли он тригеры в выходные ячейки я не знаю к сожелению. Спасибо большое за советы
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|