题解 | #不重叠序列检测#

不重叠序列检测

https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc

`timescale 1ns/1ns
module sequence_detect(
    input clk,
    input rst_n,
    input data,
    output wire match,
    output wire not_match
    );
localparam idle = 6'b000000;
localparam s0   = 6'b000001;
localparam s1   = 6'b000010;
localparam s2   = 6'b000100;
localparam s3   = 6'b001000;
localparam s4   = 6'b010000;
localparam s5   = 6'b100000;

reg [5:0] cs,ns;
reg [2:0] cnt;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)  cs<='b0;
    else    cs<= ns;
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)  cnt<='b0;
    else if(cnt==3'd6) cnt<='b1;
    else cnt<= cnt+1'b1;
end

/*
idle
s0 0
s1 01
s2 011
s3 0111
s4 01110
s5 011100
*/    
always @(*) begin
    case (cs)
    idle: ns = data ? idle : s0;
    s0  : ns = data ? s1   : idle; 
    s1  : ns = data ? s2   : idle;
    s2  : ns = data ? s3   : idle;
    s3  : ns = data ? idle : s4;
    s4  : ns = data ? idle : s5;
    s5  : ns = data ? idle : s0;
    default: ns = idle;
endcase
end
/*
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)  match <= 0; 
    else if((cs==s5)&(cnt==3'd6)) match<=1;
    else match<=0;     
end
*/
//assign match = (cs==s5)&(cnt==3'd6)?1'b1:1'b0;
//assign not_match = (cs==idle)&(cnt==3'd6)?1'b1:1'b0;

assign match = (cs==s5)&(cnt==3'd6)?1'b1:1'b0;
assign not_match = (cs!=s5 )&(cnt==3'd6)?1'b1:1'b0;

/*
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)  not_match <= 0; 
    else if((cs==s5)&(cnt!=3'd6)) not_match<=1;
    else not_match<=0;     
end
*/
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务