原创 第3讲 状态机1--序列检测器

2016-2-5 15:00 5477 22 22 分类: FPGA/CPLD

序列检测器

实验目的:用状态机设计一个序列检测器,实现对序列10010的检测。

状态转换图如下:

20160205145840821001.gif

1 序列检测器的状态转换图

 

对于以上状态图作出如下说明:

1)各箭头上方的数字表示状态跳转条件及相应的输出结果。如:S0—>S1上的1/0表示当输入的数据为1时,由状态S0跳转到状态S1,并且输出为0,表示还未检测到(或未检测完)数据流10010。同理,当完整地检测到10010时就输出1

2)从S0~S5共有六种状态,在设计程序的时候,通常是采用3bit数据类型表示即可,但是,为了适应高速数字电路的应用需求,扩大数据信号的时间窗(时间窗由建立时间和保持时间构成),避免出现不稳定的中间态,故此六种状态采用6bit的数据类型表示。

3)下面描述一下状态跳转的过程:

S0为起始状态(或默认状态),当第一个bit到来的时候,判断其是否为1,若为1则跳转到S1状态,并输出0作为标志信号,表示序列检测尚未完成;若为0则保持当前状态不变,同时输出标志信号0

若当前状态为S1,当前输入的bit0,则状态机跳转到S2状态,并输出标志信号0;若当前输入的bit1,则保持当前状态不变。

若当前状态为S2,当前输入的bit0,则状态机跳转到S3状态,并输出标志信号0;若当前输入的bit1,则状态机跳转到S1状态,并输出标志信号0

若当前状态为S3,当前输入的bit1,则状态机跳转到S4状态,并输出标志信号0;若当前输入的bit0,则状态机跳转到S0状态,并输出标志信号0

若当前状态为S4,当前输入的bit0,则状态机跳转到S5状态,并输出标志信号1,检测到一个完整的“10010”序列;若当前输入的bit1,则状态机跳转到S1状态,并输出标志信号0

若当前状态为S5,当前输入的bit0,则状态机跳转到S3状态,并输出标志信号0;若当前输入的bit1,则状态机跳转到S1状态,并输出标志信号0

除上述跳转过程外,各状态均需加上一条复位跳转路径,即:当复位信号rst_n当来的时候,任何状态都跳转到S0状态,输出0作为标志信号。

按照上面的状态跳转图写状态机,控制状态跳转和信号输出,程序代码如下截图所示:

20160205145924961001.jpg

20160205145932411002.jpg

20160205145943817003.jpg

20160205145948821004.jpg

接下来是写testbench,代码如下:

20160205145955971005.jpg

20160205150000226006.jpg

以上testbench的目的:

1)产生频率为50MHz的时钟信号和复位信号;

2)产生测试需要的比特流序列,该序列为11100011010010100101100100100010,将它们送给序列检测器予以检测。

Quartus综合所得的状态转换图如下图所示:

QUARTUS综合后的序列检测器状态机图.png

2 Quartus综合所得的状态转换图

对比图2和图1可知,综合后所得的状态转换图与设计要求中的状态转换图一致,转换条件相同。下面,可以直接看仿真结果,仿真结果如图3所示:

序列检测器功能仿真图.png

3 仿真结果截图

由图3可知,in_data是我们产生的比特流,它们是11100011010010100101100100100010,与期望的值是一致的。同时,在对比特流进行序列检测的过程中,flag信号共出现了4次高电平,分别是在i1817之间、1312之间、76之间以及43之间,这与序列10010在比特流中的位置是一致的(左起是第31位,右起是第0位)。故由此可知,序列检测器的检测功能正常。

文章评论0条评论)

登录后参与讨论
我要评论
0
22
关闭 站长推荐上一条 /2 下一条