我正在开发一个包含fsm的VHDL项目。 有些州根据柜台改变。除了当前状态和输入之外,在我将'clk'放在灵敏度列表中之前它不起作用。 我知道在合成过程中,灵敏度没有使用或被丢弃。但是,如何才能对模拟结果产生这样的影响呢?如果离开这个'clk',fsm会不会像我想要的那样执行FPGA?
谢谢,
大卫
答案 0 :(得分:1)
这是一个简单的解释:
模拟器使用灵敏度列表来确定何时需要运行该过程。模拟器需要提示以确定何时运行该过程的原因是因为计算机处理器一次只能执行一个(或多个系统中只有少数几个),处理器将不得不轮流运行设计的每个部分。灵敏度列表允许模拟在合理的时间范围内运行。
当您将代码合成到ASIC或FPGA中时,该过程始终“正在运行”,因为它具有专用硬件。
当您在灵敏度列表中模拟没有时钟的状态机时,该过程将永远不会在时钟边沿运行,而只会在输入更改时运行。如果您将状态转换实现为触发器(如果clk'event和clk ='1'),那么除非您碰巧在时钟的上升沿同时更改输入,否则将永远不会模拟您的状态转换。 假设FSM在时钟边沿发生变化,您应该将时钟留在灵敏度列表中。
另外,请尝试校对您的问题。
答案 1 :(得分:0)
综合工具专注于逻辑设计(FPGA,ASIC)并忽略灵敏度列表,因为只有三种基本类型的逻辑:组合逻辑,边缘敏感存储(触发器和一些RAM)以及电平敏感存储(锁存器和一些RAM)。
组合逻辑要求所有输入信号都在灵敏度列表中。从综合工具的角度来看,如果缺少一个,他们可以忽略灵敏度列表并将其视为所有输入都在灵敏度列表中,或者产生一些触发器和组合逻辑的复杂组合,可能不会做什么用户还是想要的。这两者都有供应商的实施成本,因此,为什么投资(开发时间)来创造一些无用的东西。因此,唯一的好处是简化和忽略敏感度列表。
另一方面,模拟器具有比逻辑设计更大的视角。该语言定义敏感性列表以指示代码何时运行。因此,模拟器以高保真度实现该语义。长期来看,您可能会高兴地知道VHDL-2008允许在灵敏度列表中使用关键字“all”来替换那里的信号输入。这旨在简化组合逻辑的建模。语法如下:
MyStateMachine : process(all)
begin
-- my statemachine logic
end process MyStateMachine ;
打开VHDL-2008开关并在合成工具中将其打开。如果它不起作用,请务必提交该工具的错误。