0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析FPGA時(shí)序的進(jìn)位鏈

454398 ? 來(lái)源: 科學(xué)計(jì)算 technomania ? 作者:貓叔 ? 2020-11-16 16:35 ? 次閱讀

FPGA中我們寫(xiě)的最大的邏輯是什么?相信對(duì)大部分朋友來(lái)說(shuō)應(yīng)該是計(jì)數(shù)器,從最初板卡的測(cè)試時(shí)我們會(huì)閃爍LED,到復(fù)雜的AXI總線中產(chǎn)生地址或者last等信號(hào),都會(huì)用到計(jì)數(shù)器,使用計(jì)數(shù)器那必然會(huì)用到進(jìn)位鏈。

可能很多剛開(kāi)始接觸FPGA的同學(xué)沒(méi)聽(tīng)過(guò)進(jìn)位鏈,也就是Carry Chain,我們這里再回顧一下。FPGA的三個(gè)主要資源為:

1. 最低邏輯單元

可配置邏輯單元(CLB)

存儲(chǔ)單元

運(yùn)算單元(DSP48)

2. 一流的I / O資源

3. 布線資源

其中,CLB在FPGA中最豐富,在7系列的FPGA中,一個(gè)CLB中有兩個(gè)Slice,Slice中包含4個(gè)LUT6、3個(gè)數(shù)據(jù)選擇器MUX,兩個(gè)獨(dú)立進(jìn)位鏈(Carry4,Ultrascale是CARRY8)和8個(gè)主軸。

首先,我們來(lái)看下Carry Chain的結(jié)構(gòu)原理,其輸入輸出接口如下:

其中,

CI是上一個(gè)CARRY4的進(jìn)位輸出,位寬為1;

CYINT是進(jìn)位的初始化值,位寬為1;

DI是數(shù)據(jù)的輸入(兩個(gè)加數(shù)的任意一個(gè)),位寬為4;

SI是兩個(gè)加數(shù)的異或,位寬為4;

O是加法結(jié)果輸出,位寬為4;

CO是進(jìn)位輸出,位寬為4;(為什么進(jìn)位輸出是4bit?后面有解釋?zhuān)?/p>

Carry4的內(nèi)部結(jié)構(gòu)如下圖所示:

這里我們要先解釋一下FPGA中利用卡里鏈(Carry Chain)實(shí)現(xiàn)加法的原理,比如兩個(gè)加數(shù)分別為a = 4'b1000和b=4'b1100,其結(jié)果應(yīng)該是8+12=20。

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

S = a ^ b = 4'b0100;
D = b = 4'b1100;          //D取a也可以
CIN = 0;                  //沒(méi)有上一級(jí)的進(jìn)位輸入
CYINIT = 0;               //初始值為0
// 下面為CARRY4的計(jì)算過(guò)程,具體的算法跟上圖中過(guò)程一樣
S0 = 0;                  //S的第0位
O0 = S0 ^ 0 = 0 ^ 0 = 0;
CO0 = DI0 = 0;            //上圖中的MUXCY,S0為0時(shí),選擇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;

加法最終的輸出結(jié)果為:{CO3,O3,O2,O1,O0} = 5'b10100 =20。進(jìn)位輸出在CARRY4的內(nèi)部也使用到了,因此有4個(gè)位的進(jìn)位輸出CO,但輸出給下一級(jí)的只是CO [3]。

再來(lái)看完下面的例子就更清晰了。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

綜合之后的電路如下:

在本程序中,加數(shù)為din_a和din_b,圖中

1 表示CARRY4的進(jìn)位輸出到下一級(jí)的進(jìn)入輸入;

2 表示輸入的一個(gè)加數(shù)din_a(換成din_b也是可以的);

3 表示第二級(jí)輸入的DI端口,因?yàn)榈诙?jí)CARRY是通過(guò)第一級(jí)的進(jìn)位輸出進(jìn)行累加,因此該接口為0;

4 表示輸入兩個(gè)加數(shù)的異或結(jié)果。

可以拋光,當(dāng)進(jìn)行兩個(gè)兩個(gè)bit的數(shù)據(jù)進(jìn)行加法操作時(shí),會(huì)使用兩個(gè)CARRY4級(jí)聯(lián),那如果是對(duì)48位的數(shù)據(jù)進(jìn)行相加,那就會(huì)用到12個(gè)的CARRY4的級(jí)聯(lián),這樣(此處需要注意的是,在Vivado的設(shè)置下,如果進(jìn)行的是12bit以下的數(shù)據(jù)加1'b1的操作,那么Vivado綜合的結(jié)果并不會(huì)使用CARYY4,或者使用LUT來(lái)實(shí)現(xiàn)加法器)。

那如何解決這種問(wèn)題呢?我們可以把加法操作進(jìn)行拆解,比如拆解成3個(gè)16bit的計(jì)數(shù)器,那這樣就會(huì)只有4個(gè)CARRY4的級(jí)聯(lián),時(shí)序情況就好了很多。

對(duì)比程序如下:

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后可以發(fā)現(xiàn),在dout2的輸出中,每4個(gè)CARRY4后都會(huì)有一級(jí)的觸發(fā),這樣時(shí)序就會(huì)好很多,但造成的代價(jià)是LUT會(huì)增加。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598980
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2241

    瀏覽量

    93978
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA電源時(shí)序控制

    電子發(fā)燒友網(wǎng)站提供《FPGA電源時(shí)序控制.pdf》資料免費(fèi)下載
    發(fā)表于 08-26 09:25 ?0次下載
    <b class='flag-5'>FPGA</b>電源<b class='flag-5'>時(shí)序</b>控制

    深度解析FPGA中的時(shí)序約束

    建立時(shí)間和保持時(shí)間是FPGA時(shí)序約束中兩個(gè)最基本的概念,同樣在芯片電路時(shí)序分析中也存在。
    的頭像 發(fā)表于 08-06 11:40 ?329次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>FPGA</b>中的<b class='flag-5'>時(shí)序</b>約束

    FPGA深度神經(jīng)網(wǎng)絡(luò)中的應(yīng)用

    、低功耗等特點(diǎn),逐漸成為深度神經(jīng)網(wǎng)絡(luò)在邊緣計(jì)算和設(shè)備端推理的重要硬件平臺(tái)。本文將詳細(xì)探討FPGA深度神經(jīng)網(wǎng)絡(luò)中的應(yīng)用,包括其優(yōu)勢(shì)、設(shè)計(jì)流程、關(guān)鍵技術(shù)以及實(shí)際應(yīng)用案例。
    的頭像 發(fā)表于 07-24 10:42 ?384次閱讀

    溫度補(bǔ)償振蕩器TG-3541CE的深度解析

    溫度補(bǔ)償振蕩器TG-3541CE的深度解析
    的頭像 發(fā)表于 07-18 17:48 ?177次閱讀

    FPGA時(shí)序課件下載

    方便FPGA愛(ài)好者學(xué)習(xí)
    發(fā)表于 07-12 11:45 ?0次下載

    FPGA 高級(jí)設(shè)計(jì):時(shí)序分析和收斂

    今天給大俠帶來(lái)FPGA 高級(jí)設(shè)計(jì):時(shí)序分析和收斂,話不多說(shuō),上貨。 這里超鏈接一篇之前的STA的文章,僅供各位大俠參考。 FPGA STA(靜態(tài)時(shí)序分析) 什么是靜態(tài)
    發(fā)表于 06-17 17:07

    加法進(jìn)位的手動(dòng)約束

    在激光雷達(dá)中,使用FPGA實(shí)現(xiàn)TDC時(shí)需要手動(dòng)約束進(jìn)位的位置。這里簡(jiǎn)單記錄下。 在outflow下會(huì)生成一個(gè).qplace文件?。用于指示布線的各個(gè)原語(yǔ)資源的分布位置 。 它的內(nèi)容主是 是原語(yǔ)
    的頭像 發(fā)表于 05-20 11:38 ?1113次閱讀
    加法<b class='flag-5'>進(jìn)位</b><b class='flag-5'>鏈</b>的手動(dòng)約束

    FPGA工程的時(shí)序約束實(shí)踐案例

    詳細(xì)的原時(shí)鐘時(shí)序、數(shù)據(jù)路徑時(shí)序、目標(biāo)時(shí)鐘時(shí)序的各延遲數(shù)據(jù)如下圖所示。值得注意的是數(shù)據(jù)路徑信息,其中包括Tco延遲和布線延遲,各級(jí)累加之后得到總的延遲時(shí)間。
    發(fā)表于 04-29 10:39 ?480次閱讀
    <b class='flag-5'>FPGA</b>工程的<b class='flag-5'>時(shí)序</b>約束實(shí)踐案例

    深入理解 FPGA 的基礎(chǔ)結(jié)構(gòu)

    FPGA 的兩個(gè)最基本的部分是組合邏輯以及時(shí)序邏輯,分別實(shí)現(xiàn)這兩個(gè)基本部分的結(jié)構(gòu)就是 FPGA 的基本單元。組合邏輯部分一般采用查找表(Look-Up-Table,LUT)的形式,時(shí)序
    發(fā)表于 04-03 17:39

    FPGA深度學(xué)習(xí)應(yīng)用中或?qū)⑷〈鶪PU

    現(xiàn)場(chǎng)可編程門(mén)陣列 (FPGA) 解決了 GPU 在運(yùn)行深度學(xué)習(xí)模型時(shí)面臨的許多問(wèn)題 在過(guò)去的十年里,人工智能的再一次興起使顯卡行業(yè)受益匪淺。英偉達(dá) (Nvidia) 和 AMD 等公司的股價(jià)也大幅
    發(fā)表于 03-21 15:19

    fpga時(shí)序仿真和功能仿真的區(qū)別

    FPGA時(shí)序仿真和功能仿真在芯片設(shè)計(jì)和驗(yàn)證過(guò)程中各自扮演著不可或缺的角色,它們之間存在明顯的區(qū)別。
    的頭像 發(fā)表于 03-15 15:28 ?1471次閱讀

    基于FPGA時(shí)序分析設(shè)計(jì)方案

    時(shí)鐘的時(shí)序特性主要分為抖動(dòng)(Jitter)、偏移(Skew)、占空比失真(Duty Cycle Distortion)3點(diǎn)。對(duì)于低速設(shè)計(jì),基本不用考慮這些特征;對(duì)于高速設(shè)計(jì),由于時(shí)鐘本身的原因造成的時(shí)序問(wèn)題很普遍,因此必須關(guān)注。
    發(fā)表于 11-22 09:29 ?593次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>時(shí)序</b>分析設(shè)計(jì)方案

    FPGA時(shí)序約束--基礎(chǔ)理論篇

    FPGA開(kāi)發(fā)過(guò)程中,離不開(kāi)時(shí)序約束,那么時(shí)序約束是什么?簡(jiǎn)單點(diǎn)說(shuō),FPGA芯片中的邏輯電路,從輸入到輸出所需要的時(shí)間,這個(gè)時(shí)間必須在設(shè)定的時(shí)鐘周期內(nèi)完成,更詳細(xì)一點(diǎn),即需要滿(mǎn)足建立和保
    發(fā)表于 11-15 17:41

    什么是進(jìn)位和溢出?

    什么是進(jìn)位和溢出
    發(fā)表于 11-03 07:26

    C語(yǔ)言深度解析

    C語(yǔ)言深度解析,本資料來(lái)源于網(wǎng)絡(luò),對(duì)C語(yǔ)言的學(xué)習(xí)有很大的幫助,有著較為深刻的解析,可能會(huì)對(duì)讀者有一定的幫助。
    發(fā)表于 09-28 07:00