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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблема синтеза под Altera, Не моделируется синтезированная схема
White
сообщение Sep 9 2005, 11:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324



Дроброго времени суток.

Если кто может-помогите wacko.gif
Проблема вот в чем:
Есть код на 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 До этого с ПЛИС не работал. Так что сильно не бейте
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 9 2005, 11:58
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



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

в одном процесе никогда не заработает, разнесите по разным процессам
и если это стетй машина воспользуйтесь перечисляемыми типами


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 9 2005, 12:13
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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 надо сделать сигналом, а не переменной.
Go to the top of the page
 
+Quote Post
Iouri
сообщение Sep 9 2005, 12:31
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 364
Регистрация: 11-07-05
Пользователь №: 6 707



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;


удачи
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 9 2005, 12:37
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 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 ы пишут ?


--------------------
Go to the top of the page
 
+Quote Post
vetal
сообщение Sep 9 2005, 12:58
Сообщение #6


Гуру
******

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



Код
   -------------------------------------------------------------------    
   -- 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.
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 9 2005, 13:08
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 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.


--------------------
Go to the top of the page
 
+Quote Post
vetal
сообщение Sep 9 2005, 13:25
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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 там всегда нули, по крайней мере у меня из-за этого не было сбоев.
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 9 2005, 13:33
Сообщение #9


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



bb-offtopic.gif
уважаемый Vetal вы не могли бы ответить мне в неоконченую тему
http://forum.electronix.ru/index.php?showtopic=7676
хочу до конца разобраться smile.gif


--------------------
Go to the top of the page
 
+Quote Post
White
сообщение Sep 10 2005, 11:53
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324



Спасибо всем за советы. Разобрался - все вроде работает , хотя есть небольшие выбросы на выходе данных где-то в 10 нс при такте с 100 нс, но это для меня не страшно даи как боротся догадываюсь. Еще раз всем спасибо
Go to the top of the page
 
+Quote Post
White
сообщение Sep 12 2005, 13:17
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324



К сожалению приходится возобновлять тему sad.gif

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

Может кто-нибудь сказать что это?! blink.gif
Правда работать будет и так скорее всего blush.gif

Прим.: файлы 1.txt, 2.txt, 3.txt на самом деле jpg smile.gif по другому не смог загрузить
Прикрепленные файлы
Прикрепленный файл  text.txt ( 2.86 килобайт ) Кол-во скачиваний: 74
Прикрепленный файл  1.txt ( 113.98 килобайт ) Кол-во скачиваний: 39
Прикрепленный файл  2.txt ( 99.34 килобайт ) Кол-во скачиваний: 29
Прикрепленный файл  3.txt ( 97.44 килобайт ) Кол-во скачиваний: 28
 
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 12 2005, 13:39
Сообщение #12


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(White @ Sep 12 2005, 08:17)
К сожалению приходится возобновлять тему sad.gif

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

Может кто-нибудь сказать что это?! blink.gif
Правда работать будет и так скорее всего  blush.gif

Прим.: файлы 1.txt, 2.txt, 3.txt на самом деле jpg smile.gif по другому не смог загрузить
*

не вижу ничего странного, кроме может быть того, что вы используете сигнал разрешения enable как асинхронный ресет.
и еще рекомендую отличать сигналы с активным нулем и активной единицей каким небудь постфиксом например _n или _b, но это на будующее.
а по вашему вопросу
у тригера есть время переключения и это время может быть различным у разных тригеров, вот вы это и наблюдаете.


--------------------
Go to the top of the page
 
+Quote Post
White
сообщение Sep 12 2005, 13:48
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324



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


асинхронный ресет это в данном случае вроде не проблема, хотя если есть достаточно жесткие мрекомендации можно и в синхронный переделать

Цитата
и еще рекомендую отличать сигналы с активным нулем и активной единицей каким небудь постфиксом например _n или _b, но это на будующее.


Учту

Цитата
а по вашему вопросу
у тригера есть время переключения и это время может быть различным у разных тригеров, вот вы это и наблюдаете.


так и что же с этим делать? или это не есть большая проблема?
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 12 2005, 14:05
Сообщение #14


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(White @ Sep 12 2005, 08:48)
так и что же с этим делать? или это не есть большая проблема?

а ИМХО ничего, если для вашей переферии это не помешает.
тут нужно смотереть на требования по thold, tsetup вашей переферии(что вы не привели) и вот если вы не будете укладываться в эти параметры тогда уже нужно будет смотреть.

ИМХО в вашем дизайне для МАКСОВ 7000 я бы проверил пакует ли он тригеры в выходные ячейки, т.е. делает ли он регистровые выходы и все же переделал бы все на 1 фронт, либо положительный либо отрицательный. ПЛИС это не рассыпуха. Однофазная синхронизация здесь хорошо работатет.

Удачи.


--------------------
Go to the top of the page
 
+Quote Post
White
сообщение Sep 12 2005, 14:27
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 31-01-05
Из: Москва
Пользователь №: 2 324



Ок посмотрим в железе, а там видно будет.

При однотактной синхнонизации получалось тоже самое (вроде менялось много точно не уверен).
И как посмотреть
Цитата
пакует ли он тригеры в выходные ячейки

я не знаю к сожелению.
Спасибо большое за советы a14.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:31
Рейтинг@Mail.ru


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