VHDL中的匹配模拟和后合成行为

VHDL中的匹配模拟和后合成行为,vhdl,quartus,Vhdl,Quartus,这个问题是另一个问题的延伸 然而,由于代表分数不足50分,我无法就进一步的解释发表评论 因此,我在链接中遇到了同样的问题,并接受了显示的答案。然而,现在我对推荐的方法感兴趣,以便将模拟与合成后行为相匹配。链路中的公认答案表示,不建议将电平敏感锁存作为解决方案,因为它们会导致更多问题。所以我的问题是,推荐的方法是什么?有吗 换句话说,我想在那个职位上实现我的目标,但这样做不会带来更多的问题。我需要我的敏感度列表不被我的合成工具忽略 另外,我是VHDL新手,所以使用进程可能不是实现我想要的结果的正确

这个问题是另一个问题的延伸

然而,由于代表分数不足50分,我无法就进一步的解释发表评论

因此,我在链接中遇到了同样的问题,并接受了显示的答案。然而,现在我对推荐的方法感兴趣,以便将模拟与合成后行为相匹配。链路中的公认答案表示,不建议将电平敏感锁存作为解决方案,因为它们会导致更多问题。所以我的问题是,推荐的方法是什么?有吗

换句话说,我想在那个职位上实现我的目标,但这样做不会带来更多的问题。我需要我的敏感度列表不被我的合成工具忽略


另外,我是VHDL新手,所以使用进程可能不是实现我想要的结果的正确方法。我使用的是带有Quartus Prime 16.0的DE2-115。任何信息都将不胜感激。

如果您使用VHDL对基于FPGA的原型板进行编程,您将对该语言的合成语义感兴趣。它与语言参考手册(LRM)中描述的模拟语义有很大不同。更糟糕的是:它没有标准化,并且在合成工具之间有所不同。总之,合成意味着从VHDL代码到数字硬件的转换。对于仍然不清楚合成语义的初学者,这里唯一推荐的方法是:

先考虑硬件,然后编码。

换句话说,在一张纸上画一个你想要的硬件框图。并使用以下10条规则。严格地说。没有例外。从未。别忘了仔细检查最后一个,它和其他的一样重要,但更难验证

  • 用一个大矩形环绕图形。这是你们电路的边界。所有跨越此边界的对象都是输入或输出端口。VHDL实体将描述此边界
  • 将边缘触发寄存器(如方形块)与组合逻辑(如圆形块)明确分开
  • 不要使用水平触发闩锁
  • 仅使用上升沿触发寄存器,并对所有寄存器使用相同的单个时钟。它的名字是
    clock
    。它来自外部,是所有方形块的输入,并且只有它们。甚至不要表示时钟,它对于所有的方块都是相同的,您可以将它隐式地保留在图表中
  • 用命名箭头和定向箭头表示块之间的通信。对于箭头来自的块,箭头是一个输出信号。对于箭头指向的块,箭头是一个输入信号
  • 箭头只有一个原点,但可以有多个目标。如果箭头有多个目的地,请根据需要多次叉箭头
  • 一些箭头来自大矩形的外部。这些是实体的输入端口。输入箭头也不能是任何块的输出
  • 有些箭射向外面。这些是输出端口。输出箭头有一个原点和一个目标:外部。输出箭头上没有叉。因此,输出箭头不能同时也是其中一个块的输入。如果要使用输出箭头作为某些块的输入,请插入一个新的圆形块,将其拆分为两部分:新块的输入,可以使用任意数量的叉子,以及来自新块的输出箭头,并将其伸出。新块将成为VHDL中的简单连续赋值。一种透明的重命名
  • 所有不从外部进出的箭头都是内部信号。您将在体系结构中声明它们
  • 图中的每个循环必须至少包含一个方块
  • 如果用这种方法无法找到描述所需函数的方法,那么问题在于所需函数。不使用VHDL或合成器。这意味着您想要的功能不是数字硬件。使用另一种技术实现它

    VHDL编码成为一个细节:

    • 每平方块一个同步进程
    • 每个圆形块一个组合过程
    同步进程如下所示:

    process(clock)
    begin
      if rising_edge(clock) then
        o1 <= i1;
        ...
        on <= in;
      end if;
    end process;
    
    process(i1, i2,... , in)
      <declarations>
    begin
      o1 <= <default_value_for_o1>;
      ...
      om <= <default_value_for_om>;
      <statements>
    end process;
    
    其中,中的
    i1,i2,…,是进入图表相应圆形块的所有箭头全部仅此而已。不要忘记一个箭头,也不要添加任何其他内容。没有例外。从未。其中,
    o1,…,om
    所有输出图表相应圆形块的箭头全部仅此而已。除了
    、输入的名称、输出的名称、
    的值外,不要更改任何内容。不要忘记单个默认值赋值。如果必须创建新的圆形块来拆分主输出箭头,则相应的过程如下:

    process(i)
    begin
      o <= i;
    end process;
    
    过程(一)
    开始
    
    o我需要我的敏感度列表不被我的合成工具忽略。使用供应商推荐的顺序构造(如问题的答案所示)。条件或语句中的任何评估信号都应在灵敏度列表中(在-2008中等同于使用保留字
    all
    )。见Quartus Prime标准版手册第1卷,第12页。推荐的HDL编码样式、寄存器和锁存器编码样式。模拟(结果未显示)似乎依赖于CE从灵敏度列表中推断出的锁存器,该锁存器未用于合成(且未提供锁存器)。简而言之,使用VHDL进行数字硬件设计。非常有用的信息,这有助于解决很多问题。我想我理解它是如何工作的,但是你是否有一个你描述的设计过程的视觉参考(例如视频教程),或者研究“block d”的合适名称是什么
    o <= i;
    
    process(clock, reset)
    begin
      if reset = '1' then
        o <= reset_value_for_o;
      elsif rising_edge(clock) then
        o <= i;
      end if;
    end process;