**这是本文档旧的修订版!**
序列检测
====硬件平台====
====设计要求====
- 掌握序列检测的原理
- 掌握状态机的设计
- 基于STEP-MXO2第一代平台实现101序列的检测
====工作原理====
序列检测就是将一个指定的序列从数字码流中识别出来,是时序数字电路中非常常见的设计之一。
FPGA做序列检测的方法有很多,可以使用以为寄存器实现,也可以使用状态机实现。使用移位寄存器实现设计非常简单,利用移位寄存器将输入信号循环锁存,然后通过将移位寄存器中的数据与指定的序列比对,输出序列检测的结果,这里我们不在详细介绍,重点介绍使用状态机实现序列检测。
考虑到检测出的相邻序列可能是重叠的,使用状态机实现序列检测的复杂度与指定序列的长度及重复度相关,但是方法都是一样的,首先我们要将需要设计的逻辑功能使用状态转换图实现,然后再将状态转换图转换为设计代码。
本设计的功能是在输入信号中检测101的序列,使用状态机至少需要三个状态,分别对指定序列101的三位逻辑状态。
====硬件连接====
为了方便我们在硬件平台上更直观的观察,我们使用25MHz时钟晶振分频产生1Hz的信号作为序列检测的时钟,同时使用LED灯LD1指示1Hz信号,按键信号作为序列检测的信号输入,LED灯LD2作为序列检测的输出指示。
====代码设计====
设计文件
为了实现对8个LED的控制,我们设计了25位的计数器cnt进行1s周期的循环计数,同时我们定义了一个4位寄存器led_cnt作为状态机的状态控制流水灯的闪烁。状态机共有8个状态,每一个状态对应点亮一个LED灯。
首先是计数器的设计,计数器的计数范围为0~CNTNUM-1,为了实现每个LED灯1秒的点亮时间,设计文件代码中我们定义参数CNTNUM为25000000,但是在仿真文件调用设计文件时,为了方便仿真,我们会将参数CNT_NUM重新赋值为10.
reg [24:0] cnt = 25'd0; always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) begin cnt <= 25'd0; end else if(cnt>=CNT_NUM-1) begin cnt <= 25'd0; end else begin cnt <= cnt + 25'd1; end end
然后我们需要对状态机的状态进行控制,使得作为状态的寄存器led_cnt实现从0到7的循环加一操作。
reg [3:0] led_cnt = 4'd0; always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) begin led_cnt <= 4'd0; end else if(cnt==CNT_NUM-1) begin if(led_cnt==4'd7) led_cnt <= 4'd0; else led_cnt <= led_cnt + 4'd1; end end
最后是组合逻辑,根据led_cnt的不同状态控制不同的LED点亮。
always@(led_cnt) begin case(led_cnt) 4'd0: led_out = 8'b1111_1110; 4'd1: led_out = 8'b1111_1101; 4'd2: led_out = 8'b1111_1011; 4'd3: led_out = 8'b1111_0111; 4'd4: led_out = 8'b1110_1111; 4'd5: led_out = 8'b1101_1111; 4'd6: led_out = 8'b1011_1111; 4'd7: led_out = 8'b0111_1111; default: led_out = 8'b1111_1111; endcase end
测试文件
测试文件中我们需要对设计文件中的参数CNT_NUM进行重新赋值
parameter CNT_NUM = 10; Water_led #(.CNT_NUM(CNT_NUM)) Water_led_uut ( .clk_in(sys_clk), .rst_n_in(sys_rst_n), .led_out(led_out) );
引脚分配如下:
管脚名称 | clkin| rstnin | ledout[0] | ledout[1] |ledout[2] | ledout[3] |ledout[4] | ledout[5] |ledout[6] | led_out[7] | |||||
---|---|---|---|---|---|---|---|---|---|---|
FPGA管脚 | C1 | A2 | B14 | C14 | E14 | F14 | G14 | J14 | K14 | L14 |
仿真结果
资源报告
资源 | 数量 | 比例 | 说明 |
---|---|---|---|
LUTs | 28 | 4% | |
寄存器 | 33 | 2% | |
存储器 | 0 | 0% | |
IO管脚 | 10 | ||
时钟频率 | 25MHz |
知识点
- 分频设计
- 时序控制
- 简单状态机
参考文档
相关文档
文件名称 | 功能 |
---|---|
Water_led.v | 流水灯 |
Water_led_test.v | 测试文件 |