「精品博文」FPGA 時序描述語言

Medium 賽靈思 腳本語言 圖像處理 電子技術應用 2017-05-20

先明確一下這裡所指的“時序”,代表一組信號的邏輯關係,而不是指延時 steptime holdtime這些時序。

想要了解為什麼會有這篇文章,請參考《FPGA何去何從》系列,和《FPGA需要怎樣的HLS》,這裡只關注TDL的實現和帶來效果。

「精品博文」FPGA 時序描述語言

上圖為不同實現的簡單對比,我現在的狀態處於圖中X位置,說明現在我大量採用interface的設計,開發效率和verilog還處於同一個量級(這和我一直在攢的interface ip數量有關係)。本質上TDL不是新的東西,完全是建立在interface上面的,這個和ARM SOC 建立在AXI4上是一樣的。沒有sv 的interface就不會有TDL,由interface到TDL又是自然而然的事情,TDL的語法幾乎是建立在特定總線sv模塊上面的。現在我已經攢了足夠多的AXI 模塊(數量應該是xilinx axi ip的4倍左右),有些模塊只是幾行代碼,但是對TDL是很有用的。

感覺過得很快,從我開始大量使用interface做設計(寫《FPGA何去何從的時候》)到現在不過半年的時間,我已經開始構建TDL的實現環境了,估計今年就可以完成。

TDL的核心就是自動例化sv 的interface和相關模塊,它最終還是要生成一個sv文件的。當FPGA設計裡面,對幾個特定總線(AXI,AVALON或其他)大量使用,和大量複用使用總線的模塊時,用腳本去自動編寫代碼效率提升是十分大的。而這裡涉及到一個問題,我們所面臨的設計是否都可以只使用特定interface(如axi)進行設計?,我的回答是可以的,不僅可以,而且設計就應該只走標準總線。想想FPGA SOC 也只是採用一種總線。

《How we get to now》講得挺有道理,時間點就是剛剛好,modelsim直到最新版的(10.5,去年剛出的,10.4版都不行)才有效支持sv的 interface語法參數層級引用,vivado也是最近兩個版本對sv的綜合才勉強夠用,雖然需要優化的地方很多。所以即使在一年前,想在FPGA裡面大量使用interface互聯設計,肯定不如意,你要面對一堆軟件 BUG。《How we get to now》也說應該不止我一個人想到TDL這個點子。

-----------------------------------------------------------------------------------------------------------------------------------------

設計本來應該針對時序的,而且是面向對象的,可持續集成,容易拓展,測試,修改的。

上面這條是寫到page的,下面這條才是

用最少的代碼,完成最多的功能

好了,開始正文,我們來重新構建一個硬件設計生態,時序描述語言。所用的時序都是類,clock,video,axi,avalon等

從最基本的說起,最簡單的時序,時鐘clock,時鐘對象的屬性為週期,那麼我們可以有這樣的語法(我借鑑Ruby)。

clock_obj = Clock.new(freq:"100M")

這就是最簡單的定義,那麼下面就是對象的方法,Clock類都有一個分頻的方法

div2_clock = clock_obj.div(2)

現在看雖然和傳統的HDL差別很大,但是並不能看出怎麼提升生產力。不急,來講個複雜的,Video類。

v0 = Video.new(1080) #定義一個1080P RGB的時序 v1 = Video.new(1080) #定義另一個1080P RGB的時序

我們把圖像處理的模塊都看成對象的方法,低通 高通濾波,邊緣銳化,中值濾波。

v_lpf = v0.LPF #圖像0做低通濾波,參數用默認值 v_hpf= v1.HPF #圖像1做高通濾波,參數用默認值

如果,類中沒有我們想要的方法呢,比如Video類中並沒有我們想要的中值濾波,我們可以自己定義一個

def Video.medium_filter # 只要已經有了medium filter的hdl文件,和port定義滿足Video要求 end

然後就可以這樣用

v0_mf = v_lpf.medium_filter v1_mf = v_hpf.medium_filter

最後做alpha 35%疊加輸出

v_out = v0_mf.alpha(v1_mf,0.35)

上面的時序對象其實都是中間變量,完全可以把整個功能壓縮成一句

v_out = Video.new(1080) .LPF.medium_filter.alpha(Video.new(1080) .LPF.medium_filter,0.35)

就這樣兩路1080視頻濾波後疊加的代碼就只是上面一行。可以看到特意"強化"了信號時序(像sv 的interface),"弱化"了模塊,傳統設計“關聯組信號時序”只是verilig幾個相關reg,sv的interface,Qsys粗細不一的連線,現在變成實實在在的類對象,而且有自己特定的方法,這些方法就是對應了module,卻不像module 例化那麼麻煩,沒有port inout名稱,只保留核心功能。

------------------------------------------------------------------------------------------------------------------------

為了跟進一步深入說明,我們假定做一個實實在在的簡單工程,4路1080P拼接成4K,看懂可能需要一些 axi 知識。

and,再假定我們還有下面這些基礎模塊(這些模塊一些對應原廠真實IP)

DDR3 IP AXI4接口

video_to_AXI_STREAM

AXI_STREAM_to_video

AXI_STREAM_to_AXI4_WR #這個xilinx沒有,把axi stream按自己的定義轉成axi4,本質上就是吧addr + len 附加到 stream上

AXI4_RD_to_AXI_STREAM #這個只是簡單的剔除掉除了 stream的其他信號

AXI4_packet_fifo

AXI4_burst_partition # 這個xilinx好像沒有,burst切分成小塊

AXI4_datawidth_convert #數據位寬轉換

下面就是TDL CODE

wr_origin_1080P[3:0] = Video.new[3:0] #直接例化4個1080P原始時序 wr_orgin_axis[3:0] = wr_origin_1080P[3:0].video_to_AXI_STREAM # video 流轉成 axi stream 流 wr_orgin_axi4[0] = wr_orgin_axis[0].AXI_STREAM_to_AXI4_WR(addr:0) # 寫到 0地址 wr_orgin_axi4[1] = wr_orgin_axis[1].AXI_STREAM_to_AXI4_WR(addr:100) # 寫到 100地址 wr_orgin_axi4[2] = wr_orgin_axis[2].AXI_STREAM_to_AXI4_WR(addr:200) # 寫到 200地址 wr_orgin_axi4[3] = wr_orgin_axis[3].AXI_STREAM_to_AXI4_WR(addr:300) # 寫到 300地址 wr_par_axi4[3:0] = wr_orgin_axi4[3:0].AXI4_datawidth_convert( 256 ) # 轉成256位寬的總線 wr_pkt_axi4[3:0] = wr_par_axi4[3:0].AXI4_packet_fifo(4) # fifo 深度4,表示可以存4 packet,ddr多路讀寫仲裁必須要有fifo存數據 wr_pkt_axi4[3:0].DDR3_IP_AXI4 # 直接調用ddr3 ip 方法,完全把仲裁 interconnect隱藏掉了 rd_pkt_axi4[3:0] = AXI4.new(4)[3:0] #直接例化4個axi4 接口 DDR3_IP_AXI4(rd_pkt_axi4[3:0] , [0,100,200,300]) # 從 DDR3 IP 讀出axi4 rd_axi_stream[3:0] = rd_pkt_axi4[3:0].AXI4_RD_to_AXI_STREAM # axi4 轉成 axi stream rd_video_1080p[3:0] = rd_axi_stream[3:0].AXI_STREAM_to_video # axi stream 轉成 video K4_sync(rd_video_1080p[3:0]) #4K分辨率 行場時序生成控制

上面功能基本已經寫完....

未完待續

先提一點,interface 對於verilog,會有3-5倍的效率提升,TDL對於sv interface 會有10倍左右的效率提升,那麼TDL對於傳統的verilog會有30-50倍的效率。

什麼概念呢? A7 200T的期間,1000行代碼,就能撐滿資源。

我很少聲明版權,但是這篇極其重要,必需加版權聲明

版權聲明:

本文由博主“吳明”發佈。歡迎轉載,但不得擅自更改博文內容,也不得用於任何盈利目的。轉載時不得刪除作者簡介和版權聲明。如有盜用而不說明出處引起的版權糾紛,由盜用者自負。

「精品博文」FPGA 時序描述語言

相關推薦

推薦中...