full_case避免综合出锁存器?

[复制链接]
3631|13
 楼主| 笑溜溜+ 发表于 2012-7-27 21:41 | 显示全部楼层 |阅读模式
本帖最后由 笑溜溜+ 于 2012-7-27 21:42 编辑

各位路过的大虾,帮我指导一下。书中说“使用full_case避免综合出锁存器”,下面是我做的程序,一个没有synthesis full_case语句,另一个有。但是我用quartus综合后所用的逻辑单元依然一样,综合后的电路也是一样。不是synthesis full_case可避免综合出锁存器吗?怎么结果还是一样?
  1. module datadistributor(datain,sel,enable,a,b,c,d);
  2. input datain;
  3. input[1:0] sel;
  4. input enable;
  5. output a;
  6. output c;
  7. output d;
  8. output b;
  9. reg a,b,c,d;
  10. always @(datain or enable or sel)
  11.    begin
  12.       if(enable==1'b1)
  13.           begin
  14.              case(sel)
  15.                 2'b00:a<=datain;
  16.                 2'b01:b<=datain;
  17.                 2'b10:c<=datain;
  18.                 2'b11:d<=datain;
  19.                 default:a<=datain;
  20.               endcase
  21.           end
  22.        else
  23.           begin
  24.              a<=1'bz;
  25.              b<=1'bz;
  26.              c<=1'bz;
  27.              d<=1'bz;
  28.           end
  29.    end  
  30. endmodule






  1. module datadistributor_1(datain,sel,enable,a,b,c,d);

  2. input datain;
  3. input[1:0] sel;
  4. input enable;
  5. output a;
  6. output c;
  7. output d;
  8. output b;

  9. reg a,b,c,d;
  10. always @(datain or enable or sel)
  11.    begin
  12.       if(enable==1'b1)
  13.           begin
  14.              case(sel)         //synthesis full_case
  15.                 2'b00:a<=datain;
  16.                 2'b01:b<=datain;
  17.                 2'b10:c<=datain;
  18.                 2'b11:d<=datain;
  19.                 default:a<=datain;
  20.               endcase
  21.           end
  22.        else
  23.           begin
  24.              a<=1'bz;
  25.              b<=1'bz;
  26.              c<=1'bz;
  27.              d<=1'bz;
  28.           end
  29.    end
  30.    
  31.    
  32. endmodule
GoldSunMonkey 发表于 2012-7-27 22:23 | 显示全部楼层
2'b00:a<=datain;
                2'b01:b<=datain;
                2'b10:c<=datain;
                2'b11:d<=datain;
                default:a<=datain;
这个是4个变量赋值,没有全部赋值啊
 楼主| 笑溜溜+ 发表于 2012-7-28 22:05 | 显示全部楼层
2# GoldSunMonkey
对,是没有全部赋值。不是case语句中加入了synthesis full_case语句后会减少锁存器的产生。但我综合后综合电路依然一样
GoldSunMonkey 发表于 2012-7-29 15:23 | 显示全部楼层
那就综合器不识别你的语句。
GoldSunMonkey 发表于 2012-7-29 15:24 | 显示全部楼层
不要什么事情都相信综合器
 楼主| 笑溜溜+ 发表于 2012-7-29 20:54 | 显示全部楼层
5# GoldSunMonkey
不是这样,我用的其它的例子,也是同样加了这一条语句,最后显示没有锁存器,逻辑单元比原来少了
GoldSunMonkey 发表于 2012-7-30 10:12 | 显示全部楼层
那我不知道了。
GoldSunMonkey 发表于 2012-7-30 10:14 | 显示全部楼层
你都说那么准确,代码本身没问题,综合器也没问题

反正我看不出来有什么问题。
 楼主| 笑溜溜+ 发表于 2012-7-31 10:55 | 显示全部楼层
8# GoldSunMonkey
谢谢,猴哥。各位路过大仙,帮忙给看看
GoldSunMonkey 发表于 2012-7-31 17:58 | 显示全部楼层
8# GoldSunMonkey  
谢谢,猴哥。各位路过大仙,帮忙给看看
笑溜溜+ 发表于 2012-7-31 10:55
不可能解决。这个问题,我都给你说了,你不信。
aikimi7 发表于 2012-12-24 10:45 | 显示全部楼层
第一个程序里面default:a<=datain去掉就能出现你要的效果了,赋值不全就会产生不必要的锁存器,然后你再增加full_case语句综合后会去掉锁存器。。。你的问题现在是会两个程序里都指定了default,考虑了所有的情况,那么增加full_case就没有意义了。
aikimi7 发表于 2012-12-24 10:45 | 显示全部楼层
本帖最后由 aikimi7 于 2012-12-24 16:13 编辑

我研究下了,发现我说的不正确。你这个例子产生的锁存器是没有办法用full_case来去掉的,猴哥说的也没错,原因你自己看下面的文献说的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
aikimi7 发表于 2012-12-24 16:24 | 显示全部楼层
Quartus中验证过了
GoldSunMonkey 发表于 2012-12-24 22:01 | 显示全部楼层
aikimi7 发表于 2012-12-24 16:24
Quartus中验证过了

希望在ISE或者VIVADO里面验证
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

89

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部