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;

非常感谢您的帮助。

4

2 回答 2

2

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

可能的解决方案:你真的需要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;
      ...
于 2012-06-25T10:55:02.163 回答
1

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

于 2012-06-25T10:52:54.827 回答