程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

【Verilog基础】Verilog语法之case/casez/casex

发布于2022-01-08 18:06     阅读(1119)     评论(0)     点赞(18)     收藏(2)


一、语法格式

case/casez/casex语法格式如下:

case(控制表达式) <case分支项> endcase
casez(控制表达式) <case分支项> endcase
casex(控制表达式) <case分支项> endcase

case分支项的语法格式如下:

分支表达式: 语句
缺省项(default): 语句

注意事项:

  • a)case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式
  • b)当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有的分支表达式的值都没有与控制表达式的值相匹配的,就执行default后面的语句。
  • c)default 是可选项,在一个case语句中不能使用多个default。
  • d)执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行。
  • e) 在用case语句表达式进行比较的过程中,只有当信号的对应位的值能明确进行比较时,比较才能成功。因此要注意详细说明case分项的分支表达式的值。
  • f)case语句的所有表达式的值的位宽必须相等*,只有这样控制表达式和分支表达式才能进行对应位的比较。一个经常犯的错误是用’bx, 'bz 来替代 n’bx, n’bz,这样写是不对的,因为信号x, z的缺省宽度是机器的字节宽度,通常是32位。
  • g)不推荐使用casex语句,因为x状态为仿真的初值,容易引起误会。

二、case/casez/casex的区别

真值表如下:

在这里插入图片描述

  • 1)在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。
  • 2)在casez语句中,如果分支表达式某些位的值为高阻z(?),那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。
  • 3)在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z(?)或x,那么这些位的比较就不予考虑。

注:分支表达式中的z也可以写成

三、case/casez/casex的应用实例

3.1、case 应用实例

case (sel) 
    2'b00:      y = a; 
    2'b01:      y = b; 
    2'bx0:      y = c; 
    2'b1x:      y = d; 
    2'bz0:      y = e; 
    2'b1?:      y = f; 
    default :   y = g; 
endcase

对于case来说,每一种情况(0/1/x/z)都会识别,所以只有当sel的值和case分支中的值完全一样时,才会进行匹配。需要提醒一点的是:分支表达式中的z也可以写成

不同sel值的匹配结果如下:

selycase item
00a00
11gdefault
xxgdefault
x0cx0
1zf1?
z1gdefault

3.2、casez应用实例

casez (sel) 
    2'b00:      y = a; 
    2'b01:      y = b; 
    2'bx0:      y = c; 
    2'b1x:      y = d; 
    2'bz0:      y = e; 
    2'b1?:      y = f; 
    default:    y = g; 
endcase

对于casez:

  • sel中含有 0 的话,就能和 0/z(?) 匹配。
  • sel中含有 1 的话,就能和 1/z(?) 匹配。
  • sel中含有 x 的话,就能和 x/z(?) 匹配。
  • sel中含有 z(?) 的话,就能和 0/1/x/z(?) 匹配。

不同sel值的匹配结果如下:

selycase item
00a00
11f1?
xxgdefault
x0cx0
1zd1x
z1b01

需要说明的是:case/casez/casex是从上往下依次判断分支的,如果当前分支满足要求就会执行其后的分支表达式,本次执行完毕后就会退出case/casez/casex。所以上述例子中的case item一栏并不是说只有1个分支符合情况,可能有多个分支满足,但是只会执行第一个满足的分支。

3.3、casex应用实例

casex (sel) 
    2'b00   :   y = a; 
    2'b01   :   y = b; 
    2'bx0   :   y = c; 
    2'b1x   :   y = d; 
    2'bz0   :   y = e; 
    2'b1?   :   y = f; 
    default :   y = g; 
endcase

对于casex:

  • sel中含有 0 的话,就能和 0/x/z(?) 匹配。
  • sel中含有 1 的话,就能和 1/x/z(?) 匹配。
  • sel中含有 x 的话,就能和 0/1/x/z(?) 匹配。
  • sel中含有 z(?) 的话,就能和 0/1/x/z(?) 匹配。

不同sel值的匹配结果如下:

selycase item
00a00
11d1x
xxa00
x0a00
1zcx0
z1b01

需要说明的是:case/casez/casex是从上往下依次判断分支的,如果当前分支满足要求就会执行其后的分支表达式,本次执行完毕后就会退出case/casez/casex。所以上述例子中的case item一栏并不是说只有1个分支符合情况,可能有多个分支满足,但是只会执行第一个满足的分支。

参考

原文链接:https://blog.csdn.net/ReCclay/article/details/122365788



所属网站分类: 技术文章 > 博客

作者:卡卡卡

链接:http://www.phpheidong.com/blog/article/261135/d8b3b0ad6e89ce745f6f/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)