用verilog代码实现序列检测器,以检测一个‘11001101’序列为例
我的理解是,在当前输入位数下,输入正确或者错误对当前剩下的序列造成的影响来转移,这样免了一个状态转移图,什么意思呢?
以序列“11001101”来说,比如我输入110,下一位如果我输入错成1,他这个“1”还可以当成第一位使用,重新检测第二位,以此类推
三段式:
//初始化
module delete(data,clk,res_n,out);
input data;
input clk;
input rst_n;
output out;
reg[2:0] state
reg[2:0] next_state
parameter idle = 0
parameter state_1=1
parameter state_2=2
parameter state_3=3
parameter state_4=4
parameter state_5=5
parameter state_6=6
parameter state_7=7
parameter state_8=8
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
state <= 0;
else
state <= next_state
end
always@(*) begin
case(state)
idle: next_state=(data==1)?state_0:idle ;
state_0: next_state=(data==1)?state_1:idle ;//以1为例,是我需要的那个数吗,是则next
state_1: next_state = (data==0)?state_2:state_1;111还能用或110
state_2: next_state = (data==0)?state_3:state_0;//1101错误但1是对
state_3: next_state = (data==1)?state_4:idle;//11000没法用重头来
state_4: next_state = (data==1)?state_5:idle;//110010没法用
state_5: next_state = (data==0)?state_6:state_1;//1100111第三位重来
state_6: next_state = (data==1)?state_7:state_3;//11001100第五位
state_7: next_state = (data==1)?state_0:idle;//输入完返回,错了重头
endcase
end
always@(*) begin
if(!res_n)
out = 1’b0;
else if(next_state == state_7)
out= 1’b1;
else
out= 1’b0;
end