CHA 发表于 2010-6-26 01:30:07

请教Verilog语言中的一个问题

本帖最后由 fpgaw 于 2010-7-16 13:34 编辑

Verilog程序如下:
是一个10010序列检测器,我用ModelSim仿真之后,输出波形z只是一个脉冲,z并没有输出一个周期宽度的矩形波,请问是什么原因?
module seqdet(x,z,clk,rst);
input x,clk,rst;
output z;
reg state;
wire z;
parameter IDLE = 3'd0,
   A = 3'd1,
   B = 3'd2,
   C = 3'd3,
   D = 3'd4,
   E = 3'd5,
   F = 3'd6,
   G = 3'd7;
assign z = (state==D&&x==0)?1:0
always @(posedge clk or negedge rst)
   if(!rst)
   begin
    state<=IDLE;
   end
else
   case(state)
   IDLE:if(x==1)
         state<=A;
      else
         state<=IDLE;
      A:if(x==0)
         state<=B;
      else
         state<=A;
      B:if(x==0)
         state<=C;
      else
         state<=F;
      C:if(x==1)
         state<=D;
      else
         state<=G;
      D:if(x==0)
         state<=E;
      else
         state<=A;
      E:if(x==0)
         state<=C;
      else
         state<=A;
      F:if(x==1)
         state<=A;
      else
         state<=B;
      G:if(x==1)
         state<=F;
      else
         state<=B;
    default:state<=IDLE;
   endcase
endmodule

encounter 发表于 2010-6-26 03:17:09

&lt;assign z = (state==D&amp;&amp;x==0)?1:0<br>
<br>
改为:assign z = (state==E&amp;&amp;x==0)?1:0;<br>
<br>
试试看

CHANG 发表于 2010-6-26 04:35:33

楼上的好强,我尝试了下也碰到这个问题,用楼上的方法,解决了。非常感谢。不过,这与想法有点不同,斑竹能说明下原因么??为何要把状态设置在状态e上。而且,当状态设置在状态d上,为何只出现一个短脉冲。我估计这肯定与状态改变的瞬时有关。

CHANG 发表于 2010-6-26 04:45:36

如果状态设置在D上,输入x的当前值是1,理论上讲z的脉冲宽度最大值是一个时钟周期,也就是说在状态c时,当时钟上升沿来到时采到x=1,状态变为d,之后x立刻变为0,才能保证输出一个时钟z脉冲。所以如果这样输入激励x,仿真器是判断不了的。因此状态设在e,可以满足输出一个时钟宽度z脉冲。<br>
&nbsp; &nbsp;&nbsp;&nbsp;另外我测试程序写的比较简单,以上观点仅供参考。

CHANG 发表于 2010-6-26 05:14:58

呵呵,不是太懂,干脆这样理解。当x=0时,状态已变为E,状态为D时,x仍为1。因此,输出1的条件为(state==E&amp;&amp;x==0)

inter 发表于 2010-6-26 05:34:12

呵呵 这样理解也可以。我也是通过看波形,不断调试得出的结论

AAT 发表于 2010-6-26 06:27:15

我的看法:将Z改为寄存器型,这样能保证z的宽度是一个时钟周期。module seqdet(x,z,clk,rst);<br>
input x,clk,rst;<br>
output z;<br>
reg state;<br>
reg z;<br>
parameter IDLE = 3'd0,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; A = 3'd1,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; B = 3'd2,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; C = 3'd3,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; D = 3'd4,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; E = 3'd5,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; F = 3'd6,<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; G = 3'd7;<br>
always @(posedge clk)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;z &lt;= (state==D&amp;&amp;x==0)?1:0<br>
always @(posedge clk or negedge rst)<br>
&nbsp; &nbsp;&nbsp; &nbsp; if(!rst)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;state&lt;=IDLE;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;end<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;case(state)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;IDLE:&nbsp;&nbsp;if(x==1)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=A;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=IDLE;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;A:&nbsp;&nbsp;if(x==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=B;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=A;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;B:&nbsp;&nbsp;if(x==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=C;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=F;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;C:&nbsp;&nbsp;if(x==1)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=D;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=G;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;D:&nbsp;&nbsp;if(x==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=E;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=A;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;E:&nbsp;&nbsp;if(x==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=C;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=A;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;F:&nbsp;&nbsp;if(x==1)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=A;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=B;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;G:&nbsp;&nbsp;if(x==1)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=F;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; state&lt;=B;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;default:&nbsp;&nbsp;state&lt;=IDLE;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;endcase<br>
endmodule[ 本帖最后由 dianzi 于 2007-2-23 11:40 编辑 ]

VVC 发表于 2010-6-26 08:27:03

按照楼上的方法尝试过了。效果非常好。感谢楼上,这样,更能理解通了。

ANG 发表于 2010-6-26 09:17:21

感谢各位版主,感谢各位高手,为我解决了这个问题.<br>
小弟从中受益不少
        http://bbs.vibesic.com/images/smilies/default/smile.gif

CTT 发表于 2010-6-26 10:18:28

有个疑问就是F和G的状态是否可以去掉, F,G分别有A 来代替是否可以??
页: [1] 2
查看完整版本: 请教Verilog语言中的一个问题