Vivado中的加法器电路结构

先给出结论,Vivado中的加法器是利用SLICE中的LUT和进位链实现的。

目录

    • 一、全加器
    • 二、SLICE如何实现加法器
    • 三、实例测试
      • 1.直接使用加法器
      • 2.LUT级别

一、全加器

一位全加器的结构如下:

在这里插入图片描述

其中:

  • A、B为输入的两个加数
  • CI为进位
  • CO为本位对高位的进位
  • S为本位和

输出与输入的逻辑关系为:

S = A ⊕ B ⊕ C i n C o u t = A B + B C i n + A C i n S=A\oplus B\oplus C_{in}\\ C_{out}= AB+BC_{in}+AC_{in} S=ABCinCout=AB+BCin+ACin

二、SLICE如何实现加法器

SLICEM的结构如下:

在这里插入图片描述

CARRY4进位链结构如下:

在这里插入图片描述

介绍图中几个信号的含义:

  • CIN:进位信号
  • DI:数据输入,两个加数或的结果;
  • O:本位和
  • CO:本位对高位的进位
  • S:两个加数异或的结果

参考全加器输出与输入的对应关系

S = A ⊕ B ⊕ C i n C o u t = A B + B C i n + A C i n S=A\oplus B\oplus C_{in}\\ C_{out}= AB+BC_{in}+AC_{in} S=ABCinCout=AB+BCin+ACin

再观察下图中红色框部分,其中,LUT的O6输出(O6 From LUTA)和进位CIN进行异或得到输出AMUX,对比公式可知这个为本位和的输出,,可以选择直接输出也可以选择经过触发器同步输出。

在这里插入图片描述

而本位对高位的进位在图中是如何体现的呢?

首先明确四个信号,在图中已标出:

在这里插入图片描述

当S0为0时,MUX输出左边的DI,若S0为1则输出CIN。

具体分析如下:

  • 若S0为0说明两个加数要么为00,要么为11,此时输出的是DI即两个加数相或的结果

    ①如果为0表明两个加数为00,DI为0,根本不会产生进位,因此CO0输出0;

    ②如果为1表明两个加数为11,DI为1,一定会产生进位,因此CO0输出1;

    两种情况下CO0的输出和DI的值相同。

  • 若S0为1表明两个加数中只有一个1,这时只要CIN为1就有进位,CO0输出1;为0 则没有进位,CO0输出0,CO0的输出与CIN值相同。

那重点是如何实现让S表示两个数异或的结果,让DI表示两数相互或的结果?

这就利用到将1一个六输入LUT当作两个5输入LUT的原理。LUT6的结构如下:

在这里插入图片描述

因此我们需要将上面LUT5的输出对应S,下面的LUT5输出对应DI,如何实现?就是通过填写LUT5的初始值(LUT就像真值表一样,根据输入的情况产生对应的输出)。

三、实例测试

1.直接使用加法器

module full_add(input [7:0] a,input [7:0] b,input c_in,output [7:0] sum);
assign sum=a+b+c_in;
endmodule

综合后的电路为:

在这里插入图片描述

大部分电路结构和我们上述分析的是一致的,但是我们也会发现有几个不同的地方(仅分析低4bit对应的电路):

(1)b[0]没有和a[0]连入一个查找表,而是b[0]连接到动态进位输入CYINIT,a[0]和c_in构成了查找表的输出S0;

(2)DI连接的不少查找表的O5输出,而是连接的a[3:0]

S = a ⊕ c i n D I = a S=a\oplus c_{in} \\DI=a \\ S=acinDI=a

而原来的情况下:

S = a ⊕ b D I = a + b S=a\oplus b \\DI=a+b \\ S=abDI=a+b

那这样的效果和之前描述的效果一样吗?

首先可以明确的是对于本位和是没有影响的,因为本位和是三者的异或。将b[0]和c_in换位置并不影响。

但是本位对高位的进位就不一定了,因为要经过S控制的MUX,做如下分析:

之前说过S为0选择DI输出,S为1选择低位对本位的进位(对于第一级就是b)输出。

①假设c_in为0

abSDIC[0]
00000
01000
10110
11111

符合要求。

②假设c_in为1

abSDIC[0]
00100
01101
10011
11011

也符合要求。

但是不理解为什么会综合成这个结果…

2.LUT级别

为能够更深入的理解进位链的结构和LUT的关系,给出采用LUT级别实现加法器的例子。

参考LUT6的结构发现其为两个LUT5的组合,因此给出两个5输入LUT真值表如下:

(1)上面LUT5的真值表(两个输入异或,用于输出O6)

I4-I2I0(a)I1(b)O6
0000
0011
0101
0110

(2)下面LUT5的真值表(两个输入相或,用于输出O5)

I4-I2I0(a)I1(b)O6
x000
x011
x101
x111
module ADD_lut(input rst,input clk,input CE,input [7:0]a,input [7:0]b,output [7:0]sum,output [7:0]co
);wire [7:0]sum;wire [7:0]lut_o6;wire [7:0]lut_o5;LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst0(.O6(lut_o6[0]),.O5(lut_o5[0]),.I0(a[0]),.I1(b[0]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst1(.O6(lut_o6[1]),.O5(lut_o5[1]),.I0(a[1]),.I1(b[1]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst2(.O6(lut_o6[2]),.O5(lut_o5[2]),.I0(a[2]),.I1(b[2]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst3(.O6(lut_o6[3]),.O5(lut_o5[3]),.I0(a[3]),.I1(b[3]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst4(.O6(lut_o6[4]),.O5(lut_o5[4]),.I0(a[4]),.I1(b[4]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst5(.O6(lut_o6[5]),.O5(lut_o5[5]),.I0(a[5]),.I1(b[5]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst6(.O6(lut_o6[6]),.O5(lut_o5[6]),.I0(a[6]),.I1(b[6]),.I2(0),.I3(0),.I4(0),.I5(1));LUT6_2#(.INIT(64'h66666666EEEEEEEE))LUT6_2_inst7(.O6(lut_o6[7]),.O5(lut_o5[7]),.I0(a[7]),.I1(b[7]),.I2(0),.I3(0),.I4(0),.I5(1));CARRY4 CARRY4_inst0(.CO(co[3:0]),.O(sum[3:0]),.CI(1'b1),.CYINIT(1'b0),.DI(lut_o5[3:0]),.S(lut_o6[3:0]));CARRY4 CARRY4_inst1(.CO(co[7:4]),.O(sum[7:4]),.CI(co[3]),.CYINIT(1'b0),.DI(lut_o5[7:4]),.S(lut_o6[7:4]));FDRE FDRE_inst0(.Q(o_sum[0]),.C(clk),.CE(CE),.R(rst),.D(sum[0]));FDRE FDRE_inst1(.Q(o_sum[1]),.C(clk),.CE(CE),.R(rst),.D(sum[1]));FDRE FDRE_inst2(.Q(o_sum[2]),.C(clk),.CE(CE),.R(rst),.D(sum[2]));FDRE FDRE_inst3(.Q(o_sum[3]),.C(clk),.CE(CE),.R(rst),.D(sum[3]));FDRE FDRE_inst4(.Q(o_sum[4]),.C(clk),.CE(CE),.R(rst),.D(sum[4]));FDRE FDRE_inst5(.Q(o_sum[5]),.C(clk),.CE(CE),.R(rst),.D(sum[5]));FDRE FDRE_inst6(.Q(o_sum[6]),.C(clk),.CE(CE),.R(rst),.D(sum[6]));FDRE FDRE_inst7(.Q(o_sum[7]),.C(clk),.CE(CE),.R(rst),.D(sum[7]));FDRE FDRE_inst8(.Q(o_sum[8]),.C(clk),.CE(CE),.R(rst),.D(co[7]));endmodule

综合出来的电路结构如下:

在这里插入图片描述

这个就和上述介绍的完全一致了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连接器电镀小课堂系列三 | 打底电镀、基体金属、润滑、电压

【摘要/前言】 电镀会影响连接器系统的寿命和质量,包括耐腐蚀性、导电性、可焊性,当然还有成本。 【小课堂背景】 这是 Samtec质量工程经理 Phil Eckert 和首席工程师 Matt Brown 讨论连接器电镀相关问题的系列第三部分,主题为 “打底电镀、…

C语言 | Leetcode C语言题解之第40题组合总和II

题目: 题解: int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, sequence, sizeof(int…

通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验

通义灵码自成功入职阿里云后,其智能编程助手的角色除了服务于阿里云内部几万开发者,如今进一步服务函数计算 FC 产品开发者。近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中&a…

ARTS Week 24

Algorithm 本周的算法题为 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: img 输入:list1 [1,2,4], list2 [1,3,4]输出:[1,1,2,3,4,4] 实现代码如下&…

springcloudgateway集成knife4j

上篇我们聊聊springboot是怎么继承knife4j的。springboot3 集成knife4j-CSDN博客 本次我们一起学习springcloudgateway集成knife4j。 环境介绍 java:17 SpringBoot:3.2.0 SpringCloud:2023.0.0 knife4j : 4.4.0 引入maven配置…

近年数一,数二难度如何,听说24是像张宇那样的题?

直接上分数! “估分一百零几,平时李林130-140,张八110-125的样子,超越做的分数也是100出头。” 24学长说: “远离李林张八!张四没做不评价。” “李林张八暑假前做完当作打基础即可。超越才是真题难度”…

打开新世界大门!淘宝商品关键词搜索电商API接口解密

淘宝商城作为全球最大的电子商务平台之一,为数以亿计的消费者提供了广泛的商品选择和购物体验。然而,对于开发者来说,如何利用淘宝平台的资源进行开发和推广是一个关键的问题。幸运的是,联讯数据淘宝电商API的出现为开发者打开了通…

X-Spider媒体下载工具

软件介绍 X-Spider 是一个功能丰富的推特媒体下载器,它不仅可以帮助用户从推特上下载图片和视频,还提供了一些高级的过滤功能。例如,用户可以通过指定日期范围来筛选需要下载的媒体文件,并且可以跳过已下载的重复文件&#xff0c…

【Linux】文件描述符——万字详解

目录 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切皆文件 缓冲区…

STM32F4 Hal库中IO外部中断(EXIT)的应用

目录 概述 1 中断和事件 1.1 外部中断/事件控制器 (EXTI) 1.2 EXTI主要特性 1.3 中断和事件的差别 1.3.1 中断产生流程 1.3.2 事件产生流程 1.3.3 STM32F4的事件 2 STM32Cube配置工程 2.1 外部中断/事件介绍 2.2 配置参数 2.3 生成Project 3 STM32F4 Hal库中外部中…

在使用电脑时遇过msvcr120.dll文件丢失的情况怎么办,一键修复dll文件丢失

在使用电脑时有没有遇到过msvcr120.dll文件丢失的情况,遇到这样的情况有什么办法可以解决,废话少说,直接上教程,解决msvcr120.dll文件丢失问题。 msvcr120.dll文件丢失修复方法 A. 从官方或其他可信赖的来源下载并安装缺失的 msv…

众筹商城源码 众筹农业平台 农业乘科技富强之路 线上农业众筹 养殖系统 种植系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 前端是编译后的,后端PHP,带商城,详情看下图 特点和功能: 用户管理:包括注册、登录、个人信息管理等。 项目创建与展示&…

【C语言进阶篇】offsetof宏的介绍 及其实现

目录 一、offsetof宏的介绍 头文件 : offsetof宏的通用形式: 参数说明: 用法举例: 二、offsetof宏的实现 三、offsetof宏的使用注意事项 个人主页: 倔强的石头的博客 系列专栏 :C语言指南 …

Java中的动态代理

动态代理 什么是代理程序为什么需要代理例子如何创建代理对象 应用场景 什么是代理 程序为什么需要代理 对象如果认为身上干的事太多,可以通过代理来转移部分职责; 对象有什么方法想被代理,代理就一定要有对应的方法 使用接口实现&#xf…

iPerf 3 测试UDP和TCP方法详解

文章目录 前言一、What is iPerf / iPerf3 ?二、功能1. TCP and SCTP2. UDP3. 其他 三、 Iperf的使用1.Iperf的工作模式2. 通用指令3. 服务端特有选项4. 客户端特有选项5. -t -n参数联系 四、Iperf使用实例1. 调整 TCP 连接1. 1TCP 窗口大小调节1. 2 最大传输单元 (MTU)调整 2…

Pyhton Sqlite3手机数据库

代码结果 Code import sqlite3 connsqlite3.connect(test.db) csconn.cursor() create_tb_sqlcreate table if not exists info(id int primary key,name text,age int)cs.execute(create_tb_sql)# cs.execute(insert into info(id,name,age) values(3,"dog_Senior&quo…

华为交换机重置密码

1.进入bootrom 加电后,18S左右,在启动菜单按 CtrlB 进入bootrom(3s内) 注意:本步骤属于高危操作,一定小心切勿删除系统或修改bootrom密码! 输入bootrom密码,按6 看到提示成功后按…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕,算力需求持续爆发,AI与边缘深度融合已是大势所趋,越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地,勾勒出大模型从“技术力”转向…

web漏洞合集描述和修复建议

完整Excle文件可移步至知识星球查看下载 星球不定时分享网上各种资料,欢迎大家加入交流。