Verilog(2)关于选择

时序电路或者组合逻辑中都会遇到根据相应的情况选择相应的逻辑处理方式或者结果的情况,这时候一般会使用到大概有以下三种方式:

第一种是采用assign result=(condition)?result1 :result2;这种语法来进行信号的选择,采用的逻辑是?:的方式,condition为1则result为result1,否则就会为result2,;不过这个表达方式只能表示组合逻辑,不能写在时序模块中区,当然,之前我们介绍过assign和deassign这种赋值方式,不过在时序逻辑中不会采用这种方式来表示相应的选择;不过这种表述方式可以真实的表述电路的实际行为,在仿真的时候仿真结果与电路行为是一致的,所以组合逻辑推荐使用这种方式来表达。

第二种是采用if,else这种结构来表述,这种结构要放在always这种procedural block中,如下这种表述:

always @( result1 orresult2)

if(condition1) begin

result = result1;

end

else if(condition2)begin

result = result2;

end

end

不过实际电路中可能会存在unknown的信号,x这个时候result根据result1和result2的值是否相同就会有不同的表现,有的时候会给result加上相应的默认值,比如说在always block下加上一句result=0;这时候就会给result一个默认值,假如不满足condition(condition1和condition2的情况是fullcase,但并不一定不会出现unknown而两个都不匹配的现象)的情况,这时候就会保持result为0,但如果result在这个模块之前就存在,而且值为1,经过模块后值仍然为1,则会出现中间有一个暂态0,这是一个很小的毛刺,可能会对电路产生很大的影响,不注意这个问题的话会使设计产生很大的问题,假如最后加上一个else result=0,则回产生实际电路行为和仿真结果不符合的情况,这个需要注意下;所以一般在写的时候要很注意fullcase,避免出现unknown信号,组合逻辑建议使用第一种方式。

第三种,采用case语句,除了case还存在相应的casez和casex的表述方式,这三个有一定的区别;casez会把z和?当做don’t care,而casex会把?,z和x当做don’t  care,这三种都是可以综合的,不过一般在实际项目中不会出现casex的情况,这是因为电路中出现了unknown不能忽视:,具体用法格式如下:

always @(con or result1or result2)begin

case(con)

con1 : result =result1;

con2: result=result2;

endcase

end

上面的always中的模块,不管是if还是case,组合逻辑采用blocking assignment=,时序逻辑采用non-blocking assignment<=.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • fpga规范 工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎...
    Michael_Johnson阅读 5,945评论 1 4
  • 学号:16010199021 姓名:李若宇 转载自 http://blog.csdn.net/sun1991011...
    承瑜阅读 4,274评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,200评论 19 139
  • ​​​本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:...
    OpenJetson阅读 8,645评论 0 13
  • 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本...
    荣卓然阅读 6,228评论 0 5

友情链接更多精彩内容