数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)

前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计(在一般的设计中使用不到,本节只是更好理解FPGA内部逻辑块资源的使用),参考这篇博客:
浅谈XILINX FPGA CLB单元 汇总 (CLB、LUT、存储单元、Distributed RAM、移位寄存器、多路复用器、进位逻辑(Carry Logic))

之前写过一篇关于如何使用Verilog 设计半加器,全加器及超前进位加法器的博客:数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器

在使用FPGA进行设计时,如果能对FPGA中的资源分布及配置能有详细的了解,对于设计高性能的计算硬件具有更好的指导意义。因此我们可以使用原语来设计快速加法器或乘法器等比较常用的电路。

一、基于LUT3的四位加法器设计

因为一个全加器由输入A,B,及进位信号Cout 三个输入端口,所以利用查找表进行设计,应该选用LUT3以上的查找表,下面针对LUT3 单元进行设计分析
下面的结构是经典的行波进位加法器

  1. 全加器
    有关基本的加法器的介绍本节会略去。
    一位全加器的基本逻辑方程:
    S = A xor B xor Cin
    Cout = (A and B) or (A and Cin) or (B and Cin)

    下表给出了真值表:

    因此输出S的三位查找表的初始值为:8’b1001_0110 (8’h96)
    进位输出Cout的三位查找表的初始值为:8’b1110_1000 (8’hE8)

  2. 使用Vivado进行一位全加器的设计
    代码如下:

module addr_1bit(
A,B,Cin,S,Cout);input A,B;
input Cin;
output S,Cout;LUT3 #(.INIT(8'h96)  // Specify LUT Contents    查找表值) LUT3_inst1 (       .O(S),   // LUT general output 结果输出端.I0(Cin), // LUT input.I1(B), // LUT input.I2(A)  // LUT input);LUT3 #(.INIT(8'hE8)  // Specify LUT Contents   查找表值) LUT3_inst2 (      .O(Cout),   // LUT general output 进位输出端.I0(Cin), // LUT input.I1(B), // LUT input.I2(A)  // LUT input);endmodule

LUT3_inst1和LUT3_inst2分别是S 结果输出端和Cout进位输出端。

  1. 仿真结果
  2. 四位全加器的设计
module addr_4bit(
A,B,Ci,S,Co);input [3:0] A,B;
input Ci;
output [3:0] S;
output Co;wire [4:0] Cin;genvar i;
generateassign Ci = Cin[0];assign Co = Cin[4];for (i=0;i<4;i=i+1)begin: label               // label是实例化之后的名称addr_1bit u(.A(A[i]),.B(B[i]),.S(S[i]),.Cout(Cin[i+1]),.Cin(Cin[i]));  end
endgenerateendmodule

需要注意的是Cin是线网wire类型的变量,位宽为5bit。addr_1bit即为上面的一位全加器的模块。

对于generate语句块,这是Verilog 2001语法中新增的语法,方便了设计者设计电路。
但需要注意generate-for语句:
(1) 必须有genvar关键字定义for语句的变量。
(2)for语句的内容必须加begin和end(即使就一句)。
(3)for语句必须有个名字。

上面的generate 的代码片段等效于下面:

/*
addr_1bit u1(.A(A[0]),.B(B[0]),.S(S[0]),.Cin(Cin[0]),.Cout(Cin[1]));
addr_1bit u2(.A(A[1]),.B(B[1]),.S(S[1]),.Cin(Cin[1]),.Cout(Cin[2]));
addr_1bit u3(.A(A[2]),.B(B[2]),.S(S[2]),.Cin(Cin[2]),.Cout(Cin[3]));
addr_1bit u4(.A(A[3]),.B(B[3]),.S(S[3]),.Cin(Cin[3]),.Cout(Cin[4]));assign Ci = Cin[0];
assign Cout = Cin[4];
*/

其RTL电路为:

仿真结果如下:
可以看到有正确的结果输出和进位输出

5. 利用LUT3设计四位加法器的资源利用及延迟情况

二、基于LUT5的四位加法器设计

  1. 对于上面利用LUT3来设计加法器的情况,无论是资源使用情况还是延迟都存在改进的空间,由于Xilinx 7 系列中CLB是由LUT5/6组成,而上述的LUT3实际上把LUT5当作是LUT3来使用了,即资源中所使用的8个LUT3实际上占用8个LUT5。
    因此可以想到的是将加法器直接使用LUT5,就可以减少资源的使用及可以减少延迟。
    下图是改进的四位加法器结构:
    使用5输入查找表,就可以使用俩位全加器,即五个输入分别是,两个加数A0,A1、两个加数B0,B1,进位输入Cin;输出需要三个结果输出S0,S1,进位输出Cout。
  2. 设计思路
    由于把两个全加器当作一级来使用,因此有五个输入,三个输出,但是LUT5只能提供俩输出,因此还需要一个LUT3来作为第三个输出使用。因此,每一级使用2个五输入查找表和一个三输入查找表。
    具体的每一级全加器的真值表如下:

我们将S0作为三位查找表的输出,其初始值仍为:8’b1001_0110 (8’h96);
输出S1的五位查找表,初始值为:32’b1001_1001_1001_0110_1001_0110_0110_0110 (32’h9996_9666);
输出Cout的五位查找表,初始值为:32’b1110_1110_1110_1000_1110_1000_1000_1000 (32’hEEE8_E888)

  1. 一级对应的全加器代码如下:

    RTL电路结构:
  2. 两级形成四位全加器
module addr_4bit(
a0,a1,b0,b1,Ci,s0,s1,Co);input [1:0] a0,a1,b0,b1;
input Ci;
output [1:0] s0,s1;
output Co;wire [2:0] Cin;addr_2bit u1(.A0(a0[0]),.A1(a0[1]),.B0(b0[0]),.B1(b0[1]),.S0(s0[0]),.S1(s0[1]),.Cin(Cin[0]),.Cout(Cin[1])
);addr_2bit u2(.A0(a1[0]),.A1(a1[1]),.B0(b1[0]),.B1(b1[1]),.S0(s1[0]),.S1(s1[1]),.Cin(Cin[1]),.Cout(Cin[2])
);assign Ci = Cin[0];
assign Co = Cin[2];endmodule

RTL电路结构:

仿真结果:

5. 两级形成四位全加器的资源利用和延迟情况对比


可以看到和之前采用LUT3设计的四位加法器相比,资源利用变少了,关键路径延迟也变小了。

但需要说明一点的是:
如果再不采用原语进行设计的情况下,直接编写加法器Verilog代码,综合工具会根据自己的算法给出一个比较合理的电路,可能会比我们采用后一种方法设计的要更好,这需要依赖EDA综合工具。
但是通过了解CLB的不同的基本配置方式以及内部资源分布,对于更好理解软件综合过程和设计具有更好的指导意义,如果能再关键的位置手动配置硬件资源,可能会改善局部性能,这对于高性能计算硬件有重要意义,尤其是底层的硬件加法等部件。

数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)相关推荐

  1. HR面必问问题——和HR斗智斗勇(数字IC,FPGA,计算机,JAVA,算法,C++,产品,芯片通用)

    很多同学非常重视技术面试和主管面,但是我想和大家强调一下HR面也是非常重要的,一些公司的HR权力挺大,起码能让你挂掉面试或者offer排名低.         实际上,HR面是有一套固定套路的,接下来 ...

  2. 聊聊华为校招流程及安排——23届实习、提前批、正式批(数字IC、FPGA逻辑、通信、软件等)

    华为(包括海思)的实习.提前批.正式批流程及注意事项. 实习笔试 华为的校园招聘包含3个阶段,从3月份左右开始. 3-4/5月:实习招聘(笔试+一次专业面+一次主管面+性格测试) 以成渝地区为例(成都 ...

  3. 数字IC/FPGA设计之——学习路径

    对于在校生或刚学习数字IC/FPGA设计的小伙伴来说,通常迷惑于一个问题:这个方向需要掌握哪些基础知识,学习路径是什么样的? 面对网上各种公众号,知乎分享,应该怎么学习呢? SiliconThink( ...

  4. 艾为数字ic面试题_秋招 应聘FPGA/数字IC笔试面试经验分享(简单列举FPGA/数字IC公司)...

    1.自我介绍 我是一名二本院校的电气自动化专业的本科生,因为自己的爱好,喜欢FPGA开发,两年的开发经验,用FPGA开发并完成三个省级科研立项并获得一个A类竞赛国家一等奖.目前签约上海艾为电子,数字I ...

  5. 数字 IC 设计、FPGA 设计秋招笔试题目、答案、解析(3)2022 大疆创新数字芯片 B 卷

    引言 最近收到诸多粉丝的来信,要求出一版<数字 IC 设计.FPGA 设计秋招笔试题精讲>,于是,通过几天几夜的加班加点,终于出了这一版<2022 大疆创新秋招笔试题目.答案.解析& ...

  6. 常见数字IC设计、FPGA工程师面试题

    转载自:常见数字IC设计.FPGA工程师面试题 我怕弄丢了,找不到了,所以转载过来吧,回答的还挺具有参考意义. 借个位置,顺便把另外一篇好文的地址附上:FPGA中的亚稳态 1:什么是同步逻辑和异步逻辑 ...

  7. 数字IC/FPGA设计面试与工作_sky

    请问:对于找工作刷题,怎么看? 热身有必要,但是规劝一句:题目是刷不完的.面试通过了,后面还得再工作15年.你咋刷? 得想的长远些.做题不是终点.刷题,面试为了啥? 建议刷题是补充,平时多积累数字IC ...

  8. 搭建属于自己的数字IC EDA环境(五):搭建FPGA自动化环境(Linux下vivado Tcl脚本自动化开发),业余IC设计流程与通路

    1.简述 一个完整的IC EDA环境也不能缺少了FPGA,FPGA原型验证是IC设计流程中重要的一环.一个芯片从设计到流片需要投入大量的人力.财力以及很长的研发周期,如果流片失败,对于公司来说是一笔很 ...

  9. 数字IC设计/FPGA工程师秋招面经

    秋招面经 秋招总结 迷茫期 低谷期 兴奋期 秋招面试常问问题 投递公司 学习的FPGA课程 总结 秋招总结 已经一个多月没更新博客了,并不是因为博主的只是储备量空了,而是因为我去准备秋招去了,接下来将 ...

最新文章

  1. iOS仿抖音节拍界面、Swift,MVVM架构完整项目、日历demo、滚动切换分类等源码
  2. python 隐马尔可夫链
  3. JQuery中serialize()、serializeArray()和param()的使用方法
  4. 微信小程序css 华文琥珀_琥珀项目:较小的,面向生产力的Java语言功能
  5. 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
  6. 上帝就在机器里:复杂算法背后隐藏的可怕现实
  7. 规范化之路(一) Checkstyle插件安装使用
  8. bzoj 1562 [NOI2009]变换序列 二分图
  9. java 网络字节序转主机字节序_C语言高级编程——网络编程技术
  10. ZOJ 1730 圆桌换序
  11. linux nginx支持socket,nginx配置websocket转发功能
  12. js基础-11-相等和全等的区别
  13. 学校教学的计算机网络教室它的网络类型,用于学校教学的计算机网络教室,它的网络类型属于( )...
  14. 地壳中元素含量排名记忆口诀_【化学好好玩】用口诀帮你速记忆化学知识
  15. Nacos启动报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
  16. 汇编语言||存储单元,存储字长,存储字,存储容量的理解
  17. SQL SERVER 实用教程(第四版) 实验 1-10 非标准答案
  18. 一键清理电脑垃圾文件
  19. 利用ELK技术栈收集nginx日志
  20. 杨卫华:新浪微博的架构发展历程

热门文章

  1. 每日一题(91) - 插入排序
  2. I2C总线及AT24C02读写
  3. Word:文档中一行,多个公式与文字对不齐,有的偏上有的偏下
  4. node.js爬虫-校园网模拟登录
  5. 金蝶 EAS BOS F7监听器
  6. 网络驱动器和网络位置
  7. excel数据导入python后不对齐_Python处理Excel文件的实用姿势
  8. ARM Linux下UPnP使用
  9. 蓝桥杯历届试题-蚂蚁感冒
  10. 第十二届蓝桥杯大赛软件赛决赛(C/C++ 大学C组)