关于检测五位二进制序列10010的状态机设计问题

2019-07-15 23:37发布

    时钟上升沿到来时,data左移,同时data最高位赋给x,同样在该上升沿到来时,进入状态判断,第一个x=1时应该进入状态A(001),为什么modelsim仿真波形图显示x=1下一周期才变为状态A,感觉状态(state)的输出滞后一个周期,希望大神帮忙看看哪里出了问题,或者解释一下是什么原因?谢谢(附代码和仿真结果图)
QQ截图20150818083525.png
QQ截图20150818083544.png
QQ截图20150818083602.png
QQ截图20150818083736.png
QQ截图20150818083756.png
QQ截图20150817220729.png
QQ截图20150817220807.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
安和桥丶
1楼-- · 2019-07-16 04:17
安和桥丶 发表于 2015-8-18 13:28
你查一下异步的  这个实验用异步会消除前面的不定态

一个是tb  一个主程序 最佳答案
QQ图片20150818182924.jpg
大苏打.jpg
骨灰级发烧友
2楼-- · 2019-07-16 08:12
采用Moore机,画出状态图,并写出状态转移输出表。为了简单起见,我们这里采用的是无重复的序列检测。
程序代码:  
module VrSMex( CLOCK, X, Z);
   input CLOCK, X;   
   output Z;   
   reg Z;   
   reg [2:0] Sreg, Snext;
   parameter [2:0] A = 3'b000,                 
                   B = 3'b001,                 
                   C = 3'b010,                 
                   D = 3'b011,                 
                   E = 3'b100,
                                   F = 3'b101;
    always @ (posedge CLOCK)     
        Sreg <= Snext;
        always @ (X, Sreg) begin     
          case (Sreg)        
             A:      if(X==0)  Snext = A;               
                 else      Snext = B;
                 B:      if(X==0)  Snext = C;               
                 else      Snext = B;                 
                 C:      if(X==0)  Snext = D;               
                 else      Snext = B;                 
                 D:      if(X==0)  Snext = A;               
                 else      Snext = E;               
                 E:      if(X==0)  Snext = F;               
                 else      Snext = B;
                 F:      if(X==0)  Snext = A;               
                 else      Snext = B;         
           default Snext = A;     
        endcase
        end
       
        always @ (Sreg)            
          case (Sreg)      
            A, B, C, D, E: Z = 0;      
                F:             Z = 1;      
                default        z = 0;
        endcase
endmodule

runileking
3楼-- · 2019-07-16 13:45
骨灰级发烧友 发表于 2015-8-18 08:56
采用Moore机,画出状态图,并写出状态转移输出表。为了简单起见,我们这里采用的是无重复的序列检测。
程序代码:  
module VrSMex( CLOCK, X, Z);

谢谢你,我还想问一下,就是我是按书上一个例子写的,但是我觉得当x=1时,state应该为001,但是为什么仿真结果在x=1的一个周期之后才变为001,能帮我看看是为什么么?
安和桥丶
4楼-- · 2019-07-16 16:23
 精彩回答 2  元偷偷看……
安和桥丶
5楼-- · 2019-07-16 19:49
runileking 发表于 2015-8-18 09:47
谢谢你,我还想问一下,就是我是按书上一个例子写的,但是我觉得当x=1时,state应该为001,但是为什么仿真结果在x=1的一个周期之后才变为001,能帮我看看是为什么么?

这个例子你可以把它改成异步low reset   看看 波形怎么变化 这样你才会看到同步和异步的区别
runileking
6楼-- · 2019-07-16 22:19
安和桥丶 发表于 2015-8-18 10:45
你把你的testbench的39行改成非阻塞赋值看看  data

谢谢你,这个我试过了,没有变化

一周热门 更多>