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
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风月ac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值