首页 > 其他分享 >有符号加法的Verilog实现

有符号加法的Verilog实现

时间:2023-03-04 17:24:27浏览次数:41  
标签:符号 unsigned signed WIDTH localparam Verilog 加法 reg

有符号加法的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,localparam,Verilog,加法,reg
From: https://www.cnblogs.com/chunk998/p/17178639.html

相关文章

  • 无符号二进制加法
    无符号二进制加法,需要保证两个相加的加数均为无符号数,如果有一个位有符号数,则均为有符号运算,结果为有符号数,即对于减法来讲,不存在无符号减法。  无符号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:表......
  • Verilog 语句
    可综合语句Module...endmoduleModule(clk,a,b,c,d);inputclk;input[2:0]a,b;outputb;inoute;endmodulemodule括号声明所有输入和输出......
  • 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 ......