题解 | #输入序列连续的序列检测#

Tips

三段式状态机的第一段状态流转的功能是使state_cur比state_next慢一拍,也就是说,第一段实际上就是一个D触发器。如果要让输出也慢一拍,那么让输出端也类似地构造一个D触发器输出就可以了。

Verilog Code

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    //行为描述
    reg [2:0] state_cur = 3'd0, state_next = 3'd0; 
    reg [2:0] S0 = 3'd0, S1 = 3'd1, S2 = 3'd2, S3 = 3'd3;
    reg [2:0] S4 = 3'd4, S5 = 3'd5, S6 = 3'd6, S7 = 3'd7;
    reg [1:0] cnt = 2'd0;
    reg tag = 1'b0;
    //状态流转
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            state_cur <= 3'd0;
        end
        else begin
            state_cur <= state_next;
        end
    end
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            match <= 1'b0;
        end
        else begin
            match <= tag;
        end
    end
    //状态切换
    always @(*)begin
        if(~rst_n)begin
            state_next = 3'd0;
        end
        else begin
            case(state_cur)
                S0: state_next = (a == 1'd0 ? S1:S0);
                S1: state_next = (a == 1'd1 ? S2:S1);
                S2: state_next = (a == 1'd1 ? S3:S1);
                S3: state_next = (a == 1'd1 ? S4:S1);
                S4: state_next = (a == 1'd0 ? S5:S0);
                S5: state_next = (a == 1'd0 ? S6:S2);
                S6: state_next = (a == 1'd0 ? S7:S2);
                S7: state_next = (a == 1'd1 ? S0:S1);
                default:state_next = S0;
            endcase
        end
    end
    //状态输出
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            tag <= 1'b0;
        end
        else begin
            if(state_cur == S7 && a == 1'b1)begin
                tag <= 1'b1;
            end
            else begin
                tag <= 1'b0;
            end
        end
    end
endmodule

Testbench Code

`timescale 1ns/1ns
module testbench();
	reg clk,rst_n;
	reg a;
	wire match;
initial begin
	$dumpfile("out.vcd");
	$dumpvars(0,testbench);
	clk = 1'b1;
	rst_n = 0;
end
always #5 clk = ~clk;
initial begin
    #10 rst_n = 1'b1;
    a = 0;
    #10 a = 1'b1;
    #30 a = 0;
    #30 a = 1'b1;
    #10 a = 0;
    #20 $finish();
end
sequence_detect dut(
	.clk(clk),
	.rst_n(rst_n),
	.a(a),
	.match(match)
);
endmodule
全部评论

相关推荐

天降大厂offer:想从事前端就放前端的技术栈,然后项目描述,还有项目做了什么内容,使用了什么技术解决了什么问题优化了什么性能。然后头像可以不要,在读也可以不要,还有bg的话就不要放课程,写哪个学校什么本科,还有绩点排名(如果高的话),然后就是技术栈写好一点,接下来就是项目(有实习就写实习,没有就到项目),项目放两个好一点的,自己包装一下,然后有参加什么竞赛放两个就好了,接下来就是靠你自己了,毕竟211还是很难容易找的,不像我们学院本
点赞 评论 收藏
分享
09-22 22:22
中山大学 Java
乌鱼子萨奇:羡慕你啊,直接转正了,都不用经历秋招的炼狱,但是你少经历了很多痛苦的事情啊
点赞 评论 收藏
分享
10-29 22:30
吉林大学 Java
同专业学长学姐,去互联网大厂的起薪&nbsp;15k+,去国企&nbsp;IT&nbsp;岗的也有&nbsp;12k+,就连去中小厂的都基本&nbsp;13k&nbsp;起步😤&nbsp;我投的传统行业技术岗,拼死拼活拿到&nbsp;1Woffer,本来还挺开心,结果逛了圈牛客直接破防,同是校招生,行业差距怎么就这么大啊!
喵喵喵6_6:应该哪里不对吧,大厂都是20k以上的,10k那种对于985本的学生基本就是点击一下过了笔试就送的,我前两天刚拿了一个11k,笔试完第2天就打电话了,非科班。坏消息是c++岗开这么低真是刷新认知了
校招生月薪1W算什么水平
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务