VHDL错误无法推断寄存器,因为它的行为与任何支持的寄存器模型都不匹配

时间:2012-06-25 10:12:32

标签: vhdl

我是VHDL的新手,并尝试为可编程FPGA制作延迟/门应用,具有可调节的延迟和门输出。一旦收到输入信号,就应该忽略任何其他输入,直到完成门信号的生成。

我希望稍后将此组件用于8个不同的输入和8个不同的输出,并通过写入寄存器为每个输出分别设置所需的延迟/门控参数。

当尝试在Quartus II v 11.0中编译时,我收到此错误:

错误(10821):clkgen.vhd(46)处的HDL错误:无法推断“control_clkgen”的寄存器,因为其行为与任何支持的寄存器模型都不匹配

以及

错误(10822):clkgen.vhd(37)处的HDL错误:无法在此时钟边沿上为分配实现寄存器

不知道什么是错的,这是组件的代码:

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 个答案:

答案 0 :(得分:2)

问题在于,在您描述元素control_clkgen的方式中 - 它对两个不同的信号(lclkstart_clkgen)边缘敏感。工具告诉你的是“嘿,因为我试图使你的有效VHDL设计适合真正的硬件,我发现不是任何可以实现你想要的硬件。 基本上,没有触发器可以对两个信号(只有一个,通常是时钟)边缘敏感。

可能的解决方案:您真的需要control_clkgenstart_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;
      ...

答案 1 :(得分:1)

您正在描述一个寄存器control_clkgen,它有两个时钟start_clkgenlclk。我想你的综合工具不支持。 您必须以另一种方式描述此行为。也许使用start_clkgen作为异步或同步预置信号,或者将这两个信号组合成一个时钟信号,或者使用多个触发器来实现该功能。