PYNQ-Z2 HDMI用法- 4:視頻處理無縫開關(guān)
這篇文章增加了Sobel過濾器的開關(guān),確保屏幕保持穩(wěn)定,沒有停電。
正如標(biāo)題所述,這一次我們的目標(biāo)是在我們之前建立的設(shè)計(jì)基礎(chǔ)上實(shí)現(xiàn)無縫的視頻處理過渡。
這篇文章還需要先閱讀前面的部分,以便更容易實(shí)現(xiàn)。
Vivado
塊設(shè)計(jì)主要是基于前面的設(shè)計(jì)。由于早期的視頻測試模式發(fā)生器(TPG)僅用作旁路,因此我們可以用axis4流廣播器替換它。
AXI4-流廣播器是一個(gè)IP核心,它將輸入AXI4數(shù)據(jù)流復(fù)制到多個(gè)輸出通道,從而允許同時(shí)分發(fā)數(shù)據(jù)。這使得并行處理應(yīng)用程序,如視頻處理和通信系統(tǒng)。
但是,請注意,當(dāng)從axi4流廣播器輸出時(shí),它必須連接到axi4流數(shù)據(jù)FIFO;否則,不輸出任何數(shù)據(jù)。這主要是因?yàn)楹罄m(xù)IP需要等待所有接口斷言tvalid,而S00接口不是這種情況。欲了解更多詳細(xì)信息,請參閱賽靈思的官方解釋。
對于axis4流數(shù)據(jù)FIFO復(fù)位,我們選擇在Vitis中使用GPIO來自定義何時(shí)復(fù)位。
因此,我們現(xiàn)在有兩個(gè)相同的HDMI輸入源。一個(gè)輸入通過索貝爾濾波器處理,而另一個(gè)作為旁路直接通過。這些信號中的每一個(gè)都由它自己的VDMA進(jìn)行緩沖和同步處理。
從各個(gè)vdma的輸出,我們可以連接一個(gè)AXI4-stream開關(guān)或一個(gè)AXI4-stream合并器來實(shí)現(xiàn)源切換。使用axis4 -stream開關(guān)將完全切換到不同的源,這將在轉(zhuǎn)換期間導(dǎo)致短暫的中斷。相比之下,AXI4-stream合并器通過tuser信號對齊不同的信號,然后將它們合并(例如,將24位tdata和24位tdata合并為48位tdata)。由于信號被組合成一個(gè)單一的源——選擇tdata[47:24]或tdata[23:0]作為輸出——轉(zhuǎn)換發(fā)生時(shí)不會停電。
下面是AXI4-Stream接口中的一些關(guān)鍵信號:
?TDATA:攜帶主數(shù)據(jù)負(fù)載。
?TVALID:表示TDATA上的數(shù)據(jù)是有效的,可以傳輸。
?trready:表示下游組件準(zhǔn)備好接收數(shù)據(jù)。
?TKEEP:標(biāo)記TDATA的哪些字節(jié)通道是有效的,對于不是全寬的數(shù)據(jù)流很有用。
?TLAST:表示數(shù)據(jù)包或幀的最后一個(gè)數(shù)據(jù)字。
?TUSER:提供額外的用戶定義邊帶信息,通常用于對齊或元數(shù)據(jù)目的。
因此,您可以看到這些信號之間的關(guān)系,如下面的波形所示。
如前所述,由于確認(rèn)的輸出是tdata[47:24]或tdata[23:0],我們可以編寫一個(gè)簡單的RTL代碼IP來確定使用哪一個(gè)。
首先,定義輸入和輸出。
?為了對齊來自不同源的tuser信號,AXI4-Stream Combiner將它們組合成一個(gè)2位信號。只有當(dāng)兩個(gè)位都設(shè)置為1時(shí),我們才能可靠地確定輸出數(shù)據(jù)。
?開關(guān)信號由PYNQ-Z2板上的物理開關(guān)控制,通過GPIO實(shí)現(xiàn)。
因此,只有當(dāng)開關(guān)模式被確認(rèn)并且來自不同源的tuser信號被對齊時(shí),才確定當(dāng)前模式。
編寫的RTL代碼可以直接拖到塊設(shè)計(jì)中以形成IP。
最后,連接AXI4-Stream子集轉(zhuǎn)換器,形成一個(gè)適當(dāng)?shù)腁XI4-Stream,然后連接AXI4-Stream Data FIFO,以確保正確輸出tvalid、tuser和tready等信號。
對于PYNQ-Z2上的物理開關(guān)與通過GPIO控制信號源的關(guān)系,如下圖所示,首先從GPIO通道1讀取物理開關(guān)的值。然后,該值通過GPIO通道2輸出到自定義IP。
將物理交換機(jī)引腳配置添加到XDC后,整個(gè)模塊設(shè)計(jì)就完成了。
Vitis
要構(gòu)建新的平臺和應(yīng)用程序,或在現(xiàn)有平臺上更新XSA,您可以參考前面的帖子并按照以下方式更新代碼:
需要注意的一點(diǎn)是,你必須在for循環(huán)中包含以下兩行;否則,只輸出第一幀。
結(jié)果
本文編譯自hackster.io