完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
3.4.4.6 双目按位异或 ^
双目运算符^,左边和右边都是信号,表示的是这两个信号之间,对应的位相异或。异或是指0^0=0,1^1=0,0^1=1,即相同为0,不同为1。例如:
上面的代码等价于:C[0] = A[0] ^ B[0], C[1] = A[1] ^ B[1] ,C[2] = A[2] ^ B[2] , C[3] = A[3] ^ B[3]。如果A=4’b0110,B=4’b1010,C的结果为4’b1100。 如果操作数长度不相等, 长度较小的操作数在最左侧添0补位。例如,
上面的代码等价于:C[0] = A[0] ^ B[0], C[1] = A[1] ^ B[1] ,C[2] = 0] ^ B[2],C[3] = 0 ^ 0。 3.4.4.7 逻辑运算符和位运算符的区别 逻辑运算符包括&&、 || 、 !,位运算符包括 &、|、~。逻辑运算符和位运算符有什么区别呢? 逻辑运算符的结果只有逻辑真或逻辑假两种,即1或0; 而“ &”是位运算符,用于两个多位宽数据操作,两个数按位进行相与、相或或者非。
上面运行的结果为:a=1’b1 ,b=1’b1,c=1’b0,d=4’b000,e=4’b1111,f=4’b1000。 3.3.5 条件运算符 Verilog HDL的条件运算符(?:)带有三个操作数(即三目运算符),其格式一般表达为: 当“条件表达式 ”为真(即逻辑1),执行“真表达式”;当“条件表达式”为假(即逻辑0),执行“假表达式”。 如果condition_expr 为真(即值为1),选择true_expr;如果condition_expr 为假(值为0),选择false_exp。如果condition_expr为x或z,结果将是按以下逻辑true_expr和false_expr 按位操作的值:0与0得0,1与1得1,其余情况为 x。 应用举例如下:
表达式s如果为真,则把t赋值给r;如果s为假,则把u赋值给r 。 对应硬件电路图: 图 24 知识点①条件表达式的作用实际上类似于多路选择器(如图所示);同时,其可以用if-else语句来替代。 图 25 2选1多路选择器图 知识点②条件运算符可用在数据流建模中的条件赋值,这个时候,条件表达式的作用相当于控制开关。例如:
表达式Marks > 18如果为真,则Grade_A赋值为Student;如果Marks > 18 为假,则Grade_C赋值为Student。 对应硬件电路图: 图 26 知识点③条件运算符也可以嵌套使用,每个“真 表 达式”和“假表达式”本身就可以是一个条件表达式。例如:
表达式M == 1如果为真,则判断CTL是否为真,如果为真就将A赋值给OUT,如果为假就将B赋值给OUT;如果M = = 1为假,则判断CLT是否为真,如果为真就将C赋值给OUT,如果为假就将D赋值给OUT。 对应硬件电路图: 图 27 3.3.6 连接运算符 连接操作是将小表达式合并形成大表达式的操作。形式如下:
拼接符是不消耗任何硬件资源的,它只是把线换一种组合方式。 实例如下所示:
/ /以反转的顺序将低端4位赋给高端4位。 assign Dbus = {Dbus [3:0], Dbus [ 7 : 4 ] } ; / /高4位与低4位交换。 由于非定长常数的长度未知, 不允许连接非定长常数。例如,下列式子非法: {Dbus,5} / /不允许连接操作非定长常数。 3.3.7 移位运算符 在Verilog HDL中有两种移位运算符,分别为“<<”(左移位运算符)和 “>>”(右移位运算符)。下面分别介绍它们的用法: 3.4.7.1 左移运算符 在Verilog HDL中,用“<<”表示左移运算符。其一般表达式为: A << n A代表要进行移位的操作数,n代表要左移多少位。此表示的意义是把操作数A左移n位。左移操作属于逻辑移位,需要用0来填补移出的空位,即在低位补0。左移n位,就要补n个0。
由于左移了2位,所以在低位补2个零,所以上面代码运行结果是: a = 4 ’b1100 左移操作是不消耗逻辑资源的,甚至连与门、非门都不需要,它只是线的连接。
上面代码,是将信号b左移两位,并赋给c。其所对应的硬件电路如下图: 左移操作需根据位宽储存结果。 有读者可能看到过如下代码: 4’b1001<<1=4’b0010与4’b1001<<1=5’b10010 为什么操作数同样是4’b1001 ,都是左移一位,但结果一个是4’b0010 ,一个是5’b10010呢? 这是因为左移操作后,要看用多少位来存储结果。
上面代码中,由于a是4比特,只能保存4位结果,所以b左移1位赋给4bit的a,用0填补移出的位,结果为a = 4 ’b0010 ;
上面代码中,由于a是5比特,只能保存5位结果,所以b左移1位赋给5bit的a,用0填补移出的位,结果为a = 5 ’b10010 ; 左移操作的操作数可以是常数,也可以是信号。同样,左移操作的移位数、常数,也可以是信号。
上面代码中,cnt每个时钟加1,由于是3比特,所以值为0~2。a则是4’b1左移cnt位。当 cnt等于0时,左移0位,a等于4’b1;当cnt等于1时,左移1位,a等于4’b10,以此类推。a的每个时钟变化情况是: 图 28 需要注意的是,如果移位数是信号时,其综合的电路就不是简单的连线,而是有可能带有选择器的,如下图: 图 29 虽然如此,这种硬件电路所消耗的资源还是比较少的。 3.4.7.2 右移运算符 在Verilog HDL 中,用“ >> ”表示右移运算符。其一般表达式为: A >>n A代表要进行移位的操作数,n代表要右移多少位。此表示的意义是把操作数A右移n位。 知识点①右移操作属于逻辑移位,需要用0来填补移出的空位,即在高位补0,补多少个0,取决于保存结果的信号的位宽。
由于是4’b0111 右移两位后,结果为2’b01,由于a是6位的,2位赋值给6位,需要在高位补0,这里需要补4个0。 所以上面代码运行结果是:
知识点②与左移操作相似,右移操作是不消耗逻辑资源的,甚至连与门、非门都不需要,它只是线的连接。
上面代码,是将信号b左移两位,并赋给a。其所对应的硬件电路如下图: 图 30 知识点③左移操作的操作数可以是常数,也可以是信号。同样,右移操作的移位数可以是常数,也可以是信号。
上面代码中,cnt每个时钟加1,由于是3比特,所以值为0~2。 a则是4’b1000右移cnt位。当cnt等于0时,右移0位,a等于4’b1000;当cnt等于1时,右移1位,a等于4’b0100,以此类推。a的每个时钟变化情况是: 图 31 需要注意的是,如果移位数是信号时,其综合的电路就不是简单的连线,而是有可能带有选择器的,如下图: 图 32 虽然如此,这种硬件电路所消耗的资源还是比较少的。 3.4.7.3 通过左移乘法运算 FPGA中要尽量避免乘法运算,因为这种计算需要占用较大的硬件资源,并且运算速度较慢;当不得不使用乘法的时候,尽量乘以2的N次方,这样我们可以利用左移运算来实现该乘法运算,大大减少硬件资源。 当乘数是2的N次方的常数时,就可以用移位运算来实现乘法。例如:a*2,等价于 a<<1;a*4等价于a<<2;a*8等价于 a<<3,依此类推。 即使乘数不是2的N次方的常数,也可以通过移位运算来简化实现。例如:
上面代码,b和c都是实现a*127,但第1行消耗了一个乘法,而第2行则只用到一个减法器。
上面代码,b和c都是实现a*67,但第1行消耗了一个乘法,而第2行则只用到2个加法器。又节省了资源。 有读者可能注意到,上面两个例子,乘数都是常数,那么在设计时,也要花时间和精力来考虑这种优化吗?其实是不必要的,因为现在综合工具都很强大了,当工具发现乘数是常数时,它自然会按上述过程来优化,也就是说如果乘以常数,其实质是不消耗乘法器资源的,读者可以放心使用。 那么如果乘数不是常数呢?如果是这种情况,读者就要注意使用了。即使是信号,也尽量凑成跟2的N次方相关,例如当数据要扩大后来计算时,那么扩大100倍,还不如扩大128倍来得方便 。 3.4.7.4 利用右移实现除法运算 FPGA中要极力避免除法,在明德扬的规范中,甚至是严禁使用“ /”来当除法的 。这是由于除法器占用极大的资源,比乘法器还要多,而且很多时候不能在一个时钟周期内得出结果。 当不得不使用除法的时候,尽量除以2的N次方,这样我们可以利用右移运算来实现该除法运算,大大减少硬件资源。 当除数是2的N次方的常数时,就可以用移位运算来实现除法。例如:a/2,等价于 a>>1;a/4等价于a>>2;a/8等价于 a>>3,依此类推。 与左移不同的是,当除数不是2的N次方的常数时,不能简单地通过移位运算来简化实现。 因此,在FPGA设计中,应尽力避免除法。 3.4.7.5 利用左移位产生独热码 独热码,也叫one-hot code ,就是只有1个比特为1,其他全为0的一种码制。例如8’b00010000,8’b1000000等。 独热码在设计时非常有用,可以用来表示状态机的状态,使状态机更健壮;也可以用于多选一的电路中,表示选 择其中的一个。 可以利用左移位来方便地产生独热码,例如产生 4’b0010,可以是1’b1 << 1。 类似地,我们也可以产生1个比特为0,其他为1的码制,例如产生 4’b1011,可以是 ~ (1’ b1 <<2)。 利用左移位来产生连续为1的数字 例如,产生5’b00111,可以是(5’b1<<3)-1。 例如,产生5’b11100,可以是~((5’b1<<2)-1)。
|
|
|
|
|
792 浏览 0 评论
NVMe over Fabrics 国产 IP:高性能网络存储解决方案
750 浏览 0 评论
130 浏览 0 评论
NVMe高速传输之摆脱XDMA设计54:如何测试队列管理功能2
437 浏览 0 评论
NVMe高速传输之摆脱XDMA设计53:如何测试队列管理功能
769 浏览 0 评论
4574 浏览 64 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 00:21 , Processed in 0.684231 second(s), Total 64, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖