aleshanoff 0 15 мая, 2016 Опубликовано 15 мая, 2016 · Жалоба Добрый день, уважаемые товарищи. Проектирую на VHDL блок, который по спаду одного сигнала (hf) устанавливает выход(o) в 1, а по фронту другого ® - в 0. Симуляция в iSim проходит на ура, а синтезатор ругается : " Signal o 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." что в переводе означает: "Сигнал о не могут быть синтезированы, плохая синхронное описание. Описание стиля вы используете для описания синхронного элемента (регистр, память и т.д.) не поддерживается в текущей версии программного обеспечения." Помогите, пожалуйста, обойти проблему. У меня не хватает опыта. entity hf_spad is Port ( hf : in STD_LOGIC; r : in STD_LOGIC; o : out STD_LOGIC); end hf_spad; architecture Behavioral of hf_spad is begin process (hf,r) begin if (hf'event and hf='0') then o<='1'; elsif (r'event and r='1') then o<='0'; end if; end process; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 15 мая, 2016 Опубликовано 15 мая, 2016 (изменено) · Жалоба Просто в железе нет таких элементов, у которых бы были два входа, чувствительные к фронту. Как вариант обхода этого - сделать синхронный вариант: на неком клоке выделять нужные фронты и потом на том же клоке сделать ваш процесс синхронным. Изменено 15 мая, 2016 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleshanoff 0 15 мая, 2016 Опубликовано 15 мая, 2016 · Жалоба Спасибо HF - внешний несинхронный сигнал. R - внутренний сигнал, который через определенное время останавливает обработку до следующего спада HF. Как это можно реализовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 15 мая, 2016 Опубликовано 15 мая, 2016 · Жалоба HF - внешний несинхронный сигнал. R - внутренний сигнал, который через определенное время останавливает обработку до следующего спада HF. Как это можно реализовать? При такой постановке задачи - никак. Если почитать книжки по VHDL, то можно ввести в систему тактовый сигнал CLK, "протянуть" через него и входной сигнал HF, чтобы стал синхронным, и внутренний R - на всякий случай ибо автор есть зело непредсказуем. И построить регистр с разрешением записи и сбросом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 15 мая, 2016 Опубликовано 15 мая, 2016 · Жалоба При такой постановке задачи - никак. Если почитать книжки по VHDL, то можно ввести в систему тактовый сигнал CLK, "протянуть" через него и входной сигнал HF, чтобы стал синхронным, и внутренний R - на всякий случай ибо автор есть зело непредсказуем. И построить регистр с разрешением записи и сбросом. Добавлю... 1. Сначала прочитать про пересечение клоковых доменов. 2. Прочитать про синхронное проектирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleshanoff 0 16 мая, 2016 Опубликовано 16 мая, 2016 · Жалоба Получилось решить проблему с помощью стандартного FDRS -триггера. на вход s подал сигнал hf, на вход сброса - сигнал r, выход триггера замкнул на вход d и с него же беру нужны сигнал управления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 16 мая, 2016 Опубликовано 16 мая, 2016 · Жалоба Получилось решить проблему с помощью стандартного FDRS -триггера. на вход s подал сигнал hf, на вход сброса - сигнал r, выход триггера замкнул на вход d и с него же беру нужны сигнал управления. Хреново одним словом! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 16 мая, 2016 Опубликовано 16 мая, 2016 · Жалоба лучше тогда следующим образом: JK триггер library IEEE; use IEEE.std_logic_1164.all; entity JK_tr is port (J: in STD_LOGIC; K:in STD_LOGIC; CLK:in STD_LOGIC; Reset: in STD_LOGIC; Q: out STD_LOGIC); end JK_tr; architecture JK_tr of JK_tr is begin process(clk, reset) is variable Qint: STD_LOGIC; begin if (reset ='0') then Qint:='0'; elsif (CLK'event and CLK ='1') then if (J='1' and K='1') then Qint := not(Qint); elsif (J='0' and K='0') then Qint:=Qint; elsif (J='1' and K='0') then Qint:='1'; elsif (J='0' and K='1') then Qint:='0'; end if; end if; Q<=Qint; end process; end JK_tr; + детектор переднего и заднего фронта входных импульсов/сигналов library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity det is Port ( clk : in STD_LOGIC; input : in STD_LOGIC; stroba : out STD_LOGIC; strobb : out STD_LOGIC); end det; architecture Behavioral of det is signal input_1, input_2 : STD_LOGIC; begin process(input, CLK, input_1, input_2) begin if (rising_edge(CLK)) then --- falling_edge(clk) input_1 <= input; input_2 <= input_1; end if; end process; stroba <= input_1 and (not input_2); strobb <= (not input_1) and input_2; end Behavioral; + синхронизация входных сигналов/импульсов, если эти сигналы/импульсы приходят из вне в ПЛИС или формируются на другой тактовой частоте library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity synchronizer is generic ( stages : natural := 3 ); Port ( clk : in STD_LOGIC; i : in STD_LOGIC; o : out STD_LOGIC); end synchronizer; architecture Behavioral of synchronizer is signal flipflops : std_logic_vector(stages-1 downto 0):= (others => '0'); attribute ASYNC_REG : string; attribute ASYNC_REG of flipflops: signal is "true"; begin o <= flipflops(flipflops'high); clk_proc: process(clk) begin if rising_edge(clk) then flipflops <= flipflops(flipflops'high-1 downto 0) & i; end if; end process; end Behavioral; Как соединить предлагаю Вам подумать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleshanoff 0 16 мая, 2016 Опубликовано 16 мая, 2016 (изменено) · Жалоба Спасибо большое! но не могли бы Вы прокомментировать последний код? как он работает в железе? а то на этапе задания атрибутов я запутался. Изменено 17 мая, 2016 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 16 мая, 2016 Опубликовано 16 мая, 2016 · Жалоба Спасибо большое! но не могли бы Вы прокомментировать последний код? как он работает в железе? а то на этапе задания атрибутов я запутался. рисунок 6 и 8 и читаем статью от уважаемого iosifk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleshanoff 0 17 мая, 2016 Опубликовано 17 мая, 2016 (изменено) · Жалоба Залил в железо. Работает на FDRS триггере стабильно. Может я неправильно описал используемые мной сигналы. HF и R изменяются всего один раз за цикл обработки, то есть каждый из сигналов представляет собой один импульс, которые никогда не пересекаются. Изменено 17 мая, 2016 пользователем aleshanoff Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleshanoff 0 19 мая, 2016 Опубликовано 19 мая, 2016 · Жалоба Итогом всех изысканий стал просто автомат на два состояния. Спасибо, iosifk. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity vxod_automat_1 is Port ( clk : in STD_LOGIC; hf : in STD_LOGIC; stop : in STD_LOGIC; r : in STD_LOGIC; o : out STD_LOGIC); end vxod_automat_1; architecture Behavioral of vxod_automat_1 is type state_type is (st0, st1); signal state: state_type; begin state_proc: process (clk, r) begin if r='1' then state <= st0; elsif (rising_edge(clk)) then case state is when st0 => if (hf='1' and stop='0')then state <= st1; else state <= st0; end if; when st1 => if (hf='0' and stop='1') then state <= st0; else state <= st1; end if; when others => state <=st0; end case; end if; end process ; out_proc: process (state) begin case state is when st0=> o <= '0'; when st1=> o <= '1'; when others => o<= '0'; end case; end process ; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться