Verilog常用的数据选择语句vect[a +: b]或vect [a -: b]

本文介绍了Verilog中用于数据选择的语句`vect[a +: b]`和`vect [a -: b]`,解释了它们的工作原理和等价表达。通过示例说明了如何在实际设计中使用这些语句,特别是结合变量cnt简化代码。同时,提到了选择语句在硬件层面的实现以及Modelsim的功能仿真验证。

Verilog语法中有一个常用的选择语句,其语法形式为:

vect[a +: b]或vect [a -: b];

vect为变量名字,a为起始位置,加号或者减号代表着升序或者降序,b是进行升序或者降序的宽度。

vect[a +: b]等同于vect[a : a+b-1],vect的区间从a开始,往比a大的方向数b个数;vect [a -: b]等同于vect[a : a-b+1],vect的区间从a开始,往比a小的方向数b个数。a可以是一个常数也可以是一个可变的数,但b必须是一个常数。

例1:vect[7 +: 3];

其中,起始位置为7,+代表着升序,宽度为3。即从7开始往比7大的方向数3个数。其等价形式为:vect[7 +: 3]==vect[7 : 9]。

值得注意的是vect[7 : 9]和vect[9: 7]是一样的,不会因为截位时是m:n和n:m有所变化。
举个例子,wire vect = 9’b100000111,vect[7 : 9]=vect[9: 7]=3’b100。

例2:vect[9 -: 4];

其中,起始位置为9,-代表着降序,宽度为4。即从9开始往比9小的方向数4个数。其等价形式为:vect[9 -: 4]==vect[9 : 6]。

在实际使用的过程中,这个语法最常用的形式是将a作为一个可变的数来使用。例如需要设计如下代码:

当cnt=0时,将din[7:0]赋值给data[15:8];当cnt==1时将din[7:0]赋值给data[7:0]。

在设计的时候便可以写成:data[15-8cnt -: 8] <= din[7:0](这里需要把15-8cnt看成一个整体a,它是一个随着cnt变化而变化的数)。这样就可以精简我们的代码了。

选择语句的硬件电路结构如下图31所示,本质上是个选择器。当cnt=0时,选中data[15:8]的锁存器,将din[7:0]赋值给data[15:8],而data[7:0]的锁存器保持输出不变;当cnt==1时,选中data[7:0]的锁存器,将din[7:0]赋值给data[7:0],而data[15:8]的锁存器保持输出不变。
在这里插入图片描述
用Modelsim对上面的例子进行一下功能仿真,仿真图如下:
在这里插入图片描述 仿真结果满足实际的设计需求。

笔者经验:在实际工程中可以多多使用选择语句vect[a +: b]或vect [a -: b]的形式来写代码,这将有助于精简设计代码。

转载:MDY常用的数据选择语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值