Ошибка 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 в качестве асинхронного или синхронного предварительно установленного сигнала или объединить эти два сигнала в один тактовый сигнал или использовать более одного триггера для этой функции.

Другие вопросы по тегам