背景:在做Blackjack Project时,做到FSM模块,由于涉及到的usersum和robotsum两个(时序的状态转换,组合的状态译码和组合的输出译码)时, usersum和robotsum形成Latch。并且map report中也显示生成门控时钟。宏观上,整个设计下载到试验板上状态机运行不正确。
分析:通过FPGA Editor查看生成门控时钟的模块,发现这种情况是由于生成了Latch,而驱动Latch的状态信号形成了门控时钟。产生这种状态的主要原因是输出译码模块是组合逻辑,没有保持功能,当需要保持一个值时,系统就自动产生了latch。由于门控时钟容易引起glitch,门控时钟控制的latch导致了usersum的不正常。
解决方法:将输出译码电路转换为时序逻辑,由时钟控制。将原来控制latch的信号转接到FF的CE端口。具体方法见示例代码。
原始代码结构:(按照ISE中的Language Templates)
type state_type is (st1_
, st2_, ...);
signal state, next_state : state_type;
--Declare internal signals for all outputs of the state machine
signal