本原創教程由芯驛電子科技(上海)有限公司(ALINX)創做,版權歸本公司全部,如需轉載,需受權並註明出處。node
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG異步
實驗Vivado工程爲「hdmi_char」。工具
在HDMI輸出實驗中講解了HDMI顯示原理和顯示方式,本實驗介紹如何使用FPGA實現字符顯示,經過這個實驗更加深刻的瞭解HDMI的顯示方式。字體
實驗經過字符轉換工具將字符轉換爲16進制coe文件存放到單端口的ROM IP 核中,再從ROM 中把轉換後的數據讀取出來顯示到HDMI上。設計
字符顯示例程是在HDMI顯示的基礎上增長了一個osd_display的模塊,「osd_display」模塊是用來讀取存儲在Rom ip核裏轉換後的字符信息,並在指定區域顯示。程序框圖以下圖所示:3d
2.1 在「timing_gen_xy」模塊是根據HDMI時序標準定義了「x_cnt」和「y_cnt」兩個計數器並由這兩個計數器產生了HDMI顯示的「x」座標和「y」座標。程序中用「vs_edge」和「de_falling」分別表示場同步開始信號和數據有效結束信號。其原理以下圖所示:orm
信號名稱 | 方向 | 說明 |
rst_n | in | 異步復位輸入,低復位 |
clk | in | 外部時鐘輸入 |
i_hs | in | 行同步信號 |
i_vs | in | 場同步信號 |
i_de | in | 數據有效信號 |
i_data | in | color_bar數據 |
o_hs | out | 輸出行同步信號 |
o_vs | out | 輸出場同步信號 |
o_de | out | 輸出數據有效信號 |
o_data | out | 輸出數據 |
x | out | 生成X座標 |
y | out | 生成Y座標 |
timing_gen_xy模塊端口blog
2.2 下面介紹如何存儲文字信息的ROMIP,首先須要生成可以被XILINX FPGA識別的.coe文件。教程
首先在工程文件夾下找到「FPGA字模提取」工具。接口
雙擊.exe文件打開工具
在提取工具的「字符輸入」框中輸入須要顯示的字符,字體和字符高度能夠自定義選擇。設置完成後點擊「轉換」按鈕,在界面左下角能夠看到轉換後的字符點陣大小,點陣的寬和高在程序中是須要用到
點陣的寬和高這裏位144x32,須要跟osd_display程序中定義的一致:
點擊「保存」按鈕,將文件保存到本例程源文件目錄下,須要注意的是在保存類型下應該選擇Xilinx(*.coe),點擊「保存」按鈕。
找到生成的.coe文件打開後能夠看到以下:
調用單端口Rom IP核的過程在前面ROM的使用中已經介紹過,設置爲Single Port ROM
在PortA Options欄中設置以下:
按以下圖添加osd.coe文件(找到前面生成的coe文件),完成後點擊「OK」按鈕:
2.3 osd_display模塊包含timing_gen_xy 模塊和osd_rom模塊。osd_rom裏存儲的字符數據,若是數據爲1,OSD的區域顯示ROM中的前景紅色(顯示ALINX芯驛),若是數據是0,OSD的區域顯示數據爲背景色(彩條)。
設置區域有效信號,也就是字符顯示在此區域中,起始座標設置成(9,9),區域大小能夠根據字符生成工具設置的區域設置。
在ROM的讀地址部分可能不少人不理解,爲何是[15:3],也就是八個時鐘週期纔讀出一個數據,這是由於字符的一個點只表示1bit,而ROM的存儲數據寬度是8位,所以須要八個週期取出一個數據,並比較每一個bit位的值,將字符一個點轉換成圖像上的一個像素。
信號名稱 | 方向 | 說明 |
rst_n | in | 異步復位輸入,低復位 |
pclk | in | 外部時鐘輸入 |
i_hs | in | 行同步信號 |
i_vs | in | 場同步信號 |
i_de | in | 數據有效信號 |
i_data | in | color_bar數據 |
o_hs | out | 輸出行同步信號 |
o_vs | out | 輸出場同步信號 |
o_de | out | 輸出數據有效信號 |
o_data | out | 輸出數據 |
osd_display模塊端口
鏈接好開發板和顯示器,鏈接方式參考《HDMI輸出實驗》教程,須要注意,開發板的各個鏈接器不要帶電熱插拔,下載好實驗程序,能夠看到顯示器顯示以彩條爲背景的字符。開發板做爲HDMI輸出設備,只能經過HDMI顯示設備來顯示,不要試圖經過筆記本電腦的HDMI接口來顯示,由於筆記本也是輸出設備。
默認字符顯示的位置在座標爲(9,9),另外用戶能夠修改下面的pos_y和pos_x的判斷條件將字符顯示在顯示屏的任意位置: