首页 文章

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

提问于
浏览
0

我是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 回答

  • 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

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

相关问题