测试积点老人 发表于 2022-3-23 13:40:18

编写序列检测器检测“111”,仿真得不到想要的输出

本人使用quartusII编写111序列检测的模块,用modelsim进行仿真,得到了想要的激励,但是输出结果不对,输入存在连续的111的时候,输出还是为0,且一直为0,到底是哪里错了?
模块代码:
//序列检测器,检测111,采用Mealy型FSM
module seq_tec1(in, clk, rst, out);
    input in, clk, rst;
    output out;
    reg out;//输出必须有指定类型
   
    parameter S0=4'b0001, S1=4'b0010,
                              S2=4'b0100, S3=4'b1000;   //状态编码,采用独热one hot码。
    //状态寄存器
    reg S;         //S当前状态
    reg Snext;   //Snext下一时刻状态
   
    //状态转移方程,根据状态转移表可写出状态转移关系
    always @(in or S)
    begin
       case(S)
       S0: Snext = (in==1'b1)? S1 : S0;
       S1: Snext = (in==1'b1)? S2 : S0;
       S2: Snext = (in==1'b1)? S3 : S0;
       S3: Snext = (in==1'b1)? S3 : S0;
       default: Snext = S0;
       endcase
    end
   
    //rst功能和clk功能
    always @(negedge rst or posedge clk)
    begin
       if(~rst)
          S <= S0;
       else
          S <= Snext;
    end
   
    //输出方程
    always @(negedge rst or posedge clk)
    begin
       if(~rst)    //按下复位键
          out <= 1'b0;
       else
          case(S)
             S0 , S1: out <= 1'b0;
             S2 , S3: out <= (in == 1'b1) ? 1'b1 : 1'b0;
             default: out <= 1'b0;
          endcase
    end
   
    endmodule tb代码:
`timescale 1 ps/ 1 ps
module seq_tec1_vlg_tst();
reg clk, rst;
wire in, out;
reg data; //定义一个24位的寄存器用于存放待测数据码

parameter PERIOD = 20;
//==========模块例化====================//                           
seq_tec1 i1 (
    .clk(clk),
    .in(in),
    .out(out),
    .rst(rst)
);
//==========产生初始信号=================//   
initial                                                
begin                                       
    clk = 0;rst = 0;
   #5 rst = 1;
   #20 rst = 0;
    data = 24'b0011_1111_1111_0000_1001_0100;
   //#(PERIOD * 100)$stop; //执行100个时钟周期
    $display("Running testbench");   
end
//==========产生时钟信号================//      
always      #(PERIOD/2) clk = ~clk;         
//========循环移位产生输入数据============//      
always @(posedge clk)
    #5 data = {data, data};//循环左移
    assign in = data; //将最高位输入到序列检测器中
endmodule运行结果及

我想要达到的结果通过quartusII自带的VWF仿真得到的:
页: [1]
查看完整版本: 编写序列检测器检测“111”,仿真得不到想要的输出