加法器简介及Verilog实现

  • 写在前面的话
  • 经典加法器
    • 8bit并行加法器
    • 8bit超前进位加法器
    • 8bit流水线加法器
    • 8bit级联加法器
  • 总结

写在前面的话

加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制作运算。负数可用二的补数来表示,减法器也是加法器,乘法器可以由加法器和移位器实现。加法器和乘法器由于会频繁使用,因此加法器的速度也影响着整个系统的计算速度。对加法器的设计也一直在更新迭代,反观数字IC初学者,往往只是了解个全加器和半加器,而对一些经典的加法器类型和实现方式却很少了解。

经典加法器

8bit并行加法器

并行加法器就是利用多个全加器实现两个操作数各位同时相加。并行加法器中全加器的个数与操作数的位数相同,常用的并行加法器有行波进位加法器、超前进位加法器、进位选择加法器等。容易实现、运算速度快,但是耗用资源多,当位宽较宽时,耗用的资源会非常大。

Verilog代码:

// Verdion: v1.0
// Description: 8位并行加法器
// -----------------------------------------------------------------------------
module parallel_adder (input [7:0]          din_a   ,       // data in ainput [7:0]         din_b   ,       // data in binput               cin     ,       // carry inoutput wire [7:0]    sum     ,       // summation of a ,boutput wire         cout            // carry out
);assign {cout,sum} =  din_a + din_b +   cin ;endmodule

这里使用的是数据流描述方式,只用了一条语句,不能控制综合的具体电路。

Quartus RTL图
用到了两个加法器。

Quartus Post mapping图

Vivado synthesis图

这里可以看出,相同的设计,在不同综合工具中综合出的电路结构是不同的,感兴趣的同学可以学习综合相关的知识点。后续也会把DC综合的教程笔记分享出来,这个可以在笔面前再了解,大部分同学都很难接触到流片相关的软件,在学校稍微熟悉就好。

8bit超前进位加法器

超前进位加法器是由全加器发展而来,目的是提高运算速度。当加法器级数提高时,高位的进位信号需要从低级逐级传递,为了缩短这个时间,我们可以从低级的输入信号确定一个组合逻辑电路,唯一确定一个高位的进位信号,从而提高运行速度。超前进位加法器也称为快速进位加法器,目的就是缩短进位信号生成的时间。
Verilog代码:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2022 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT904  1320343336@qq.com
// File   : Carry_Look_ahead_adder.v
// Create : 2022-11-19 16:15:31
// Revise : 2022-11-19 16:15:31
// Editor : 0078
// Verdion: v1.0
// Description: 8bit 超前进位加法器
// -----------------------------------------------------------------------------
module Carry_Look_ahead_adder (input [7:0]      din_a   ,       // data in ainput [7:0]         din_b   ,       // data in binput               cin     ,       // carry in output  wire        cout    ,       // carry out output     wire [7:0]  sum             // summation of a ,b
);wire [7:0]    G   ;
wire [7:0]  P   ;
wire [7:0]  C   ;assign G[0]    = din_a[0] & din_b[0]  ;       //bit 0
assign P[0]     = din_a[0] | din_b[0]  ;
assign C[0]     = cin                  ;
assign sum[0]   = G[0] ^ P[0] ^ C[0]   ;assign G[1]    = din_a[1] & din_b[1]  ;       //bit 1
assign P[1]     = din_a[1] | din_b[1]  ;
assign C[1]     = G[0] | (P[0] & cin)  ;
assign sum[1]   = G[1] ^ P[1] ^ C[1]   ;assign G[2]    = din_a[2] & din_b[2]  ;       //bit 2
assign P[2]     = din_a[2] | din_b[2]  ;
assign C[2]     = G[1] | (P[1] & C[1])     ;
assign sum[2]   = G[2] ^ P[2] ^ C[2]   ;assign G[3]    = din_a[3] & din_b[3]  ;       //bit 3
assign P[3]     = din_a[3] | din_b[3]  ;
assign C[3]     = G[2] | (P[2] & C[2])     ;
assign sum[3]   = G[3] ^ P[3] ^ C[3]   ;assign G[4]    = din_a[4] & din_b[4]  ;       //bit 4
assign P[4]     = din_a[4] | din_b[4]  ;
assign C[4]     = G[3] | (P[3] & C[3])     ;
assign sum[4]   = G[4] ^ P[4] ^ C[4]   ;assign G[5]    = din_a[5] & din_b[5]  ;       //bit 5
assign P[5]     = din_a[5] | din_b[5]  ;
assign C[5]     = G[4] | (P[4] & C[4])     ;
assign sum[5]   = G[5] ^ P[5] ^ C[5]   ;assign G[6]    = din_a[6] & din_b[6]  ;       //bit 6
assign P[6]     = din_a[6] | din_b[6]  ;
assign C[6]     = G[5] | (P[5] & C[5])     ;
assign sum[6]   = G[6] ^ P[6] ^ C[6]   ;assign G[7]    = din_a[7] & din_b[7]  ;       //bit 7
assign P[7]     = din_a[7] | din_b[7]  ;
assign C[7]     = G[6] | (P[6] & C[6])     ;
assign sum[7]   = G[7] ^ P[7] ^ C[7]   ;assign cout = G[7] | (P[7] & C[7])        ;
endmodule

Quartus RTL图
用到了两个加法器。

Quartus Post mapping图
使用的资源明显要高于普通的并行加法器。

8bit流水线加法器

流水线设计可以有效提高工作频率,核心就是面积换速度。

Verilog代码:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2022 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : Pipeline_adder.v
// Create : 2022-11-21 15:40:45
// Revise : 2022-11-21 15:40:45
// Editor : 0078
// Verdion: v1.0
// Description: 8bit 流水线加法器
// -----------------------------------------------------------------------------
module Pipeline_adder (input [7:0]          din_a       ,   // data in ainput [7:0]         din_b       ,   // data in binput               cin         ,   // Carry ininput                clk         ,   // Clockoutput  reg [7:0]   sum         ,   // Sumoutput    reg         cout            // Carry out
);reg   [7:0]   a_t ;reg    [7:0]   b_t ;//carry in & outreg    ci_t    ;reg    p1co    ;reg    p2co    ;reg    p3co    ;reg [5:0]  p1a ;reg [5:0]  p1b ;reg [1:0]  p1s ;reg [3:0]  p2a ;reg [3:0]  p2b ;reg [3:0]  p2s ;reg [1:0]  p3a ;reg [1:0]  p3b ;reg [5:0]  p3s ;always@(posedge clk) begina_t     <=   din_a  ;b_t    <=   din_b  ;ci_t   <=   cin    ;
endalways@(posedge  clk )  begin{p1co,p1s}  <= a_t[1:0]    + b_t[1:0] + ci_t ;p1a        <= a_t[7:2] ;p1b        <= b_t[7:2] ;
endalways@(posedge  clk )  begin{p2co,p2s}  <= p1a[1:0]    + p1b[1:0] + p1co + p1s  ;p2a        <= p1a[5:2] ;p2b        <= p1b[5:2] ;
endalways@(posedge  clk )  begin{p3co,p3s}  <= p2a[1:0]    + p2b[1:0] + p2co + p2s  ;p3a        <= p1a[3:2] ;p3b        <= p1b[3:2] ;
endalways@(posedge  clk )  begin{cout,sum}     <=  p3a[1:0] + p3b[1:0]    + p3co + p3s ;
endendmodule

Quartus RTL图
用到了四个2bit加法器以及中间数据缓存。

Quartus Post mapping图
这个资源的使用就更多,更大的面积换取更高的运行速度。

8bit级联加法器

级联加法器的结构简单,但N位级联加法器的延时是一位全加器的N倍,延时主要是由于进位信号级联造成的,避免在高性能要求的设计中采用该结构。
Verilog代码:


// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : Cascade_adder.v
// Create : 2023-03-20 10:51:14
// Revise : 2023-03-20 10:51:14
// Editor : 0078
// Verdion: v1.0
// Description: 8bit 级联加法器
// -----------------------------------------------------------------------------
module Cascade_adder(input      [7:0]       a       ,       //data in ainput    [7:0]       b       ,       //data in binput                cin     ,       //carry inoutput wire       cout    ,       //carry outoutput wire [7:0]    sum             //sum);//signal
wire cin1   ;
wire cin2   ;
wire cin3   ;
wire cin4   ;
wire cin5   ;
wire cin6   ;
wire cin7   ;// inst cascade descfull_add1 f0(.a        (a[0]   ),.b        (b[0]   ),.cin      (cin    ),.cout     (cin1   ),.sum  (sum[0] ));full_add1 f1(.a      (a[1]   ),.b        (b[1]   ),.cin      (cin1   ),.cout     (cin2   ),.sum  (sum[1] ));full_add1 f2(.a      (a[2]   ),.b        (b[2]   ),.cin      (cin2   ),.cout     (cin3   ),.sum  (sum[2] ));full_add1 f3(.a      (a[3]   ),.b        (b[3]   ),.cin      (cin3   ),.cout     (cin4   ),.sum  (sum[3] ));full_add1 f4(.a      (a[4]   ),.b        (b[4]   ),.cin      (cin4   ),.cout     (cin5   ),.sum  (sum[4] ));full_add1 f5(.a      (a[5]   ),.b        (b[5]   ),.cin      (cin5   ),.cout     (cin6   ),.sum  (sum[5] ));full_add1 f6(.a      (a[6]   ),.b        (b[6]   ),.cin      (cin6   ),.cout     (cin7   ),.sum  (sum[6] ));full_add1 f7(.a      (a[7]   ),.b        (b[7]   ),.cin      (cin7   ),.cout     (cout   ),.sum  (sum[7] ));endmodule

其中,8bit级联加法器需要使用8个单bit的全加器。其描述如下:


// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : fuu_add1.v
// Create : 2023-03-20 11:06:52
// Revise : 2023-03-20 11:06:52
// Editor : 0078
// Verdion: v1.0
// Description: 1bit full adder
// -----------------------------------------------------------------------------
module full_add1 (input         a   ,       // data in ainput       b   ,       // data in binput       cin ,       // carry in output      sum ,       // sumoutput        cout        // carry out
);//signal
wire    s1  ;
wire    m1  ;
wire    m2  ;
wire    m3  ;and (m1,a,b    ),(m2,b,cin   ),(m3,a,cin   );xor (s1,a,b   ),(sum,s1,cin );or (cout,m1,m2,m3);endmodule

Quartus RTL图
用到了8个加法器。

单bit全加器。

Quartus Post mapping图

总结

数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)相关推荐

  1. verilog hdl数字集成电路设计原理与应用_数字IC设计经典书籍推荐

    数字IC设计流程很复杂,从前端到后端,也有很多职位.在这里整理了个数字IC各个环节的经典必读书籍.市面上的书籍种类纷繁复杂,这里每种只推荐两本左右,如果需要,建议知识类的书籍还是购买正版,尊重作者,也 ...

  2. 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  3. 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  4. 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  5. 【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  6. 【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  7. 数字IC手撕代码--小米科技(除法器设计)

    前言: 本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析.代码及波形,所有代码均经过本人验证. 目录如下: 1.数字IC手撕代码-分频器(任意偶数分频) 2.数字IC手 ...

  8. 数字IC经典电路(4)——经典滤波器的实现(滤波器简介及Verilog实现)

    数字IC经典电路(4)-经典数字滤波器(滤波器简介及verilog实现) 写在前面的话 数字滤波器分类 经典数字滤波器 FIR滤波器 FFT-FIR滤波器 并行FIR滤波器 串行FIR滤波器 CIC滤 ...

  9. 数字IC设计工程师笔试面试经典100题-有答案

    转自知乎答主ictown_数字IC设计工程师笔试面试经典100题-有答案-陈恩 1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 同 ...

最新文章

  1. Metasploit远程调用Nessus出错
  2. 《Flowable基础二 Flowable是什么》
  3. eclipse正则表达式查找
  4. 通过ObjectProvider进行依赖查找
  5. Golang 单元测试详尽指引
  6. 随机森林算法的随机性_理解随机森林算法的图形指南
  7. 【SMTP 补录 Apache服务】
  8. php-有时候你会疑惑的小问题
  9. 李开复发自前方:From Davos with AI
  10. 切图崽的自我修养-[ES6] 编程风格规范
  11. 在Ubuntu10.10下安装osd-lyrics
  12. axure内联框架和动态面板_Axure中内联框架的使用与设置图文教程(第12)
  13. rslinx连接linux教程,RSLinx Classic软件通讯配置教程
  14. ASF/WMV 文件格式解析
  15. [iOS]仿微博视频边下边播之封装播放器
  16. 数据库事物,隔离级别慢慢深入
  17. Framework 修改默认输入法
  18. 阿里 + 京东 Java 岗面试题概要(面试须知)
  19. 【Appium】测试时遇到手机内嵌H5页面的切换问题
  20. NB-IoT网络规划过程

热门文章

  1. js获取年月日星期日期
  2. JavaScript小技能:事件
  3. 【转】关于骆驼运输胡萝卜难题的分析与Python实现
  4. 直播客户端架构设计与开发-DQLive for Android
  5. FPGA实现D触发器
  6. turtle中的颜色
  7. c语言延时程序_科技文化节 | 剑指疫情,策“码”扬“编”程序设计大赛完美收官...
  8. 行业首发:响应式优酷快速适配新Mac
  9. 关于yield关键字的一些理解
  10. WINDOWS程式设计--计时器