热度 22
2016-2-5 15:00
5480 次阅读|
0 个评论
序列检测器 实验目的: 用状态机设计一个序列检测器,实现对序列 10010 的检测。 状态转换图如下: 图 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 ,当前输入的 bit 为 0 ,则状态机跳转到 S2 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则保持当前状态不变。 若当前状态为 S2 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S3 ,当前输入的 bit 为 1 ,则状态机跳转到 S4 状态,并输出标志信号 0 ;若当前输入的 bit 为 0 ,则状态机跳转到 S0 状态,并输出标志信号 0 。 若当前状态为 S4 ,当前输入的 bit 为 0 ,则状态机跳转到 S5 状态,并输出标志信号 1 ,检测到一个完整的“ 10010 ”序列; 若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S5 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 除上述跳转过程外,各状态均需加上一条复位跳转路径,即:当复位信号 rst_n 当来的时候,任何状态都跳转到 S0 状态,输出 0 作为标志信号。 按照上面的状态跳转图写状态机,控制状态跳转和信号输出,程序代码如下截图所示: 接下来是写 testbench ,代码如下: 以上 testbench 的目的: ( 1 )产生频率为 50MHz 的时钟信号和复位信号; ( 2 )产生测试需要的比特流序列,该序列为 11100011010010100101100100100010 ,将它们送给序列检测器予以检测。 Quartus 综合所得的状态转换图如下图所示: 图 2 Quartus 综合所得的状态转换图 对比图 2 和图 1 可知,综合后所得的状态转换图与设计要求中的状态转换图一致,转换条件相同。下面,可以直接看仿真结果,仿真结果如图 3 所示: 图 3 仿真结果截图 由图 3 可知, in_data 是我们产生的比特流,它们是 111000110 10010 10010 1 100 10 010 0010 ,与期望的值是一致的。同时,在对比特流进行序列检测的过程中, flag 信号共出现了 4 次高电平,分别是在 i 为 18 与 17 之间、 13 与 12 之间、 7 与 6 之间以及 4 与 3 之间,这与序列 10010 在比特流中的位置是一致的(左起是第 31 位,右起是第 0 位)。故由此可知,序列检测器的检测功能正常。