我正在阅读自由范围VHDL一书,这是第8章的一个例子。
-- library declaration
library IEEE;
use IEEE.std_logic_1164.all;
-- entity
entity my_fsm1 is
port ( TOG_EN : in std_logic;
CLK,CLR : in std_logic;
Z1 : out std_logic);
end my_fsm1;
-- architecture
architecture fsm1 of my_fsm1 is
type state_type is (ST0,ST1);
signal PS,NS : state_type;
begin
sync_proc: process(CLK,NS,CLR)
begin
-- take care of the asynchronous input
if (CLR = '1') then
PS <= ST0;
elsif (rising_edge(CLK)) then
PS <= NS;
end if;
end process sync_proc;
comb_proc: process(PS,TOG_EN)
begin
Z1 <= '0'; -- pre-assign output
case PS is
when ST0 => -- items regarding state ST0
Z1 <= '0'; -- Moore output
if (TOG_EN = '1') then NS <= ST1;
else NS <= ST0;
end if;
when ST1 => -- items regarding state ST1
Z1 <= '1'; -- Moore output
if (TOG_EN = '1') then NS <= ST0;
else NS <= ST1;
end if;
when others => -- the catch-all condition
Z1 <= '0'; -- arbitrary; it should never
NS <= ST0; -- make it to these two statements
end case;
end process comb_proc;
end fsm1;
如果我从sync_proc
的敏感度列表中删除NS,是否有任何区别?
sync_proc: process(CLK,NS,CLR)
begin
-- take care of the asynchronous input
if (CLR = '1') then
PS <= ST0;
elsif (rising_edge(CLK)) then
PS <= NS;
end if;
end process sync_proc;
答案 0 :(得分:1)
在检查了问题后,这被认为是重复的,并且它的答案缺乏关于信号何时属于敏感性列表的任何权威性参考,可能值得询问从哪里得到的信息?
您可以注意 Free Range VHDL 仅提及在VHDL中等待作为保留字。还有更多的东西。 VHDL标准(IEEE Std 1076-2008 10.3流程声明)中描述的流程声明告诉我们:
如果在保留字进程之后出现过程敏感性列表,则假定过程语句包含隐式等待语句作为过程语句部分的最后一个语句;这个隐式的等待语句的格式为
等待sensitivity_list;
然后继续讨论如何将10.2 Wait语句的规则应用于由保留字 all 组成的敏感度列表。
实体my_fsm1的体系结构fsm1中的syn_proc来自自由范围VHDL 清单7.1示例18的解决方案根据10.2 Wait语句中的规则获得了一个敏感列表,用于隐式生成的灵敏度。
然而,这不是完整的权威机构。还有IEEE Std 1076.6-2004(RTL综合,现已撤销)6.1.3.1来自具有灵敏度列表和一个时钟的进程的边缘敏感存储:
d)过程灵敏度列表包括时钟和控制&lt; async_assignment&gt;的任何信号。
其中&lt; async_assignment&gt;在6.13建模边缘敏感存储元素中定义:
<强>&LT; async_assignment&GT; 即可。对不受&lt; clock_edge&gt;控制的信号或变量的赋值。在任何执行路径中。
并且&lt; clock_edge&gt;由约定(1.4)定义为在6.1.2时钟边缘规范中找到的BNF中定义的clock_edge的形式之一。
上面的(翻译:d)表示你认为阅读时的含义。)
这告诉我们这里需要什么信号。过程灵敏度列表中的不必要信号没有限制。然而,它们的效果可以从IEEE Std 1076-2008 10.2 Wait声明中看出:
由于等待语句的灵敏度集中的任何信号发生事件,暂停的进程也会恢复。如果发生此类事件,则评估条件子句中的条件。如果条件的值为FALSE,则进程再次暂停。这种重复暂停不涉及重新计算超时间隔。
等待陈述:
wait_statement :: =
[label:] 等待 [sensitivity_clause] [condition_clause] [timeout_clause] ;
如果您知道条件子句是可选的,如上面的方括号所示,则会有所帮助:
条件子句指定进程继续执行应满足的条件。如果没有出现条件子句,则假定条件子句直到为TRUE。
这意味着该过程将针对过程敏感性列表中的任何信号的任何事件重新开始,并将遍历它的顺序语句。
通过对信号NS执行事件的sync_proc,在模拟期间对设计层次结构的状态没有任何损害。 if语句中的赋值语句都不会受条件限制。您还可以注意到在CLK下降沿的事件也是如此。
削减敏感度列表的目的是最大限度地减少不必要地恢复过程的次数。设计模型越大越复杂,模拟就会越慢,特别是拖延不必要的恢复和暂停。
在过程灵敏度列表中显示的三个信号中,只有三个二进制值转换是有意义的,而在信号NS上没有。 NS的当前值在CLK的上升沿分配给PS。
进程在特定的等待语句中暂停并恢复。具有敏感性列表的进程不应包含显式的等待语句(10.3),这意味着它只有一个等待语句,即隐式语句。
在你的第一个关于VHDL的问题看来,你已经超出了 Free Range VHDL 所能提供的答案限制。
Peter Ashenden可能会The Designer's Guide to VHDL, 3rd edition对这个问题采取更好的恳求。
这里传达的想法是,如果不知道如何,你就无法理解。
答案 1 :(得分:0)
我们总是使用时钟处理块和灵敏度列表中的复位来描述序列电路。并使用处理块和灵敏度列表中的每个驱动信号来描述组合电路。
有时灵敏度列表仅对模拟很重要,但如果您忘记信号或在灵敏度列表中添加太多信号,则可能会得到错误的模拟结果。如果您的逻辑正确,大部分时间真正的FPGA函数都能正常工作。
但它可能会导致一些问题。
例如,如果在具有灵敏度的总块中描述类似a = b&amp; c的函数(b);但你忘了c。然后在模拟中,当c被改变时,a不会改变。但实际FPGA中的电路,将正确描述函数a = b&amp; c。当您综合代码时,您可能会收到警告。
您可以将其称为“预卡片和后卡片不一致”。
真正令人害怕的是你的前卡片是正确的,但你的后卡片是错误的。这可能会导致FPGA功能不正确。
所以我建议你在编写VHDL代码时描述电路而不是函数。