Vivado中的加法器电路结构

本文详细介绍了Vivado设计工具中利用SLICE中的LUT和进位链实现加法器的过程,包括全加器结构、SLICE工作原理以及实例测试,展示了如何通过LUT级联来构建加法器功能。
摘要由CSDN通过智能技术生成

先给出结论,Vivado中的加法器是利用SLICE中的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

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

在这里插入图片描述

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

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vivado fir compiler 是 Vivado 设计套件的一个工具,用于实现 FIR 滤波器。多通道用法指的是在使用 vivado fir compiler 时,同时处理多个通道的数据。 在使用 vivado fir compiler 进行多通道处理时,首先我们需要定义每个通道的滤波器系数和输入数据。可以通过 Vivado 的图形界面或者使用 Verilog/VHDL 代码来进行配置。每个通道的滤波器系数和输入数据可以是不同的,根据需求进行设置。 接下来,我们需要通过连接每个通道的滤波器,构建多通道滤波器的结构。可以使用 Vivado 带有的多路选择器、并行加法器等硬件逻辑电路来实现多通道并行处理。通过合理设计硬件的连接方式,可以同时处理多个通道的数据,提高处理效率。 在完成硬件连接后,我们需要设置 vivado fir compiler 的参数。可以根据需要定制每个通道的输入数据位宽、滤波器系数位宽、输出结果位宽等参数。根据这些参数,vivado fir compiler 将自动生成适应的滤波器结构和控制电路。 最后,我们需要将输入数据和滤波器系数通过合适的接口传入 vivado fir compiler,并获取滤波器的输出结果。可以使用 Vivado 提供的仿真工具进行测试,或者将设计下载到 FPGA 上进行实际验证。 总结来说,vivado fir compiler 多通道用法涉及到定义每个通道的滤波器系数和输入数据、构建多通道滤波器的结构、设置 vivado fir compiler 的参数以及传入数据并获取滤波器输出结果。通过合理配置和设计,可以实现并行处理多个通道的数据,提高系统的处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值