不同方法的序列检测

检测一段序列这里给出两种方法讨论:1.状态机;2.移位寄存器。例子:检测序列1011。

第一种方法:状态机。(这里采用一段式状态机)话不多说,上代码。

module fsm(
	input clk,
	input rst_n,
	input din,
    output reg led                    
);
reg [2:0] state;
localparam s_idle = 4'b0001,s_1 = 4'b0010,s_10 = 4'b0100,s_101 = 4'b1000;

always@(posedge clk or negedge rst_n)
	if(!rst_n)begin
		state <= s_idle;
		led <= 1'b1;
		end
	else begin
		case(state)
			s_idle : 
				if(din == "1")
					state <= s_1;
				else state <= s_idle;
			s_1 :
				if(din == "0")
					state <= s_10;
				else state <= s_1;
			s_10 :
				if(din == "1")
					state <= s_101;
				else state <= s_10;
			s_101 : 
				if(din == "1")begin
					state <= s_idle;
					led <= ~led;
					end
				else 
				led <= led;
		default : state <= s_idle;
		endcase
	end
endmodule
	
	
	

 

第二种方法:移位寄存器。代码如下:

module xulie(
	input clk,
	input rst_n,
	input din,
	output reg match

);
reg [2:0] match_d;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		match_d <= 3'd0;
	else
		match_d <= {match_d[1:0] , din};

always@(posedge clk or negedge rst_n)
	if(!rst_n)
		match <= 1'b0;
	else if(din && (match_d == 3'b101))
		match <= 1'b1;
	else if(match)
		match <= 1'b0;
endmodule

仿真如图:在检测到1011序列后,match输出一高电平。


    
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值