verilog代码实现序列检测器,以检测一个‘11001101’序列为例

用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

你可能感兴趣的:(verilog学习,自学,fpga开发,verilog)