Asynchronous Synplify:不支持异步加载foo的非常量数据

Asynchronous Synplify:不支持异步加载foo的非常量数据,asynchronous,vhdl,reset,synthesis,Asynchronous,Vhdl,Reset,Synthesis,在尝试使用Synplify Pro(Lattice edition)编译和合成VHDL设计时,我收到以下错误和警告: Asynchronous load of non-constant data for counter(0) is not supported Input data for signal counter(31 downto 0) contains references to signal edges. An asynchronous reset may be missing fro

在尝试使用Synplify Pro(Lattice edition)编译和合成VHDL设计时,我收到以下错误和警告:

Asynchronous load of non-constant data for counter(0) is not supported
Input data for signal counter(31 downto 0) contains references to signal edges. An asynchronous reset may be missing from the sensitivity list.
第一个错误是CL126,手册中描述为“HDL代码包含顺序元素上异步负载的不完整描述”

第二行是一个警告(CL116),但在手册中找不到,谷歌也空了

我从中得出的结论是,Synplify无法推断正在使用异步重置,尽管我在没有为同一行提供警告的情况下也得到了其他行的第一个错误

包含cnt/计数器变量和信号(整数)的块:

接收计数器:处理(重置、接收添加、接收重新设置)
变量cnt:整数;
开始
如果重置='1'或接收\u rst'事件,则
cnt:=-1;

计数器在我使用过的任何合成工具中,有两种有效的模式用于实现重置。很明显,边缘(上升或下降)可以改变,复位的极性也可以改变:

process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;
过程(重置、时钟)
开始
如果(重置='1'),则

q在我使用的任何合成工具中,有两种有效的模式可以实现重置。很明显,边缘(上升或下降)可以改变,复位的极性也可以改变:

process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;
过程(重置、时钟)
开始
如果(重置='1'),则

q
elsif receive\u add'event则
有问题:选择一条边!例如,
elsif上升沿(接收添加),然后
。。。但这可能不是你的问题。可能是
receive\u rst'事件
有问题。
els如果接收添加事件
有问题:选择一条边!例如,
elsif上升沿(接收添加),然后
。。。但这可能不是你的问题。可能
receive\u rst'event
是。一位熟人建议我的问题是FPGA结构不支持DDR触发器,这是有道理的,因为“event用法”。这似乎也与你的答案不符。一个可能的解决方案是在VHDL中实现DDR FFs,这样合成器就可以使用常规FFs来模拟所需的行为。@Mayapsch您的代码没有描述DDR触发器。无论如何,综合工具通常不支持DDR元素的推断。正如我所说,您需要创建一个基于我的答案中的模式使用寄存器的设计。如果你试图模拟DDR寄存器,你将与传统的设计技术背道而驰,最终可能会得到比简单地使用可用模式更复杂的设计。一位熟人建议我的问题是FPGA结构不支持DDR触发器,这是有意义的,因为“事件使用”。这似乎也与你的答案不符。一个可能的解决方案是在VHDL中实现DDR FFs,这样合成器就可以使用常规FFs来模拟所需的行为。@Mayapsch您的代码没有描述DDR触发器。无论如何,综合工具通常不支持DDR元素的推断。正如我所说,您需要创建一个基于我的答案中的模式使用寄存器的设计。如果您试图模拟DDR寄存器,您将与传统的设计技术背道而驰,并且很可能会得到比使用可用模式更复杂的设计。
process (clk)
begin
  if (rising_edge(clk)) then
    if (reset = '1') then
      q <= '0';
    else
      q <= d;
    end if;
  end if;
end process;
process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;
process (reset, clk)
begin
  if (reset = '1') then
    q <= d2;  -- Async load
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;