一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

FPGA攻城獅之家 ? 來(lái)源:FPGA攻城獅之家 ? 2024-03-12 09:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

你想在時(shí)序違例時(shí)能輕松應(yīng)對(duì)嗎?讓代碼輕松越過(guò)時(shí)序這道門(mén)檻。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

是不是覺(jué)得這太簡(jiǎn)單了。別急,聽(tīng)我繼續(xù)分析:

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

好,此時(shí)另一個(gè)誤區(qū)可能就要出現(xiàn)了。因?yàn)閒lag可能為0也可能為1,那么你得到了三個(gè)flag,一共有多少種情況呢?可能有人不假思索地回答8種,因?yàn)?bit數(shù)據(jù),2^3= 8 ,所以就是8 種。其實(shí)不是,用概率與統(tǒng)計(jì)的知識(shí),三個(gè)數(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ì)了。首先你需要進(jìn)行三次比較。

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

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

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

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

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

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

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

如果上述的路徑因?yàn)樽呔€(linelatency)延遲,或者是因?yàn)檫壿嬔舆t(logiclatency)過(guò)大導(dǎo)致了時(shí)序違例,那么我們就應(yīng)該在兩個(gè)組合邏輯之間插入reg。從電路上,應(yīng)該如下圖所示。

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

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

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

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

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

三方代碼 1

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

三方代碼 2

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

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

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

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

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

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

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

可以看到在兩個(gè) reg之間有4個(gè)邏輯塊,然后再去代碼中找到相應(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推測(cè)出第37行,需要經(jīng)過(guò)4級(jí)組合邏輯才能將dat3 賦值給 mid_dat 。





審核編輯:劉清

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

    1645

    文章

    22050

    瀏覽量

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

    關(guān)注

    162

    文章

    8138

    瀏覽量

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

    關(guān)注

    14

    文章

    1848

    瀏覽量

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

    關(guān)注

    8

    文章

    330

    瀏覽量

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

    關(guān)注

    0

    文章

    92

    瀏覽量

    6817

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

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

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

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

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

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

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

    如何利用時(shí)鐘芯片DS1302來(lái)分析時(shí)序圖并寫(xiě)出代碼

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

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

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

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

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

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

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

    用C語(yǔ)言如何寫(xiě)出單片機(jī)延時(shí)程序,且延時(shí)時(shí)間如何計(jì)算的?

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

    介紹了五個(gè)簡(jiǎn)單的總體概念 可輕松寫(xiě)出寫(xiě)出代碼

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

    教你如何寫(xiě)出性能更高的SystemVerilog代碼

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

    C語(yǔ)言如何寫(xiě)出高效代碼呢?

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

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

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

    如何寫(xiě)出穩(wěn)定的單片機(jī)代碼

    這篇文章分享怎么寫(xiě)出穩(wěn)定的單片機(jī)代碼。? ?? 我對(duì)優(yōu)秀代碼的理解,大體分為兩個(gè)部分:高效和穩(wěn)定。 ? 兩者都能做到很好的,如果靠自己摸索,沒(méi)有刻意去練習(xí),可能需要花10年,甚至更久
    的頭像 發(fā)表于 11-15 16:40 ?828次閱讀
    <b class='flag-5'>如何寫(xiě)出</b>穩(wěn)定的單片機(jī)<b class='flag-5'>代碼</b>