色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

進行RTL代碼設(shè)計需要考慮時序收斂的問題

454398 ? 來源:AI加速 ? 作者:AI加速 ? 2020-11-20 15:51 ? 次閱讀

引言

硬件描述語言(verilog,systemVerilog,VHDL等)不同于軟件語言(C,C++等)的一點就是,代碼對應(yīng)于硬件實現(xiàn),不同的代碼風格影響硬件的實現(xiàn)效果。好的代碼風格能讓硬件“跑得更快”,而一個壞的代碼風格則給后續(xù)時序收斂造成很大負擔。你可能要花費很長時間去優(yōu)化時序,保證時序收斂。拆解你的代碼,添加寄存器,修改走線,最后讓你原來的代碼“遍體鱗傷”。這一篇基于賽靈思的器件來介紹一下如何在開始碼代碼的時候就考慮時序收斂的問題,寫出一手良好的代碼。

1. Counter結(jié)構(gòu)

計數(shù)器是在FPGA設(shè)計中經(jīng)常要用到的結(jié)構(gòu),比如在AXI總線中對接收數(shù)據(jù)量的計算,用計數(shù)器來產(chǎn)生地址和last等信號。在計數(shù)器中需要用到進位鏈,進位鏈是影響時序的主要因素。如果進位鏈越長,那么組合邏輯的級數(shù)就越高,組合邏輯延遲越大,能夠支持的最大時鐘頻率就會越低。在一個CLB中通常會含有一個進位鏈結(jié)構(gòu),比如在ultrascale中是CARRY8,在zynq7系列中是CARRY4,CARRY4可以實現(xiàn)4bit進位。如果是一個48bit計數(shù)器就需要12個這樣的進位結(jié)構(gòu)。一個CARRY4輸出有兩種CO和O,CO是進位bit,用于級聯(lián)到下一級的CARRY4的CI,O是結(jié)果輸出。因此我們可以看到在計數(shù)器中最下的進位結(jié)構(gòu)是CARRY4,如果直接讓多個進位結(jié)構(gòu)級聯(lián),那么組合邏輯就會變大,時序延遲就會增大。如果可以將計數(shù)器拆分成小的計數(shù)器,那么時序就可以得到改善。


比如一個48bit計數(shù)器拆分成3個16bit計數(shù)器,那么CARRY4的級聯(lián)級別就從原來的12個降低到4個。每4個之間增加了FF來進行時序改善。

always @(posedge clk)begin
         if(rst)
                   cnt_o <= 0;
         else 
                   cnt_o <= cnt_o + 1;
end  

拆分后代碼為:

genvar i;
generate
for(i=0;i<3;i=i+1)begin: CNT_LOOP
         wire trigger_nxt, trigger_pre;

         if(i == 0)begin
                   always @(posedge clk)begin
                            if(rst)
                                     cnt_o[i*16 +: 16] <= 0;
                            else
                                     cnt_o[i*16 +: 16] <= cnt_o[i*16 +: 16] + 1;
                   end

                   assign trigger_nxt = (cnt_o[i*16 +: 16] == 16'hFFFF) ? 1 : 0;
         end//if
         else begin
                   assign trigger_pre = CNT_LOOP[i-1].trigger_nxt;

                   always @(posedge clk)begin
                            if(rst)
                                     cnt_o[i*16 +: 16] <= 0;
                            else if(trigger_pre)
                                     cnt_o[i*16 +: 16] <= cnt_o[i*16 +: 16] + 1;
                   end 

                   assign trigger_nxt =  CNT_LOOP[i-1].trigger_nxt && (cnt_o[i*16 +: 16] == 16'hFFFF);
         end//else
end//for
endgenerate

綜合后我們就可以看到它的schematic每4個CARRY4都被FF隔開了,可以降低邏輯延時。但是代價是增加了LUT的數(shù)量,這些LUT是用來判斷前一個16bit計數(shù)器的數(shù)值的,從而驅(qū)動后邊16bit寄存器計數(shù)。


2. 邏輯拆分

在上一節(jié)中拆解計數(shù)器本質(zhì)上就是在拆分組合邏輯。當一個組合邏輯過大的時候,延時較大。將其拆解成兩個或者兩個以上邏輯,中間增加寄存器可以來提高能跑得時鐘頻率。比如下圖有一個較大的組合邏輯,前邊有一個FF,后邊連續(xù)接2個FF。組合邏輯的延時就成為了整體時鐘頻率的一個關(guān)鍵路徑。如果我們可以將其拆分成兩個,中間用一級寄存器連接,這樣總共的時鐘周期還是3個,但是時鐘頻率明顯會好于前一種。


3. 改善扇出

扇出是指某個信號驅(qū)動的信號的數(shù)量。驅(qū)動的信號越多,那么要求其產(chǎn)生的電流越大。學(xué)過數(shù)字電路就會知道,當一個信號輸出連接的越多的時候,其輸出負載就會越小,那么輸出電壓就會減小。所以如果信號扇出過大就會影響到高低電平,最終就會導(dǎo)致時序不收斂。另外一個原因是如果信號扇出過大,那么由于FPGA上走線路徑的差異,就可能造成這個信號到達不同地址的延遲不同,造成時序不同步。一種解決辦法是復(fù)制,將扇出較大的信號復(fù)制幾份,這樣就可以減小扇出。比如一個輸入d_i需要和3個數(shù)進行求和。那么這個信號扇出就是3.如果將其復(fù)制3份,給每個數(shù)輸送一份,那么扇出就變?yōu)?。

always @(posedge clk)begin
         data1_o <= data_i + data1_o;
         data2_o <= data_i + data2_o;
         data3_o <= data_i + data3_o;
end 


如果我們復(fù)制輸入數(shù)據(jù),如下圖,從中可以看出輸入信號復(fù)制了三份,分別接給三個加法器。

(* keep = "true" *)reg data_rp1;
(* keep = "true" *)reg data_rp2;
(* keep = "true" *)reg data_rp3;   


always @(posedge clk)begin
         data_rp1 <= data_i;
         data_rp2 <= data_i;
         data_rp3 <= data_i;
         data1_o <= data_rp1 + data1_o;
         data2_o <= data_rp2 + data2_o;
         data3_o <= data_rp3 + data3_o;
end


4. URAM和BRAM使用

Xilinx器件中BRAM的大小是36Kbit,如果不使用校驗位,可以配置成1-32bit位寬的存儲。比如32x1K。在RTL代碼中使用存儲的時候,需要適配BRAM大小,這樣可以不浪費BRAM存儲空間。比如你需要使用一個FIFO,那么這個FIFO位寬32bit,那么它的深度512和1024配置,都消耗了一個BRAM。

BRAM輸出中最好用register,不要直接接組合邏輯,這樣會增加延時。BRAM中含有register,如果代碼中輸出有用到register,那么這個register在綜合時會被移到BRAM內(nèi)部。如果BRAM外要連接組合邏輯,最好在BRAM的register的外部在添加一個register,這樣有更好的時序。


當我們需要的存儲空間和位寬都超過了一個BRAM的時候,就涉及到多個BRAM的級聯(lián)問題。如何選擇單個BRAM的位寬拼接和級聯(lián)BRAM的個數(shù)呢?比如我們要一個32bit位寬,深度為2**15大小的存儲。有兩種極限方式來配置BRAM。一種是將每個BRAM配置為1x32K,那么32個拼接組成32x32K的存儲。另外一種是將每個BRAM設(shè)置為32x1K,那么32個級聯(lián)形成32K深度。前一種不需要多余邏輯來對不同BRAM進行選擇操作,但是32個BRAM同時讀寫,這樣會增加power。而后一種32個BRAM級聯(lián)在一起造成延時路徑較長,同時需要增加組合邏輯來選擇不同BRAM。但是每次只讀寫一個BRAM,power較低。可以選擇這兩個極限的中間值來即降低power也不會有太長的邏輯延時。可以通過約束條件來進行設(shè)置。如下圖。級聯(lián)設(shè)置為4,這樣每次只有8個BRAM同時使能。

(* ram_style = "block", cascade_height = 4 *)
reg [31:0] mem[2**15-1:0];
reg [14:0] addr_reg;
always @(posedge clk)begin
         addr_reg <= addr;
         dout <= mem[addr_reg];
         if(we)
                   mem[addr_reg] <= din;
end


URAM的使用方式類似,只不過URAM存儲空間比BRAM大,其可以配置為72x64K大小。

5. 其它

1) 進行條件判定的時候,如果條件過多,盡量減少if-else語句的使用,盡可能用case替代。因為if-else是有優(yōu)先級的,而case條件判斷的平等的。前者會用掉更多邏輯;

2) 在一個always塊中盡量對一個信號賦值,不要對具有不同判斷條件的信號同時賦值,這樣可以減少不必要的邏輯;

3) 盡量使用時鐘同步復(fù)位,不要使用異步復(fù)位。即要用:

always @(posedge clk)begin

If(rst)

End

而不是

always @(posedge clk or posedge rst)

4) 在使用乘法較多的時候,使用DSP原語是最好的。一個DSP除了有乘法功能外,還有前加法器和后加法器,這兩個是經(jīng)常用到的,可以用來計算很多功能。DSP的具體使用可以參考DSP的手冊。

總結(jié)

以上總結(jié)了幾點在進行RTL代碼設(shè)計時,最需要考慮的幾種情況。這些對時序影響很大,需要注意。另外從整體來講,如何選擇一個好的算法,然后設(shè)計出一個簡潔的架構(gòu)更加重要。因為這些是從整體讓你的設(shè)計有更多靈活的空間。

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

    關(guān)注

    1629

    文章

    21744

    瀏覽量

    603614
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120429
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59815
  • AXI總線
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    14264
收藏 人收藏

    評論

    相關(guān)推薦

    ADS1675進行高速采集的程序,看時序圖應(yīng)該會使用PLL進行3倍頻,但是這個PLL需要配置嗎?

    我現(xiàn)在寫ADS1675進行高速采集的程序,看時序圖應(yīng)該會使用PLL進行3倍頻,但是這個PLL需要配置嗎?一直達不到我想要的結(jié)果。謝謝大哥們,幫幫小弟呀
    發(fā)表于 12-10 08:15

    如何創(chuàng)建虛擬時鐘

    通常RTL設(shè)計要求對芯片/module的輸入信號進行reg_in打拍處理,對芯片/module的輸出也要求做reg_out打拍處理,這是良好的代碼習(xí)慣,為時序
    的頭像 發(fā)表于 10-23 09:40 ?244次閱讀
    如何創(chuàng)建虛擬時鐘

    使用IBIS模型進行時序分析

    電子發(fā)燒友網(wǎng)站提供《使用IBIS模型進行時序分析.pdf》資料免費下載
    發(fā)表于 10-21 10:00 ?0次下載
    使用IBIS模型<b class='flag-5'>進行時序</b>分析

    高速ADC與FPGA的LVDS數(shù)據(jù)接口中避免時序誤差的設(shè)計考慮

    電子發(fā)燒友網(wǎng)站提供《高速ADC與FPGA的LVDS數(shù)據(jù)接口中避免時序誤差的設(shè)計考慮.pdf》資料免費下載
    發(fā)表于 10-15 09:50 ?5次下載
    高速ADC與FPGA的LVDS數(shù)據(jù)接口中避免<b class='flag-5'>時序</b>誤差的設(shè)計<b class='flag-5'>考慮</b>

    使用MXO58示波器輕松進行電源時序分析

    當今復(fù)雜的電路必須集成多個在不同功率等級下運行的組件。要確保這些組件的互操作性,電路需要精心設(shè)計,具備干凈且穩(wěn)定的電源分配網(wǎng)絡(luò)來進行電源時序管理。在較低的電壓水平下,容差以百分比表示,這可能會給精確
    的頭像 發(fā)表于 10-13 08:07 ?298次閱讀
    使用MXO58示波器輕松<b class='flag-5'>進行</b>電源<b class='flag-5'>時序</b>分析

    優(yōu)化 FPGA HLS 設(shè)計

    RTL代碼進行任何更改即可實現(xiàn)的。 更高水平的性能 要達到更高的性能水平,需要在所有方面進行優(yōu)化——架構(gòu)設(shè)計、
    發(fā)表于 08-16 19:56

    聚徽觸控-選擇工控機需要考慮的問題都有哪些

    選擇工控機時,需要考慮的問題主要有以下幾個方面:
    的頭像 發(fā)表于 07-26 10:11 ?228次閱讀

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

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

    基于樹莓派5的RTL仿真體驗

    ,將以 verilog 編寫的源代碼編譯為某種目標格式。如果要進行仿真的話,它可以生成一個叫做 vvp 的中間格式。這個格式可以由其所附帶的 vvp 命令執(zhí)行。 1.2GTKwave GTKwave
    發(fā)表于 04-30 17:35

    一文解讀PSpice中的收斂性問題及其相關(guān)因素

    收斂性問題及其與之相關(guān)因素,希望對各位有所幫助,文章如有未詳盡表述清楚的地方,請指正。在PSpice中進行電路仿真時,常會遇到仿真不收斂的問題(簡稱收斂性問題)。當
    的頭像 發(fā)表于 04-13 08:12 ?2012次閱讀
    一文解讀PSpice中的<b class='flag-5'>收斂</b>性問題及其相關(guān)因素

    為什么對FPGA軟件進行測評?

    FPGA軟件包含進行設(shè)計而產(chǎn)生的程序、文檔和數(shù)據(jù),同時包含與之相關(guān)的軟件特性和硬件特性。FPGA軟件測試需要考慮軟件代碼正確性、軟硬件接口協(xié)調(diào)性、
    發(fā)表于 03-06 11:39 ?737次閱讀

    時序電路的分類 時序電路的基本單元電路有哪些

    時序電路是一種能夠按照特定的順序進行操作的電路。它以時鐘信號為基準,根據(jù)輸入信號的狀態(tài)和過去的狀態(tài)來確定輸出信號的狀態(tài)。時序電路廣泛應(yīng)用于計算機、通信系統(tǒng)、數(shù)字信號處理等領(lǐng)域。根據(jù)不同的分類標準
    的頭像 發(fā)表于 02-06 11:25 ?2654次閱讀

    FPGA管教分配需要考慮因素

    這種方法往往是不可取的,RTL驗證與驗證板設(shè)計必須是同步進行的,在驗證代碼出來時驗證的單板也必須設(shè)計完畢,也就是管腳的分配也必須在設(shè)計代碼出來之前完成。所以,管腳的分配更多的將是依賴人
    發(fā)表于 01-10 22:40

    西門子PLC進行連續(xù)數(shù)據(jù)采集、時序和故障追蹤的方法

    西門子可以通過博圖軟件進行PLC數(shù)據(jù)的采集和狀態(tài)記錄,但是,僅適用于S7-1200和S7-1500,且不能連續(xù)錄波。如果需要連續(xù)記錄PLC內(nèi)的數(shù)據(jù),或者進行長時間的時序和故障追蹤,可以
    的頭像 發(fā)表于 01-05 10:30 ?1629次閱讀

    Vivado時序問題分析

    有些時候在寫完代碼之后呢,Vivado時序報紅,Timing一欄有很多時序問題。
    的頭像 發(fā)表于 01-05 10:18 ?2190次閱讀
    主站蜘蛛池模板: 青青青伊人| 国产亚洲国际精品福利| 欧美亚洲韩日午夜| 国产女人视频免费观看| 综合人妻久久一区二区精品| 日韩性xxx| 久久视频在线视频观看精品15| 成人免费在线观看视频| 伊人22222| 天天操夜夜噜| 找老女人泻火对白自拍| 蕾丝边娱乐网| 国产精品亚洲二线在线播放| 7723日本高清完整版在线观看 | 芭乐视频网页版在线观看| 亚洲欧美中文字幕5发布| 日本色呦呦| 美女脱衣服搞鸡| 国内精品国内自产视频| 国产 日韩 欧美 综合 激情| 91国内精品久久久久免费影院| 亚洲精品无码不卡| 午夜精品国产自在现线拍| 欧美亚洲国产专区在线| 免费欧美大片| 久久天天婷婷五月俺也去| 韩国电影real在线观看完整版| 国产GV无码A片在线观看| seba51久久精品| 99成人在线视频| 中文字幕天堂久久精品| 亚洲天堂久久久| 亚洲精品高清在线观看| 午夜在线观看免费完整直播网| 久久久久久天天夜夜天天| 国产偷国产偷亚洲高清SWAG| 观赏女性排尿| 大学生一级毛片免费看| 亚洲免费人成在线视频观看| 无限资源在线观看完整版免费下载 | 99热精品一区|