版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> </p><p> 電子信息工程專業(yè)綜合設(shè)計(jì)(報(bào)告)</p><p><b> ?。ㄕn 程 設(shè) 計(jì))</b></p><p> 題目 基于FPGA的VGA圖像顯示設(shè)計(jì) </
2、p><p> (圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng)) </p><p> 二級(jí)學(xué)院 電子信息與自動(dòng)化學(xué)院 </p><p> 專 業(yè) 電子信息工程 </p><p> 班 級(jí)
3、 </p><p> 學(xué)生姓名 學(xué) 號(hào) </p><p> 指導(dǎo)教師 </p><p> 時(shí) 間 2011.12.26-2012.01.13 </p><p> 基于FPGA的VGA圖像顯示設(shè)計(jì)及應(yīng)用</p>
4、<p> 摘 要:VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛的應(yīng)用。本文依據(jù)VGA顯示原理,介紹了利用 FPGA 實(shí)現(xiàn)對(duì)VGA圖形控制器VHDL設(shè)計(jì)方法。詳細(xì)描述了各硬件模塊的工作原理及實(shí)現(xiàn)途徑,并給出了軟件設(shè)計(jì)思路及部分代碼。</p><p> 關(guān)鍵詞:VGA;FPGA;VHDL</p><p><b> 0. 引言</b><
5、;/p><p> 隨著可編程邏輯器件的不斷發(fā)展及其價(jià)格的不斷下降,EDA 開(kāi)發(fā)軟件的不斷完善,可編程邏輯設(shè)計(jì)的應(yīng)用優(yōu)勢(shì)逐漸顯示出來(lái), 特別是大規(guī)模可編程器件。 而 FPGA 具有功能強(qiáng)大,開(kāi)發(fā)過(guò)程投資小、周期短等特點(diǎn),成為當(dāng)今硬件設(shè)計(jì)的首選方式之一。VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛地應(yīng)用。利用 FPGA 芯片和 EDA設(shè)計(jì)方法,可以靈活地根據(jù)用戶需求,設(shè)計(jì)出針對(duì)性強(qiáng)的 VGA 顯示控制器,不僅降
6、低了生產(chǎn)成本也可以快速地對(duì)產(chǎn)品進(jìn)行升級(jí)換代。 </p><p> 本文設(shè)計(jì)采用 Quartus II 9.0軟件工具,并以 Altera公司的 Cyclone 系列 FPGA 的器件EP1C12F324C8為主實(shí)現(xiàn)硬件平臺(tái)的設(shè)計(jì)。</p><p><b> 方案設(shè)計(jì)及工作原理</b></p><p><b> 1.1方案設(shè)計(jì)&l
7、t;/b></p><p> 采用模塊化設(shè)計(jì)方法,我們對(duì) VGA 圖形控制器按功能進(jìn)行層次劃分。本設(shè)計(jì)的VGA控制器主要由以下模塊組成:VGA 時(shí)序控制模塊、ROM 內(nèi)存地址控制模塊、RO內(nèi)存模塊、按鍵掃描控制模塊。如圖 1 所示。</p><p><b> 圖1.方案模塊框圖</b></p><p><b> 1.2工作
8、原理</b></p><p> 根據(jù)VGA的顯示協(xié)議,可以選擇不同的顯示分辨率。本設(shè)計(jì)選擇的是800*600的分辨率。根據(jù)相應(yīng)協(xié)議,在“VGA時(shí)序控制模塊”對(duì)行掃描信號(hào)HS和場(chǎng)掃描信號(hào)VS進(jìn)行相應(yīng)的時(shí)序控制(具體控制詳細(xì)信息見(jiàn)“VGA驅(qū)動(dòng)原理”資料文檔)。</p><p> “ROM內(nèi)存地址控制模塊”根據(jù)“按鍵掃描控制模塊”獲得的圖片顯示首坐標(biāo)xx、yy信息和“VGA時(shí)序控
9、制模塊”傳送過(guò)來(lái)的hcnt(列計(jì)數(shù)器值)、vcnt(行計(jì)數(shù)器值)及相關(guān)控制信號(hào)計(jì)算出正確的內(nèi)存地址,從rom中取出所需要的像素點(diǎn)的三基色數(shù)據(jù)。</p><p> 本設(shè)計(jì)的功能實(shí)現(xiàn)包括:圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng)功能。其中圖像的旋轉(zhuǎn)運(yùn)用了矩陣的轉(zhuǎn)置原理,通過(guò)對(duì)圖像的內(nèi)存存儲(chǔ)地址矩陣進(jìn)行轉(zhuǎn)置運(yùn)算獲得圖像90°旋轉(zhuǎn)的效果。圖像的放大是通過(guò)將包括原像素點(diǎn)在內(nèi),相鄰的4個(gè)點(diǎn)填寫相同的顏色來(lái)實(shí)現(xiàn)的。&
10、lt;/p><p><b> 模塊設(shè)計(jì)及仿真</b></p><p> 2.1 VGA時(shí)序控制模塊</p><p> VGA 時(shí)序控制模塊是整個(gè)顯示控制器的關(guān)鍵部分,其實(shí)質(zhì)就是完成 VGA 顯示卡的功能。主要作用就是在一定的工作頻率下,產(chǎn)生準(zhǔn)確的時(shí)序關(guān)系(VS-垂直同步信號(hào),HS-水平同步信號(hào),消隱信號(hào)之間的關(guān)系)。及其在準(zhǔn)確的時(shí)序下對(duì)ROM
11、存儲(chǔ)器數(shù)據(jù)進(jìn)行讀取。 </p><p> 其中產(chǎn)生準(zhǔn)確的時(shí)序關(guān)系為此模塊重點(diǎn),在 VGA顯示過(guò)程中,完成一行掃描所需要的時(shí)間稱為水平掃描時(shí)間,完成一幀(一屏)掃描所需要的時(shí)間稱為垂直掃描時(shí)間。每掃描完一行用行同步信號(hào)進(jìn)行同步;掃描完所有行后用場(chǎng)同步信號(hào)進(jìn)行同步。本文設(shè)計(jì)采用的是800×600×75Hz 模式。依據(jù)時(shí)序標(biāo)準(zhǔn),每顯示行包含 1056 點(diǎn),其中 800 點(diǎn)為有效顯示區(qū),256 點(diǎn)為
12、消隱區(qū),每行的行同步脈沖低電平寬度為 80個(gè)像素點(diǎn);同理每場(chǎng)有 625 行,有效行為 600 行,其中場(chǎng)同步脈沖低電平寬度為 3 行。其行、場(chǎng)時(shí)序如表 1 ,時(shí)序圖見(jiàn)圖2。</p><p> 表1 行掃描、場(chǎng)掃描時(shí)序</p><p> 依照這個(gè)標(biāo)準(zhǔn),正好與開(kāi)發(fā)板EP1C12外部晶振頻率50MHz相近,可以直接引用外部晶振時(shí)鐘作為其驅(qū)動(dòng)時(shí)鐘(只要所用時(shí)鐘和協(xié)議要求的時(shí)鐘相差不大,不會(huì)影響
13、顯示效果,最多就是顯示的刷新頻率不是真正等于75Hz而已)。</p><p> 圖2 行HS、場(chǎng)VS時(shí)序圖</p><p> 2.2 ROM內(nèi)存地址控制模塊</p><p> 整個(gè)顯示思路是在800*600分辨率的顯示器上開(kāi)辟一256*64的顯示區(qū)域來(lái)顯示圖片,因?yàn)轱@示的圖片的大小為256*64。在此區(qū)域以外顯示指定顏色,例如黑色、藍(lán)色等,作為一個(gè)背景色顯示。
14、在本模塊中,通過(guò)在對(duì)ROM內(nèi)存地址的控制,實(shí)現(xiàn)了圖片的旋轉(zhuǎn)和一倍放大功能。以下通過(guò)一段關(guān)鍵代碼詳細(xì)講解其實(shí)現(xiàn)原理。</p><p> 首先分析無(wú)旋轉(zhuǎn)狀態(tài)下的romaddr_control的計(jì)算原理:</p><p> romaddr_control <= (vcnt(5 downto 0)-count_tempv(5 downto 0))</p><p>
15、 &(hcnt(7 downto 0)-count_temph(7 downto 0));</p><p> 注:romaddr_control為從rom中取數(shù)據(jù)時(shí)所需要的地址,它對(duì)應(yīng)著圖片的沒(méi)一個(gè)像素點(diǎn)的三基色數(shù)據(jù);vcnt(5 downto 0)和hcnt(7 downto 0)分別表示取vcnt(9 downto 0)、hcnt(10 downto 0)的后6、后8 個(gè)二進(jìn)制位來(lái)做運(yùn)算。coun
16、t_tempv(5 downto 0)和count_temph(7 downto 0)同理可以理解其含義。Vcnt、hcnt實(shí)際上可以分別理解為屏幕顯示的行和列計(jì)數(shù)器,count_tempv和count_temph可以分別理解為圖片在屏幕上顯示的起始行和列坐標(biāo)。</p><p> 拋開(kāi)以上等式,按照正常思路,我們可以得到圖片控制地址:addr_control=( vcnt - count_tempv ) * 2
17、56 + ( hcnt – count_temph )</p><p> 通過(guò)分析整個(gè)mid.vhdl文件,會(huì)發(fā)現(xiàn)其實(shí)上面代碼是該等式的高效等效實(shí)現(xiàn)。</p><p> 從矩陣的角度分析90°旋轉(zhuǎn)的實(shí)現(xiàn)</p><p> 旋轉(zhuǎn)的控制,將圖片的顯示分為4種狀態(tài),“00”表示0°旋轉(zhuǎn),“01”表示90°旋轉(zhuǎn),“10”表示180
18、6;旋轉(zhuǎn),“11”表示270°旋轉(zhuǎn)。</p><p> 首先對(duì)比0°旋轉(zhuǎn)和90°旋轉(zhuǎn)圖片在屏幕上顯示所對(duì)應(yīng)的內(nèi)存地址矩陣圖:</p><p> 0度顯示對(duì)應(yīng)內(nèi)存地址矩陣:</p><p> 90度顯示對(duì)應(yīng)內(nèi)存地址矩陣:</p><p> 觀察前后變化規(guī)律,可以看成是進(jìn)行了矩陣的轉(zhuǎn)置運(yùn)算。根據(jù)矩陣的轉(zhuǎn)制原理
19、,我們可以根據(jù)0°狀態(tài)下romaddr_control的算法獲得90°狀態(tài)下romaddr_control的算法。</p><p> romaddr_control <= (64-(hcnt(5 downto 0)-count_temph(5 downto 0)))</p><p> &(vcnt(7 downto 0)-count_tempv(7 d
20、ownto 0));</p><p> 同理可以計(jì)算出“10”、“11”狀態(tài)下的地址控制表達(dá)式,即旋轉(zhuǎn)到180°和270°狀態(tài)的地址控制表達(dá)式。</p><p><b> 實(shí)現(xiàn)一倍放大</b></p><p> 實(shí)現(xiàn)一倍放大的基本思路為將原來(lái)的像素點(diǎn)相鄰的另外三個(gè)點(diǎn)填上同樣的顏色,也就是一個(gè)地址對(duì)應(yīng)屏幕上的四個(gè)像素位,
21、從而實(shí)現(xiàn)放大的效果。這個(gè)比較容易實(shí)現(xiàn),也比較容易想到,將原來(lái)的算法改為:</p><p> romaddr_control <= (hcnt(6 downto 1)-count_temph(6 downto 1))</p><p> &(vcnt(8 downto 1)-count_tempv(8 downto 1));</p><p> 2.3
22、 按鍵掃描控制模塊</p><p> 按鍵掃描控制采用的電平觸發(fā)機(jī)制,5Hz左右的掃描頻率,適合于人們的使用習(xí)慣。其中按鍵的功能里包括了:a.單步上下、左右的移動(dòng);b.放大和不放大兩種模式的選擇;c.順時(shí)針90°旋轉(zhuǎn)按鈕;d.屏保模式自由移動(dòng)和停止選擇按鈕。</p><p> 2.4 ROM內(nèi)存模塊</p><p> ROM內(nèi)存中存儲(chǔ)的是圖片的依次行
23、掃描三基色數(shù)據(jù),作為顯示時(shí)送給VGA顯示器的RGB數(shù)據(jù)。本設(shè)計(jì)存儲(chǔ)的是一幅256*64的圖片,所以定義了一256*64=16384 byte的rom內(nèi)存。</p><p><b> 結(jié)果分析和調(diào)試</b></p><p> 在調(diào)試過(guò)程中,我們遇到圖片在靠近行和列的零邊界線時(shí),會(huì)出現(xiàn)整個(gè)圖片突然消失的問(wèn)題,而不是想象中的逐漸步入,逐漸消失。經(jīng)過(guò)查閱資料,發(fā)現(xiàn)VHDL
24、中沒(méi)有能表示負(fù)數(shù)的數(shù)據(jù)類型,而在程序的運(yùn)算過(guò)程中,有會(huì)出現(xiàn)負(fù)數(shù)的可能性,即在對(duì)圖片初始坐標(biāo)的減運(yùn)算過(guò)程中,可能會(huì)將圖片的起始坐標(biāo)減成負(fù)數(shù),使圖片初始坐標(biāo)變量進(jìn)入未知狀態(tài),致使圖片在屏幕上立即消失的。經(jīng)過(guò)對(duì)程序的修改,排除了大部分的漏洞,讓圖片顯示基本能按設(shè)想顯示,不排除還存在部分Bug的可能性。</p><p><b> 體會(huì)和感受</b></p><p> 經(jīng)過(guò)
25、本次課程設(shè)計(jì),學(xué)到了很多VHDL的知識(shí),比純粹的理論教學(xué)課堂上學(xué)到的知識(shí)更多,更加深刻。實(shí)踐教學(xué)方式對(duì)于我們工程運(yùn)用專業(yè)是一個(gè)非常適合的教學(xué)方式,不僅鍛煉了個(gè)人的動(dòng)手能力,而且調(diào)動(dòng)了學(xué)習(xí)的積極性,改變了我們的學(xué)習(xí)狀態(tài),是一種非常值得重視和推廣的教學(xué)方式。</p><p><b> 參考文獻(xiàn)</b></p><p><b> 【1】</b>&l
26、t;/p><p><b> 【2】</b></p><p><b> 【3】</b></p><p><b> 【4】</b></p><p><b> 【5】</b></p><p><b> 【6】</b&
27、gt;</p><p><b> 【7】</b></p><p><b> 【8】</b></p><p><b> 【9】</b></p><p><b> 【10】</b></p><p> 附錄(程序和元件清單)&l
28、t;/p><p> (1)800*600VGA時(shí)序控制模塊代碼:----------------------------------</p><p> library IEEE; </p><p> use IEEE.std_logic_1164.all; </p><p> use IEEE.STD_LOGIC_UNSIGNED.ALL
29、; </p><p> entity vga800600 is </p><p><b> port ( </b></p><p> clk : in STD_LOGIC; </p><p> hs : out STD_LOGIc; </p><p> vs : out STD_LOGI
30、c; </p><p> r : out STD_LOGIC_VECTOR(2 downto 0); </p><p> g : out STD_LOGIC_VECTOR(2 downto 0); </p><p> b : out STD_LOGIC_VECTOR(1 downto 0); </p><p> rgbin : in
31、std_logic_vector(7 downto 0); </p><p> hcntout : out std_logic_vector(10 downto 0); </p><p> vcntout : out std_logic_vector(9 downto 0)); </p><p> end vga800600; </p><
32、p> architecture ONE of vga800600 is </p><p> signal hcnt : std_logic_vector(10 downto 0); </p><p> signal vcnt : std_logic_vector(9 downto 0); </p><p><b> begin </b&
33、gt;</p><p> hcntout <= hcnt; </p><p> vcntout <= vcnt; </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then </p><p> if(hcnt < 105
34、6) then </p><p> hcnt <= hcnt + 1; </p><p><b> else </b></p><p> hcnt <= (others => '0'); </p><p><b> end if; </b></p>
35、;<p><b> end if; </b></p><p> end process; </p><p> --this is Vertical counter </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then &
36、lt;/p><p> if (hcnt = 800+8 ) then </p><p> if(vcnt < 625) then </p><p> vcnt <= vcnt + 1; </p><p><b> else </b></p><p> vcnt <= (ot
37、hers => '0'); </p><p><b> end if; </b></p><p><b> end if; </b></p><p><b> end if; </b></p><p> end process; </p>
38、;<p> --this is hs pulse </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then </p><p> if((hcnt>=800+8+8)and (hcnt<800+8+8+80 )) then </p><p&g
39、t; hs <= '0'; </p><p><b> else </b></p><p> hs <= '1'; </p><p><b> end if; </b></p><p><b> end if; </b>&l
40、t;/p><p> end process; </p><p> --this is vs pulse </p><p> process(vcnt) begin </p><p> if ((vcnt >= 600+0+1) and (vcnt < 600+0+1+3)) then </p><p>
41、 vs <= '0'; </p><p><b> else </b></p><p> vs <= '1'; </p><p><b> end if; </b></p><p> end process; </p><p&
42、gt; process(clk) begin </p><p> if (rising_edge(clk)) then </p><p> if (hcnt<800 and vcnt<600) then </p><p> r(2 downto 0)<=rgbin(7 downto 5); </p><p> g(
43、2 downto 0)<=rgbin(4 downto 2); </p><p> b(1 downto 0)<=rgbin(1 downto 0); </p><p><b> else </b></p><p> r<="000"; </p><p> g<=&qu
44、ot;000"; </p><p><b> b<="00"; </b></p><p><b> end if; </b></p><p><b> end if; </b></p><p> end process; </p
45、><p><b> end ONE;</b></p><p> ?。?)rom內(nèi)存地址控制模塊代碼:--------------------------------------</p><p> library ieee; </p><p> use ieee.std_logic_1164.all; </p>
46、;<p> use ieee.std_logic_unsigned.all; </p><p> entity mid is </p><p><b> port (</b></p><p> clk : in std_logic;</p><p> fangda_temp : in std_lo
47、gic;</p><p> mode : in std_logic_vector(1 downto 0);--key按鍵輸入旋轉(zhuǎn)90度信號(hào),下降沿有效</p><p> qin : in std_logic_vector(7 downto 0); </p><p> xx: in std_logic_vector(9 downto 0);</p>
48、<p> yy: in std_logic_vector(9 downto 0);</p><p> hcntin : in std_logic_vector(10 downto 0); </p><p> vcntin : in std_logic_vector(9 downto 0);</p><p> qout : out std_logi
49、c_vector(7 downto 0);</p><p> romaddr_control : out std_logic_vector(13 downto 0)</p><p><b> ); </b></p><p><b> end mid;</b></p><p> archite
50、cture one of mid is</p><p> signal xuanzhuanjiaodu: std_logic_vector(1 downto 0);</p><p> signal hcnt : std_logic_vector(10 downto 0); </p><p> signal vcnt : std_logic_vector(9
51、 downto 0); </p><p> signal qout_temp : std_logic_vector(7 downto 0);</p><p> signal count_temph : std_logic_vector(9 downto 0);</p><p> signal count_tempv : std_logic_vector(9 d
52、ownto 0);</p><p> signal wide : integer range 0 to 1024;</p><p> signal long : integer range 0 to 1024;</p><p><b> begin</b></p><p> -- As
53、sign pin </p><p> hcnt <= hcntin; </p><p> vcnt <= vcntin;</p><p> qout <= qout_temp;</p><p> xuanzhuanjiaodu <=mode;</p><p> process( fan
54、gda_temp )</p><p><b> begin</b></p><p> if(fangda_temp='0') then</p><p> wide <=256;</p><p> long <=64;</p><p><b> els
55、e</b></p><p> wide <=512;</p><p> long <=128;</p><p><b> end if;</b></p><p> end process;</p><p> process( xuanzhuanjiaodu )&l
56、t;/p><p><b> BEGIN</b></p><p> case xuanzhuanjiaodu IS</p><p> WHEN "00" => </p><p> if(fangda_temp = '0') then</p><p>
57、romaddr_control <= (vcnt(5 downto 0)-count_tempv(5 downto 0))--0 du</p><p> &(hcnt(7 downto 0)-count_temph(7 downto 0)); </p><p><b> else</b></p><p> romaddr_c
58、ontrol <= (vcnt(6 downto 1)-count_tempv(6 downto 1))--0 du</p><p> &(hcnt(8 downto 1)-count_temph(8 downto 1)); </p><p><b> end if;</b></p><p> WHEN "01&q
59、uot; => </p><p> if(fangda_temp = '0') then</p><p> romaddr_control <= (64-(hcnt(5 downto 0)-count_temph(5 downto 0)))--90 du</p><p> &(vcnt(7 downto 0)-count_
60、tempv(7 downto 0));</p><p><b> else</b></p><p> romaddr_control <= (64-(hcnt(6 downto 1)-count_temph(6 downto 1)))--90 du</p><p> &(vcnt(8 downto 1)-count_temp
61、v(8 downto 1));</p><p><b> end if;</b></p><p> WHEN "10" => </p><p> if(fangda_temp = '0') then</p><p> romaddr_control <= (64-(
62、vcnt(5 downto 0)-count_tempv(5 downto 0)))--180 du</p><p> &(256-(hcnt(7 downto 0)-count_temph(7 downto 0)));</p><p><b> else</b></p><p> romaddr_control <= (6
63、4-(vcnt(6 downto 1)-count_tempv(6 downto 1)))--180 du</p><p> &(256-(hcnt(8 downto 1)-count_temph(8 downto 1)));</p><p><b> end if;</b></p><p> WHEN OTHERS =>
64、 </p><p> if(fangda_temp = '0') then</p><p> romaddr_control <= ((hcnt(5 downto 0)-count_temph(5 downto 0))) --270 du</p><p> &(256-(vcnt(7 downto 0)-count_tempv(7
65、 downto 0)));</p><p><b> else</b></p><p> romaddr_control <= ((hcnt(6 downto 1)-count_temph(6 downto 1))) --270 du</p><p> &(256-(vcnt(8 downto 1)-count_tempv(
66、8 downto 1)));</p><p><b> end if;</b></p><p><b> end case;</b></p><p> end process;</p><p> process(xx,yy) begin </p><p> if((
67、vcnt = yy) and( hcnt=xx) )then </p><p> count_temph<=xx;</p><p> count_tempv<=yy;</p><p><b> end if;</b></p><p> if((xuanzhuanjiaodu =1 ) or (xuan
68、zhuanjiaodu =3 )) then</p><p> if((vcnt < yy) or (vcnt > yy+wide)) then qout_temp<="00000111";--cnt(31 downto 24);</p><p> elsif((hcnt>xx)and(hcnt<xx + long)) then<
69、/p><p> qout_temp<=qin;---------input logo.hex</p><p><b> else</b></p><p> qout_temp<="00000111";--cnt(31 downto 24);</p><p><b> end
70、if;</b></p><p><b> else</b></p><p> if((vcnt < yy) or (vcnt > yy+long)) then qout_temp<="00000111";--cnt(31 downto 24);</p><p> elsif((hcnt&g
71、t;=xx)and(hcnt<=xx + wide)) then</p><p> qout_temp<=qin;---------input logo.hex</p><p><b> else</b></p><p> qout_temp<="00000111";--cnt(31 downto 2
72、4);</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p><b> end one;</b></p><p> 按鍵控制模塊(圖象
73、顯示頂層程序)</p><p> LIBRARY ieee; --圖象顯示頂層程序 </p><p> USE ieee.std_logic_1164.all; </p><p> use ieee.std_logic_unsigned.all;</p><p> ENTITY img IS </p><p>
74、<b> port </b></p><p> ( clk50MHz : IN STD_LOGIC; </p><p> key1,key2,key3,key4,key,s2,s3: in std_logic;</p><p> hs, vs : OUT STD_LOGIC;</p><p> r,g
75、: OUT STD_LOGIC_VECTOR(2 downto 0);</p><p> b: out STD_LOGIC_VECTOR(1 downto 0)</p><p><b> ); </b></p><p><b> END img; </b></p><p> AR
76、CHITECTURE modelstru OF img IS </p><p> component vga800600 --VGA顯示控制模塊 </p><p> PORT(clk : IN STD_LOGIC; </p><p> rgbin : IN STD_LOGIC_VECTOR(7 downto 0); </p><p>
77、 hs, vs : OUT STD_LOGIC;</p><p> r, g: OUT STD_LOGIC_VECTOR(2 downto 0);</p><p> b : OUT STD_LOGIC_VECTOR(1 downto 0);</p><p> hcntout :OUT STD_LOGIC_VECTOR(10 downto 0);</
78、p><p> vcntout : OUT STD_LOGIC_VECTOR(9 downto 0) </p><p><b> ); </b></p><p> end component;</p><p> component imgrom --圖象數(shù)據(jù)ROM,數(shù)據(jù)線8位;地址線12位 </p>&l
79、t;p> PORT(clock : IN STD_LOGIC; </p><p> address : IN STD_LOGIC_VECTOR(13 downto 0); </p><p> q : OUT STD_LOGIC_VECTOR(7 downto 0) </p><p><b> ); </b></p>
80、<p> end component;</p><p> component mid</p><p><b> port ( </b></p><p> clk : in std_logic;</p><p> fangda_temp : in std_logic;</p><p&
81、gt; mode : in std_logic_vector(1 downto 0);</p><p> qin : in std_logic_vector(7 downto 0);</p><p> xx: in std_logic_vector(9 downto 0);</p><p> yy: in std_logic_vector(9 downto
82、0); </p><p> hcntin : in std_logic_vector(10 downto 0); </p><p> vcntin : in std_logic_vector(9 downto 0);</p><p> qout : out std_logic_vector(7 downto 0);</p><p>
83、romaddr_control : out std_logic_vector(13 downto 0)</p><p><b> ); </b></p><p> end component;</p><p> signal rgb : STD_LOGIC_VECTOR(7 downto 0); </p><p>
84、 signal rgb1 : STD_LOGIC_VECTOR(7 downto 0); </p><p> signal clk25MHz : std_logic; </p><p> signal clk1Hz : std_logic; </p><p> signal romaddr : STD_LOGIC_VECTOR(13 downto 0); &
85、lt;/p><p> signal hpos: std_logic_vector(10 downto 0);</p><p> signal vpos : std_logic_vector(9 downto 0);</p><p> signal txx,tyy :std_logic_vector(9 downto 0);</p><p>
86、; signalclk_count: std_logic_vector(24 downto 0);</p><p> signalclkm:std_logic;</p><p> signal key_mode : std_logic_vector(1 downto 0);</p><p> signal fangda,yidong : std_
87、logic ;</p><p> signal yidong_mode : std_logic_vector(1 downto 0);</p><p> signal yidong_y,yidong_x :std_logic;</p><p> BEGIN------------------ARCHITECTURE begin</p>
88、<p> div: process(clk50MHz)</p><p><b> begin</b></p><p> if (clk50MHz'event and clk50MHz='1') then</p><p> if(clk_count < "00111101111111100
89、11000000")then</p><p> clk_count <= clk_count + 1;</p><p> clkm <= '0';</p><p><b> else</b></p><p> clk_count <= "00000000000
90、00000000000001";</p><p> clkm <= '1';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p>
91、; process(clkm)--clkm的頻率為2Hz,做按鍵掃描用</p><p> variable ttxx :std_logic_vector(9 downto 0) :="0011000000"; --192</p><p> variable ttyy :std_logic_vector(9 downto 0) :="001101000
92、0"; --208</p><p><b> begin</b></p><p> if(clkm'event and clkm='1')then</p><p> if( key ='0')thenttyy := ttyy+10; --key1</p><p>
93、 elsif ( key2 ='0')thenif(( ttyy-10)>9)then ttyy := ttyy-10;end if;--key2</p><p> elsif ( key3 ='0')thenttxx := ttxx+10;--key3</p><p> elsif ( key4 ='0')thenif((
94、 ttxx-10)>9)then ttxx := ttxx-10;end if;</p><p> elsif ( key1 ='0')then --key</p><p> if( key_mode =3)then key_mode <= "00";</p><p> elsekey_mode<=k
95、ey_mode+1;</p><p><b> end if;</b></p><p> if(fangda = '0') then</p><p> if(key_mode=1) then ttyy:=ttyy+96;if((ttxx-96)>=0)then ttxx:=ttxx-96;else yidong_x&
96、lt;='0'; end if;</p><p> elsif(key_mode=2) then ttxx:=ttxx+96;if((ttyy-96)>=0)then ttyy:=ttyy-96;else yidong_y<='0';end if;</p><p> elsif(key_mode=3) then ttyy:=ttyy+96;i
97、f((ttxx-96)>=0)then ttxx:=ttxx-96;else yidong_x<='0'; end if;</p><p> else ttxx:=ttxx+96;if((ttyy-96)>=0)then ttyy:=ttyy-96;else yidong_y<='0';end if;--ttyy:="0000000000&quo
98、t;;</p><p><b> end if;</b></p><p><b> else</b></p><p> if(key_mode=1) then ttyy:=ttyy+192;if((ttxx-192)>=0)then ttxx:=ttxx-192;else yidong_x<='0
99、';end if;</p><p> elsif(key_mode=2) then ttxx:=ttxx+192;if((ttyy-192)>=0)then ttyy:=ttyy-192;else yidong_y<='0';end if;</p><p> elsif(key_mode=3) then ttyy:=ttyy+192;if((ttxx
100、-192)>=0)then ttxx:=ttxx-192;else yidong_x<='0'; end if;</p><p> else ttxx:=ttxx+192;if((ttyy-192)>=0)then ttyy:=ttyy-192;else yidong_y<='0';end if;</p><p><b>
101、 end if;</b></p><p><b> end if;</b></p><p> elsif (s2 = '0') thenfangda <= not fangda; --s2</p><p> if(fangda='1') then ttxx :=ttxx+128; tt
102、yy :=ttyy+32;</p><p> else ttxx :=ttxx-128; ttyy :=ttyy-32;</p><p><b> end if;</b></p><p> elsif( s3 = '0' ) then yidong<= not yidong;</p><p>
103、<b> end if;</b></p><p> if ( yidong='1') then </p><p> if(yidong_x='0') then ttxx:=ttxx+12;------yidong_X等于'0',圖片的首坐標(biāo)做自增運(yùn)算,否則做自減運(yùn)算</p><p> el
104、se ttxx:=ttxx-12;</p><p><b> end if;</b></p><p> if(yidong_y='0') then ttyy:=ttyy+8;-------yidong_y等于'0',圖片的首坐標(biāo)做自增運(yùn)算,否則做自減運(yùn)算</p><p> else ttyy:=ttyy-8
105、;</p><p><b> end if;</b></p><p> if(ttxx<=11) then yidong_x<='0';</p><p><b> end if;</b></p><p> if(ttyy<=7) then yidong_y&
106、lt;='0';</p><p><b> end if;</b></p><p> if(fangda='0') then</p><p> case key_mode is</p><p> when "00" =></p><p&
107、gt; if(ttxx>=544) then yidong_x<='1';</p><p><b> end if;</b></p><p> if(ttyy>=536) then yidong_y<='1';</p><p><b> end if;</b>
108、</p><p> when "10" =></p><p> if(ttxx>=544) then yidong_x<='1';</p><p><b> end if;</b></p><p> if(ttyy>=536) then yidong_y
109、<='1';</p><p><b> end if;</b></p><p> when "01" =></p><p> if(ttxx>=736) then yidong_x<='1';</p><p><b> end
110、if;</b></p><p> if(ttyy>=334) then yidong_y<='1';</p><p><b> end if;</b></p><p> when "11" =></p><p> if(ttxx>=736)
111、then yidong_x<='1';</p><p><b> end if;</b></p><p> if(ttyy>=334) then yidong_y<='1';</p><p><b> end if;</b></p><p>&
112、lt;b> end case;</b></p><p><b> else</b></p><p> case key_mode is</p><p> when "00" =></p><p> if(ttxx>=288) then yidong_x<=
113、'1';</p><p><b> end if;</b></p><p> if(ttyy>=472) then yidong_y<='1';</p><p><b> end if;</b></p><p> when "10&quo
114、t; =></p><p> if(ttxx>=288) then yidong_x<='1';</p><p><b> end if;</b></p><p> if(ttyy>=472) then yidong_y<='1';</p><p>&l
115、t;b> end if;</b></p><p> when "01" =></p><p> if(ttxx>=672) then yidong_x<='1';</p><p><b> end if;</b></p><p> if(t
116、tyy>=88) then yidong_y<='1';</p><p><b> end if;</b></p><p> when "11" =></p><p> if(ttxx>=672) then yidong_x<='1';</p>
117、<p><b> end if;</b></p><p> if(ttyy>=88) then yidong_y<='1';</p><p><b> end if;</b></p><p><b> end case;</b></p>&
118、lt;p><b> end if;</b></p><p><b> end if;</b></p><p><b> end if;</b></p><p> -------------------------------------------一下為防出邊界檢驗(yàn)及相應(yīng)矯正操作,因?yàn)?/p>
119、當(dāng)ttxx和ttyy因?yàn)橐恍╇S </p><p> -------------------------------------------機(jī)的按鍵操作讓其做自減操作時(shí)可能會(huì)出現(xiàn)為負(fù)數(shù)的情況。</p><p> if(ttxx<=0) then yidong_x<='0';--ttxx:="0000000000";</p>&
120、lt;p><b> end if;</b></p><p> if(ttyy<=0) then yidong_y<='0'; --ttyy:="0000000000";</p><p><b> end if;</b></p><p> txx<=ttxx
121、;</p><p> tyy<=ttyy;</p><p> end process;</p><p> process(clk50MHz) begin </p><p> if clk50MHz'event and clk50MHz = '1' then clk25MHz <= not clk25
122、MHz ; end if; </p><p> end process; </p><p> i_vga800600 : vga800600 PORT MAP(clk => clk50MHz, rgbin => rgb1, hs => hs, </p><p> vs => vs, r => r, g => g, b =&g
123、t; b, hcntout => hpos, vcntout => vpos); </p><p> i_rom : imgrom PORT MAP(clock => clk50MHz, address => romaddr, q => rgb);</p><p> i_mid : mid PORT MAP(clk => clk50MHz,fangd
124、a_temp=>fangda,mode=>key_mode, xx => txx, yy=> tyy ,qin => rgb, hcntin => hpos, vcntin => vpos, qout =>rgb1,romaddr_control => romaddr); </p><p><b> end;</b></p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- fpga課程設(shè)計(jì)--vga圖像顯示控制電路設(shè)計(jì)
- 課程設(shè)計(jì)-基于fpga的vga圖像顯示設(shè)計(jì)(圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng))
- 課程設(shè)計(jì)-基于fpga的vga圖像顯示設(shè)計(jì)(圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng))
- 課程設(shè)計(jì)--基于fpga的vga圖像漢字顯示及ps2鍵盤控制設(shè)計(jì)與應(yīng)用
- 基于fpga的vga接口顯示設(shè)計(jì)與實(shí)現(xiàn)
- 基于FPGA的實(shí)時(shí)視頻圖像采集與VGA顯示系統(tǒng)設(shè)計(jì)研究.pdf
- 基于FPGA的VGA顯示控制器設(shè)計(jì)和實(shí)現(xiàn).docx
- 基于fpga的ps2鼠標(biāo)接口設(shè)計(jì)及vga顯示
- 課程設(shè)計(jì)-- 基于fpga的液晶顯示控制器設(shè)計(jì)
- 基于fpga的vga顯示說(shuō)明書
- 華科 基于fpga的vga顯示實(shí)驗(yàn)
- 摘要--基于fpga硬件平臺(tái)的vga 顯示游戲
- 軟件課程設(shè)計(jì)-bmp圖像顯示
- 用verilog編寫fpga的vga顯示
- 畢業(yè)論文--基于fpga的vga顯示控制器設(shè)計(jì)(含外文翻譯)
- 基于stm32的圖像顯示系統(tǒng)-大學(xué)課程設(shè)計(jì)報(bào)告
- fpga課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- fpga課程設(shè)計(jì)報(bào)告---基于cpld的1602字符液晶顯示系統(tǒng)設(shè)計(jì)
- 基于fpga的數(shù)字時(shí)鐘課程設(shè)計(jì)
- 基于FPGA的數(shù)字圖像顯示系統(tǒng)設(shè)計(jì)實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論