官方论坛
官方淘宝
官方博客
微信公众号
点击联系吴工 点击联系周老师

算术运算符信号位宽

发布时间:2023-04-13   作者:admin 浏览量:


看对应的视频,请点击视频编号:001100000059

1、本视频主要介绍,在写代码时注意信号的位宽,即保存低位,丢弃高位。
2、这是ALTERA和VIVADO视频


5.3.5经验总结


  • 位宽问题

在写代码时,需要注意信号的位宽,最终的结果取决于“=”号左边信号的位宽,保存低位,丢弃高位。例如:


1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
wire c;
  
wire[1:0] d;
  
wire[2:0]  e;
  
wire[2:0]  f;
  
assign c = 1’b1  + 1’b1;
  
assign d = 1’b1  + 1’b1;
  
assign e = 1’b1  + 1’b1;
  
assign f = 1  + 1;


信号c的位宽为1位,所以运算的结果最终保留最低1位,因此c的值为1’b0。由于d的位宽有2位,

所以运算的结果可以保留低2位,因此d的值为2’b10。由于e的位宽有3位,所以运算的结果可以保留低3位,

因此e的值为3’b0101”默认是32位,1+1的结果也是32位,但由于f的位宽只有3位,

所以运算的结果可以保留低3位,因此f的值为3’b010


减法运算也是相同的道理,以如下代码为例:


1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
wire c;
  
wire[1:0] d;
  
wire[2:0]  e;
  
wire[3:0]  f;
  
assign c = 0  -1 ;
  
assign d = 0  - 1 ;
  
assign e = 0  -1 ;
  
assign f  =  0 - 1;


0-1”得到的二进制值是“1111111111….”,但保存结果取决于“=”号左边信号的位宽。c的位宽是1

保留最低1位,所以c的值为1’b1。由于d的位宽有2位,结果保留低2位,所以d的值为2’b11。由于e的位宽有3位,

结果保留低3位,所以e的值为3’b111f的位宽有4位,所以运算的结果可以保留低4位,所以f的值为4’b1111


在写乘法代码时,同样需要注意信号的位宽,最终的结果取决于“*”号左边信号的位宽,保存低位,丢弃高位:


1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
wire c;
  
wire[1:0] d;
  
wire[2:0]  e;
  
wire[3:0]  f;
  
wire[4:0]  h;
  
assign c = 2’b11  * 3’b101 ;
  
assign d = 2’b11  * 3’b101 ;
  
assign e = 2’b11  * 3’b101 ;
  
assign f  =  2’b11 * 3’b101;



2’b11 * 3’b101”得到的二进制值是“4’b1111”,但保存结果取决于“*”号左边信号的位宽。

c的位宽是1,保留最低1位,所以c的值为1’b1。由于d的位宽有2位,结果保留低2位,所以d的值为2’b11

由于e的位宽有3位,结果保留低3位,所以e的值为3’b111f的位宽有4位,所以运算的结果可以保留低4位,所以f的值为4’b1111

需要注意的是h,该信号有5位,4’b1111赋给5位信号,结果是高位补0,所以其结果为5’b01111

相关视频:https://www.bilibili.com/video/BV1yf4y1R7gH?p=13


相关视频:https://www.bilibili.com/video/BV1yf4y1R7gH?p=13


上一篇:算术运算符
   拓展阅读