51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1111|回复: 0
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2022-3-23 13:40:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
    本人使用quartusII编写111序列检测的模块,用modelsim进行仿真,得到了想要的激励,但是输出结果不对,输入存在连续的111的时候,输出还是为0,且一直为0,到底是哪里错了?
    模块代码:
    1. //序列检测器,检测111,采用Mealy型FSM
    2. module seq_tec1(in, clk, rst, out);
    3.     input in, clk, rst;
    4.     output out;
    5.     reg out;//输出必须有指定类型
    6.    
    7.     parameter [3:0] S0=4'b0001, S1=4'b0010,
    8.                               S2=4'b0100, S3=4'b1000;   //状态编码,采用独热one hot码。
    9.     //状态寄存器
    10.     reg [3:0] S;           //S当前状态
    11.     reg [3:0] Snext;   //Snext下一时刻状态
    12.    
    13.     //状态转移方程,根据状态转移表可写出状态转移关系
    14.     always @(in or S)
    15.     begin
    16.        case(S)
    17.        S0: Snext = (in==1'b1)? S1 : S0;
    18.        S1: Snext = (in==1'b1)? S2 : S0;
    19.        S2: Snext = (in==1'b1)? S3 : S0;
    20.        S3: Snext = (in==1'b1)? S3 : S0;
    21.        default: Snext = S0;
    22.        endcase
    23.     end
    24.    
    25.     //rst功能和clk功能
    26.     always @(negedge rst or posedge clk)
    27.     begin
    28.        if(~rst)
    29.           S <= S0;
    30.        else
    31.           S <= Snext;
    32.     end
    33.    
    34.     //输出方程
    35.     always @(negedge rst or posedge clk)
    36.     begin
    37.        if(~rst)    //按下复位键
    38.           out <= 1'b0;
    39.        else
    40.           case(S)
    41.              S0 , S1: out <= 1'b0;
    42.              S2 , S3: out <= (in == 1'b1) ? 1'b1 : 1'b0;
    43.              default: out <= 1'b0;
    44.           endcase
    45.     end
    46.    
    47.     endmodule
    复制代码
    tb代码:
    1. `timescale 1 ps/ 1 ps
    2. module seq_tec1_vlg_tst();
    3. reg clk, rst;
    4. wire in, out;
    5. reg [23 : 0] data; //定义一个24位的寄存器用于存放待测数据码

    6. parameter PERIOD = 20;
    7. //==========模块例化====================//                           
    8. seq_tec1 i1 (
    9.     .clk(clk),
    10.     .in(in),
    11.     .out(out),
    12.     .rst(rst)
    13. );
    14. //==========产生初始信号=================//   
    15. initial                                                
    16. begin                                       
    17.     clk = 0;  rst = 0;
    18.      #5 rst = 1;
    19.      #20 rst = 0;
    20.     data = 24'b0011_1111_1111_0000_1001_0100;
    21.      //#(PERIOD * 100)  $stop; //执行100个时钟周期
    22.     $display("Running testbench");   
    23. end
    24. //==========产生时钟信号================//      
    25. always      #(PERIOD/2) clk = ~clk;         
    26. //========循环移位产生输入数据============//      
    27. always @(posedge clk)
    28.     #5 data = {data[22 : 0], data[23]};  //循环左移
    29.     assign in = data[23]; //将最高位输入到序列检测器中  
    30. endmodule
    复制代码
    运行结果及

    我想要达到的结果

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


    附件: 您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 13:27 , Processed in 0.066749 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表