此问题是此处显示的另一个问题的扩展,VHDL Process Confusion with Sensitivity Lists
但是,如果得分低于50,我无法评论进一步的解释。
所以,我从链接遇到了同样的问题并接受了显示的答案。但是,现在我对推荐的方法感兴趣,以便将模拟与后合成行为相匹配。链接中接受的答案表明,不建议使用Level Sensitive Latches作为解决方案,因为它们会导致更多问题。所以我的问题是推荐的方法是什么?有吗?
换句话说,我想要实现在那篇文章中想要实现的目标,但这种方式不会导致更多问题。我需要我的灵敏度列表不被我的综合工具忽略。
此外,我是VHDL的新手,因此使用流程可能无法实现我想要的结果。我使用的是带有Quartus Prime 16.0的DE2-115。任何信息将不胜感激。
答案 0 :(得分:2)
如果您使用VHDL编程基于FPGA的原型开发板,您会对该语言的综合语义感兴趣。它与语言参考手册(LRM)中描述的模拟语义有很大不同。更糟糕的是:它没有标准化,并且在综合工具之间有所不同无论如何,综合意味着从VHDL代码到数字硬件的转换。这里唯一推荐的方法是,对于仍然不清楚理解合成语义的初学者是:
先考虑硬件,然后再编码。
换句话说,在一张纸上绘制一个漂亮的硬件框图。并使用以下10条规则。严格。没有例外。决不。并且不要忘记仔细检查最后一个,它与其他人一样重要,但更难以验证。
clock
。它来自外部,是所有方块的输入,只有它们。甚至不代表时钟,它对于所有方块都是相同的,你可以在图中隐含它。如果您无法通过此方法找到描述所需功能的方法,则问题在于您想要的功能。不使用VHDL或合成器。这意味着您想要的功能是不数字硬件。使用其他技术实现它。
VHDL编码成为一个细节:
同步过程如下所示:
process(clock)
begin
if rising_edge(clock) then
o1 <= i1;
...
on <= in;
end if;
end process;
其中i1, i2,..., in
是所有箭头,用于输入图表的相应方块,而o1, ..., om
是所有箭头,用于输出相应的方块你的图表。除信号名称外,不要更改任何内容。没有。甚至不是一个角色。 OK?
组合过程如下所示:
process(i1, i2,... , in)
<declarations>
begin
o1 <= <default_value_for_o1>;
...
om <= <default_value_for_om>;
<statements>
end process;
其中i1, i2,..., in
是所有箭头,用于输入图表的相应圆形块。 全部,不再有。不要忘记单箭头,不要添加任何其他内容。没有例外。决不。并且o1, ..., om
是所有箭头,其中输出图表的相应圆形块。 全部,不再有。请勿更改<declarations>
以外的任何内容,输入的名称,输出的名称,<default_value_for_oi>
和<statements>
的值。 不会忘记单个默认值分配。如果必须创建一个新的圆形块来分割主输出箭头,则相应的过程只是:
process(i)
begin
o <= i;
end process;
你可以简化为:
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;
在一个组合过程中合并几个组合过程。这是微不足道的,只是对程序框图的简单重组。
将一些组合进程与同步进程合并。但为了做到这一点,你必须回到你的方框图并添加第十一条规则:
稍后您还将开始使用锁存器,时钟下降沿,多个时钟和时钟域之间的重新同步......但我们将在时机成熟时讨论这些。