目的
使用Moore状态机完成对一输入序列的检测,当输入序列中有1011的特征时,输出一个时钟周期的高电平。举例如下:
如果输入的序列为:
0001_0110_1011_0111_0010_1010_1101_0000_1011_1101_1000_0010_1101_1011_0011...
则输出的序列为:
0000_0010_0001_0010_0000_0000_0100_0000_0001_0000_1000_0000_0100_1001_0000...
实现
1 detect_serial_fsm.v
根据设计需求,需要识别序列中出现的1011这一特定序列,使用Moore状态机来描述过程。那么可以设定:
当输入为1,从闲置态到达状态1;若输入为0则停留在闲置态。
在状态1若输入0,到达状态2;若为1则停留在状态1。
在状态2若输入为1,进入状态3;否则进入闲置态。
在状态3若输入为1进入状态4;否则返回状态2.
在状态4若输入为1,返回状态1,否则回到状态2,只有状态4产生输出1,且两种情况都输出1.
以上结果是在实验了几次最初画的状态图发现问题之后做出的。主要是考虑了返回时到达的状态。接下来主要说明判断识别返回的分支,由于判断的序列是1011,
来到状态1时,已经输过了1。此时若为1则出现11的序列,对比1011,只能重新从1开始识别,故回到状态1已经输过1的状态。
来到状态2时,已经输过10.此时若为0,则出现100序列,对比1011,只能从闲置态重新开始。
来到状态3时,已经输过101。若此时输入为0,则为1010,对比1011,只能从状态2(已经输过10)重新开始.
来到状态4时,已经输过1011。若此时输入1,则为10111,返回到状态1;若输入为0,已有10110对比1011回到状态2.
综上画出状态机如图:
思路完成,根据思路,设计代码如下(采用三段式写法):
module detect_serial_fsm(
input clk_i,
input rst_i,
input signal_i,
output reg detected_o,
output [4:0] curent_state_o //为观察方便ÿ