Перейти к содержанию
    

2 процесса, один из которых является следствием второго

Здрасьте!

 

Есть код:

...
process(clk,strob)
begin
--Проверяем на знакоперемену
if we='1' and ch='0' then 
--Если we стал = "1" - держим strob в "1" 
  strob<='1';
else strob<='0';    
end if;

if rising_edge(clk) then
ch<=we;
if cnt=159 then --some actions(регистр Reg заполнен)
else --other actions (регистр Reg не заполнен)
end if;
end if;--clk

if rising_edge(strob) then
cnt:=cnt+1;
Reg<=Reg[158..0] & in;
end if;--strob

end process;
...

 

Из приведенного выше кода видно, что we и clk являются внешними сигналами (we - асинхронный, clk - высокочастотный), ch - trigger, хранящий предыдущее значение сигнала we, strob - внутренний сигнал - строб:

--Проверяем на знакоперемену
if we='1' and ch='0' then 
--Если we стал = "1" - держим strob в "1" 
  strob<='1';
else strob<='0';    
end if;

STROB - асинхронный сигнал. Но мне надо его сделать синхронизирующим - по нему заполняется регистр и инкрементируется счетчик.

Check syntax не ругается, а вот Syntesis - ругается. Не может этот самый регистр привязать к синхронизации:

Signal Reg<159> cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.

 

Что можете предложить, многоуважаемые кроты? :)

Copyright: Thumberlina (Дюймовочка)

 

Вот полный код для лучшего восприятия:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity procs is
    Port ( 
                                
                                -- Рабочие выводы
---------------------------------------------------------------------------
              in        : in  std_logic;
           clk             : in  std_logic;
              we                 : in  std_logic);
end procs;

architecture Behavioral of procs is
    signal ch         : std_logic:='0';
    signal strob     : std_logic:='0';
    signal Reg             : std_logic_vector (159 downto 0):=(others => '0');

begin

process(clk,strob)
variable 
cnt:integer:=0;

begin
--Проверяем на знакоперемену
    if we='1' and ch='0' then
--Если we стал = "1" - держим strob в "1"
            strob<='1';
    else     strob<='0';    
    end if;

    if rising_edge(clk) then
        ch<=we;
        if cnt=159 then 
         Reg<=Reg(158 downto 0) & (Reg(5) xor Reg(8));--some actions(регистр Reg заполнен)
        else Reg<=Reg;--other actions (регистр Reg не заполнен)
        end if;
    end if;--clk

    if rising_edge(strob) then
        cnt:=cnt+1;
        Reg<=Reg(158 downto 0) & in;
    end if;--strob

end process;

end Behavioral;

 

Пока на выход ничего не подаю - это болванка....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здрасьте!

'''

Что можете предложить, многоуважаемые кроты? :)

Copyright: Thumberlina (Дюймовочка)

 

Для начала разбить на несколько процессов, а не сваливать всё в кучу в один (будет наляднее). Затем для всех процессов использовать только ОДИН тактовый сигнал, например clk, а strob подавать на вход enable триггера. Например так:

 

process(clk)
begin

--Проверяем на знакоперемену
if rising_edge(clk) then
   
   if we='1' and ch='0' then 
   --Если we стал = "1" - держим strob в "1" 
      strob<='1';
   else 
      strob<='0';    
   end if;

end if;

end process;

process(clk)
begin

if rising_edge(clk) then
   
   if (strob='1') then 
      cnt:=cnt+1;
      Reg<=Reg[158..0] & in;
  end if;--strob

end if;

end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш пример работает, однако при добавлении вот этого куска в process(clk) - опять FAILED...

   if rising_edge(clk) then
        ch<=we;
        if cnt=159 then
         Reg<=Reg(158 downto 0) & (Reg(5) xor Reg(8));--some actions(регистр Reg заполнен)
        else Reg<=Reg;--other actions (регистр Reg не заполнен)
        end if;
    end if;--clk

 

И все же - у вас только clk управляет схемой, мне же надо, чтоб управляли схемой два сигнала - strob and clk.

 

И строб у Вас тоже завязан на clk. Хотелось бы сделать его асинхронным - вынести за rising_edge(clk) и вообще за любой *'event. У меня было так:

process (clk,strob)
begin
   if we='1' and ch='0' then
      strob<='1';
   else
      strob<='0';    
   end if;

--Далее:
   if rising_edge(clk) then
        ch<=we;
        if cnt=159 then
         Reg<=Reg(158 downto 0) & (Reg(5) xor Reg(8));--some actions(регистр Reg заполнен)
        else Reg<=Reg;--other actions (регистр Reg не заполнен)
        end if;
    end if;--clk

end process;

 

Однако когда все совмещаю вмесое - FAILED...

В принципе, в Xilinx возможно управление по двум клокам одной и той же комбинационной схемы? Коллизий не будет - за всем смотрит внешний процессор, поэтому я и хочу собрать такую схему. Позволит ли мне это сделать Xilinx-XST и вообще VHDL?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш пример работает, однако при добавлении вот этого куска в process(clk) - опять FAILED...

А вы не добавляйте :), а если сильно хочется, то в отдельный процесс.

 

И все же - у вас только clk управляет схемой, мне же надо, чтоб управляли схемой два сигнала - strob and clk.

У нас схемой управляет strob, который синхронизирован с clk, так шо усё как надо.

 

И строб у Вас тоже завязан на clk. Хотелось бы сделать его асинхронным - вынести за rising_edge(clk) и вообще за любой *'event.

...

Однако когда все совмещаю вмесое - FAILED...

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

Позволит ли мне это сделать Xilinx-XST и вообще VHDL?

Xilinx-XST может и позволит, но лучше так не делать, если нет очень острой необходимости. Схему лучше сделать синхронной, управляемой одним клоком, если это возможно. Так легче.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы сделать его асинхронным - вынести за rising_edge(clk) и вообще за любой *'event.

 

Простой вопрос

 

1. Что вы понимаете под асинхронным сигналом ?

2. Зачем ва это надо ?

 

У меня было так:

process (strob)
begin
   if we='1' and ch='0' then
      strob<='1';
   else
      strob<='0';    
   end if;
end process;

 

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

 

Удачи !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ладно, эт я с дуру написал - спешил, а вот если я вообще вынесу эту схему за процесс?

architecture Behavioral of Str is
begin
   if we='1' and ch='0' then
      strob<='1';
   else
      strob<='0';    
   end if;
process (strob)
begin
...
end process;
end Behavioral;

 

так можно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ладно, эт я с дуру написал - спешил, а вот если я вообще вынесу эту схему за процесс?

architecture Behavioral of Str is
begin
   if we='1' and ch='0' then
      strob<='1';
   else
      strob<='0';    
   end if;
process (strob)
begin
...
end process;
end Behavioral;

 

так можно?

 

Прекращайте спешить и сдуру писать в форум

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вне процесса нужно писать по-другому:

strob <= '1' when we='1' and ch='0' else '0';

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

PS: а сдуру эт я только первый раз написал, и то - потому что спешил!

PPS: а спешил - потому что с дуру! :)

 

Ну, извините, если что!

И спасибо еще раз!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if rising_edge(clk) then

Reg<=Reg(158 downto 0) & (Reg(5) xor Reg(8));--some

 

if rising_edge(strob) then

Reg<=Reg(158 downto 0) & in;

 

Попробуйте это на железо переложить.

Что в одном, что в разных процессов, Reg наверно надо один раз полностью описывать.

Тогда и на железо ляжет.

 

Что касается

strob <= '1' when we='1' and ch='0' else '0';

Разве это не эквивалентно

strob <= we='1' and ch='0';

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sazh Эквивалентно, конечно. Написал так просто для того, чтобы было понятно соответствие конструкций if else elsif внутри процесса и описания того же вне процесса.

Вообще, даже так:

strob <= we and not ch;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to sazh:

Попробуйте это на железо переложить.

Что в одном, что в разных процессов, Reg наверно надо один раз полностью описывать.

Тогда и на железо ляжет.

 

немного недопонял.... Как его "полностью один раз описать"?

В железе должен по идее стоять ключ, переключающий клоки на Reg в зависимости от условий. У меня условие (если посмотреть вверху темы) - это значение счетчика cnt. Это условие проверяется что в одном, что в другом процессе. Просто Xilinx-XST не любит двух независимых процессов! Ему подавай один top "if clk'event" а остальное else"ами или elsif'ами. А вот я бы хотел два отдельных процесса, потому что знаю - коллизий между strob и clk не будет (почему - тоже в этой теме я писал). У меня в связи с этим вопрос - может описать отдельный entity и оттуда посылать clk?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что касается

strob <= '1' when we='1' and ch='0' else '0';

Разве это не эквивалентно

strob <= we='1' and ch='0';

Конечно нет. strobe типа std_logic, а у вас справа результат выражения типа boolean. Без приведения типа не обойтись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

немного недопонял.... Как его "полностью один раз описать"?

В железе должен по идее стоять ключ, переключающий клоки на Reg в зависимости от условий. У меня условие (если посмотреть вверху темы) - это значение счетчика cnt. Это условие проверяется что в одном, что в другом процессе. Просто Xilinx-XST не любит двух независимых процессов! Ему подавай один top "if clk'event" а остальное else"ами или elsif'ами. А вот я бы хотел два отдельных процесса, потому что знаю - коллизий между strob и clk не будет (почему - тоже в этой теме я писал). У меня в связи с этим вопрос - может описать отдельный entity и оттуда посылать clk?

 

Что любит xst, в xst.pdf расписано. Покажите мне библиотечный примитив или макрос, у которого два входа, реагирующие на фронт сигнала, да еще разлуливающий ситуацию бесприоритетных условий.

(Он не знает, да его и не волнует, будут коллизии или нет).

Поэтому или if - elsif - else, или мультиплексор на входе регистровой структуры по клоку.

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

И как это делать, тут уже показали. А значение Ващего счетчика можете проверять как угодно.

Что в одном процессе, что в двух независимых процессах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...