首页 > 其他分享 >有符号数的加法

有符号数的加法

时间:2023-03-04 17:33:50浏览次数:29  
标签:场景 符号 unsigned signed WIDTH 加法 reg

有符号数的加法,从无符号的加法章节就提及过,只要加数有一方为有符号数,则和一定是有符号数,重点强调一下,大家千万不要从场景上分析,认为C = A+B一定是>0,则及时A和B有一个是有符号数,那么和就是无符号数,我们只能从电路结构上决定C是无符号,还是有符号,原因是,大家场景分析,往往只是从正常功能场景分析,而忽略了异常场景。 比如
A[1:0]:作为无符号数
  2     |        .                    .
  1     |   .         .          .
  0  —|.——————.————————
         |0 1   2   3   4    5   6

B[1:0]:作为有符号数
  2     |                             
  1     |.                       .
  0  —|——.————.————————
-1    |             .
         0     1     2    3    4

C正常为:正常场景,C被当做无符号数,没有问题,与有符号数值一样。

  2     |                             
  1     |.    .      .     .     .
  0  —|——————————————
-1    |            
         0     1     2    3    4


异常场景,或者说未来B[1:0]信号相位和幅度发生了变化
B[1:0]:作为有符号数
  2     |                             
  1     |            .                  
  0  —|——.————.————————
-1     |.                       .
         0     1     2    3    4

C[2:0]:作为有符号数(-4~3)波形
  3     |            .
  2     |                             
  1     |     .             .               
  0  —|——————————————
-1     |.                        .
         0     1     2    3    4

C[2:0]:作为无符号数(0~8)波形, 0,1 两个坐标点,3,4两个坐标点,就存在很大幅度跳变
  7     |.                         .
  6     |
  5     |
  4     |
  3     |            .
  2     |                             
  1     |     .             .               
  0  —|——————————————
-1     |                       
         0     1     2    3    4


所以C应该按照有符号处理,即便,从算法角度,希望C后续按照无符号进行后续计算处理,
也应该是做一个C的有符号到无符号转换,专访方式其实很简单就是,把C最高位取反,上面的里面即

C_UNSIGN = {~C[2],C[1:0]}

这样异常场景,C_UNSIGN的波形为,这样,只是增加直流分量,其幅度仍然没有变化:

7      |            .                        
  6     |
  5     |     .            .
  4     |
  3     |.                        .
  2     |                             
  1     |                              
  0  —|——————————————
-1    |                       
         0     1     2    3    4

上面小节,主要跟大家强调,进行有符号运算,其和一定是有符号的,按照电路结构进行设计,如果根据场景需要把和作为无符号数使用,需要单独进行有符号到无符号转换,这个是电路结构的转换,不是简单定一个$signed去转换类型。有符号加法的Verilog实现形式,推荐两种方式:

方式一:传统方式,手动扩位,实现左右位宽匹配,扩位为符号位,另外信号输入有符号数,一定要显示定义,Verilog默认不定义就是无符号类型

1    localparam A_WIDTH = 16;
2    localparam B_WIDTH = 8;
3  // Sumation result width should be 1 bit more than biggest widht of adder factor
4    localparam C_WIDTH = if (A_WIDTH > B_WIDTH) ? A_WIDTH + 1'b1 : B_WIDTH + 1'b1;
5
6   reg signed [A_WIDTH-1  : 0]      a;
7   reg signed [B_WIDTH-1  : 0]      b;
8   
9    reg signed [C_WIDTH-1  : 0]      c;
10  reg unsigned [C_WIDTH-1  : 0]      c_unsigned;
11
12   always @(*) begin
13         c = {(C_WIDTH-A_WIDTH){a[A_WIDTH-1]}},a} +
                    {{C_WIDTH-B_WIDTH{b[B_WIDITH-1]}},b};
14    end
15
16   always @(*) begin
17         c_unsigned = {~c[C_WIDTH-1],c[C_WIDTH-2:0]};
18   end   
方式二: Synopsys推荐,直接定义好符号类型,和的位宽按照运算法则定义好,实际+地方不作位宽匹配,工具自动识别
1    localparam A_WIDTH = 16;
2    localparam B_WIDTH = 8;
3  // Sumation result width should be 1 bit more than biggest widht of adder factor
4    localparam C_WIDTH = if (A_WIDTH > B_WIDTH) ? A_WIDTH + 1'b1 : B_WIDTH + 1'b1;
5
6   reg signed [A_WIDTH-1  : 0]      a;
7   reg signed [B_WIDTH-1  : 0]      b;
8   
9    reg signed [C_WIDTH-1  : 0]      c;
10  reg unsigned [C_WIDTH-1  : 0]      c_unsigned;
11
12   always @(*) begin
13         c = a + b;
14    end
15
16   always @(*) begin
17         c_unsigned = {~c[C_WIDTH-1],c[C_WIDTH-2:0]};
18   end   

另种方式,综合效果是一样,个人还是推荐方式一,虽然写代码时间多花一点,但是整个代码更干净整洁,后续工具检查的Warning少,便于从LOG中检查出真正位宽不匹配的点,否则有很多这种伪不匹配Warning,LOG查看会非常费劲。 另外,强调一点,代码的编写从来都不是我们集成电路设计真正的瓶颈,真正时间是用于场景分析,需要分析,数据流分析,电路实现。代码编写只是我们设计思路的映射,所以初学者切忌不要被一些语言工具厂商或者教科书忽悠,认为作集成电路就是写Verilog,花大量时间学习和记忆一些枯燥的语法,大家会从我给的Demo看到,RTL 设计实现用的Verilog 语法都非常简单。我们核心是作逻辑时序和电路实现。

标签:场景,符号,unsigned,signed,WIDTH,加法,reg
From: https://www.cnblogs.com/chunk998/p/17178672.html

相关文章

  • 有符号加法的Verilog实现
    有符号加法的Verilog实现形式,推荐两种方式:方式一:传统方式,手动扩位,实现左右位宽匹配,扩位为符号位,另外信号输入有符号数,一定要显示定义,Verilog默认不定义就是无符号类型1 ......
  • 无符号二进制加法
    无符号二进制加法,需要保证两个相加的加数均为无符号数,如果有一个位有符号数,则均为有符号运算,结果为有符号数,即对于减法来讲,不存在无符号减法。  无符号A+无符号B=无......
  • 算法基础1.3.1高精度加法
    前言该文章探讨的高精度代指C++中极大整数的计算,不是浮点数(y总说那个少见,不讲)。这个问题只在C++中存在,Java有大整数类来解决,python本身特性就已经解决了。高精度整数分......
  • idea2020版本找不到符号,找不到程序包问题
    本人把网上除了重装idea的方法试了个遍,最后才重装的,根据群体反应2020版本的这个问题是通病,2020版本会出现这种莫名的错误,建议官网下载2019,2021,2022版本的idea(2022版本需......
  • LNK2001 无法解析的外部符号 "int const ROUND"
    今天在写代码时出现了这个错误,网上的解决方法都不合适我的代码是这样,在一个cpp里申明了一个常量//data.cppconstintROUND=3;然后在一个头文件里申明为全局变量......
  • HTML 符号实体
    HTML符号实体本字符实体参考手册包括了数学符号、希腊字符、各种箭头记号、科技符号以及形状。注释: 实体名称对大小写敏感。HTML支持的数学符号字符实体编号实体......
  • mysql: 看不见的空符号 char(9) char(10) char(13)
    trim,消除前后的空格,没有效时果updatetable_namesetcolumn_name=replace(replace(replace(column_name,char(9),''),char(10),''),char(13),'');说明:table_name:表......
  • pat 乙级1024 科学计数法关于stl中size()的一些思考即测试点六,无符号整数问题
    来,先看题目:1024科学计数法分数20作者HOU,Qiming单位浙江大学科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9].[0-9]+......
  • python 字符串 格式化输出 槽格式 小数的位数与符号控制
    """槽的格式限定冒号:左边填序号或名称,右边填写格式"""#定义一个数num=3.1465926#保留两位小数,并且四舍五入res="{:.2f}".format(num)print(res)#有符号的数字res2=......
  • IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题
    setting-->Build,Execution,Deployment 点击complier 在SharedbuildprocessVMoptions:中添加配置  -Djps.track.ap.dependencies=false ......