最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

3.11VGA顯示圖片--明德?lián)P科教(1)(mdy-edu.com)

2023-01-10 07:21 作者:明德?lián)P易老師  | 我要投稿

本文的文檔編號:001700000023

沒有對應(yīng)的視頻

1、至簡原理與應(yīng)用配套的案例和PPT講解
2、本案例要實現(xiàn)的效果是通過VGA,以640*480的分辨率在顯示器中心顯示120*55的圖片圖片數(shù)據(jù)存在ROM IP核內(nèi)。步驟性教學(xué);

3、_Altera和Xilinx入門學(xué)習(xí)文檔

第十一章 VGA顯示圖片第1節(jié) 項目背景


1.1?IP核概述

IP核(Intellectual Property core)指的是知識產(chǎn)權(quán)核或知識產(chǎn)權(quán)模塊,其是具有特定電路功能的硬件描述語言程序,在EDA技術(shù)開發(fā)中具有十分重要的地位。美國著名的Dataquest咨詢公司將半導(dǎo)體產(chǎn)業(yè)的IP定義為“用于ASIC或FPGA中的預(yù)先設(shè)計好的電路功能模塊”。

在數(shù)字電路中IP(知識產(chǎn)權(quán))核非常常用,其將FIR濾波器、SDRAM控制器、PCI接口等比較復(fù)雜的功能模塊設(shè)計成可修改參數(shù)的模塊,這些模塊會像應(yīng)用程序一樣公開給設(shè)計者們使用。在進(jìn)行復(fù)雜的工程中如果需要這些技術(shù),設(shè)計者就可以調(diào)用對應(yīng)IP核后補充工程所需參數(shù),就可將其運用到設(shè)計中。隨著CPLD/FPGA的規(guī)模越來越大,設(shè)計也變得越來越復(fù)雜,設(shè)計者的主要任務(wù)則是在規(guī)定的時間周期內(nèi)完成復(fù)雜的設(shè)計。而IP核的調(diào)用可以避免重復(fù)勞動,從而大大減輕工程師的負(fù)擔(dān),因此使用IP核成為了一大發(fā)展趨勢,與此同時,IP核的重用大大縮短了產(chǎn)品上市時間。

利用IP核設(shè)計的電子系統(tǒng)具有引用方便的特點且很易于修改基本元件的功能。一般來說,具有復(fù)雜功能和商業(yè)價值的IP核具有知識產(chǎn)權(quán),盡管目前IP核的市場活動還不規(guī)范,但是仍有許多集成電路設(shè)計公司從事IP核的設(shè)計、開發(fā)和營銷工作。

IP核具有三種不同的存在形式:HDL語言形式,網(wǎng)表形式、版圖形式。IP內(nèi)核可以在不同的硬件描述級實現(xiàn),由此產(chǎn)生了三類IP內(nèi)核:軟核、固核和硬核。這種分類主要依據(jù)產(chǎn)品交付的方式,而這三種IP內(nèi)核實現(xiàn)方法也各具特色。

軟核是用VHDL等硬件描述語言描述的功能塊,但其并不涉及用哪些具體電路元件來實現(xiàn)這些功能。軟IP通常是以硬件描述語言HDL源文件的形式出現(xiàn),其應(yīng)用開發(fā)過程與普通HDL的設(shè)計十分相似,只是所需的開發(fā)硬軟件環(huán)境比較昂貴。軟IP的設(shè)計周期短,設(shè)計投入少,且不涉及物理實現(xiàn),因此為后續(xù)的設(shè)計留有較大的發(fā)揮空間,同時也增大了IP的靈活性和適應(yīng)性。其主要缺點是軟IP在一定程度上使后續(xù)工序無法適應(yīng)整體設(shè)計,從而需要一定程度的修正,在性能上也不可能獲得全面的優(yōu)化。軟核是以源代碼的形式提供,盡管源代碼可以采用加密方法,但其知識產(chǎn)權(quán)保護問題依然不容忽視。

硬核提供設(shè)計階段最終階段產(chǎn)品:掩膜。這種硬核以經(jīng)過完全的布局布線的網(wǎng)表形式提供,既具有可預(yù)見性,同時還可以針對特定工藝或購買商進(jìn)行功耗和尺寸上的優(yōu)化。盡管由于缺乏靈活性而導(dǎo)致硬核可移植性差,但由于其無須提供寄存器轉(zhuǎn)移級(RTL)文件,因而更易于實現(xiàn)IP保護。

固核則是軟核和硬核的折中。目前應(yīng)用于FPGA的IP內(nèi)核大多數(shù)均為軟核,其有助于用戶調(diào)節(jié)參數(shù)并增強可復(fù)用性。軟核通常以加密形式提供,這樣一來用戶無法獲取實際的?RTL,但其布局和布線十分靈活。在這些加密的軟核中,如果對內(nèi)核進(jìn)行了參數(shù)化,那么通過頭文件或圖形用戶接口(GUI)用戶可以方便地進(jìn)行參數(shù)操作。而對于那些對時序要求嚴(yán)格的內(nèi)核(如PCI接口內(nèi)核),可預(yù)布線特定信號或分配特定的布線資源從而滿足其時序要求,這一部分的內(nèi)核就可歸類為固核。由于內(nèi)核是預(yù)先設(shè)計的代碼模塊,其建立(setup)、保持時間和握手信號都可能是固定的,因此其它電路的設(shè)計時都必須考慮如何與該內(nèi)核正確地進(jìn)行接口。如果內(nèi)核具有固定布局或部分固定的布局,那么這還可能影響其它電路的布局。


1.2?ROM IP

目前現(xiàn)有的大多數(shù)FPGA都有內(nèi)嵌塊RAM(Block RAM),可以將其靈活地配置成單端口RAM(DPRAM,Single Port RAM)、雙端口RAM(DPRAM,Double Ports RAM)、偽雙端口RAM(Pseudo DPRAM)、CAM(Content Addressable Memory)和FIFO等常用的存儲結(jié)構(gòu)。其實在FPGA中并沒有專用的ROM硬件資源,實現(xiàn)ROM的思路是對RAM賦予初值后保持該初值。

Altera?的器件內(nèi)部提供了各種存儲器模塊(RAM、ROM?或雙口?RAM),可以在設(shè)計中使用MegaWizard Plug-In Manager,執(zhí)行“Tools”后利用“MegaWizard Plug-In Manager”菜單命令來創(chuàng)建所需要的存儲器模塊。此外,也可以使用?Altera?提供的宏功能模塊?LPM_ROM?來創(chuàng)建存儲器模塊。每個?ROM?模塊有clock(時鐘)、address(地址)這兩個輸入信號和一個?q(值)輸出信號。

在每個時鐘上升沿,ROM讀出地址信號指定存儲單元中的信號值并將其輸出。ROM?內(nèi)的值通過加載?MIF?(Memory Initialization File,存儲器初始化文件)來實現(xiàn)。

當(dāng)設(shè)計中使用了器件內(nèi)部的存儲器模塊時,需要對存儲器模塊進(jìn)行初始化。在?Quartus?Ⅱ中,存儲器初始化文件可以使用兩種格式:Intel Hex?格式(.hex)或?Altera?存儲器初始化格式(.mif)。其中mif文件是?Altera?存儲器類器件初始化的專用文件格式,文件內(nèi)容為地址與值的對應(yīng)表,該表規(guī)定了存儲器單元的初始值。

如果?ROM?要存儲的內(nèi)容比較少或者很有規(guī)律,這種情況下可以執(zhí)行【File】|【New…】菜單命令,創(chuàng)建mif文件并編輯其內(nèi)容。如果已經(jīng)存在bmp格式的圖片,則可以使用本書提供的BmpToMif軟件,利用現(xiàn)有的bmp格式圖片生成mif文件。該軟件使用方法非常簡單,但是需要注意要適當(dāng)調(diào)整原圖片的大小,這一操作可以通過Windows?自帶的畫圖程序、Photoshop?等各種圖形編輯軟件修改實現(xiàn)。BmpToMif軟件可以將?bmp?圖片轉(zhuǎn)為mif文件,即將黑白圖片轉(zhuǎn)換為單色mif文件,將彩色圖片轉(zhuǎn)換為三色mif文件,也可以將二進(jìn)制文件轉(zhuǎn)為mif文件,如將中英文點陣字庫轉(zhuǎn)換為mif文件。


1.3?圖片轉(zhuǎn)成初始化文件

上文中提到過:在創(chuàng)建mif文件時,若已經(jīng)存在bmp格式圖片則可以使用軟件工具BmpToMif來將bmp的圖片轉(zhuǎn)換為mif文件。下面介紹其具體操作,BmpToMif的軟件界面如下圖所示。

圖3.11-1BMP2MIF軟件界面


點擊打開圖片后選擇一幅bmp格式的圖片。這里需要注意的是,由于受開發(fā)板上FPGA資源的限制,圖片的大小不能超過320*240。如果圖片大小不是320*240,建議使用“畫圖”或者“photoshop”等軟件將圖片大小更改為320*240。


將bmp圖片轉(zhuǎn)換為mif文件的過程如下:


1.?點擊“圖像”選項卡;

2.?點擊“打開圖片”后選擇一幅圖片,本案例中選擇一幅大小為320*240、格式為bmp的圖片,文件名為“mdy_logo.bmp”;

3.?在“顏色類型”中根據(jù)需要選擇“黑白”或“彩色”,本案例中將選用黑白模式;

4.?若為黑白圖,在“黑白選項”中選擇“黑色為1”或“白色為1”,注意如果是黑白圖片,生成ROM要選擇字長為“1”;

5.?若為彩色圖,在“彩色選項”中選擇“單一mif文件”或“三個mif文件”。如果是“單一mif文件”,則生成ROM要選擇字長為3,每個字按紅綠藍(lán)表示各個分量;如果是“三個mif文件”,會生成三個mif文件,每個文件分別對應(yīng)于紅綠藍(lán)分量,生成ROM要選擇字長為“1”;

6.?“顏色界值”用于顏色的界定。若為黑白圖,當(dāng)圖中的顏色紅綠藍(lán)三個分量均小于或等于對應(yīng)界值時轉(zhuǎn)換為黑,否則為白;若為彩色圖,當(dāng)圖中的顏色紅、綠或藍(lán)分量小于等于對應(yīng)界值時該分量轉(zhuǎn)換為0,否則為1;

7.?點擊“預(yù)覽”可以查看轉(zhuǎn)換顏色后的效果;

8.?點擊“生成mif文件”,可以得到所需文件。


本設(shè)計將提供已經(jīng)生成好的mif文件:mdy_logo.mif,可以直接使用。



1.4?生成ROM IP

打開Quartus軟件后首先應(yīng)新建工程,新建工程的方法請看本章的4.1部分,這里需要注意目錄路徑、工程名和頂層模塊名要與本書設(shè)定一致。在“Quartus”界面右邊“IP Catalog”窗口中,輸入“rom”,然后雙擊“ROM:1-PORT”,就會彈出ROM的路徑設(shè)置界面。

圖3.11-2IP Catalog中查找ROM IP核


在文件名設(shè)置頁面中輸入“D:mdy_bookpicture_new_borad om1.v”,選擇“Verilog”類型,此時會生成一個文件名為room1.v,類型為verilog的ROM代碼,點擊“OK”后會跳到ROM IP核的設(shè)置界面。

圖3.11-3設(shè)置ROM IP核文件名界面


按下圖所示進(jìn)行設(shè)置,需要注意,輸出信號q的位寬選擇為1,深度選擇為65536。其它保持為默認(rèn),點擊“Next”。

圖3.11-4ROM IP核設(shè)置界面1


在下圖將“’q’ output port”選項不勾選,其它保持默認(rèn),點擊“Next”。

圖3.11-5ROM IP核設(shè)置界面2


選擇ROM初始化文件的界面如下圖所示,選擇本書提供的文件“D:/mdy_book/picture_new_borad/rom1.mif”后直接點擊Finish,完成ROM文件的設(shè)置并生成ROM的代碼“rom1.v”。

圖3.11-6ROM IP核設(shè)置界面3


約一分鐘左右后在“D:/mdy_book/picture_new_borad/”目錄下就可以看到生成的“rom1.v”文件,如下圖所示。但該代碼的RTL部分不可見,同學(xué)們只能看到其頂層接口,可以看出該模塊只有三個信號,時鐘clock,16位的地址address和1位輸出數(shù)據(jù)q。

圖3.11-7ROM IP核的輸入輸出接口


第2節(jié)?設(shè)計目標(biāo)

學(xué)會生成ROM IP核后來帶領(lǐng)同學(xué)們進(jìn)行新項目的設(shè)計。按照至簡設(shè)計法的思路,在進(jìn)行設(shè)計之前首先應(yīng)明確設(shè)計目標(biāo)。明確了設(shè)計目標(biāo)后,后續(xù)的每一步操作都會圍繞設(shè)計目標(biāo)進(jìn)行展開。如果沒有牢記設(shè)計目標(biāo)就開始動手進(jìn)行實踐操作,最終的作品也只是東拼西湊的產(chǎn)物。這種狀態(tài)下,一旦在設(shè)計過程中出現(xiàn)了問題就需要花費大量的精力進(jìn)行尋找修復(fù)。只有在開始學(xué)習(xí)時就養(yǎng)成良好的設(shè)計習(xí)慣,才能在后續(xù)的職業(yè)生涯中受益。因此建議一定要確定設(shè)計目標(biāo)再進(jìn)行后面部分的學(xué)習(xí)。

前面幾章中已經(jīng)帶領(lǐng)同學(xué)們學(xué)習(xí)了通過VGA顯示顏色和形狀的工程,這一章中在之前設(shè)計的基礎(chǔ)上增強項目的難度,引入一個新的概念。前幾章的設(shè)計中顯示的圖像都是基于FPGA本身可以產(chǎn)生的三基色完成的,本次設(shè)計會在顯示顏色的同時在顯示器上產(chǎn)生一幅圖像。

本設(shè)計需要通過VGA連接線將顯示器和開發(fā)板進(jìn)行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率、刷新頻率為60Hz的VGA時序,使得顯示器屏幕的中央顯示一個至簡設(shè)計法的LOGO,除圖片之外的顯示區(qū)域則顯示為白色。顯示的至簡設(shè)計法LOGO大小為120*60像素。

顯示器一般都具有分辨率自適應(yīng)功能,無須特殊設(shè)置就能識別不同分辨率的圖像。本設(shè)計相應(yīng)參數(shù)參見表3.11-1中的第一行,這里的VGA常用分辨率的對應(yīng)時序參數(shù)并不是本書隨意設(shè)定的,而是國際通用標(biāo)準(zhǔn),每個關(guān)于VGA的設(shè)計工程都需要遵守這一標(biāo)準(zhǔn)。其中,行的單位為“基準(zhǔn)時鐘”,即頻率為25MHz、周期為40ns的時鐘,列的單位則為“行”,請讀者朋友們一定要區(qū)分好。


表3.11 - 1 VGA常用分辨率


本案例中提供了ROM IP核文件:rom1.v。該文件的輸入輸出接口是:


rom1是一個寬度為16位,深度為8192的ROM,該ROM中已經(jīng)保存了至簡設(shè)計法的LOGO圖片,并且與VGA掃描路徑相同,該ROM也是按照從左往右,由上往下的順序保存了LOGO圖像每個像素的值。圖中(y,x)表示的是第y行第x列的像素值。例如:

地址0保存的是第1行第1列的像素值,即(0,0);

地址1保存的是第1行第2列的像素值,即(0,1);

地址2保存的是第1行第3列的像素值,即(0,2);

地址119保存的是第1行第120列的像素值,即(0,119)

地址120保存的是第2行第1列的像素值,即(2,0);

以此類推,地址6599保存的是第55行120列的像素值,即(54,119);

而大于6599的地址,保存的值為0,其數(shù)字沒有意義。

按RGB565的方式保存ROM的每一個像素,即[15:11]表示紅基色,[10:5]表示綠基色,[4:0]表示藍(lán)基色。

綜上可知,該ROM的排列方式如下圖所示:


圖3.11-8ROM存儲圖片的方式



設(shè)計完成后,通過VGA連接線將顯示器和教學(xué)板的VGA接口相連。連接示意圖如下所示:

圖3.11-9教學(xué)板連接示意圖


上板后顯示器展示效果圖如下圖所示,不同的顯示器會有一定的色差,請讀者朋友們以實際情況為主??梢钥吹狡聊恢醒胗幸粋€120*60的至簡設(shè)計法LOGO,其余顯示區(qū)域為白色。想要觀看連接后的演示視頻效果,可以登陸至簡設(shè)計法官網(wǎng)學(xué)習(xí):www.mdy-edu.com/xxxx。

圖3.11-10VGA顯示圖片效果圖


第3節(jié)?設(shè)計實現(xiàn)

確定了設(shè)計目標(biāo)后,本書會逐步分析講解工程的制作步驟。建議初學(xué)者認(rèn)真學(xué)習(xí)每一步,因為這里分享給同學(xué)們的不僅僅是案例,還有在操作過程中的一些設(shè)計理念及原理。當(dāng)然本書也會分享一些至簡設(shè)計法的設(shè)計技巧,最終希望每一位讀者都可以具備獨立設(shè)計工程的能力。當(dāng)然已經(jīng)擁有扎實的功底、只是想要根據(jù)步驟完成項目的讀者朋友們可以跳過此部分,直接進(jìn)入第五節(jié)中的簡略版操作步驟分享。


3.1?頂層接口

新建目錄:D:mdy_bookpicture_new_borad,并在該目錄中,新建一個名為picture_new_borad.v的文件。用GVIM打開后開始編寫代碼,這里再次強調(diào),初學(xué)者一定要按照本書提供的文件路徑以及文件名進(jìn)行設(shè)置,避免后面出現(xiàn)未知錯誤。


首先來確定頂層信號,分析設(shè)計目標(biāo)可知FPGA產(chǎn)生VGA時序,即控制VGA_R4~R0、VGA_G5~G0、VGA_B4~B0、VGA_HSYNC和VGA_VSYNC從而使顯示器顯示圖像。其中,F(xiàn)PGA可根據(jù)時序產(chǎn)生高低電平從而控制VGA_HSYNC和VGA_VSYNC。本設(shè)計中顯示的一部分是FPGA自身可以產(chǎn)生的白色圖像,另一部分的LOGO圖片數(shù)據(jù)需要先轉(zhuǎn)成mif的初始化文件,再利用初始化文件生成ROM IP核,設(shè)計時例化此IP核,控制IP核的地址從而讀取到圖片數(shù)據(jù)。


在本工程設(shè)計中可以定義輸出信號hys表示行同步,定義輸出信號vys表示場同步,定義一個16位的信號lcd_rgb用于RGB輸出,其中l(wèi)cd_rgb[15:11]表示VGA_R4~0、lcd_rgb[10:5]表示VGA_G5~0、lcd_rgb[4:0]表示VGA_B4~0。當(dāng)然,設(shè)計中還需要時鐘信號clk和復(fù)位信號rst_n來進(jìn)行工程控制。


綜上所述,本工程一共需要五個信號,時鐘信號clk,復(fù)位信號rst_n,場同步信號vys、行同步信號hys和RGB輸出信號lcd_rgb。信號與硬件的對應(yīng)關(guān)系如下表所示。


表3.11 –2 信號和管腳關(guān)系


通過以上分析寫出頂層信號代碼。將module的名稱定義為picture_new_borad。已經(jīng)知道該模塊有五個信號:clk、rst_n、lcd_hs、lcd_vs和lcd_rgb。將與外部相連接的輸入/輸出信號列出,從而實現(xiàn)信號與管腳的連接。具體頂層代碼如下:

隨后聲明信號的輸入輸出屬性。這里需要聲明這一信號對于FPGA來說,屬于輸入信號還是輸出信號。如果是輸入信號,則聲明其為input,如果是輸出信號,則聲明其為ouput。在本設(shè)計中,由于clk是外部的晶振輸入給FPGA的,因此在FPGA中clk是輸入信號input;同樣地,rst_n是外部按鍵輸送給FPGA的,在FPGA中同樣為輸入信號input;lcd_hs、lcd_vs和lcd_rgb是FPGA輸出給顯示器的,因此其為輸出信號output,并且其中clk、rst_n、lcd_hs、lcd_vs的值都是0或者1,用一根線表示即可,lcd_rgb位寬為16位。根據(jù)以上分析補充輸入輸出端口定義,其具體代碼如下:

信號設(shè)計

分析設(shè)計目標(biāo)可知,首先需要設(shè)計行同步信號hys,其時序圖表示如下:


圖3.11-11VGA行同步時序


根據(jù)時序圖可以看到,hys就是一個周期性地高低變化的脈沖。根據(jù)設(shè)計目標(biāo)可知圖像分辨率選定為640*480,因此使用下表中的640*480分辨率的相關(guān)參數(shù)。即同步脈沖a的時間是96個基準(zhǔn)時鐘,顯示后沿b的時間是48個基準(zhǔn)時鐘周期,顯示時序c的時間是640個基準(zhǔn)時鐘,顯示前沿的時間是16個基準(zhǔn)時鐘,共計800個基準(zhǔn)時鐘(800=96+48+640+16)。


表3.11 - 1 VGA常用分辨率

這里需要注意,一個基準(zhǔn)時鐘是40ns,而至簡設(shè)計法開發(fā)板的時鐘周期是20ns,因此基于至簡設(shè)計法開發(fā)板的VGA工程設(shè)計中,采用2個時鐘時間代表一個基準(zhǔn)時鐘時間。在圖中補充對應(yīng)的時間信息,帶有時間信息的時序圖如下:


圖3.11-12帶時間信息的VGA行同步時序


根據(jù)至簡設(shè)計法的理論,分析波形圖和設(shè)計目標(biāo)可以得到本設(shè)計的計數(shù)器架構(gòu):本設(shè)計需要使用2個計數(shù)器,其中一個計數(shù)器cnt0用來計數(shù)基準(zhǔn)時間,另一個計數(shù)器cnt1用來計數(shù)hys的行長度。

先來討論用于計數(shù)基準(zhǔn)時間的cnt0。至簡設(shè)計法的計數(shù)器只考慮兩個因素:加1條件和計數(shù)數(shù)量,只要可以確定相應(yīng)邏輯,就能完成計數(shù)器代碼設(shè)計。首先確定計數(shù)器cnt0的加1條件:由于該計數(shù)器在不停地計數(shù),永遠(yuǎn)不停止,因此可以認(rèn)為其加1條件是始終有效的,可寫成:assign add_cnt0==1。

這里可能會有讀者會提出疑問:加1條件的概念是什么?這里以停車位來進(jìn)行比喻,一般情況下對每個停車位置會進(jìn)行對應(yīng)編號,但是如果某個位置上放置了一塊石頭無法作為停車位時,該位置就不能獲得對應(yīng)的編號。反之則可以認(rèn)為停車位編號的加1條件就是:對應(yīng)位置上沒有石頭,其可以繼續(xù)的進(jìn)行編號,即assign add_cnt0 =?“沒有石頭”。因此如果在設(shè)計中計數(shù)器一直沒有阻礙地進(jìn)行計數(shù)工作,就可以認(rèn)為加1條件是一直有效的。

接下來確定計數(shù)器cnt0的計數(shù)數(shù)量,前文分析中可知2個時鐘周期等于1個基準(zhǔn)時鐘,因此計數(shù)器cnt0的計數(shù)數(shù)量是2。

確定好了加1條件和計數(shù)數(shù)量后開始進(jìn)行代碼編寫。相信各位往常都是一行行輸入代碼,但是至簡設(shè)計法有一個小技巧,可以為大家編寫代碼省去不少時間,并且一定程度上降低了代碼的出錯率。至簡設(shè)計法將日常代碼中常用到的固定部分做成了模板,進(jìn)行代碼編程時可以調(diào)用相應(yīng)模板后根據(jù)邏輯輸入對應(yīng)設(shè)計的變量將代碼補充完整。這里就可以用模板編寫計數(shù)器代碼,感受一下這個炫酷的功能。

在命令模式下輸入“:Mdyjsq”,點擊回車,就調(diào)出了對應(yīng)模板,如下圖所示。隨后再將本案例中的變量填到模板里面,就可以得到完整正確的計數(shù)器代碼。


圖3.11-13至簡設(shè)計法調(diào)用計數(shù)器代碼模板


補充完整后得到計數(shù)基準(zhǔn)時間的計數(shù)器cnt0代碼如下所示:

接著討論用于計數(shù)hys長度的計數(shù)器cnt1。根據(jù)設(shè)計目標(biāo)可以知道一行占有800個基準(zhǔn)時鐘,因此其計數(shù)數(shù)量為800。前文設(shè)計中已經(jīng)確定了一個基準(zhǔn)時鐘可以用end_cnt0表示,因此計數(shù)器cnt1的加1條件為“end_cnt0”,可寫成:assign add_cnt1 = end_cnt0。此時繼續(xù)調(diào)用至簡設(shè)計法模板,在命令模式下輸入“:Mdyjsq”后點擊回車,調(diào)出對應(yīng)模板并將“add_cnt1”和“end_cnt1”補充完整,得到該計數(shù)器的代碼如下:


確定了計數(shù)器cnt0和cnt1后hys信號的設(shè)計就有了對齊的對象。從時序圖可以發(fā)現(xiàn),hys有兩個變化點,一個是cnt1數(shù)到96個基準(zhǔn)時鐘時,同步脈沖a結(jié)束,信號由0變1出現(xiàn)一個上升沿;另一個是當(dāng)cnt1數(shù)到800個基準(zhǔn)時鐘時,信號由1變0出現(xiàn)下降沿。下面將其翻譯成代碼,在編輯模式下輸入“Shixu2”,調(diào)用至簡設(shè)計法模板,然后將模板補充完整后得到場同步信號的代碼如下:


接下來討論vys信號的設(shè)計。根據(jù)設(shè)計目標(biāo)可以得到VGA場同步信號的時序圖如下所示:


圖3.11-14VGA場同步時序


可以看出vys就是一個周期性地進(jìn)行高低變化的脈沖。本設(shè)計中圖像分辨率選定為640*480,因此使用表3.10-?1中的640*480分辨率的相應(yīng)參數(shù)。查詢表可知:同步脈沖a的時間是2行,顯示后沿b的時間是33行,顯示時序c的時間是480行,顯示前沿的時間是10行,共計525行。此處需要注意行的單位為“基準(zhǔn)時鐘”,前文設(shè)計中已經(jīng)使用計數(shù)器cnt0表示一個基準(zhǔn)時鐘,cnt1表示一行;場同步信號是的單位是“行”,因此設(shè)計中可以使用cnt1來輔助表示場同步信號,即cnt1計數(shù)結(jié)束則代表一“行”結(jié)束。


在場同步信號中補充時間信息,得到帶有時間信息的時序圖如下所示。

圖3.11-15帶時間信息的VGA場同步時序


分析時序圖可以發(fā)現(xiàn)若要產(chǎn)生這一時序還需要另1個計數(shù)器,可將產(chǎn)生這一時序的計數(shù)器命名為cnt2。前文強調(diào)過vys的單位是行,而該計數(shù)器是用來計數(shù)行的數(shù)量,因此其加1條件就是一行結(jié)束。前文中使用cnt1來計數(shù)一行,因此計數(shù)器cnt2的加1條件一行結(jié)束即“end_cnt1”,可寫成:assign add_cnt2 = end_cnt1。分析上面的時序圖可以知道,該計數(shù)器的計數(shù)數(shù)量為525。下面繼續(xù)調(diào)用至簡設(shè)計法模板將其翻譯為代碼表示,在命令模式下輸入“:Mdyjsq”,點擊回車,調(diào)出對應(yīng)模板后將“add_cnt1”和“end_cnt1”補充完整,得到該計數(shù)器的代碼如下:

確定了計數(shù)器cnt2,則vys信號的設(shè)計就有了對齊的對象。從時序圖可以發(fā)現(xiàn):vys有兩個變化點,一個是cnt2數(shù)到2個時,信號值由0變1;另一個是當(dāng)cnt2數(shù)到525個時,信號值由1變0。下面將vys信號翻譯成代碼,在編輯模式下輸入“Shixu2”調(diào)用至簡設(shè)計法模板后將其補充完整,得到場同步信號的代碼如下:

圖3.11-16VGA顯示圖片區(qū)域


最后還需要完成lcd_rgb信號的設(shè)計。從設(shè)計目標(biāo)可知要在顯示器中一共要完成兩種方式的顯示。如上圖所示,顯示器需要顯示一幅外部輸入的圖片,其他區(qū)域顯示為白色。外部輸入圖片大小為120*55,以屏幕最中心為中間點,中心點左方和右方均為120/2=60列,上方55/2≈27行,下方55-27=28行,這一范圍是顯示圖像數(shù)據(jù)的區(qū)域,而在其它區(qū)域內(nèi)直接顯示白色,這時lcd_rgb等于16’b11111_111111_11111。這里一定要注意,設(shè)計目標(biāo)需要在“顯示區(qū)域”才能進(jìn)行顏色賦值,在非顯示區(qū)域,將lcd_rgb的值要為0。

確定VGA背景的講解部分有說明過顯示區(qū)域如何確定,場同步信號處于顯示區(qū)域且行同步信號也處于顯示區(qū)域時才是真正的顯示區(qū)域,而其他區(qū)域中紅、綠、藍(lán)基色都應(yīng)賦值為低電平時,從而實現(xiàn)VGA顏色顯示。結(jié)合VGA時序可以知道行同步信號的顯示區(qū)域為同步脈沖和顯示后沿之后,并且在顯示前沿之前,轉(zhuǎn)化為代碼表示即為cnt1>=(96+48)&&cnt1<(96+48+640);場同步信號的顯示區(qū)域也為同步脈沖和顯示后沿之后,且在顯示前沿之前,轉(zhuǎn)化為代碼表示即為cnt2>=(2+33) &&cnt2<(2+33+480)。行同步信號和場同步信號同時處于顯示區(qū)域才是顯示器的實際顯示區(qū)域,因此顯示器顯示區(qū)域轉(zhuǎn)化為代碼表示即為(cnt1>=(96+48)&&cnt1<(96+48+640)),并且(cnt2>=(2+33) &&cnt2<(2+33+480))。

通過前文分析可知圖片的顯示區(qū)域為中間點左方60列,右方60列,上方27行,下方28行。確定顯示區(qū)域后可以得到:

顯示區(qū)域:其中間點為cnt1=96+48+640/2=464,cnt2=2+33+480/2=275,因而可以確定圖片區(qū)域的范圍,轉(zhuǎn)化為代碼表示即(cnt1>=(96+48+320-60)&&cnt1<(96+48+320+60)),并且(cnt2>=(2+33+240-27) &&cnt2<(2+33+240+28))。

白色區(qū)域:在顯示區(qū)域中,非圖片區(qū)域的就是白色區(qū)域,此時lcd_rgb輸出“16’b11111_111111_11111”;

非顯示區(qū)域:顯示區(qū)域之外的就是非顯示區(qū)域,非顯示區(qū)域lcd_rgb要為低電平,即輸出“16’b0”。

綜上所述,可以設(shè)計幾個信號來表示這些區(qū)域,定義顯示區(qū)域用valid_area=1表示,圖片區(qū)域用rom_area=1表示??傻玫酱a如下:


確定了rom_area和valid_area后,lcd_rgb的設(shè)計非常容易。通過前文分析可知:在顯示區(qū)域(valid_area=1)中的圖片區(qū)域(rom_area=1),lcd_rgb輸出為圖片的像素值。有讀者此時可能會有疑問:圖片的像素值從哪里來呢?在第一節(jié)中講解了可以將圖片數(shù)據(jù)轉(zhuǎn)換為mif的初始化文件并利用該初始化文件生成ROM IP核,通過控制該ROMIP核的地址就能讀取到圖片數(shù)據(jù)。下面將具體介紹其操作方法。

首先將該ROM例化,所謂IP核的例化,就是將IP核的接口與工程進(jìn)行連接。舉個例子,現(xiàn)在要在一臺電視機內(nèi)部要安裝一個電路板。電路板上的接口有address、clock和q。同樣電視機里面有三種線,分別是rom_addr,clk和rom_data。需要把rom_addr插到電路板address接口上,把clk插到電路板的clock接口上,把rom_data插到電路板的q接口上才能完成了安裝。同樣地,在rom1內(nèi)部有三個信號分別是address、clock和q;因此VGA驅(qū)動模塊也有對應(yīng)的三個信號rom_addr、clk和rom_data。例化就是將rom1的信號address連到VGA驅(qū)動模塊的rom_addr信號上;將rom1的信號clock連到VGA驅(qū)動模塊的clk信號上;將rom1的信號q連到VGA驅(qū)動模塊的rom_data信號上。


在本設(shè)計中例化IP核的代碼如下:


前文中講解過可以通過控制ROM的地址令ROM輸出對應(yīng)地址的數(shù)據(jù)。ROM輸出的信號是rom_data,因此在顯示區(qū)域(valid_area=1)中的圖片區(qū)域(rom_area=1),lcd_rgb輸出圖片的像素值,也就是rom_data的值,即當(dāng)rom_area=1時,lcd_rgb=rom_data。

在顯示區(qū)域(valid_area=1)中的非圖片區(qū)域(rom_area=0),lcd_rgb輸出白色16’h11111_111111_11111。


綜上所述,lcd_rgb信號設(shè)計代碼如下:



最后來設(shè)計控制地址的rom_addr信號。下表是本設(shè)計中cnt1和cnt2對應(yīng)的rom_addr值,可以得出rom_addr與cnt1和cnt2的關(guān)系,即rom_addr = (cnt1-96-48-320+60) + 120*(cnt2-2-33-240+27)。

表3.11- 3 cnt1和cnt2對應(yīng)的rom_addr值

需要注意的是ROM的時序中,rom_data會比rom_addr滯后一個時鐘,如下圖所示。下面請同學(xué)們來思考一下這樣會出現(xiàn)什么問題呢?

圖3.11-17ROM時序問題


在這種情況下,當(dāng)cnt1=404并且cnt2=248時的位置為圖片的第一個像素點。由于rom_addr是由組合邏輯產(chǎn)生的,所以在第6個時鐘時rom_addr的值為0,但地址0所對應(yīng)的像素值在第7個時鐘時才會在rom_data輸出。由于lcd_rgb是時序產(chǎn)生的,它在第7個時鐘上升沿,才會采樣rom_data的值并輸出,可以看出此時lcd_rgb并不是輸出地址0所對應(yīng)的像素值。

在設(shè)計中遇到此種問題時,就需要進(jìn)行時序調(diào)整。此時,最簡單的辦法是調(diào)整rom_addr的時序,讓它提前一個時鐘產(chǎn)生,而其它信號保持不變。更新后的波形如下圖所示:

圖3.11-18調(diào)整ROM相關(guān)時序


調(diào)整前,當(dāng)cnt1=404時rom_addr的值為0,調(diào)整rom_addr將其提前一個時鐘后,變?yōu)楫?dāng)cnt1=403時,rom_addr就為0,從而使得rom_data也提前了一個時鐘,這樣一來就完美的解決了時鐘滯后的問題。


因此rom_addr所對應(yīng)的代碼如下:

至此,主體程序已經(jīng)完成。



3.3?信號定義

接下來將module補充完整,首先來定義信號類型。再次強調(diào),在進(jìn)行reg和wire的判斷的時候,總?cè)菀状嬖诙嘤嗟穆?lián)想,比如認(rèn)為reg就是寄存器,wire是線;或者認(rèn)為reg會綜合成寄存器,wire不會綜合成寄存器。但是這些其實和reg型還是wire型的確定都并無關(guān)系,在進(jìn)行信號類型的判斷時不需要做任何的聯(lián)想,只要記住一個規(guī)則“用always實現(xiàn)的是reg型,其他都是wire型”就可以了。

cnt0是用always產(chǎn)生的信號,因此類型為reg。cnt0計數(shù)的最大值為1,需要用1根線表示,即位寬是1位。

add_cnt0和end_cnt0都是用assign方式設(shè)計的,因此類型為wire。其值是0或者1,用1根線表示即可,即位寬為1。


打開GVIM,在編輯模式下輸入“Reg1”“Wire1”可調(diào)用至簡設(shè)計法相應(yīng)模板,補充完整后得到代碼如下:


cnt1是用always產(chǎn)生的信號,因此類型為reg。cnt1計數(shù)的最大值為800,那如何確定該值對應(yīng)的位寬是多少呢?至簡設(shè)計法在這里分享一個非常實用的技巧,打開計算器,點擊“查看”,選擇“程序員”模式,在“十進(jìn)制”下將信號值輸入進(jìn)去,就會獲得對應(yīng)的信號位寬。利用這一方法將cnt1的最大計數(shù)器800輸入到計算器中,如下圖所示,可以看出其位寬為10。本設(shè)計的數(shù)位比較小,這種方法在后續(xù)遇到比較大的數(shù)字時會方便很多,也不容易出錯。


圖3.11-19通過計算器獲取信號位寬


add_cnt1和end_cnt1都是用assign方式設(shè)計的,因此類型為wire,并且其值是0或者1,用1根線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計法模板,補充完整后得到cnt1、add_cnt1和end_cnt1的代碼如下:

cnt2是用always產(chǎn)生的信號,因此類型為reg。cnt2計數(shù)的最大值為525,需要用10根線表示,即位寬是10位。


add_cnt2和end_cnt2都是用assign方式設(shè)計的,因此類型為wire。并且其值是0或者1,用1根線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計法模板,補充完整后得到cnt2、add_cnt2和end_cnt2的代碼如下:

lcd_rgb是用always方式設(shè)計的,因此類型為reg。其位寬是16位,16根線表示即可。編輯模式下輸入“Reg16”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:


hys和vys是用always方式設(shè)計的,因此類型為reg。并且其值是0或1,需要1根線表示即可。編輯模式下輸入“Reg1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:

valid_area和rom_area是用always方式設(shè)計的,因此類型為reg。并且其值是0或1,用一根線表示即可。編輯模式下輸入“Reg1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:


rom_addr是用always方式設(shè)計的,因此類型為reg。其表示范圍是0~6599,最大值為6599,使用計算器得出需要13根線表示,即位寬為13位,因此代碼如下:

rom_data是例化模塊的輸出,不是用always方式設(shè)計的,因此類型為wire。其位寬為16位,需要16根線表示,編輯模式下輸入“Reg16”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:


至此,整個代碼的設(shè)計工作已經(jīng)完成?;仡櫼幌卤竟こ痰恼麄€代碼設(shè)計,可以發(fā)現(xiàn)一共需要3個計數(shù)器,這里同樣分享一個至簡設(shè)計法代碼模板,在“GVIM”中使用快捷命令“Jsq3”可以調(diào)出3個計數(shù)器的模板,調(diào)出的“Jsq3”模板如下圖所示,補充完整后可以得到完整的計數(shù)器代碼。


圖3.11-20至簡設(shè)計法調(diào)用3個計數(shù)器模板


最終得到整個工程的代碼如下:

未完請看3.11VGA顯示圖片--明德?lián)P科教(2)(mdy-edu.com)

3.11VGA顯示圖片--明德?lián)P科教(1)(mdy-edu.com)的評論 (共 條)

分享到微博請遵守國家法律
潮州市| 北流市| 西安市| 都匀市| 马边| 二连浩特市| 五家渠市| 彝良县| 盐津县| 台州市| 蒙城县| 响水县| 亳州市| 孟连| 灵山县| 武平县| 三河市| 延川县| 彭阳县| 镇巴县| 客服| 孟州市| 滦平县| 清远市| 城市| 荥经县| 东光县| 容城县| 广水市| 贵南县| 敦化市| 广元市| 乌鲁木齐县| 玉树县| 梅河口市| 德清县| 彭泽县| 仪陇县| 金昌市| 特克斯县| 铜山县|