序列检测:状态机和移位寄存器(Verilog)

RTL代码:

//实现序列1101
//状态机实现和移位寄存器两种方式实现

//状态机方式:
module fsm(
	input clk,
	input rst_n,
	input data_in,
	output reg flag
);

	reg [4:0]c_state;
	reg [4:0]n_state;
	
	parameter s0 = 5'b00001;
	parameter s1 = 5'b00010;
	parameter s2 = 5'b00100;
	parameter s3 = 5'b01000;
	parameter s4 = 5'b10000;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			c_state <= s0;
		else
			c_state <= n_state;
	end 
	
	always@(*)begin
		case(c_state)
			s0:begin
				if(data_in) n_state = s1;
				else n_state = s0;
			end
			s1:begin
				if(data_in) n_state = s2;
				else n_state = s0;
			end
			s2:begin
				if(data_in) n_state = s1;
				else n_state = s3;
			end
			s3:begin
				if(data_in) n_state = s4;
				else n_state = s0;
			end
			s4:begin
				if(data_in) n_state = s1;
				else n_state = s0;
			end
		endcase
	end
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			flag <= 1'b0;
		else if(n_state == s4)
			flag <= 1'b1;
		else
			flag <= 1'b0;
	end

endmodule



//移位寄存器方式:
module fsm(
	input clk,
	input rst_n,
	input data_in,
	output flag
);
	reg [3:0]data_r;
	parameter data = 4'b1101;
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			data_r <= 'd0;
		else 
			data_r <= {data_r[2:0],data_in};
	end
	
	assign flag = (data_r == data)? 1'b1:1'b0;


endmodule 


仿真代码:

`timescale 1ns / 1ps

module fsm_tb;
    
    reg clk;
    reg rst_n;
    reg data_in;
    wire flag;
    
    fsm fsm_inst(
	   .clk        (clk),
	   .rst_n      (rst_n),
	   .data_in    (data_in),
	   .flag       (flag)
);
    
    initial clk = 0;
    always#10 clk = ~clk;
    
    initial begin
        rst_n = 0;
        data_in = 0;
        #200;
        rst_n = 1;
    end
    
    reg [7:0]data;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            data <= 8'b10110110;
        else
            data <= {data[6:0],data[7]};
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            data_in <= 1'b0;
        else 
            data_in <= data[7];
    end
    

endmodule

**仿真:**注意两种仿真结果的区别
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值