文章目录

  • 前言
  • 正文
    • 语法
    • 例子
    • 硬件原理图
    • case与if-else有什么不同?
  • 往期回顾
  • 参考资料及推荐关注

前言

case语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。

如果要检查的条件很多,if-else结构可能不合适,因为它会综合成一个优先编码器而不是多路复用器。

正文

语法

一个Verilog case语句以case关键字开始,以endcase关键字结束。在括弧内的表达式将被精确地评估一次,并按其编写顺序与备选方案列表进行比较,与给定表达式匹配的备选方案的语句将被执行。一块多条语句必须分组,并在 begin 和 end 范围内。

// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)case_item1 :   <single statement>case_item2,case_item3 :     <single statement>case_item4 :    begin<multiple statements>enddefault   : <statement>
endcase

如果所有的case项都不符合给定的表达式,则执行缺省项内的语句,缺省语句是可选的,在case语句中只能有一条缺省语句。case语句可以嵌套。

如果没有符合表达式的项目,也没有给出缺省语句,执行将不做任何事情就退出case块。

例子

下图所示的设计模块有一个2位选择信号,用于将其他三个3位输入中的一个信号连接到被调用的输出信号。根据sel的值,用case语句将正确的输入分配到输出。由于sel是一个2位信号,它可以有2^2种组合,从0到3。如果sel为3,默认语句有助于将输出设置为0。

module my_mux (input       [2:0]     a, b, c,        // Three 3-bit inputs[1:0]  sel,              // 2-bit select signal to choose from a, b, coutput reg  [2:0]    out);           // Output 3-bit signal// This always block is executed whenever a, b, c or sel changes in valuealways @ (a, b, c, sel) begincase(sel)2'b00    : out = a;         // If sel=0, output is a2'b01    : out = b;      // If sel=1, output is b2'b10    : out = c;      // If sel=2, output is cdefault  : out = 0;       // If sel is anything else, out is always 0endcaseend
endmodule

硬件原理图

通过对rtl代码进行RTL分析,得到一个表示4比1多路复用器的硬件原理图。

请看,当sel为3时,输出为零,sel为其他值时也有对应的输入。

在case语句中,只有当表达式中的每个位都与包括0、1、x和z在内的备选方案之一相匹配时,比较才会成功。在上图所示的例子中,如果sel中的任何位是x或z,默认语句将被执行,因为其他备选方案都不匹配。在这种情况下,输出将全部为0。

我们可以做下简单的仿真:

  reg  [2:0] a, b, c;reg  [1:0] sel;wire [2:0] out;my_mux    m0 ( .a(a),.b(b),.c(c),.sel(sel),.out(out));initial begin$monitor ("[%0t] a=0x%0h b=0x%0h c=0x%0h sel=0b%b out=0x%0h", $time, a, b, c, sel, out);for (int i = 0; i < 10; i = i+1) begina <= $random;b <= $random;c <= $random;sel <= $random;#10;endend
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0

如果设计中的案例语句中案例项备选有x和z,结果就会大不相同。

module my_mux (input         [2:0]   a, b, c,[1:0]       sel,output reg  [2:0]   out);// Case items have x and z and sel has to match the exact value for// output to be assigned with the corresponding inputalways @ (a, b, c, sel) begincase(sel)2'bxz          :   out = a;2'bzx         :   out = b;2'bxx         :   out = c;default    :   out = 0;endcaseend
endmodule

结果为:

[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5

有关更多case的讨论,例如casex/casez等,跳转链接:【 Verilog HDL 】case, casez, casex 之干货总结

case与if-else有什么不同?

case语句与if-else-if有两点不同。

  • 在if-else块中给出的表达式比较笼统 而在case块中,一个表达式要与多个项目相匹配。
  • 当一个表达式中存在X和Z值时,case将提供一个明确的结果。

往期回顾

Verilog初级教程(16)Verilog中的控制块

Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

Verilog初级教程(14)Verilog中的赋值语句

Verilog初级教程(13)Verilog中的块语句

Verilog初级教程(12)Verilog中的generate块

Verilog初级教程(11)Verilog中的initial块

Verilog初级教程(10)Verilog的always块

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

FPGA/ASIC初学者应该学习Verilog还是VHDL?

参考资料及推荐关注

verilog-case-statement

simulator

个人微信公众号: FPGA LAB

交个朋友

Verilog初级教程(17)Verilog中的case语句相关推荐

  1. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  2. Verilog初级教程(21)Verilog中的延迟控制语句

    文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...

  3. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

  4. Verilog初级教程(14)Verilog中的赋值语句

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

  5. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

  6. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  7. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

  8. Verilog初级教程(11)Verilog中的initial块

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

  9. Verilog初级教程(16)Verilog中的控制块

    文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...

  10. Verilog初级教程(9)Verilog的运算符

    博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...

最新文章

  1. 分分钟甩Word几条街,Python编辑公式竟可以如此简单
  2. 查看磁盘空间,清理缓存
  3. Error loading MySQLdb module: No module named MySQLdb
  4. 用python实现TCP协议传输功能(服务端代码)
  5. 三丰三坐标编程基本步骤_三丰三坐标CRYSTA APEX S776
  6. eeprom 数据偶尔变成ff_关于水电站冗余配置下监控系统下发调节令偶尔不动作的案例分析...
  7. 自学前端的误区和痛点解决办法
  8. Python的程序结构[4] - 函数/Function[2] - 匿名函数
  9. 【README】二叉树刷题框架
  10. Timer定时器控件 1130
  11. hdu 5326(基础题) work
  12. python 数据框按行拼接_使用python进行数据分析
  13. 36. PHP面向对象
  14. DiskFileUpload类
  15. 【OpenCV】计算两幅图片视觉差
  16. IK如何实现同义词搜索
  17. LED小间距屏幕理解
  18. nlp, ml, 学习书单
  19. fft理解-cooley turkey
  20. 数据库系统原理选择题总结

热门文章

  1. WebApi基于Token和签名的验证
  2. (六)Value Function Approximation-LSPI code (3)
  3. 捕获键盘和鼠标的消息机制
  4. (转)jquery对表单元素的取值和赋值
  5. SharePoint 2007 图片库视图不可用、页面标题不显示
  6. floyd算法求最短路径_算法题-蜜蜂采蜜最短路径
  7. SVM之-核函数概念和简单例子
  8. SVG 坐标和 viewBox
  9. .net core linux 串口,.Net Core 跨平台应用使用串口、串口通信 ,可能出现的问题、更简洁的实现方法...
  10. r语言聚类分析_R语言实现tSNE聚类分析