0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度解析FPGA时序的进位链

454398 来源: 科学计算 technomania 作者:猫叔 2020-11-16 16:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

FPGA中我们写的最大的逻辑是什么?相信对大部分朋友来说应该是计数器,从最初板卡的测试时我们会闪烁LED,到复杂的AXI总线中产生地址或者last等信号,都会用到计数器,使用计数器那必然会用到进位链。

可能很多刚开始接触FPGA的同学没听过进位链,也就是Carry Chain,我们这里再回顾一下。FPGA的三个主要资源为:

1. 最低逻辑单元

可配置逻辑单元(CLB)

存储单元

运算单元(DSP48)

2. 一流的I / O资源

3. 布线资源

其中,CLB在FPGA中最丰富,在7系列的FPGA中,一个CLB中有两个Slice,Slice中包含4个LUT6、3个数据选择器MUX,两个独立进位链(Carry4,Ultrascale是CARRY8)和8个主轴。

首先,我们来看下Carry Chain的结构原理,其输入输出接口如下:

其中,

CI是上一个CARRY4的进位输出,位宽为1;

CYINT是进位的初始化值,位宽为1;

DI是数据的输入(两个加数的任意一个),位宽为4;

SI是两个加数的异或,位宽为4;

O是加法结果输出,位宽为4;

CO是进位输出,位宽为4;(为什么进位输出是4bit?后面有解释)

Carry4的内部结构如下图所示:

这里我们要先解释一下FPGA中利用卡里链(Carry Chain)实现加法的原理,比如两个加数分别为a = 4'b1000和b=4'b1100,其结果应该是8+12=20。

a = 4'b1000;
b = 4'b1100;

S = a ^ b = 4'b0100;
D = b = 4'b1100;          //D取a也可以
CIN = 0;                  //没有上一级的进位输入
CYINIT = 0;               //初始值为0
// 下面为CARRY4的计算过程,具体的算法跟上图中过程一样
S0 = 0;                  //S的第0位
O0 = S0 ^ 0 = 0 ^ 0 = 0;
CO0 = DI0 = 0;            //上图中的MUXCY,S0为0时,选择1,也就是DI0,S0为1是选择2
S1 = 0;
O1 = S1 ^ CO0 = 0 ^ 0 = 0;
CO1 = DI1 = 0;
S2 = 1;
O2 = S2 ^ CO1 = 0 ^ 1 = 1;
CO2 = CO1 = 0;
S3 = 0;
O3 = S3 ^ CO2 = 0 ^ 0 = 0;
CO3 = DI3 = 1;

加法最终的输出结果为:{CO3,O3,O2,O1,O0} = 5'b10100 =20。进位输出在CARRY4的内部也使用到了,因此有4个位的进位输出CO,但输出给下一级的只是CO [3]。

再来看完下面的例子就更清晰了。Example的代码如下:

module top(

 input clk,
 input [7:0] din_a,
 input [7:0] din_b,
 output reg[7:0] dout
    );

 always @ ( posedge clk )
 begin
    dout <= din_a + din_b;
 end  
endmodule

综合之后的电路如下:

在本程序中,加数为din_a和din_b,图中

1 表示CARRY4的进位输出到下一级的进入输入;

2 表示输入的一个加数din_a(换成din_b也是可以的);

3 表示第二级输入的DI端口,因为第二级CARRY是通过第一级的进位输出进行累加,因此该接口为0;

4 表示输入两个加数的异或结果。

可以抛光,当进行两个两个bit的数据进行加法操作时,会使用两个CARRY4级联,那如果是对48位的数据进行相加,那就会用到12个的CARRY4的级联,这样(此处需要注意的是,在Vivado的设置下,如果进行的是12bit以下的数据加1'b1的操作,那么Vivado综合的结果并不会使用CARYY4,或者使用LUT来实现加法器)。

那如何解决这种问题呢?我们可以把加法操作进行拆解,比如拆解成3个16bit的计数器,那这样就会只有4个CARRY4的级联,时序情况就好了很多。

对比程序如下:

module top(

 input clk,
 input [47:0] din1,
 input [47:0] din2,
 output reg[47:0] dout1,
 output    [47:0] dout2
 );

 always @ ( posedge clk )
 begin
    dout1 <= din1 + 1'b1;
 end  

 genvar i;
 generate
 for(i = 0;i < 3;i=i+1) begin:LOOP
    wire carry_co;
    reg [15:0] carry_o=0;
    wire ci;
    if(i==0)  begin
        always @ ( posedge clk )
         begin
            carry_o <= din2[i*16+:16] + 1'b1;
         end
     end //if
     else begin
        always @ (posedge clk) begin
            if(LOOP[i-1].carry_co == 1)
                carry_o <= carry_o + 1'b1;
        end
     end //else
    assign LOOP[i].carry_co = (LOOP[i].carry_o==16'hffff)?1'b1:1'b0;
    assign dout2[i*16+:16] = LOOP[i].carry_o;

 end //for

 endgenerate

endmodule

:综合后的schematic后可以发现,在dout2的输出中,每4个CARRY4后都会有一级的触发,这样时序就会好很多,但造成的代价是LUT会增加。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1656

    文章

    22299

    浏览量

    630669
  • 计数器
    +关注

    关注

    32

    文章

    2306

    浏览量

    97641
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度解析 | 低抖动高精度EtherCAT多轴控制的实现与实践案例

    深度解析 | 低抖动高精度EtherCAT多轴控制的实现与实践案例 在工业自动化领域,运动控制的精度和稳定性直接决定了生产效率和产品质量。其中EtherCAT多轴控制技术尤为引人注目。今天,我们
    发表于 12-09 17:17

    数字IC/FPGA设计中的时序优化方法

    在数字IC/FPGA设计的过程中,对PPA的优化是无处不在的,也是芯片设计工程师的使命所在。此节主要将介绍performance性能的优化,如何对时序路径进行优化,提高工作时钟频率。
    的头像 发表于 12-09 10:33 2689次阅读
    数字IC/<b class='flag-5'>FPGA</b>设计中的<b class='flag-5'>时序</b>优化方法

    亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析

    本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家
    的头像 发表于 10-17 14:59 359次阅读

    聚徽深度解析国内工控平板电脑的工业级抗干扰技术如何实现?

    在工业自动化与智能制造领域,工控平板电脑作为核心人机交互终端,其抗干扰能力直接决定了生产系统的稳定性与可靠性。国内厂商通过技术创新与场景适配,构建了从硬件设计到软件优化的全路抗干扰体系。本文将从技术原理、硬件架构、软件策略及场景验证四个维度,深度
    的头像 发表于 07-11 18:11 602次阅读

    GPU架构深度解析

    GPU架构深度解析从图形处理到通用计算的进化之路图形处理单元(GPU),作为现代计算机中不可或缺的一部分,已经从最初的图形渲染专用处理器,发展成为强大的并行计算引擎,广泛应用于人工智能、科学计算
    的头像 发表于 05-30 10:36 1387次阅读
    GPU架构<b class='flag-5'>深度</b><b class='flag-5'>解析</b>

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的头像 发表于 05-09 10:50 715次阅读

    边缘AI MPU深度盘点:品牌、型号与技术特性全解析

    边缘AI MPU深度盘点:品牌、型号与技术特性全解析 随着边缘计算与人工智能的深度融合,边缘AI MPU(微处理器)已成为支撑物联网、智能制造、自动驾驶等场景的核心硬件。本文从品牌、型号、技术特性
    的头像 发表于 04-30 17:27 3388次阅读

    解锁未来汽车电子技术:软件定义车辆与区域架构深度解析

    解锁未来汽车电子技术:软件定义车辆与区域架构深度解析 ——立即下载白皮书,抢占智能汽车发展先机 *附件:解锁未来汽车电子技术:软件定义车辆与区域架构深度解析.pdf 为什么这份白皮书值
    的头像 发表于 04-27 11:58 1109次阅读

    FPGA时序约束之设置时钟组

    Vivado中时序分析工具默认会分析设计中所有时钟相关的时序路径,除非时序约束中设置了时钟组或false路径。使用set_clock_groups命令可以使时序分析工具不分析时钟组中时
    的头像 发表于 04-23 09:50 983次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>时序</b>约束之设置时钟组

    风华电容命名方法深度解析

    在电子元器件领域,风华电容凭借其清晰的命名体系、全面的技术参数和广泛的应用场景,成为国内外市场的标志性品牌。本文将从命名规则、技术参数、行业应用及市场优势四个维度,深度解析风华电容的技术特性
    的头像 发表于 04-11 11:58 1078次阅读

    深度解析Linux中的DNS服务

    dns,Domain Name Server,它的作用是将域名解析为 IP 地址,或者将IP地址解析为域名。
    的头像 发表于 04-09 16:13 702次阅读

    国产自研新标杆:龙芯GM9-3003主板深度解析

    国产自研新标杆:龙芯GM9-3003主板深度解析
    的头像 发表于 03-04 13:55 866次阅读

    有没有对appsfpga_io模块输入端功能时序的控制的资料?

    我们的要求,只是按行输入数据,全局reset。有没有对appsfpga_io模块输入端功能时序的控制的资料?
    发表于 02-27 07:02

    玻璃通孔(TGV)技术深度解析

    的性能和可靠性,还推动了整个电子封装行业的创新发展。本文将对TGV技术的基本原理、制造流程、应用优势以及未来发展进行深度解析
    的头像 发表于 02-02 14:52 6124次阅读

    FPGA驱动AD芯片之实现与芯片通信

    概述: 利用FPGA实现AD芯片的时序,进一步实现与AD芯片数据的交互,主要熟悉FPGA时序图的实现,掌握时序图转换Verilog硬件描述
    的头像 发表于 12-17 15:27 1536次阅读
    <b class='flag-5'>FPGA</b>驱动AD芯片之实现与芯片通信