我是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;
非常感谢您的帮助。
答案 0 :(得分: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;
...
答案 1 :(得分:1)
您正在描述一个寄存器control_clkgen
,它有两个时钟start_clkgen
和lclk
。我想你的综合工具不支持。
您必须以另一种方式描述此行为。也许使用start_clkgen
作为异步或同步预置信号,或者将这两个信号组合成一个时钟信号,或者使用多个触发器来实现该功能。