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

 
 
> Проблема синтеза под 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
 
Start new topic
Ответов
sazh
сообщение Sep 12 2005, 17:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



(C VHDL не знаком. Посмотрел в Квартусе в RTL просмотрщике):
По большому счету вроде все нормально. Синхронная схема. Регистровые выходы.
Так как данные сопровождаются стробом, то на переходные процессы (не соизмеримые с периодом клока) обращать внимание не стоит. (Для более качественного размещения в Квартусе существует Редактор ассигнований.)
На чтобы я обратил внимание:
1. асинхронный глобальный ресет. Конечно ничего страшного. Но обычно на выходные регистры он не нужен.(Какое кому дело до состояния регистров вне интервала сопровождения)
2. Если это входной сигнал, его бы надо простробировать. А при разводке печатной платы разводить первоначально. Наводки по печати на этот сигнал будут “сбивать “ работу всей схемы
3. Как уже говорилось, клок используйте по одному фронту. В результате мягче требования к быстродействию кристалла да и при использовании PLL не надо будет проект переделывать.
4. Ну и самое главное. Разведите проект в Quartus и устраните все предупреждения.
5. НЕТ у Вас ни одного полноразрядного счетчика. Все реализуется на сумматорах (lpm_add_sub max7000s , ACEX). В результате нерациональное использование ресурсов. Как у Вас это получилось, ума не приложу. Если б хотя бы в верилоге, тогда бы смог бы качественнее ответить.
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 13 2005, 05:31
Сообщение #3


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

Группа: Модераторы
Сообщений: 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
ИМХО на вашем месте я бы еще раз пересмотрел функционирование вашего девайса уже с точки зрения не симуляции, а синтеза и читаемости. Тут есть над чем работать smile.gif

ПС, может где ошибся не пинайте, я толкьо пришел на работу smile.gif


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- White   Проблема синтеза под Altera   Sep 9 2005, 11:48
- - des00   else if clk'event and clk='1' then...   Sep 9 2005, 11:58
|- - andrew_b   Цитата(des00 @ Sep 9 2005, 15:58)else   ...   Sep 9 2005, 12:13
- - Iouri   count_temp желательно вынести в отдельный процесс ...   Sep 9 2005, 12:31
|- - des00   Цитата(Iouri @ Sep 9 2005, 07:31)count_temp ж...   Sep 9 2005, 12:37
- - vetal   Код    ---------------------------------...   Sep 9 2005, 12:58
|- - des00   Цитата(vetal @ Sep 9 2005, 07:58)Код   ...   Sep 9 2005, 13:08
|- - vetal   Цитата(des00 @ Sep 9 2005, 16:08)Цитата(vetal...   Sep 9 2005, 13:25
|- - des00   уважаемый Vetal вы не могли бы ответить мне в неок...   Sep 9 2005, 13:33
- - White   Спасибо всем за советы. Разобрался - все вроде раб...   Sep 10 2005, 11:53
- - White   К сожалению приходится возобновлять тему Продолж...   Sep 12 2005, 13:17
|- - des00   Цитата(White @ Sep 12 2005, 08:17)К сожалению...   Sep 12 2005, 13:39
- - White   Цитатане вижу ничего странного, кроме может быть т...   Sep 12 2005, 13:48
|- - des00   Цитата(White @ Sep 12 2005, 08:48)так и что ж...   Sep 12 2005, 14:05
- - White   Ок посмотрим в железе, а там видно будет. При од...   Sep 12 2005, 14:27
- - vetal   Ни одна программа не запакует триггеры в эвв max7s...   Sep 12 2005, 16:57
|- - des00   Цитата(vetal @ Sep 12 2005, 11:57)Ни одна про...   Sep 13 2005, 04:53
- - vetal   sazh : Вы не туда смотрите. На RTL действительно в...   Sep 12 2005, 19:31
- - sazh   to Vetal: Я посмотрел на плюсик в Proekt Navigator...   Sep 13 2005, 06:31
- - White   2 Vetal ЦитатаWhite: добавьте следующие строчки м...   Sep 13 2005, 13:02
|- - des00   Цитатаа что это изменит ? в бинарном виде мне в да...   Sep 13 2005, 13:18
- - White   ЦитатаЦитата Но в принципе идея понятна, единствен...   Sep 13 2005, 13:36
- - vetal   Аттрибуты которые я вам сказал написать предназнач...   Sep 13 2005, 13:37
- - White   ЦитатаАттрибуты которые я вам сказал написать пред...   Sep 14 2005, 09:21
- - vetal   Выключите так же: Remove duplicate registers -off....   Sep 14 2005, 09:37
|- - des00   Насчет счетчика и всех асинхронно/синхронных дел ...   Sep 14 2005, 09:52
- - White   2 vetal Спасибо за советы все заработало 2 d...   Sep 14 2005, 10:07
- - des00   Цитата(White @ Sep 14 2005, 05:07)За ссылки н...   Sep 14 2005, 11:02


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

 


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


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