Lagrange Zu 2022-03-22 15:31 采纳率: 100%
浏览 47
已结题

编写序列检测器检测“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 [3:0] S0=4'b0001, S1=4'b0010, 
                              S2=4'b0100, S3=4'b1000;   //状态编码,采用独热one hot码。
    //状态寄存器
    reg [3:0] S;           //S当前状态
    reg [3:0] 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 [23 : 0] 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[22 : 0], data[23]};  //循环左移
    assign in = data[23]; //将最高位输入到序列检测器中  
endmodule
运行结果及

img

我想要达到的结果

通过quartusII自带的VWF仿真得到的:

img

  • 写回答

1条回答 默认 最新

  • 老皮芽子 2022-03-22 16:02
    关注

    rst 整反了,激励文件和模块代码不一致
    tb代码,19,20行改为
    #5 rst = 0;
    #20 rst = 1;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月22日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器