微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > case 语句仿真问题

case 语句仿真问题

时间:10-02 整理:3721RD 点击:
程序大概这样的
   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



    兄弟,没错就这么写的
   那有解决的方法吗?这将会有啥影响吗?

楼上的,组合逻辑用非阻塞赋值,不报错么



    除非你后面用寄存器敲了一拍!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top