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

输入序列不连续的序列检测

https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);

parameter IDLE      = 5'b00001;
parameter S1        = 5'b00010;
parameter S2        = 5'b00100;
parameter S3        = 5'b01000;
parameter S4        = 5'b10000;

//REG DEFINED
reg     [4:0]       curr_state;
reg     [4:0]       next_state;

//fsm
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        curr_state <= IDLE;
    end
    else
        curr_state <= next_state;
end

always @( *) begin
    if (data_valid) begin
        case (curr_state)
            IDLE:if (!data) 
            next_state = S1;
            else
            next_state = IDLE;
            S1:if (data) 
            next_state = S2;
            else
            next_state = S1;
            S2:if (data) 
            next_state = S3;
            else
            next_state = S1;
            S3:if (!data) 
            next_state = S4;
            else
            next_state = IDLE;
            S4:if (!data) 
            next_state = S1;
            else
            next_state = IDLE;
            default : next_state = curr_state;
        endcase
    end
    else begin
        next_state = curr_state;
    end
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        match <= 1'b0;
    end
    else
        if (next_state == S4 && data_valid && !data) begin
            match <= 1'b1;
        end
        else
            match <= 1'b0;
end
endmodule

全部评论

相关推荐

劝退式:感觉有人回才是不正常的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务