在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7329|回复: 12

请教:序列检测器仿真问题(附了代码)

[复制链接]
发表于 2008-10-21 10:17:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Mealy型有限状态机的序列检测器Verilog的仿真,原意是:w输入,z输出,当w为1001或者1111时,z为1,否则z为0。
我设计的状态表:(A:000,B:001,C:010,D:011,E:100,F:101)
当前状态       下状态              输出
                   w=0    w=1        w=0    w=1
A                  A        B            0        0
B                  C        E            0        0
C                  D        B            0        0
D                  A        B            0        1
E                  C        F            0        0  
F                  C        F            0        1
我用QuartusII仿真结果是:当w为111时候z就为1了,而当w为1001时出现一个尖峰的1(时间很短),请问有哪位高手知道原因,能指点一下,谢谢!代码如下:

module sequence_detector(clk,rst,w,z);
    input clk,rst,w;
    output reg z;
    reg [2:0] Y,y;
    parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100,F=3'b101;
    always @(w or y)
        case (y)
            A:if(w)
                begin
                z=0;
                Y=B;
                end
              else
                begin
                z=0;
                Y=A;
                end
            B:if(w)
                begin
                z=0;
                Y=E;
                end
              else
                begin
                z=0;
                Y=C;
                end
            C:if(w)
                begin
                z=0;
                Y=B;
                end
              else
                begin
                z=0;
                Y=D;
                end
            D:if(w)
                begin
                z=1;
                Y=B;
                end
              else
                begin
                z=0;
                Y=A;
                end
            E:if(w)
                begin
                z=0;
                Y=F;
                end
              else
                begin
                z=0;
                Y=C;
                end
            F:if(w)
                begin
                z=1;
                Y=F;
                end
                else
                begin
                z=0;
                Y=C;
                end
        endcase   
    always @(negedge rst or posedge clk)
        if(rst==0) y<=A;
        else    y<=Y;
endmodule
发表于 2008-10-23 20:53:38 | 显示全部楼层
写了一个,不是很好,可以参考下。
源文件和testbench都在附件里面

序列检测.rar

827 Bytes, 下载次数: 30 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2008-10-24 14:53:12 | 显示全部楼层
有俩问题问一下

为啥没有111的状态咧?如果用先输入的三位做状态机,应该起码有2^3=8个状态吧?

另,当前状态进入下个状态的表好像有点问题...E,F的下状态都是C吗当W为1的时候。

没太认真看,如果说错的话抱歉啦,哈哈~

最后,如果是我写的话,一直等到有1的输入才进入状态机,不然就一直输出0...这样的话前三位用4个状态来描述就好~~~~
发表于 2008-10-27 21:19:53 | 显示全部楼层
看了大家的帖子,很有帮助。
发表于 2008-10-28 12:01:13 | 显示全部楼层
做了一个相似的检测程序,testbench也有,你看看
不太好,参考一下

serial.rar

1.19 KB, 下载次数: 21 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2008-10-28 16:49:40 | 显示全部楼层
我也不懂,看看
发表于 2008-10-28 19:52:54 | 显示全部楼层
第一个always块中如果期待综合出纯组合逻辑,case中的分支就要写全,否则会引入latch。
发表于 2008-10-28 21:49:18 | 显示全部楼层
为什么要纯用组合逻辑,用时序逻辑,确保状态跳转在时钟沿发生就不会有毛刺了
发表于 2008-10-30 20:38:58 | 显示全部楼层

回复

我曾经也写了一个序列检测器,但是也出现了毛刺,我也想请教各位牛牛呢。跟楼主说的情况很相似。
发表于 2009-11-25 22:37:01 | 显示全部楼层
用时序逻辑,确保状态跳转在时钟沿发生就不会有毛刺了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 14:44 , Processed in 0.038706 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表