你想寫出可以跑出700M以上的代碼嗎,直逼FPGA內部PLL的極限。
你想寫出時序裕量足夠的代碼嗎,讓你的代碼不會出現(xiàn)時序違例。
你想在時序違例時能輕松應對嗎?讓代碼輕松越過時序這道門檻。
這篇文章就是一步步向你解釋,如何理解代碼中的時序,以及如何解決代碼中的時序違例問題。
之前的文章中提到過,工程中ISP算法模塊輕松跑到了762.5M的頻率,整個ISP鏈路沒有優(yōu)化的情況下跑到400M的時鐘頻率(xilinx的us+系列)。
這篇文章將逐步解開HDL代碼中的時序之謎,并且讓你輕松應對FPGA中的時序問題。我將從實際工程的ISP算法模塊出發(fā),從設計到時序違例的查找,一步步提高代碼的時序性能。
在第一個ISP模塊DPC中,我使用了一個在3x3的矩陣中查找中值的模塊,也就是大家常用的中值濾波器。是不是很多人都設計過,先不著急覺得是否簡單,而是看如何把算法移植和時序的思想灌入到這個模塊之中。
首先假設你已經(jīng)得到了一個3x3的矩陣,簡單看看設計思想:
在3x3 窗口中獲取9 個數(shù)據(jù),對9 這個數(shù)據(jù)值進行排序,排序步驟如下
A)窗內的每行數(shù)據(jù)找到最大值、中間值和最小值;
B)把三列的最小值相比較,取其中的最大值;
C)把三列的最大值相比較,取其中的最小值;
D)把三列的中間值相比較,再取一次中間值;
E) 再把B,C,D 中得到的三個值再排序,獲取中值。
有了設計思想就有了靈魂,剩下的是如何構建一個有血有肉的軀體了。經(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ù)據(jù)里面找到max,med,min的設計。
是不是覺得這太簡單了。別急,聽我繼續(xù)分析:
既然是在三個數(shù)據(jù)里面排序,那就需要兩兩比較,于是就是需要比較3次。A 與B ,B與C,A與C?,F(xiàn)在假設A
好,此時另一個誤區(qū)可能就要出現(xiàn)了。因為flag可能為0也可能為1,那么你得到了三個flag,一共有多少種情況呢?可能有人不假思索地回答8種,因為3bit數(shù)據(jù),2^3= 8 ,所以就是8 種。其實不是,用概率與統(tǒng)計的知識,三個數(shù)據(jù)的排序應該是有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ù)字電路示意圖,(mux的三個輸入端省略了datx_reg)
我假設FPGA內部按照上圖所示的方式進行布局布線,那么最長數(shù)據(jù)路徑應該是dat2_reg→comp_12 → mux3. (或者說是dat2_reg→ comp_23 → mux1)這條路徑也就被稱之為最長路徑或者關鍵路徑。時序分析工具干的事情就是,分析這條最長路徑(當然其他路徑也分析)上的時序是否滿足條件。
單獨把這條路徑摳出來,它就是這樣子的。于是,STA靜態(tài)時序分析的模型就出來了,計算reg到reg之間的延遲,兩個reg之間,經(jīng)歷了一個比較器和一個多路選擇器這兩個組合邏輯。
如果上述的路徑因為走線(linelatency)延遲,或者是因為邏輯延遲(logiclatency)過大導致了時序違例,那么我們就應該在兩個組合邏輯之間插入reg。從電路上,應該如下圖所示。
那么從代碼的角度,應該這樣修改,就可以達到上圖的效果:
好了,有了這個參考模板,再去看其他的中值濾波代碼,你就知道要從哪里去優(yōu)化了。
為了讓大家更好的理解時序,我在網(wǎng)上找了兩個用相同的算法思路設計的開源的代碼。看他們的設計方法
三方代碼 1
三方代碼 2
可以看到數(shù)據(jù)比較的時候,邏輯明顯有冗余,EDA工具不一定能自動優(yōu)化。
然后我將兩個三方的代碼,以及我自己的代碼放入同一工程中進行編譯,故意加大時鐘頻率,讓它們出現(xiàn)時序違例,從而找出關鍵路徑。
三方的兩個模塊我例化成 median_filter_3x3 ,和 medfilter3by3 ,用vivado2022.1進行編譯。得到時序違例報告
再進一步分析關聯(lián)路徑1,得到了如下圖所示的路徑示意圖
可以看到在兩個 reg之間有4個邏輯塊,然后再去代碼中找到相應的位置。然后再追究到代碼內部。
可以看到,代碼中多次出現(xiàn)重復性的數(shù)據(jù)比較,這都是數(shù)據(jù)優(yōu)化的方向。具體的位置就是 33-37行,最后vivado推測出第37行,需要經(jīng)過4級組合邏輯才能將dat3 賦值給 mid_dat 。
審核編輯:劉清
-
FPGA
+關注
關注
1630文章
21801瀏覽量
606354 -
濾波器
+關注
關注
161文章
7870瀏覽量
179048 -
比較器
+關注
關注
14文章
1659瀏覽量
107456 -
HDL
+關注
關注
8文章
328瀏覽量
47479 -
PLL電路
+關注
關注
0文章
92瀏覽量
6483
原文標題:基于FPGA的 ISP代碼精講1 —— 如何寫出時序最優(yōu)的HDL代碼
文章出處:【微信號:gh_99a29eb83412,微信公眾號:FPGA攻城獅之家】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論