|
Проблема синтеза под 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 До этого с ПЛИС не работал. Так что сильно не бейте
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 29)
|
Sep 13 2005, 05:31
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Раз пошла такая пьянка, то ИМХО по моим иследованиям в коде не совсем правильно следующее Код temp1:STD_LOGIC_VECTOR(31 downto 0):=B"00000001100000000110010000110011"; temp2:STD_LOGIC_VECTOR(31 downto 24):=X"02"; temp3:STD_LOGIC_VECTOR(31 downto 0):=B"00000011000000010000001010111100"; temp4:STD_LOGIC_VECTOR(31 downto 0):=B"11100100000000000000000000001000" Если это секция generic , то задайте лучше integer, будет понятно и давайте настроечным параметрам нормальные названия и отделяйте их от остального текста регистром букв. Код signal count_temp:integer range 0 to 1020; signal count_end:bit; лучше сделать Код signal count_temp : std_logic_vector(9 downto 0); -- 0 to 2*10-1 signal count_end : std_logic; т.к. все равно интеджер будет приведен к стд лоджику а на ваше ограничение 1020 синтезатор "забьет". Код p0: process (clk, enable) variable count:integer range 0 to 1020; variable count_stop:integer range 0 to 1020; begin if enable='0' then count:=0; elsif rising_edge(clk) then --CLK rising edge count:=count+1; if count_end='0' then count_stop:=150; else count_stop:=200; end if; if count=count_stop then count:=0; end if; end if; count_temp<=count; end process p0; В чем минус с точки зрения синтеза, вы как я понял делаете стейт машину на счетчке, хотя я не однократно уже вам говорил, что бы вы воспользовались перечисляемыми типами. я взял на себя смелость немного подправить ваш код и убрать лишнее Код signal count_stop : std_logic; begin count_stop <= '1' when (count = conv_std_logic_vector(150, count_stop'length))and(count_end = '0') else '1' when (count = conv_std_logic_vector(200, count_stop'length))and(count_end = '1') else '0'; p0: process (clk, enable) begin if (enable = '0') then count <= (others => '0'); elsif rising_edge(clk) then if (count_stop = '1') then count <= (others => '0'); else count <= count + '1'; end if; end if; end process p0; Что мы тут имеем вы описываете счетчк с двуми видами ресета, асинхронным и синхронным, ИМХО именно это и не позволяет сделать счетчик как счетчик, а не как суматор с тригерами на вашей архитектуре. Это я говорю по памяти, т.к. щас софта для альтер у меня нет и проверить не на чем., может быть я ошибаюсь. Код p1: process (enable,clk) variable t1:integer:=750; variable temp:integer range 0 to 16777215 :=0; variable num:integer range 0 to 32; variable data_strob_temp:STD_LOGIC:='1'; variable synh_out_temp:STD_LOGIC:='1'; variable data_out_temp:STD_LOGIC_VECTOR(31 downto 0):=(others=>'0'); begin if enable='0' then t1:=750; data_out<=(others=>'0'); data_strob<='1'; synh_out<='1'; count_end<='0'; data_strob_temp:='1'; synh_out_temp:='1'; data_out_temp:=(others=>'0'); temp:=0; num:=0; elsif falling_edge(clk) then --CLK rising edge case count_temp is when 1 => data_strob_temp:='0'; when 2 => synh_out_temp:='0'; data_out_temp:=temp1; when 3 => synh_out_temp:='1'; when 4 => synh_out_temp:='0'; ------------------------ temp:=temp+t1; data_out_temp:=temp2 & CONV_STD_LOGIC_VECTOR(temp,24); num:=num+1; if t1 = 750 and num = 20 then t1:=1000; num:=0; count_end<='0'; elsif t1=1000 and num=20 then t1:=750; num:=0; count_end<='1'; end if; ------------------------ when 5 => synh_out_temp:='1'; when 6 => synh_out_temp:='0'; data_out_temp:=temp3; when 7 => synh_out_temp:='1'; when 8 => synh_out_temp:='0'; data_out_temp:=temp4; when 9 => synh_out_temp:='1'; when 11 => data_strob_temp:='1'; when others => data_strob<=data_strob_temp; synh_out<=synh_out_temp; data_out<=data_out_temp; end case; data_strob<=data_strob_temp; synh_out<=synh_out_temp; data_out<=data_out_temp; end if; end process p1; Я тоже немного подправил, что усложняло восприятие кода Код p1: process (enable,clk) variable t1:integer:=750; variable temp:integer range 0 to 16777215 :=0; variable num:integer range 0 to 32; begin if enable='0' then t1 := 750; data_out <= (others=>'0'); data_strob <='1'; synh_out <='1'; count_end <= '0'; temp := 0; num :=0; elsif rising_edge(clk) then data_strob <= '0'; synh_out <= '0'; --data_out <= '0'; -- нужно если дата аут не должен "подвисать" case count is when 1 => null; when 2 => data_out <= temp1; when 3 => synh_out <= '1'; when 4 => ------------------------ 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; count_end <= '0'; elsif t1=1000 and num=20 then t1:=750; num:=0; count_end <= '1'; end if; ------------------------ when 5 => synh_out <='1'; when 6 => data_out <= temp3; when 7 => synh_out <='1'; when 8 => data_out <= temp4; when 9 => synh_out <='1'; when 11 => data_strob <='1'; when others => null; end case; end if; end process p1; это как я понял стейт машина. ИМХО косяк здесь в том, как раз в состоянии 4, т.к. переменная, в отличие от сигнала изменяться сразу же, а не по eventу, что ИМХО усложняет логику формирования сигнала возбуждения тригеров data_out data_out <= temp2 & CONV_STD_LOGIC_VECTOR(temp,24); , тоже самое касаеться переменной num ИМХО на вашем месте я бы еще раз пересмотрел функционирование вашего девайса уже с точки зрения не симуляции, а синтеза и читаемости. Тут есть над чем работать ПС, может где ошибся не пинайте, я толкьо пришел на работу
--------------------
|
|
|
|
|
Sep 13 2005, 13:02
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
2 Vetal Цитата White: добавьте следующие строчки между "архитектурой и begin" или в "секции entity после портов, перед закрытием entity"
attribute preserve: boolean; attribute preserve of data_out: signal is true; attribute preserve of data_strob: signal is true; attribute preserve of synh_out: signal is true; а что это если не секрет? что это должно дать? 2 des00 Цитата Если это секция generic , то задайте лучше integer а что это изменит ? в бинарном виде мне в данном случае удобнее записывать. Цитата лучше сделать CODE
signal count_temp : std_logic_vector(9 downto 0); -- 0 to 2*10-1 signal count_end : std_logic;
т.к. все равно интеджер будет приведен к стд лоджику а на ваше ограничение 1020 синтезатор "забьет". можно а можно просто указать нормальное ограничение - 1023, я пробывал и так и так разницы при чистом счетчике не было. Цитата я взял на себя смелость немного подправить ваш код и убрать лишнее в вашем исправленом коде счетчик проскакивает лишний такт. Цитата В чем минус с точки зрения синтеза, вы как я понял делаете стейт машину на счетчке, хотя я не однократно уже вам говорил, что бы вы воспользовались перечисляемыми типами. Объясните мне наконец в чем разница будет между тем и тем? а то я действительно не понимаю! Цитата Я тоже немного подправил, что усложняло восприятие кода Ну моя времянка была уничноженна полностью  Но в принципе идея понятна, единственное что не понятно так это то что присваивать сигналу значение дважды неправильно с моей точки зрения. Цитата ИМХО косяк здесь в том, как раз в состоянии 4, т.к. переменная, в отличие от сигнала изменяться сразу же, а не по eventу, что ИМХО усложняет логику формирования сигнала возбуждения тригеров data_out data_out <= temp2 & CONV_STD_LOGIC_VECTOR(temp,24); , тоже самое касаеться переменной num да вот это похоже на правду надо будет попробывать покрутить Цитата ИМХО на вашем месте я бы еще раз пересмотрел функционирование вашего девайса уже с точки зрения не симуляции, а синтеза и читаемости. Тут есть над чем работать smile.gif ну с этим трудно спорить  Работать всегда есть над чем тем более это первая моя работа с VHDL и ПЛИС. И как связан код и то что будет синтезированно я пока понимаю слабо. Но в общем в вашей или моей  подправленной программе глюки остались теже 2 all  Спасибо за потраченое на меня время.
|
|
|
|
|
Sep 13 2005, 13:18
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата а что это изменит ? в бинарном виде мне в данном случае удобнее записывать. а ничего, писать меньше, не нужно разрядности подсчитывать  хотя кому как, это не парадигма Цитата можно а можно просто указать нормальное ограничение - 1023, я пробывал и так и так разницы при чистом счетчике не было. асболютно правильно, просто ИМХО если писать хорошо синтезируемый код то по началу лучше делать через std_logic Цитата в вашем исправленом коде счетчик проскакивает лишний такт. все правильно, потому что на счетчике либо считаем, либо сбрасываем. а если делаем одновременно то это уже не счетчик а .... суматор с тригером кроме того да, в случае синхронного сброса, сигнал сброса должен подниматься за 1 такт (еще с кр155). Цитата Объясните мне наконец в чем разница будет между тем и тем? а то я действительно не понимаю! например type t_state is (idle, state1, state2, .....); signal state : t_state; ...... if (in_reset_b = '0') then state <= idle; elseif (rising_edge(in_clock)) then case (state) is ...... разница в том, что вам проще писать стейт машину, вы можете "играть" способом кодирования с помошью констрейнов. и не нужно собирать воедино асинхронный и синхронный сброс на одном и том же счетчике. . Цитата Ну моя времянка была уничноженна полностью  естественно я не стремился сделатть все как у вас, я просто показал вам как писать, что бы не плодить мнжественных переменных, ВХДЛ и так многословный язык (писать больше чем в верилоге), так зачем писать еще больше. Цитата Но в принципе идея понятна, единственное что не понятно так это то что присваевать сигналу значение неправильно с моей точки зрения. почему ? сигнал должен измениться по евенту, он и измениться, а как будет сделанно это изменение не волнует. + в асинхронных процессах это хороший способ случайно не наделать латчей. Цитата И как связан код и то что будет синтезированно я пока понимаю слабо. синтезим симплифаем и в RTL вьвер, рекомендую. Цитата Но в общем в вашей или моей  подправленной программе глюки остались теже естественно  зачем мне у вас хлеб отбирать  )))
--------------------
|
|
|
|
|
Sep 13 2005, 13:36
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
Цитата Цитата Но в принципе идея понятна, единственное что не понятно так это то что присваевать сигналу значение неправильно с моей точки зрения.
почему ? сигнал должен измениться по евенту, он и измениться, а как будет сделанно это изменение не волнует. + в асинхронных процессах это хороший способ случайно не наделать латчей. я имел в виду что некоректно присваивать одной и той же переменной значение дважды Цитата например type t_state is (idle, state1, state2, .....); signal state : t_state; ...... if (in_reset_b = '0') then state <= idle; elseif (rising_edge(in_clock)) then case (state) is ...... разница в том, что вам проще писать стейт машину, вы можете "играть" способом кодирования с помошью констрейнов. Ну тут state так integer не суть важно вроде дазве что нагляднее. А можно про констрейны по-подробнее? Или что почитать посоветуйте про них и вообще и если можно с рускими буквами  ? Цитата и не нужно собирать воедино асинхронный и синхронный сброс на одном и том же счетчике. не понял вы о чем и к чему?
|
|
|
|
|
Sep 14 2005, 09:21
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324

|
Цитата Аттрибуты которые я вам сказал написать предназначены для того, что бы при синтезе эти триггеры у вас не минимизировались. Резылутат минимизации вы сами видите на вашей временной диаграмме.Некоторые сигналы шины data_out имеют комбинаторный выход. не помогает  Сигнал на выходы data_out[31:26] приходит явно позже чем на остальные. И еще чем отличаются RTL вию и текноложи вию ? на первом указаные выходы имеют тригеры а на втором судя по всему нет (хотя я не уверен) PS И так ни кто и не ответел на вопрос Цитата А можно про констрейны по-подробнее? Или что почитать посоветуйте про них и вообще и если можно с рускими буквами smile.gif?
|
|
|
|
|
Sep 14 2005, 09:37
|

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

|
Выключите так же: Remove duplicate registers -off. При просмотре в tmv выделите пины с 26 по 31 и правойкнопкой отфильтруйте по sources. Все эти выводы должны иметь регистровый выход(У меня по крайней мере так), т.е. разности задержек быть не должно. Сигнал clk должен сидеть на глобальном буфере. Цитата И еще чем отличаются RTL вию и текноложи вию ? Первый- то что вы написали, а второй то что получили.
|
|
|
|
|
Sep 14 2005, 09:52
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Насчет счетчика и всех асинхронно/синхронных дел Если посмотреть на то, из какаих ЛЯ состоит ваша ЦПЛД, то можно увидеть что у вас есть тригеры, которые можно сбрасывать либо асинхронно, либо синхронно. Если реализовать оба вида сброса на одном и том же элементе, то будет использована дополнительная логика общего применения и то что вы хотите займет больше места на чипе. но вам как я понял это не критично. Имхо счетчик на ЦПЛД лучше сделать на обычных тригерах, не используя суматор + тригеры (как на ФПГА), но здесь нужно внимательно посмотреть на струкутру ЛЯ. и тогда у вас получиться описать так, что бы синтезатор вас понял. Насчет КА, вам решать какой способ описания использовать, но если уж учиться то нужно учиться делать хорошо  ) а если вам потребуеться автомат на 50 состояний ? Рекомендую почиать вам xst.pdf(раздел HDL coding styles), cfg.pdf (документация на ISE). и доку на симплифай, там расписанно что такое констрейны и с чем их едят
--------------------
|
|
|
|
|
Sep 14 2005, 11:02
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(White @ Sep 14 2005, 05:07) За ссылки на доки спасибо, на русском бы что-нибудь  Это врядли, да и еще Douglas Smith HDL Chip design. ИМХО читать в обяз!! и John F. Wakerly книгу не знаю, у меня есть главы со 2(number systems and codes) по 9ю(Sequental circut design examples) весит 7.5 метров могу поделиться. есть немного по ВХДЛ на руском http://servis-ins.narod.ru/tmp/vhdl/vhdl.html
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|