请教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 <assign z = (state==D&&x==0)?1:0<br>
<br>
改为:assign z = (state==E&&x==0)?1:0;<br>
<br>
试试看 楼上的好强,我尝试了下也碰到这个问题,用楼上的方法,解决了。非常感谢。不过,这与想法有点不同,斑竹能说明下原因么??为何要把状态设置在状态e上。而且,当状态设置在状态d上,为何只出现一个短脉冲。我估计这肯定与状态改变的瞬时有关。 如果状态设置在D上,输入x的当前值是1,理论上讲z的脉冲宽度最大值是一个时钟周期,也就是说在状态c时,当时钟上升沿来到时采到x=1,状态变为d,之后x立刻变为0,才能保证输出一个时钟z脉冲。所以如果这样输入激励x,仿真器是判断不了的。因此状态设在e,可以满足输出一个时钟宽度z脉冲。<br>
另外我测试程序写的比较简单,以上观点仅供参考。 呵呵,不是太懂,干脆这样理解。当x=0时,状态已变为E,状态为D时,x仍为1。因此,输出1的条件为(state==E&&x==0) 呵呵 这样理解也可以。我也是通过看波形,不断调试得出的结论 我的看法:将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>
A = 3'd1,<br>
B = 3'd2,<br>
C = 3'd3,<br>
D = 3'd4,<br>
E = 3'd5,<br>
F = 3'd6,<br>
G = 3'd7;<br>
always @(posedge clk)<br>
z <= (state==D&&x==0)?1:0<br>
always @(posedge clk or negedge rst)<br>
if(!rst)<br>
begin<br>
state<=IDLE;<br>
end<br>
else<br>
case(state)<br>
IDLE: if(x==1)<br>
state<=A;<br>
else<br>
state<=IDLE;<br>
A: if(x==0)<br>
state<=B;<br>
else<br>
state<=A;<br>
B: if(x==0)<br>
state<=C;<br>
else<br>
state<=F;<br>
C: if(x==1)<br>
state<=D;<br>
else<br>
state<=G;<br>
D: if(x==0)<br>
state<=E;<br>
else<br>
state<=A;<br>
E: if(x==0)<br>
state<=C;<br>
else<br>
state<=A;<br>
F: if(x==1)<br>
state<=A;<br>
else<br>
state<=B;<br>
G: if(x==1)<br>
state<=F;<br>
else<br>
state<=B;<br>
default: state<=IDLE;<br>
endcase<br>
endmodule[ 本帖最后由 dianzi 于 2007-2-23 11:40 编辑 ] 按照楼上的方法尝试过了。效果非常好。感谢楼上,这样,更能理解通了。 感谢各位版主,感谢各位高手,为我解决了这个问题.<br>
小弟从中受益不少
http://bbs.vibesic.com/images/smilies/default/smile.gif 有个疑问就是F和G的状态是否可以去掉, F,G分别有A 来代替是否可以??
页:
[1]
2