Ошибка VHDL не может вывести регистр, потому что его поведение не соответствует ни одной поддерживаемой модели регистра
Я новичок в VHDL и пытаюсь сделать приложение задержки / гейта для программируемой FPGA с регулируемой длиной задержки и выходом гейта. Как только входной сигнал получен, вещь должна игнорировать любые другие входы, пока генерация стробирующего сигнала не закончится.
Я хочу использовать этот компонент для 8 различных входов и 8 различных выходов позже, и установить желаемые параметры задержки / гейта отдельно для каждого посредством записи регистров.
При попытке компиляции в Quartus II v 11.0 я получаю эту ошибку:
Ошибка (10821): ошибка HDL в clkgen.vhd(46): невозможно определить регистр для "control_clkgen", поскольку его поведение не соответствует ни одной поддерживаемой модели регистров
А также
Ошибка (10822): ошибка HDL в clkgen.vhd(37): не удалось реализовать регистры для назначений на этом фронте тактовой частоты
Понятия не имею, что не так, вот код компонента:
library ieee;
use IEEE.Std_Logic_1164.all;
use IEEE.Std_Logic_arith.all;
use IEEE.Std_Logic_unsigned.all;
ENTITY clkgen is
port(
lclk : in std_logic;
start_clkgen : in std_logic;
gate_clkgen : in std_logic_vector(31 downto 0);
delay_clkgen : in std_logic_vector(31 downto 0);
output_clkgen : out std_logic
);
END clkgen ;
ARCHITECTURE RTL of clkgen is
signal gate_cycles_clkgen : std_logic_vector(32 downto 0);
signal delay_cycles_clkgen : std_logic_vector(32 downto 0);
signal total_cycles_clkgen : std_logic_vector(32 downto 0);
signal counter_clkgen : std_logic_vector(32 downto 0);
signal control_clkgen : std_logic;
begin
gate_cycles_clkgen <= '0' & gate_clkgen;
delay_cycles_clkgen <= '0' & delay_clkgen;
total_cycles_clkgen <= gate_cycles_clkgen + delay_cycles_clkgen;
start_proc: process(lclk, start_clkgen)
begin
if (start_clkgen'event and start_clkgen = '1') then
if control_clkgen = '0' then
control_clkgen <= '1';
end if;
end if;
if (lclk'event and lclk = '1') then
if control_clkgen = '1' then
counter_clkgen <= counter_clkgen + 1;
if (counter_clkgen > delay_cycles_clkgen - 1 AND counter_clkgen < total_cycles_clkgen + 1) then
output_clkgen <= '1';
elsif (counter_clkgen = total_cycles_clkgen) then
counter_clkgen <= (others => '0');
output_clkgen <= '0';
control_clkgen <= '0';
end if;
end if;
end if;
end process start_proc;
END RTL;
Заранее большое спасибо за помощь.
2 ответа
Проблема в том, как вы описали элемент control_clkgen
- он чувствителен к двум разным сигналам (lclk
, а также start_clkgen
). Инструменты говорят вам, что "эй, поскольку я пытаюсь приспособить ваш действительный дизайн VHDL к реальному аппаратному обеспечению, я обнаружил, что нет никаких аппаратных средств, которые могли бы реализовать то, что вы хотите. нет триггеров, которые могут быть чувствительными к фронту для двух сигналов (только один, как правило, часы).
Возможное решение: вам действительно нужно control_clkgen
быть чувствительным к краю start_clkgen
? Это было бы достаточно хорошо, или вы могли бы найти другое решение, где start_proc
чувствителен только к lclk
и вы просто проверьте, если start_clkgen
в приоритете?
start_proc: process(lclk)
begin
if (rising_edge(lclk)) then
start_clkgen_d <= start_clkgen;
if (start_clkgen='1' and start_clkgen_d='0') then
if control_clkgen = '0' then
control_clkgen <= '1';
end if;
end if;
end if;
...
Вы описываете регистр control_clkgen
который имеет два часа start_clkgen
а также lclk
, Я думаю, это не поддерживается вашим инструментом синтеза. Вы должны описать это поведение по-другому. Может быть, использовать start_clkgen
в качестве асинхронного или синхронного предварительно установленного сигнала или объединить эти два сигнала в один тактовый сигнал или использовать более одного триггера для этой функции.