
6.2 状态机设计实例
6.2.1 带同步清零端和装载端的模10计数器
本示例设计的是带同步清零端和装载端的模10计数器,可实现对输入时钟计数,输出当前计数结果和进位,并且具有使能端、同步清零端和同步装载端。计数器有“0000”~“1001”共10种计数状态和“0”、“1”两种进位状态。计数器分为三个部分。第一个部分为下一状态生成电路,根据复位端输入、装载端输入和当前状态生成下一计数状态和下一进位状态。第二部分为状态转移电路,在使能端为高电平时,计数器在时钟信号上升沿到来时,改变计数器的状态。第三部分为输出电路,根据计数器的当前状态输出计数结果和进位。
本示例的VHDL代码如下。



带同步清零端和装载端的模10计数器的RTL图如图6.3所示。

图6.3 带同步清零端和装载端的模10计数器的RTL图
图6.4是带同步清零端和装载端的模10计数器的仿真结果。输入是周期为20ns的时钟信号,使能信号在0ns至200ns及230ns后始终有效,清零信号在105ns至145ns有效。计数器使能有效时,在输入时钟上升沿时,计数器自动进入下一状态。当计数器的计数状态由“1001”状态进入“0000”状态时,进位状态变为高电平;计数器由“0000”进入“0001”,进位变为低电平。清零信号有效时,计数器输出没有立即清零,而是在下一个时钟上升沿才做出响应,实现了同步清零。装载信号有效时,计数器输出同样没有立即响应,而是在下一个时钟上升沿将状态转换为输入数据。仿真结果验证了设计的正确性。

图6.4 带同步清零端和装载端的模10计数器的仿真结果
6.2.2 带异步复位端的序列检测器
本示例设计的是带异步复位端的序列检测器,可实现对输入串行数据流中“10110”子序列的检测,输出当前检测结果,并且具有异步复位端。序列检测器使用独热码表示内部的状态,最大限度地在设计过程中降低延时和竞争的出现。序列检测器分为三个部分。第一个部分为下一状态生成电路,根据串行数据流输入端和当前状态生成下一个状态。第二部分为状态转移电路,实现异步复位,以及状态转换。第三部分为输出电路,根据序列检测器的当前状态输出检测结果。当检测到“10110”子序列时,检测器输出“1”。
本示例的VHDL代码如下。



图6.5是带异步复位端的序列检测器的仿真结果。输入是周期为20ns的时钟信号,复位信号在150ns至160ns之间有效。在输入时钟上升沿,序列检测器根据相应规则自动进入下一个状态。当序列检测器进入“000001”状态时,输出变为“1”。复位信号有效时,序列检测器立即复位到初始状态,实现了异步复位。仿真结果验证了设计的正确性。

图6.5 带异步复位端的序列检测器的仿真结果