Verilog的多分支语句

简介: 关键词:case,选择器case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。

关键词:case,选择器

case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。

case 语句

case 语句格式如下:

case(case_expr)

condition1     :             true_statement1 ;
condition2     :             true_statement2 ;
……
default        :             default_statement ;

endcase

case 语句执行时,如果 condition1 为真,则执行 true_statement1 ; 如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。如果各个 condition 都不为真,则执行 default_statement 语句。

default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。

条件选项可以有多个,不仅限于 condition1、condition2 等,而且这些条件选项不要求互斥。虽然这些条件选项是并发比较的,但执行效果是谁在前且条件为真谁被执行。

ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。

case 语句支持嵌套使用。

下面用 case 语句代替 if 语句实现了一个 4 路选择器的功能。仿真结果与 testbench 可参考条件语句一章,两者完全一致。

module mux4to1(

input [1:0]     sel ,
input [1:0]     p0 ,
input [1:0]     p1 ,
input [1:0]     p2 ,
input [1:0]     p3 ,
output [1:0]    sout);

 

reg [1:0]     sout_t ;
always @(*)
    case(sel)
        2'b00:   begin      
                sout_t = p0 ;
            end
        2'b01:       sout_t = p1 ;
        2'b10:       sout_t = p2 ;
        default:     sout_t = p3 ;
    endcase
assign sout = sout_t ;

 
endmodule

case 语句中的条件选项表单式不必都是常量,也可以是 x 值或 z 值。

当多个条件选项下需要执行相同的语句时,多个条件选项可以用逗号分开,放在同一个语句块的候选项中。

但是 case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值。

例如,对 4 路选择器的 case 语句进行扩展,举例如下:

case(sel)

2'b00:   sout_t = p0 ;
2'b01:   sout_t = p1 ;
2'b10:   sout_t = p2 ;
2'b11:     sout_t = p3 ;
2'bx0, 2'bx1, 2'bxz, 2'bxx, 2'b0x, 2'b1x, 2'bzx :
    sout_t = 2'bxx ;
2'bz0, 2'bz1, 2'bzz, 2'b0z, 2'b1z :
    sout_t = 2'bzz ;
default:  $display("Unexpected input control!!!");

endcase

casex/casez 语句

casex、 casez 语句是 case 语句的变形,用来表示条件选项中的无关项。

casex 用 "x" 来表示无关值,casez 用问号 "?" 来表示无关值。

两者的实现的功能是完全一致的,语法与 case 语句也完全一致。

但是 casex、casez 一般是不可综合的,多用于仿真。

例如用 casez 语句来实现一个 4bit 控制端的 4 路选择选择器。

module mux4to1(

input [3:0]     sel ,
input [1:0]     p0 ,
input [1:0]     p1 ,
input [1:0]     p2 ,
input [1:0]     p3 ,
output [1:0]    sout);

 

reg [1:0]     sout_t ;
always @(*)
    casez(sel)
        4'b???1:     sout_t = p0 ;
        4'b??1?:     sout_t = p1 ;
        4'b?1??:     sout_t = p2 ;
        4'b1???:     sout_t = p3 ;  
    default:         sout_t = 2'b0 ;
endcase
assign      sout = sout_t ;

 
endmodule

相关文章
|
弹性计算 云计算
记录下考Apsara Clouder云计算专项技能认证:云服务器ECS入门过程
Apsara Clouder云计算专项技能认证:云服务器ECS入门
37683 4
记录下考Apsara Clouder云计算专项技能认证:云服务器ECS入门过程
|
Linux
vsftpd 修改指定端口
vsftpd的一般默认端口为21,一般来说端口21不太方便开放,因此多数时间需要修改指定默认的端口。
2470 0
|
7月前
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
344 62
算法系列之搜索算法-深度优先搜索DFS
|
传感器 数据采集 监控
ERP系统中的生产过程监控与质量管理解析
【7月更文挑战第25天】 ERP系统中的生产过程监控与质量管理解析
509 0
ERP系统中的生产过程监控与质量管理解析
|
12月前
|
存储 运维 监控
降本 60%!小熊油耗使用阿里云 SAE 更加稳定可靠
小熊油耗在进行架构升级时,进行了广泛的市场调研,深入分析了国内多家云服务商。经过对比多种 IaaS 层云主机方案及 Serverless 产品的部署策略,他们最终选择了阿里云Serverless 应用引擎 SAE。小熊油耗认为,阿里云能给他们提供更强的安全感,安全感来自于阿里云是一个更大的平台:历史最悠久,用户最多、产品最丰富、配套工具众多、技术支持体系成熟,阿里云 SAE,不仅在稳定性上表现卓越,在细粒度的成本控制和极致的弹性能力上表现也非常出色,而且免运维,完美契合了小熊油耗作为一家细分领域小而美的公司的需求。
852 11
Vue3统计数值(Statistic)
这是一个基于 Vue3 的统计数值组件 `Statistic`,用于展示数据指标。它支持设置标题、数值内容、精度、前缀、后缀及千分位标识符等,并可通过插槽和自定义函数实现更丰富的展示效果。
353 2
Vue3统计数值(Statistic)
|
存储 自然语言处理 网络协议
【elastic search】下载安装、使用教程
【elastic search】下载安装、使用教程
278 1
|
Java 数据库连接 API
解锁你的数据库:JPA和Hibernate的乐观锁与悲观锁
本文由木头左介绍JPA和Hibernate中的乐观锁与悲观锁。乐观锁假设无冲突,通过`@Version`注解防止并发更新,适用于更新不频繁、处理冲突成本高、数据一致性要求不高的场景。悲观锁假设有冲突,利用`@Lock`注解实现加锁,适用于并发更新频繁、处理冲突成本低、数据一致性要求高的情况。选择哪种锁取决于具体需求。
解锁你的数据库:JPA和Hibernate的乐观锁与悲观锁
|
关系型数据库 数据库 数据安全/隐私保护
使用PostgreSQL进行高级数据库管理
【5月更文挑战第17天】本文介绍了使用PostgreSQL进行高级数据库管理,涵盖性能调优、安全性加强和备份恢复。性能调优包括索引优化、查询优化、分区和硬件配置调整;安全性涉及权限管理、加密及审计监控;备份恢复则讨论了物理备份、逻辑备份和持续归档。通过这些实践,可提升PostgreSQL的性能和安全性,确保数据资源的有效管理。
|
资源调度 监控 Go

热门文章

最新文章