alt

本来是这样写的,可以实现功能,但是有点怪;

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

    reg[7:0] n_state,c_state;
    
    always @ (posedge clk or negedge rst_n)
        if (!rst_n)
             c_state <= 0;
        else 
             c_state <= n_state;
    reg flag;
    always @ (posedge clk or negedge rst_n)
        if(!rst_n)
        begin
            flag <= 0;
            n_state <= 0;
            end
        else 
            begin
                case(n_state)
                    8'd0:     
                        if (a==0)
                            n_state <= 8'd1;
                        else
                            n_state <= 0;
                    8'd1:     //0
                        if(a==1)
                            n_state <= 8'd2;
                        else
                            n_state <=  8'd1;
                    8'd2:     //01
                        if(a==1)
                            n_state <= 8'd3;
                        else
                            n_state <= 8'd2;
                    
                    8'd3:     //011
                        if(a==1)
                            n_state <= 8'd4;
                        else
                            n_state <= 8'd3;     
                    
                    8'd4:     //0111
                        if(a==0)
                            n_state <= 8'd5;
                        else
                            n_state <=8'd4;
                    8'd5:     //0111 0
                        if(a==0)
                            n_state <= 8'd6;
                        else
                            n_state <= 8'd2;
                    8'd6:     //0111 00
                        if(a==0)
                            n_state <= 8'd7;
                        else
                            n_state <= 8'd2;
                    8'd7:     //0111 000
                        if(a==1)
                        begin
                            flag <= 1;
                            n_state <= 8'd8;
                         end
                        else
                            n_state <= 8'd2;
                     8'd8:     //0111 0001
                     begin
                            n_state <= 8'd0;
                            flag <= 0;
                            end
                    default:  n_state <= 8'd0; 
                endcase 
            end
        always @ (posedge clk or negedge rst_n)
        if (!rst_n)
             match <= 0;
         else if(flag)
              match <= 1;
         else
               match <= 0;  
endmodule

现在做一点修改:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output wire match
	);

    reg[7:0] n_state,c_state;
   //状态转移 
    always @ (posedge clk or negedge rst_n)
        if (!rst_n)
             c_state <= 0;
        else 
             c_state <= n_state;
 //状态转移条件
    always @ (*)
        if(!rst_n)
        begin
            n_state <= 0;
            end
        else 
            begin
                case(c_state)
                    8'd0:     
                        if (a==0)
                            n_state <= 8'd1;
                        else
                            n_state <= 0;
                    8'd1:     //0
                        if(a==1)
                            n_state <= 8'd2;
                        else
                            n_state <=  8'd1;
                    8'd2:     //01
                        if(a==1)
                            n_state <= 8'd3;
                        else
                            n_state <= 8'd2;
                    
                    8'd3:     //011
                        if(a==1)
                            n_state <= 8'd4;
                        else
                            n_state <= 8'd3;     
                    
                    8'd4:     //0111
                        if(a==0)
                            n_state <= 8'd5;
                        else
                            n_state <=8'd4;
                    8'd5:     //0111 0
                        if(a==0)
                            n_state <= 8'd6;
                        else
                            n_state <= 8'd2;
                    8'd6:     //0111 00
                        if(a==0)
                            n_state <= 8'd7;
                        else
                            n_state <= 8'd2;
                    8'd7:     //0111 000
                        if(a==1)
                        begin
                            n_state <= 8'd8;
                         end
                        else
                            n_state <= 8'd2;
                     8'd8:     //0111 0001
                            begin
                            n_state <= 8'd0;
                            end
                    default:  n_state <= 8'd0; 
                endcase 
            end
    //判断输出
    assign match = (c_state == 8'd7)? a:0;
  
endmodule

结果还是不行,给出的问题是这样: alt 可以看到在a发生变化之后(第8位要求是1);在下一个时钟检测到满足序列条件,参考答案在下一个时钟才输出match,并且我的match只有半个周期,上升沿到达就无了; alt 按照要求应该在检测到后的下一时钟输出match;