Vhdl 如果我从敏感度列表中删除NS,有什么区别吗?

Vhdl 如果我从敏感度列表中删除NS,有什么区别吗?,vhdl,fpga,Vhdl,Fpga,我正在读《自由范围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; -- a

我正在读《自由范围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;

在检查了这个问题之后,这被认为是一个重复的问题,并且它的答案缺乏任何权威参考,关于信号何时属于灵敏度列表,可能值得问一下,这些信息来自哪里

您可以注意到,在VHDL中,自由范围VHDL只提到等待作为保留字。事情远不止这些。VHDL标准(IEEE Std 1076-2008 10.3过程声明)中描述的过程声明告诉我们:

如果在保留字process之后出现一个进程敏感度列表,则假定该进程语句包含一个隐式等待语句作为进程语句部分的最后一个语句;此隐式wait语句的形式为

等待您的列表

然后继续讨论10.2 Wait语句的规则如何应用于由保留字all组成的敏感度列表

实例18的自由范围VHDL清单7.1解决方案中实体my_fsm1的体系结构fsm1的syn_proc根据10.2 Wait语句中隐式生成的灵敏度的规则,具有灵敏度列表

然而,这并不是一套完整的权限。还有IEEE Std 1076.6-2004(RTL合成,现已撤销)6.1.3.1具有灵敏度列表和一个时钟的过程中的边缘敏感存储:

d) 工艺灵敏度列表包括由Peter Ashenden控制的时钟和任何信号


这里要表达的思想是,如果不知道怎么做,你就无法理解为什么。

我们总是在灵敏度列表中使用带时钟和复位的过程块来描述时序电路。在灵敏度列表中,使用带每个驱动器信号的过程块来描述组合电路

有时,灵敏度列表仅对模拟很重要,但如果您忘记了一个信号或在灵敏度列表中添加了太多信号,则可能会得到错误的模拟结果。大多数情况下,如果逻辑正确,真正的FPGA功能将正常工作

但它会引起一些问题

例如,如果您在具有灵敏度(b)的always块中描述类似a=b&c的函数;但是你忘了c。那么在你的模拟中,当c改变时,a不会改变。但实际FPGA中的电路,将正确描述函数a=b&c。当您合成代码时,可能会收到警告

你可以称之为“前sim卡和后sim卡不一致”

真正可怕的是,你的前sim卡是对的,但后sim卡是错的。这可能会导致FPGA功能不正确


因此,我建议您在编写VHDL代码时,描述电路而不是函数。

可能的重复绝对不需要在过程的灵敏度列表中。它通过灵敏度列表中的CLK上升沿进行采样。它的当前值将分配给PS的投影输出波形。有更好的书可以自学VHDL。附带建议:不要养成使用“ns”和“ps”作为信号名的习惯。在测试台中,您希望这些表示时间单位ns和ps。如果您有本地名称信号名称ns和/或ps,它们将优先,并且您的模拟器不会给您提供非常有用的错误消息。如果
ps
是“上一个状态”,而
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;