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

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

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

如何寫出時序最優(yōu)的HDL代碼?如何寫出時序裕量足夠的代碼?

FPGA攻城獅之家 ? 來源:FPGA攻城獅之家 ? 2024-03-12 09:59 ? 次閱讀

你想寫出可以跑出700M以上的代碼嗎,直逼FPGA內(nèi)部PLL的極限。

你想寫出時序裕量足夠的代碼嗎,讓你的代碼不會出現(xiàn)時序違例。

你想在時序違例時能輕松應(yīng)對嗎?讓代碼輕松越過時序這道門檻。

這篇文章就是一步步向你解釋,如何理解代碼中的時序,以及如何解決代碼中的時序違例問題。

之前的文章中提到過,工程中ISP算法模塊輕松跑到了762.5M的頻率,整個ISP鏈路沒有優(yōu)化的情況下跑到400M的時鐘頻率(xilinx的us+系列)。

573357de-dfa1-11ee-a297-92fbcf53809c.png

這篇文章將逐步解開HDL代碼中的時序之謎,并且讓你輕松應(yīng)對FPGA中的時序問題。我將從實際工程的ISP算法模塊出發(fā),從設(shè)計到時序違例的查找,一步步提高代碼的時序性能。

在第一個ISP模塊DPC中,我使用了一個在3x3的矩陣中查找中值的模塊,也就是大家常用的中值濾波器。是不是很多人都設(shè)計過,先不著急覺得是否簡單,而是看如何把算法移植和時序的思想灌入到這個模塊之中。

首先假設(shè)你已經(jīng)得到了一個3x3的矩陣,簡單看看設(shè)計思想:

在3x3 窗口中獲取9 個數(shù)據(jù),對9 這個數(shù)據(jù)值進(jìn)行排序,排序步驟如下

A)窗內(nèi)的每行數(shù)據(jù)找到最大值、中間值和最小值;

B)把三列的最小值相比較,取其中的最大值;

C)把三列的最大值相比較,取其中的最小值;

D)把三列的中間值相比較,再取一次中間值;

E) 再把B,C,D 中得到的三個值再排序,獲取中值。

5752fd00-dfa1-11ee-a297-92fbcf53809c.png

有了設(shè)計思想就有了靈魂,剩下的是如何構(gòu)建一個有血有肉的軀體了。經(jīng)過思考不難發(fā)現(xiàn),9個數(shù)的中值濾波變成了3次在3個數(shù)中找最大值,最小值,中值。

第一次:執(zhí)行步驟A。

第二次:執(zhí)行步驟B,C,D .

第三次:執(zhí)行E 。

第一次三行D1,D2,D3并行,第二次三列Dxmax,Dxmed,Dxmin并行,第三次在剩下的三個數(shù)里面找到中值,運算完畢。所以9個數(shù)據(jù)的中值查找的設(shè)計,變成了一個只需要解決三個數(shù)據(jù)里面找到max,med,min的設(shè)計。

是不是覺得這太簡單了。別急,聽我繼續(xù)分析:

既然是在三個數(shù)據(jù)里面排序,那就需要兩兩比較,于是就是需要比較3次。A 與B ,B與C,A與C?,F(xiàn)在假設(shè)A

好,此時另一個誤區(qū)可能就要出現(xiàn)了。因為flag可能為0也可能為1,那么你得到了三個flag,一共有多少種情況呢?可能有人不假思索地回答8種,因為3bit數(shù)據(jù),2^3= 8 ,所以就是8 種。其實不是,用概率與統(tǒng)計的知識,三個數(shù)據(jù)的排序應(yīng)該是有C31* C21 * C11 = 6 種。真值表如下

A B A
0 0 0 max=A,min = C
0 0 1 不存在
0 1 0 max=A,min = B
0 1 1 max=C,min = B
1 0 0 max=B,min = C
1 0 1 max=B,min = A
1 1 0 不存在
1 1 1 max=C,min = A

算法分析完畢,剩下的就是代碼設(shè)計了。首先你需要進(jìn)行三次比較。

575de5ee-dfa1-11ee-a297-92fbcf53809c.png

5778e9f2-dfa1-11ee-a297-92fbcf53809c.png

針對上述代碼,畫出對應(yīng)的數(shù)字電路示意圖,(mux的三個輸入端省略了datx_reg)

577fdba4-dfa1-11ee-a297-92fbcf53809c.png

我假設(shè)FPGA內(nèi)部按照上圖所示的方式進(jìn)行布局布線,那么最長數(shù)據(jù)路徑應(yīng)該是dat2_reg→comp_12 → mux3. (或者說是dat2_reg→ comp_23 → mux1)這條路徑也就被稱之為最長路徑或者關(guān)鍵路徑。時序分析工具干的事情就是,分析這條最長路徑(當(dāng)然其他路徑也分析)上的時序是否滿足條件。

單獨把這條路徑摳出來,它就是這樣子的。于是,STA靜態(tài)時序分析的模型就出來了,計算reg到reg之間的延遲,兩個reg之間,經(jīng)歷了一個比較器和一個多路選擇器這兩個組合邏輯。

578396e0-dfa1-11ee-a297-92fbcf53809c.png

如果上述的路徑因為走線(linelatency)延遲,或者是因為邏輯延遲(logiclatency)過大導(dǎo)致了時序違例,那么我們就應(yīng)該在兩個組合邏輯之間插入reg。從電路上,應(yīng)該如下圖所示。

57900e84-dfa1-11ee-a297-92fbcf53809c.png

那么從代碼的角度,應(yīng)該這樣修改,就可以達(dá)到上圖的效果:

579b305c-dfa1-11ee-a297-92fbcf53809c.png

好了,有了這個參考模板,再去看其他的中值濾波代碼,你就知道要從哪里去優(yōu)化了。

為了讓大家更好的理解時序,我在網(wǎng)上找了兩個用相同的算法思路設(shè)計的開源的代碼??此麄兊脑O(shè)計方法

三方代碼 1

57abe53c-dfa1-11ee-a297-92fbcf53809c.png

三方代碼 2

57b1092c-dfa1-11ee-a297-92fbcf53809c.png

可以看到數(shù)據(jù)比較的時候,邏輯明顯有冗余,EDA工具不一定能自動優(yōu)化。

然后我將兩個三方的代碼,以及我自己的代碼放入同一工程中進(jìn)行編譯,故意加大時鐘頻率,讓它們出現(xiàn)時序違例,從而找出關(guān)鍵路徑。

三方的兩個模塊我例化成 median_filter_3x3 ,和 medfilter3by3 ,用vivado2022.1進(jìn)行編譯。得到時序違例報告

57be6acc-dfa1-11ee-a297-92fbcf53809c.png

再進(jìn)一步分析關(guān)聯(lián)路徑1,得到了如下圖所示的路徑示意圖

57c8d76e-dfa1-11ee-a297-92fbcf53809c.png

可以看到在兩個 reg之間有4個邏輯塊,然后再去代碼中找到相應(yīng)的位置。然后再追究到代碼內(nèi)部。

57dbd22e-dfa1-11ee-a297-92fbcf53809c.png

57e00344-dfa1-11ee-a297-92fbcf53809c.png

可以看到,代碼中多次出現(xiàn)重復(fù)性的數(shù)據(jù)比較,這都是數(shù)據(jù)優(yōu)化的方向。具體的位置就是 33-37行,最后vivado推測出第37行,需要經(jīng)過4級組合邏輯才能將dat3 賦值給 mid_dat 。





審核編輯:劉清

聲明:本文內(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)注

    1620

    文章

    21510

    瀏覽量

    598871
  • 濾波器
    +關(guān)注

    關(guān)注

    158

    文章

    7594

    瀏覽量

    176557
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1614

    瀏覽量

    106831
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    324

    瀏覽量

    47229
  • PLL電路
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    6371

原文標(biāo)題:基于FPGA的 ISP代碼精講1 —— 如何寫出時序最優(yōu)的HDL代碼

文章出處:【微信號:gh_99a29eb83412,微信公眾號:FPGA攻城獅之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    優(yōu)化高速接口的時序

    本文將對源同步定時如何優(yōu)化高速接口時序進(jìn)行討論。時序預(yù)算是對系統(tǒng)正常工作所需時序參數(shù)或時序
    發(fā)表于 03-20 10:46 ?2557次閱讀
    優(yōu)化高速接口的<b class='flag-5'>時序</b><b class='flag-5'>裕</b><b class='flag-5'>量</b>

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

    更快,而一個壞的代碼風(fēng)格則給后續(xù)時序收斂造成很大負(fù)擔(dān)。你可能要花費很長時間去優(yōu)化時序,保證時序收斂。拆解你的代碼,添加寄存器,修改走線,最后
    的頭像 發(fā)表于 11-20 15:51 ?3785次閱讀
    進(jìn)行RTL<b class='flag-5'>代碼</b>設(shè)計需要考慮<b class='flag-5'>時序</b>收斂的問題

    何為高質(zhì)量的代碼?如何寫出高質(zhì)量代碼?

    懂得“數(shù)據(jù)結(jié)構(gòu)與算法” 寫出高效的代碼,懂得“設(shè)計模式”寫出高質(zhì)量的代碼。
    發(fā)表于 08-02 09:44 ?694次閱讀
    何為高質(zhì)量的<b class='flag-5'>代碼</b>?<b class='flag-5'>如何寫出</b>高質(zhì)量<b class='flag-5'>代碼</b>?

    如何寫出好的代碼?高質(zhì)量代碼的三要素

    膾炙人口的詩"春有百花秋有月,夏有涼風(fēng)冬有雪",意境唯美,簡明易懂。好的代碼也是讓人陶醉的,那么如何寫出好的代碼?
    的頭像 發(fā)表于 01-05 11:29 ?1031次閱讀
    <b class='flag-5'>如何寫出</b>好的<b class='flag-5'>代碼</b>?高質(zhì)量<b class='flag-5'>代碼</b>的三要素

    如何寫出可以讓人理解的代碼(以verilog語言為例)?

    如何寫出可以讓人理解的代碼(以verilog語言為例)?1. 代碼要比較好理解,最容易做到的就是把代碼寫短,因此在每個always語句塊盡可能只處理一個信號,或者只處理一組相關(guān)度很高的
    發(fā)表于 02-01 11:39

    如何利用時鐘芯片DS1302來分析時序圖并寫出代碼

    以時鐘芯片DS1302為例子來分析時序圖并寫出代碼
    發(fā)表于 04-02 06:00

    如何寫出高效并且簡潔易于閱讀的單片機(jī)C語言代碼呢?

    單片機(jī)的運行除去需要硬件的支持之外,高效簡潔的C語言也是非常重要的因素之一。那么如何寫出高效并且簡潔易于閱讀的單片機(jī)C語言代碼呢?本文將為大家介紹如何寫出優(yōu)美簡潔 的單片機(jī)循環(huán)語句,感興趣的朋友快來
    發(fā)表于 07-15 06:34

    如何寫出多串口共用printf函數(shù)語句呢

    如何寫出多串口共用printf函數(shù)語句呢?求大神解答
    發(fā)表于 11-17 06:37

    如何寫DA轉(zhuǎn)化代碼

    如何寫DA轉(zhuǎn)化代碼:s: 即startADDRESS: 即器件地址(0表示為寫)A:表示等待回應(yīng)CONTROL BYTE: 表示控制字(第二個發(fā)送的字節(jié))A:表示等待回應(yīng)DATE BYTE: 表示寫入的電壓值(注意如果寫入255,其實結(jié)果是5v,以此來換算)A:表示等待
    發(fā)表于 02-16 07:48

    用C語言如何寫出單片機(jī)延時程序,且延時時間如何計算的?

    用C語言,如何寫出單片機(jī)延時程序,且延時時間如何計算的?
    發(fā)表于 10-18 08:19

    介紹了五個簡單的總體概念 可輕松寫出寫出代碼

    我認(rèn)為應(yīng)該建立起良好的心態(tài),這樣,不管你用什么語言或者庫,都會自然而然的寫出高質(zhì)量的代碼。這里我主要談到 5 個相關(guān)的概念。記住它們,輕松寫出寫出
    的頭像 發(fā)表于 01-10 14:00 ?5654次閱讀
    介紹了五個簡單的總體概念 可輕松<b class='flag-5'>寫出</b><b class='flag-5'>寫出</b>好<b class='flag-5'>代碼</b>

    如何寫出整潔的代碼

    現(xiàn)在我們有一個動物的接口, 里面有一個方法abc(),看了讓人一頭霧水, 調(diào)用這個方法的人也完全不知道這個方法是干什么的,因為他的命名毫無意義
    的頭像 發(fā)表于 04-04 11:24 ?1080次閱讀

    教你如何寫出性能更高的SystemVerilog代碼

    本文旨在幫助大家降低在編碼過程中寫出低性能和耗內(nèi)存的概率,只要大家在寫代碼時稍注意下,積少成多。
    的頭像 發(fā)表于 07-26 17:31 ?780次閱讀
    教你<b class='flag-5'>如何寫出</b>性能更高的SystemVerilog<b class='flag-5'>代碼</b>

    C語言如何寫出高效代碼呢?

    當(dāng)涉及復(fù)雜的高效C代碼案例時,這些代碼示例展示了C語言中一些復(fù)雜且高效的應(yīng)用案例,涵蓋了排序算法、圖算法、位操作、文件操作、多線程編程等領(lǐng)域。
    發(fā)表于 09-06 14:57 ?342次閱讀
    C語言<b class='flag-5'>如何寫出</b>高效<b class='flag-5'>代碼</b>呢?

    如何寫出高效優(yōu)美的C語言代碼

    電子發(fā)燒友網(wǎng)站提供《如何寫出高效優(yōu)美的C語言代碼.pdf》資料免費下載
    發(fā)表于 11-18 10:55 ?0次下載
    <b class='flag-5'>如何寫出</b>高效優(yōu)美的C語言<b class='flag-5'>代碼</b>