case 语句仿真问题
case(cnt)
0: Q=4'b0000;
1: Q= 4'b0010;
。
仿真出来的结果是:当计数到1的时候才出现 Q=4'b0000;计数到2的时候出现Q= 4'b0010;
为什么仿真出来的结果会慢一拍呢?
在赋值的同时,计数器也会继续计数呀
同意楼上
你要是计数,就应该是时序电路,你最好用非阻塞赋值,<=,你修改一下,把结果发上来!
你的cnt计数部分和case语句部分时序上可能没没弄好,好好检查一些代码
想来,是否这里Q的赋值应该是在时序逻辑里面做的吧。
always @(posedge clock) begin
case(cnt)
0: Q= xxxxxx;
1: Q= xxxxxx;
如果是这样的,那么结果很自然解释了,因为这个case在clock上升沿采样cnt的时候,cnt还是上一个时钟周期的值,所以Q感觉会反应慢一拍,如果把这个case改成组合逻辑就没有问题了
我的程序只能用时序逻辑,而我改成非阻塞仿真结果也一样
请问还有没有其他办法,计数和赋值一一对应?这种现象对实际的电路将会有多大?
只能用时序,那你换一种写法啊
always @(cnt) begin
case(cnt)
0: QTmp = 4'bxxxx;
1: Qtmp = 4'bxxxx;
always @(clock) begin
Q <= QTmp;
end
这样不就解了。
我猜你肯定是这么写的:
...
always@(clock)
begin
...
cnt <= cnt+1;
...
end
always@(clock)
begin
...
case(cnt)
0: Q = 4'bxxxx;
1: Q = 4'byyyy;
...
end
这种写法就会出现你说的所谓慢一拍的问题。
只要把对Q赋值的地方不用时钟沿打就对了
always@(cnt)
begin
case(cnt)
0: Q <= 4'bxxxx;
1: Q <= 4'byyyy;
...
endcase
end
兄弟,没错就这么写的
那有解决的方法吗?这将会有啥影响吗?
楼上的,组合逻辑用非阻塞赋值,不报错么
除非你后面用寄存器敲了一拍!
