那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

如何寫出時序最優的HDL代碼?如何寫出時序裕量足夠的代碼?

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

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

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

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

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

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

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

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

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

首先假設你已經得到了一個3x3的矩陣,簡單看看設計思想:

在3x3 窗口中獲取9 個數據,對9 這個數據值進行排序,排序步驟如下

A)窗內的每行數據找到最大值、中間值和最小值;

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

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

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

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

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

有了設計思想就有了靈魂,剩下的是如何構建一個有血有肉的軀體了。經過思考不難發現,9個數的中值濾波變成了3次在3個數中找最大值,最小值,中值。

第一次:執行步驟A。

第二次:執行步驟B,C,D .

第三次:執行E 。

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

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

既然是在三個數據里面排序,那就需要兩兩比較,于是就是需要比較3次。A 與B ,B與C,A與C。現在假設A

好,此時另一個誤區可能就要出現了。因為flag可能為0也可能為1,那么你得到了三個flag,一共有多少種情況呢?可能有人不假思索地回答8種,因為3bit數據,2^3= 8 ,所以就是8 種。其實不是,用概率與統計的知識,三個數據的排序應該是有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

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

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

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

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

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

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

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

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

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

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

那么從代碼的角度,應該這樣修改,就可以達到上圖的效果:

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

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

為了讓大家更好的理解時序,我在網上找了兩個用相同的算法思路設計的開源的代碼。看他們的設計方法

三方代碼 1

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

三方代碼 2

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

可以看到數據比較的時候,邏輯明顯有冗余,EDA工具不一定能自動優化。

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

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

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

再進一步分析關聯路徑1,得到了如下圖所示的路徑示意圖

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

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

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

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

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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21796

    瀏覽量

    605996
  • 濾波器
    +關注

    關注

    161

    文章

    7860

    瀏覽量

    178928
  • 比較器
    +關注

    關注

    14

    文章

    1658

    瀏覽量

    107428
  • HDL
    HDL
    +關注

    關注

    8

    文章

    328

    瀏覽量

    47468
  • PLL電路
    +關注

    關注

    0

    文章

    92

    瀏覽量

    6473

原文標題:基于FPGA的 ISP代碼精講1 —— 如何寫出時序最優的HDL代碼

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

收藏 人收藏

    評論

    相關推薦

    優化高速接口的時序

    本文將對源同步定時如何優化高速接口時序進行討論。時序預算是對系統正常工作所需時序參數或時序
    發表于 03-20 10:46 ?2694次閱讀
    優化高速接口的<b class='flag-5'>時序</b><b class='flag-5'>裕</b><b class='flag-5'>量</b>

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

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

    何為高質量的代碼如何寫出高質量代碼

    懂得“數據結構與算法” 寫出高效的代碼,懂得“設計模式”寫出高質量的代碼
    發表于 08-02 09:44 ?877次閱讀
    何為高質量的<b class='flag-5'>代碼</b>?<b class='flag-5'>如何寫出</b>高質量<b class='flag-5'>代碼</b>?

    如何寫出好的代碼?高質量代碼的三要素

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

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

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

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

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

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

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

    如何寫出多串口共用printf函數語句呢

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

    如何寫DA轉化代碼

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

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

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

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

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

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

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

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

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

    如何寫出高效優美的C語言代碼

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

    如何寫出穩定的單片機代碼

    這篇文章分享怎么寫出穩定的單片機代碼。? ?? 我對優秀代碼的理解,大體分為兩個部分:高效和穩定。 ? 兩者都能做到很好的,如果靠自己摸索,沒有刻意去練習,可能需要花10年,甚至更久
    的頭像 發表于 11-15 16:40 ?479次閱讀
    <b class='flag-5'>如何寫出</b>穩定的單片機<b class='flag-5'>代碼</b>
    大发888游戏 下载| 百家乐官网发牌靴发牌盒| 大发888方管下载| 百家乐赢率| 做生意风水摆件| 百家乐官网黏土筹码| 百家乐官网棋牌正式版| 柞水县| 大发888优惠红利代码| 名仕百家乐的玩法技巧和规则| 黄金城娱乐场| bet365备用网址b365etbyty| 大发888 大发888娱乐城 大发888娱乐场| 百家乐暗红色桌布| 百家乐金海岸| 百家乐桌布专业| 大发888游戏客户端下载| 老虎机上分器原理图| 防伪百家乐筹码币套装| 威尼斯人娱乐平台博彩投注平| 金榜百家乐的玩法技巧和规则 | 百家乐真人视频出售| 美女百家乐的玩法技巧和规则| 伯爵百家乐赌场娱乐网规则| 91百家乐的玩法技巧和规则| 百家乐波音独家注册送彩| 大发888存款| 真钱的棋牌游戏| 新利娱乐开户| 百家乐官网是骗人吗| 百家乐官网览| 百家乐官网有公式| 百家乐官网怎样出千| 香港百家乐官网赌城| 百家乐免费路单| 网上百家乐开户送现金| 永利百家乐赌场娱乐网规则 | 金木棉百家乐的玩法技巧和规则| 百家乐赌场策略论坛| 真人游戏下载| 紫云|