Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема синтеза под Altera
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
White
Дроброго времени суток.

Если кто может-помогите 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 До этого с ПЛИС не работал. Так что сильно не бейте
des00
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

в одном процесе никогда не заработает, разнесите по разным процессам
и если это стетй машина воспользуйтесь перечисляемыми типами
andrew_b
Цитата(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 надо сделать сигналом, а не переменной.
Iouri
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;


удачи
des00
Цитата(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 ы пишут ?
vetal
Код
   -------------------------------------------------------------------    
   -- 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.
des00
Цитата(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.
vetal
Цитата(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 там всегда нули, по крайней мере у меня из-за этого не было сбоев.
des00
bb-offtopic.gif
уважаемый Vetal вы не могли бы ответить мне в неоконченую тему
http://forum.electronix.ru/index.php?showtopic=7676
хочу до конца разобраться smile.gif
White
Спасибо всем за советы. Разобрался - все вроде работает , хотя есть небольшие выбросы на выходе данных где-то в 10 нс при такте с 100 нс, но это для меня не страшно даи как боротся догадываюсь. Еще раз всем спасибо
White
К сожалению приходится возобновлять тему sad.gif

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

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

Прим.: файлы 1.txt, 2.txt, 3.txt на самом деле jpg smile.gif по другому не смог загрузить
des00
Цитата(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, но это на будующее.
а по вашему вопросу
у тригера есть время переключения и это время может быть различным у разных тригеров, вот вы это и наблюдаете.
White
Цитата
не вижу ничего странного, кроме может быть того, что вы используете сигнал разрешения enable как асинхронный ресет.


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

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


Учту

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


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

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

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

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

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

я не знаю к сожелению.
Спасибо большое за советы a14.gif
vetal
Ни одна программа не запакует триггеры в эвв max7s, потому что их там просто нет нет. Логический элемент, триггер и ножка являются одной ячейкой max7s(Если ячеек больше то они просто не имеют вывода).
И если честно то в вашей схеме могут быть проблеммы с битами, т.к. ваша выходная шина является синхронной лишь частично. При различных настройках оптимизации могут появляться биты значение которых выражено через другие, другими словами комбинаторный выход.
Для получения наиболее правильного результатарекомендую отключить все оптимизации вашего синтезатора, или использовать synplify с установленной галочкой "Disable Sequential Optimizations".
sazh
(C VHDL не знаком. Посмотрел в Квартусе в RTL просмотрщике):
По большому счету вроде все нормально. Синхронная схема. Регистровые выходы.
Так как данные сопровождаются стробом, то на переходные процессы (не соизмеримые с периодом клока) обращать внимание не стоит. (Для более качественного размещения в Квартусе существует Редактор ассигнований.)
На чтобы я обратил внимание:
1. асинхронный глобальный ресет. Конечно ничего страшного. Но обычно на выходные регистры он не нужен.(Какое кому дело до состояния регистров вне интервала сопровождения)
2. Если это входной сигнал, его бы надо простробировать. А при разводке печатной платы разводить первоначально. Наводки по печати на этот сигнал будут “сбивать “ работу всей схемы
3. Как уже говорилось, клок используйте по одному фронту. В результате мягче требования к быстродействию кристалла да и при использовании PLL не надо будет проект переделывать.
4. Ну и самое главное. Разведите проект в Quartus и устраните все предупреждения.
5. НЕТ у Вас ни одного полноразрядного счетчика. Все реализуется на сумматорах (lpm_add_sub max7000s , ACEX). В результате нерациональное использование ресурсов. Как у Вас это получилось, ума не приложу. Если б хотя бы в верилоге, тогда бы смог бы качественнее ответить.
vetal
sazh : Вы не туда смотрите. На RTL действительно все почти как нанаписано. А вот в железке совсем другое реализуется.
К примеру отфильтруйте по sources в TMV выводы dataout[0] и dataout[31].

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;
des00
Цитата(vetal @ Sep 12 2005, 11:57)
Ни одна программа не запакует триггеры в эвв max7s, потому что их там просто нет нет. Логический элемент, триггер и ножка являются одной ячейкой max7s(Если ячеек больше то они просто не имеют вывода).


я это и имел в виду, просто возможен вариант, когда используеться внутренний тригер, а через ЛЯ на пине сигнал просто проходит транзитом.
des00
Раз пошла такая пьянка, то ИМХО по моим иследованиям в коде не совсем правильно следующее
Код
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
sazh
to Vetal:
Я посмотрел на плюсик в Proekt Navigator у имени проекта. Увидел lpm_add_sub.
Этого достаточно. Все это можно проще и качественнее реализовать.
Вот и все. (Нет желания в VHDL копаться. Мне терпения не хватает на его лаконичность.
White
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, я пробывал и так и так разницы при чистом счетчике не было.

Цитата
я взял на себя смелость немного подправить ваш код и убрать лишнее

в вашем исправленом коде счетчик проскакивает лишний такт.

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

Объясните мне наконец в чем разница будет между тем и тем? а то я действительно не понимаю!

Цитата
Я тоже немного подправил, что усложняло восприятие кода


Ну моя времянка была уничноженна полностью smile.gif



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

Цитата
ИМХО косяк здесь в том, как раз в состоянии 4, т.к. переменная, в отличие от сигнала изменяться сразу же, а не по eventу, что ИМХО усложняет логику формирования сигнала возбуждения тригеров data_out
data_out <= temp2 & CONV_STD_LOGIC_VECTOR(temp,24);
, тоже самое касаеться переменной num


да вот это похоже на правду надо будет попробывать покрутить

Цитата
ИМХО на вашем месте я бы еще раз пересмотрел функционирование вашего девайса уже с точки зрения не симуляции, а синтеза и читаемости. Тут есть над чем работать smile.gif


ну с этим трудно спорить smile.gif Работать всегда есть над чем тем более это первая моя работа с VHDL и ПЛИС. И как связан код и то что будет синтезированно я пока понимаю слабо.

Но в общем в вашей или моей smile.gif подправленной программе глюки остались теже

2 all a14.gif Спасибо за потраченое на меня время.
des00
Цитата
а что это изменит ? в бинарном виде мне в данном случае удобнее записывать.

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

асболютно правильно, просто ИМХО если писать хорошо синтезируемый код то по началу лучше делать через std_logic smile.gif

Цитата
в вашем исправленом коде счетчик проскакивает лишний такт.

все правильно, потому что на счетчике либо считаем, либо сбрасываем.
а если делаем одновременно то это уже не счетчик а .... суматор с тригером smile.gif
кроме того да, в случае синхронного сброса, сигнал сброса должен подниматься за 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
......
разница в том, что вам проще писать стейт машину, вы можете "играть" способом кодирования с помошью констрейнов.
и не нужно собирать воедино асинхронный и синхронный сброс на одном и том же счетчике.
.
Цитата
Ну моя времянка была уничноженна полностью smile.gif

естественно я не стремился сделатть все как у вас, я просто показал вам как писать, что бы не плодить мнжественных переменных, ВХДЛ и так многословный язык (писать больше чем в верилоге), так зачем писать еще больше. smile.gif

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

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

Цитата
И как связан код и то что будет синтезированно я пока понимаю слабо.

синтезим симплифаем и в RTL вьвер, рекомендую.

Цитата
Но в общем в вашей или моей smile.gif подправленной программе глюки остались теже

естественно smile.gif зачем мне у вас хлеб отбирать smile.gif)))
White
Цитата
Цитата

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


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

я имел в виду что некоректно присваивать одной и той же переменной значение дважды

Цитата
например
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 не суть важно вроде дазве что нагляднее.
А можно про констрейны по-подробнее? Или что почитать посоветуйте про них и вообще и если можно с рускими буквами smile.gif?
Цитата
и не нужно собирать воедино асинхронный и синхронный сброс на одном и том же счетчике.

не понял вы о чем и к чему?
vetal
Аттрибуты которые я вам сказал написать предназначены для того, что бы при синтезе эти триггеры у вас не минимизировались.
Резылутат минимизации вы сами видите на вашей временной диаграмме.Некоторые сигналы шины data_out имеют комбинаторный выход.

Если вы опишите автомат перечислимым типом, то по умолчанию(если иное не указано в настройках синтезаторы) у вас будет кодирование one-hot (один триггер - одно состояние), больше возможностей для декодирования автомата, вы частично снимите нагрузку с трассировочных ресурсов. Для того, что бы вернуться к прежнему типу кодирования вам не надо будет переписывать код, достаточно просто указать что вы хотите тот или иной тип кодировок.

В вашем проекте это не критично т.к. частота очень маленькая.
White
Цитата
Аттрибуты которые я вам сказал написать предназначены для того, что бы при синтезе эти триггеры у вас не минимизировались.
Резылутат минимизации вы сами видите на вашей временной диаграмме.Некоторые сигналы шины data_out имеют комбинаторный выход.


не помогает sad.gif Сигнал на выходы data_out[31:26] приходит явно позже чем на остальные. И еще чем отличаются RTL вию и текноложи вию ? на первом указаные выходы имеют тригеры а на втором судя по всему нет (хотя я не уверен)

PS И так ни кто и не ответел на вопрос
Цитата
А можно про констрейны по-подробнее? Или что почитать посоветуйте про них и вообще и если можно с рускими буквами smile.gif?
vetal
Выключите так же:
Remove duplicate registers -off.
При просмотре в tmv выделите пины с 26 по 31 и правойкнопкой отфильтруйте по sources.
Все эти выводы должны иметь регистровый выход(У меня по крайней мере так), т.е. разности задержек быть не должно.
Сигнал clk должен сидеть на глобальном буфере.

Цитата
И еще чем отличаются RTL вию и текноложи вию ?

Первый- то что вы написали, а второй то что получили.
des00
Насчет счетчика и всех асинхронно/синхронных дел
Если посмотреть на то, из какаих ЛЯ состоит ваша ЦПЛД, то можно увидеть что у вас есть тригеры, которые можно сбрасывать либо асинхронно, либо синхронно.

Если реализовать оба вида сброса на одном и том же элементе, то будет использована дополнительная логика общего применения и то что вы хотите займет больше места на чипе. но вам как я понял это не критично.
Имхо счетчик на ЦПЛД лучше сделать на обычных тригерах, не используя суматор + тригеры (как на ФПГА), но здесь нужно внимательно посмотреть на струкутру ЛЯ. и тогда у вас получиться описать так, что бы синтезатор вас понял.

Насчет КА, вам решать какой способ описания использовать, но если уж учиться то нужно учиться делать хорошо smile.gif)
а если вам потребуеться автомат на 50 состояний ?

Рекомендую почиать вам xst.pdf(раздел HDL coding styles), cfg.pdf (документация на ISE).
и доку на симплифай, там расписанно что такое констрейны и с чем их едят smile.gif
White
2 vetal Спасибо за советы все заработало a14.gif

2 des00 Понятно. За ссылки на доки спасибо, на русском бы что-нибудь smile.gif
Ну ладно будем есть что дают . Спасибо за помощь a14.gif
des00
Цитата(White @ Sep 14 2005, 05:07)
За ссылки на доки спасибо, на русском бы что-нибудь smile.gif

Это врядли, да и еще 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.