Verilog中Case语句
实际问题中常常需要用到多分支选择,使用if语句导致内容繁琐;更明智的做法是使用case语句,case语句是一种多分支选择语句,可以方便的处理多分支选择。本文通过实际例子,讲解case语句的使用,以及case语句的变体casez和casex的使用:
目录
一、case的用法
形式:
功能:
注意:
测试:
二、casez与casex的用法
三、参考文献
一、case的用法
形式:
case(控制表达式/值)
分支表达式:执行语句
default:执行语句
endcase
功能:
自上而下,按照顺序逐个对分支表达式进行判断,如果这一分支表达式等于控制表达式的值,就执行其对应操作;均不相等时,执行default操作;
注意:
分支表达式不能重复,否则会出现冲突;
执行完某一操作后,跳出case语句;
控制表达式与多个分支表达式匹配,只执行从上至下首个匹配项(判断顺序进行,执行一次后就跳出case语句了);
测试:
设计一个四选一器件,验证case语句功能:
实现代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer: guoliang CLL
//
// Create Date: 2020/03/02 16:51:44
// Design Name:
// Module Name: case_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module case_test(
input [1:0]sel,
output reg [3:0]dout);
always@(*)
begincase(sel)2'b00:begindout = 4'b0000;end2'b01:begindout = 4'b0001;end2'b10:begindout = 4'b0011;end2'b11:begindout = 4'b0111;enddefault:begindout = 4'b1111;endendcase
end
endmodule
测试文件如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer: guoliang CLL
//
// Create Date: 2020/03/02 16:56:45
// Design Name:
// Module Name: case_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module case_tsb();
reg [1:0]sel;
wire [3:0]dout;
initial
beginsel = 2'b00;#10 sel = 2'b10;#10 sel = 2'b11;#10 sel = 2'b01;
end
case_test inst1(.sel(sel),.dout(dout));
endmodule
仿真结果如下:
对应RTL电路如下:
二、casez与casex的用法
casez进行控制表达式与分支表达式的比较时,不关注高阻态位(不管是控制表达式还是条件表达式,这些位均默认为匹配);
casex进行控制表达式与分支表达式的比较时,不关注高阻态,以及不定位(不管是控制表达式还是条件表达式,这些位均默认为匹配);
示例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
对应的结果为:
Result:sel y case item 00 a 00 11 g default xx g default x0 c x0 1z f 1? z1 g default
可以看出,case可以识别出1/0/x/z,必须完全匹配才能执行对应的执行语句;反之就匹配default;
对于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
对应的结果为:
Result:sel y case item00 a 0011 f 1?xx g defaultx0 c x0 (would have matched with z0(item 5) if item 3 is not present.)1z d 1x (would have matched with z0(item 5) & 1?(item 6) also.)z1 b 01 (would have matched with 1?(item 6) also.)
可以看出,casez会把z/?匹配成任意,也会把任意匹配成z/?的;
对于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
对应的结果为:
Result: sel y case item 00 a 00 11 d 1x (would have matched with 1? also) xx a 00 (would have matched with all items) x0 a 00 (would have matched with all items except 01) 1z c x0 (would have matched with all items except 00,01) z1 b 01 (would have matched with 1x, 1? also)
可以看出,casex会把x和z/?匹配成任意,也会把任意匹配成x和z/?的;
三、参考文献
https://www.cnblogs.com/poiu-elab/archive/2012/11/02/2751323.html
Verilog中Case语句相关推荐
- JAVA语法中case语句的特性
JAVA语法中case语句的特性: 1.case拥有穿透机制, 若case后不写break,如果命中了某个case语句步骤,下面的case结果将会同时执行.建议写完一个case后 针对break的增加 ...
- Verilog中case,casez,casex语句的用法
文章目录 1.case的用法 2.casez/casex的用法 3.case语句的常数表达式 1.case的用法 case语句是一种多路选择结构语句,根据表达式(expression)中的值,对选项( ...
- Verilog中for语句的使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- Verilog中生成语句(generate)的用法
一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function, ...
- verilog中for语句使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在T ...
- Verilog中case,casex,casez的区别
在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配. Note: casez与casex语句是case语句的两种变体, 在写testbench时用到,属于不可综合的 ...
- Verilog中for 语句怎么用
类似C的环路结构如for-loop可能对学过C语言的人存在陷阱.其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代.在Verilog中,for循环一般用 ...
- verilog中assign语句
/************************************** * Module: assign * Date:2014-08-10 * Author: hemmingway@163. ...
- java中case语句_Java:switch-case语句
我们生活中总会出现形形色色的选择,中意选择的不同,往后的故事往往也不尽相同.计算机中想要实现现实中的选择交互,就需要用到"选择语句".当然简单的选择可以用if...else..., ...
最新文章
- mysql col与row_使用mysql实现row_number() over(partition by col1 order by col2)函数
- _disable_logging 对于归档数据库的影响
- Windbg学习 (0x0002) 命令基础
- python3 三角函数
- 全国计算机等级考试题库二级C操作题100套(第82套)
- java视频压缩 lz4_一种视频序列帧的压缩方法、解压方法及装置与流程
- Excel合并单元格基础注意事项(VSTO 2005)
- android监听自身被卸载的方法
- c语言冒泡排序法程序填空_五种数组的排序方法(C语言)Part1
- 武汉CMMI3-CMMI5三年到期后复审指南
- FIR滤波器结合快速卷积滤波
- java获取指定日期当月和下个月的第一天
- 深入理解Zend执行引擎
- web安全攻防渗透+赵雨佳43
- python 流水作业调度,流水作业调度完整代码
- U盘和存储卡实际上可以轻松的创建隐藏分区制作PE启动盘
- 噪声分析基础(公式)知识
- 关于项目管理的通俗讲解
- 京东与苏宁之争,用户体验的博弈
- 长沙有哪些比较有名的互联网公司?
热门文章
- 毁灭一切还是重塑世界?AI已成为人类故事中心
- linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” KDE和Xfce版本正式发布
- 【Meetup预告】OpenMLDB+37手游:一键查收实时特征计算场景案例及进阶使用攻略
- matlab之判别分析
- 玩客云退出链克计划后还是会下载缓存垃圾,程序员教你如何彻底绝育玩客云老母鸡
- python-selenium登陆今日头条
- Zotero 6 文献管理 + 内置PDF阅读器 + 选中翻译
- 向世界问好,.NET 5 从 Fur 框架开始,v1.0.0.rc2 发布
- openxml的视频教程
- 删除单号中的符号并查询快递物流信息