您的位置 首页 kreess

Vdma_Hdmi_Out圖像讀取顯示

實驗簡介:ZYNQ芯片內包含一個豐富特性的基於雙核ARM Cortex-A9的處理子系統(Processing System,PS)和Xilinx 28nm可編程邏輯(Pr

實驗簡介:

ZYNQ芯片內包含一個豐富特性的基於雙核ARM Cortex-A9的處理子系統(Processing System,PS)和Xilinx 28nm可編程邏輯(Programmable Logic,PL)。PS除瞭核心外還包括片上存儲器、外部存儲器接口以及大量外設連接接口。

用ZYNQ進行圖像處理具有架構上的優勢,因此對於用ZYNQ做視頻相關的開發人員,一套ZYNQ上的圖像通路是必須的。本文介紹的是是如何 使用 PS 控制 HDMI 顯示內容呢?由於 PS 沒有集成顯示控制系統,還是需要借助 PL 來實現,怎 麼將數據傳輸到 PL 端的顯示部分呢?這裡就需要用到 PS 與 PL 之間的數據交互接口瞭。通常情 況下,都會選擇高性能的 HP 口作為 PS 與 PL 之間的高速數據傳輸。HP 口最大數據寬度是 64 位, 如果頻率跑到 150MHz,帶寬就能達到 9.6Gbps,可以滿足圖像數據的傳輸。

PL 通過 VDMA 送給 HDMI 接口。系統框架如下:

描述:

/*視頻數據的 Framebuffer 在 DDR 中,通過 Processing System 寫入進去;

/*數據通過高帶寬的 AXI4 接口(這裡用到瞭 HP AXI,即 64bits 帶 FIFO 的 AXI),將數據導入到 VDMA 中;

/*VDMA 以 AXI4-Stream 的方式將數據(因為我們使用 RGB888,所以配置為數據位寬 24bits)送給 AXI4-Stream To Video Out;

/*最右邊的 Dynamic Clock Generator 負責生成對應分辨率的像素時鐘 Pixel Clock;

/*像素時鐘 Pixel Clock 同時輸出到 Video Timing Controller、AXI4-Stream To Video Out、rgb2dvi 模塊,作為像素時鐘;

/*Video Timing Controller 在像素時鐘下,同時配合軟件通過 AXI4-Lite 的配置 VTC 協同工作,生成所需要的 VSync、HSync、VBank、HBank、Video Active等信號,輸出到 AXI4-Stream To Video Out;

/*AXI4-Stream To Video Out 一端接收來自 DDR 的 AXI4-Stream 的視頻數據,另一端在像素時鐘 Pixel Clock 下進行 RGB[23:0] 的輸出;

/*rgb2dvi 模塊將 RGB[23:0] 數據轉換成為 HDMI 的 TMDS 差分信號,進行輸出到顯示設備;

Vivado工程建立

1新建一個名為“vdma_hdmi_out”工程。打開 ZYNQ 配置,由於要從 DDR 中讀 出數據,我們采用高性能的 HP 口進行 PS 與 PL 之間的數據交互。打開 HP0 接口

2配置 I2C 的 EMIO。使能 I2C0,並且選擇 EMIO,這樣可以把 I2C 連接到 PL 端(接到 HDMI 上的 IO 是 PL 的,所以這裡用 EMIO),用於連接 HDMI DDC

3配置時鐘,FCLK_CLK0 配置為 100Mhz,FCLK_CLK1 配置為 142Mhz,這個時鐘用於 FCLK_CLK1 就用於視頻流數據時鐘(VDMA 讀 取數據)。這是由於 1080p 60 幀的頻率為 148.5MHz,但包含同步和消隱時間,而 VDMA 傳 輸的都是有效數據,因此設置為 142MHz 、150 MHz等均可以滿足要求,這裡我們用142 MHz

4配置中斷,使能 IRQ_F2P,接收 PL 端的中斷

5配置vdma。添加 VDMA IP (video direct memory access視頻寄存器直接訪問,存取)。配置 VDMA 基本參數,兩個接口:Memory Map 接口,采用 AXI4 接口,與 ZYNQ HP 口進行數據交互,讀取 PS 端 DDR 中的圖像數據。ZYNQ HP 接口為 64 位 接口,在這裡我們也設置成 64 位接口,當然也可以設置大一些,經過交叉互聯模塊可以進 行數據寬度自動轉換。另外一個接口就是 Stream 接口,也就是 AXI4 stream 流接口,在這 裡主要是用來傳輸圖像數據到HDMI接口,由於RGB數據是24位的,因此這裡的Stream Data Width 也設置成 24。Frame Buffers 為幀緩存數,可以儲存多幀圖像,本實驗中隻使能 1 幀 圖像緩存。Line Buffer Depth 類似於 fifo 緩存,以 Stream Data Width 為單位,設置大些,可 以緩存的數據越多。

配置 VDMA 高級參數(advanced),在這裡使能 Allow Unaligned Transfers,如果不使能,在軟件中就要 對數據按照 Memory Map Data Width 對齊,比如我們設置的是 64,也就是要 64 位對齊。但這裡使能瞭,就可以進行不對齊的數據傳輸。GenLock 用於避免讀和寫通道同時訪問同 一個 frame,而使圖像顯示不正常。由於我們隻有一個讀通道,設置它的意義並不是很大, 需要與寫通道配置才有用處。

6添加視頻時序控制器(VCT),此模塊主要是用來產生圖像的時序。(詳細描述)另一文檔

配置視頻時序控制器參數(簡稱 VTC),Enable Generation 是產生輸出時序的使能,選擇之 後會出現 vtiming_out 總線信號。Enable Detetion 是用於檢測輸入時序信號的使能,如果使 能,會出現 vtiming_in 總線,由於本實驗為圖像輸出,因此不使能。

7添加 AXI 流轉視頻輸出控制器

配置 AXI 流轉視頻輸出控制器參數,Clock Mode 選擇 Independent,指的是 AXI4-Stream 和 Video 的時鐘是獨立的,異步的,而 common 是同步的。在本實驗中兩者是異步的。Timing Mode 的 Slave mode 是指 VTC 是時序的 Slave,由 Video Out 模塊通過 clock enable 控制時序 的輸出。Master Mode 指 VTC 是時序的 master,不由 Video Out 控制。

8添加自定義 IP

視頻有很多分辨率,各種分辨的時鐘頻率不相同,需要使用一個動態時鐘控制器.

添加 IP 倉庫,tepo文件中有第三方給出的ip

9添加動態時鐘控制器.(dynamic clock generator)

這個模塊主要功能是根據不同的分辨率配置出不同的時鐘輸出,本 質上是調用瞭鎖相環,但要註意的是,此模塊的參考時鐘必須設置為 100MHz,這就是將 FCLK0 配置為 100M 的原因

10添加 HDMI 編碼器,用於將 RGB 數據轉換為 TMDS 信號。

連接可能無法連自動連接的信號線(時鐘or復位),運用逆向思維。

最終輸出是rgb2dvi,分辨率時鐘和編碼器的時鐘需要動態時鐘模塊輸出的時鐘給;(包括復位)

動態時鐘模塊輸出的時鐘clk——>rgb2dvi+axis流2video模塊時鐘+VTC

動態時鐘模塊輸出的時鐘clk_5x——>rgb2dic串行輸入時鐘

有些接口做過相同的處理,需要連接在一塊

Rgb的輸入圖像數據需要流轉視頻模塊給

Vdma的時鐘需要(PS端)處理子系統給FCLK1 142mhz是vdma用來讀取數據的

11連接中斷信號,需要先添加一個 Concat IP,用於中斷信號連接

12其餘的使用 Vivado 自動連接功能,完成剩下的線連接,選的所有剩餘信號線

13導出 IIC_0 端口,TDMS和OEN端口,並可以修改端口名稱

14沒有問題後,開始創建wrapper包裝

Sources——右鍵design——選擇create HDL wrapper——右鍵design——選擇Generate output produce

15進行管腳約束

Open schematic——Windows——I/O port,進行管腳約束,save自動生成.XDC(限於引腳較少的工程)

否則建議編寫

set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[0]}]

set_property PACKAGE_PIN V20 [get_ports {TMDS_data_p[0]}]

16沒有問題後,生成bit file

17編譯完成後,打開sdk編寫軟件工程進行燒錄 file->export hardware->include bitstream->okfile->luanch SDK

18Run As 設置後,進行燒錄

結果顯示

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部