FPGA序列检测的Verilog
序列检测是FPGA开发的经典问题,其解决方法通常有两种:状态机和序列缓存。同时在给指示信号赋值时须注意考虑时序问题。
状态机:对序列的每个状态进行标识,当状态为满足序列检测要求时给出指示信号
序列缓存:定义一个与目标序列位数相同的寄存器,寄存过往的输入数据作为一个数组,每个时刻的输入位于数组的末尾,通过对寄存器数值的判断检测序列
通常序列缓存的方法实现相较更简单。
本文针对不同类型的序列检测进行分析解题。
目录
1、输入序列连续的序列检测
题目:请编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。
思路:最基础的序列检测问题,本题中序列不满足时不必重新匹配。在序列缓存方法中,对于寄存器的复位值需要注意,应与目标序列的首位相反,避免产生首次检测时的假匹配。
以下分别给出状态机和序列缓存的实现代码:
//状态机法
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
parameter ZERO=0, ONE=1, TWO=2, THREE=3, FOUR=4, FIVE=5, SIX=6, SEVEN=7, EIGHT=8;
reg [3:0] state, nstate;
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
state <= ZERO;
else
state <= nstate;
end
always@(*) begin
case(state)
ZERO : nstate = a? ZERO : ONE;
ONE : nstate = a? TWO : ONE;
TWO : nstate = a? THREE: ONE;
THREE : nstate = a? FOUR : ONE;
FOUR : nstate = a? ZERO : FIVE;
FIVE : nstate = a? TWO : SIX;
SIX : nstate = a? TWO : SEVEN;
SEVEN : nstate = a? EIGHT: ONE;
EIGHT : nstate = a? THREE: ONE ;
default: nstate = ZERO;
endcase
end
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
match <= 0;
else
match <= state==EIGHT;
end
endmodule
——————————————————————————————————————————————————————————————————————
//序列缓存法