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

不重叠序列检测

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

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

reg [3:0] state;
reg [3:0] nstate;
parameter S0 = 4'b0000;
parameter S1 = 4'b0001;
parameter S2 = 4'b0010;
parameter S3 = 4'b0011;
parameter S4 = 4'b0100;
parameter S5 = 4'b0101;
parameter S6 = 4'b0110;
parameter S7 = 4'b0111;
parameter S8 = 4'b1000;
parameter S9 = 4'b1001;
reg flag;
reg nflag;
reg m;
reg [2:0]cnt;
parameter max=6-1;
// 计时
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= S1;  // 初始化状态
    end else if(cnt>=max)
        cnt<=3'b0;
		else 
		cnt<=cnt+1;
    end

// 状态寄存器更新逻辑
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        state <= S1;  // 初始化状态
    end else begin
        state <= nstate;
    end
end

// 状态转移逻辑
always @(*) begin
    nstate = state;  // 默认不变状态
    flag = 0;  // 默认情况下不设置flag

    case (state)
        S1: begin
            if (data == 0)
                nstate = S2;
            else
                nstate = S0;
        end
        S2: begin
            if (data == 1)
                nstate = S3;
            else
                nstate = S0;
        end
        S3: begin
            if (data == 1)
                nstate = S4;
            else
                nstate = S0;
        end
        S4: begin
            if (data == 1 )
                nstate = S5;
            else
                nstate = S0;
        end
        S5: begin
            if (data == 0)
                nstate = S6;
            else
                nstate = S0;
        end
        S6: begin
            if (data == 0 ) begin
                nstate = S1;
				flag=1;
			end else
                nstate = S0;
        end
        
        
        S0: begin
            nflag=1;
			if(cnt==max)
			nstate=S1;
			else
			nstate=S0;
        end
		/*: begin
            if (a == 0) begin
                nstate = S9;
                
            end else begin
                nstate = S1;
            end
        end
		S9: begin
            
                flag=1;
                nstate = S1;
            end*/
    
    endcase
end

// 输出逻辑
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        not_match <= 1'b0;
     else  
       not_match <= m;
     
		
    
end
//打一拍符合时序

always @(posedge clk or negedge rst_n) begin
   if (!rst_n) 
      m <= 1'b0;
     else if (nflag && cnt==max)
       m <= nflag;
  
end
always @(posedge clk or negedge rst_n) begin
   if (!rst_n) begin
      match <= 1'b0;
    end else begin
       match <= flag;
    end
end
endmodule

全部评论

相关推荐

龙珠传说:nb,公务员解约不需要支付违约金吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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