a可編程片上系統(tǒng)應(yīng)用第二組的全部東西fancy digital finalreport_第1頁(yè)
a可編程片上系統(tǒng)應(yīng)用第二組的全部東西fancy digital finalreport_第2頁(yè)
a可編程片上系統(tǒng)應(yīng)用第二組的全部東西fancy digital finalreport_第3頁(yè)
a可編程片上系統(tǒng)應(yīng)用第二組的全部東西fancy digital finalreport_第4頁(yè)
a可編程片上系統(tǒng)應(yīng)用第二組的全部東西fancy digital finalreport_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)計(jì)名稱(chēng):A Fancy Digital Clock所在院系:華技大學(xué)電信系班級(jí)電信 0903 班姓名:外力江學(xué)號(hào):u200813654指導(dǎo):曾喻江目錄:1 實(shí)驗(yàn)名稱(chēng)32 實(shí)驗(yàn)內(nèi)容33 實(shí)驗(yàn)要求33.1 硬件要求33.2 功能要求34 系統(tǒng)設(shè)計(jì)34.1:系統(tǒng)框圖34.2:系統(tǒng)各部分的說(shuō)明34.2.1:VGA contoler34.2.2:8MB SDRAM44.2.3:Timekeeper44.2.4:Nios 44.3:系統(tǒng)的實(shí)現(xiàn)44.3.1VGA Controller44.3.2:8MB SDRAM74.3.3:Time keeper75.系統(tǒng)86.總結(jié)96.1 心得體會(huì)106.2 待改進(jìn)

2、功能116.3 修改過(guò)的部分117.Main.c 代碼析138.完成任務(wù)381 實(shí)驗(yàn)名稱(chēng):A Fancy Digital Clock2 實(shí)驗(yàn)內(nèi)容:用 quartus設(shè)計(jì)一個(gè) A Fancy Digital Clock3 實(shí)驗(yàn)要求:3.1 硬件要求:要在 DE2 上實(shí)現(xiàn) A Fancy Digital Clock 的設(shè)計(jì)3.2 功能要求:a)要具有時(shí)鐘的功能,既是能夠顯示時(shí)間,日期,。b)要具有數(shù)字相框的功能,既是能夠隨機(jī)選擇圖片顯示在我們的界面上。c)數(shù)字相框的顯示要用流水線的方式實(shí)現(xiàn)。d)時(shí)間改變時(shí),改變的動(dòng)畫(huà)要有重力的效果。e)有簡(jiǎn)單的鬧鐘功能。4 系統(tǒng)設(shè)計(jì):4.1:系統(tǒng)框圖還有一個(gè)LED

3、 顯示部分接到 Avalon bus4.2:系統(tǒng)各部分的說(shuō)明鬧鐘到點(diǎn)時(shí)的值。4.2.1:VGA contolera) VGA peripheral這一部分實(shí)現(xiàn)的功能是像素的收集與,并且一系列的輸出功能。b) Framebuffer這一部分是將SRAM 作為 VGA 輸出地緩存器,用來(lái)的下一個(gè)圖片。當(dāng)前顯示圖片c) VGA DAC完成轉(zhuǎn)換功能。4.2.2:8MB SDRAM同步動(dòng)態(tài)隨機(jī)器,同步是指 Memory 工作需要同步時(shí)鐘,內(nèi)部令的與數(shù)據(jù)的傳輸都以它為基準(zhǔn);動(dòng)態(tài)是指陣列需要不斷的刷新來(lái)保證數(shù)據(jù)不丟失;隨機(jī)是指數(shù)據(jù)不是線性依次,而是自由指定地址進(jìn)行數(shù)據(jù)讀寫(xiě)。跟時(shí)鐘同步用來(lái)圖片信息,位圖等???/p>

4、以存代碼.4.2.3:Time keeper原作者為了方便新建timer 模塊除了時(shí)鐘功能之外還有中斷來(lái)調(diào)時(shí)鐘.用來(lái)時(shí)序,實(shí)現(xiàn)時(shí)鐘的時(shí)間與產(chǎn)生。提供時(shí)鐘中斷.4.2.4:Nios 此部分編寫(xiě)代碼,來(lái)實(shí)現(xiàn)時(shí)鐘顯示,重力翻頁(yè)效果,時(shí)間調(diào)整,圖片循環(huán)隨機(jī)顯示。鬧鐘實(shí)現(xiàn).4.3:系統(tǒng)的實(shí)現(xiàn)4.3.1VGA Controller:SRAM 直接與 VGA設(shè)備連接,而且不與Avalon 總線連接。它只當(dāng)做VGA 的輸出幀緩存,因此我們讀一個(gè) 16 位的數(shù)據(jù)需要 1 個(gè)時(shí)鐘周期,寫(xiě)一個(gè) 16 位的數(shù)據(jù)需要 2 個(gè)時(shí)鐘周期。在整個(gè)VGA Controller 中,我們主要是為了實(shí)現(xiàn)下面 7 個(gè)方面的設(shè)計(jì):a)

5、 顯示成面的設(shè)計(jì)在顯示器上一共分為三層:第一層是背景,第二層是右邊圖片的顯示,第三層是左邊時(shí)鐘的顯示。第一層背景的生成并不是直接從內(nèi)存里面的,而是通過(guò)函數(shù)來(lái)生成的。其是:ED2版里面的內(nèi)存不夠大,而存放背景需要很大的內(nèi)存空間,因此為了節(jié)約內(nèi)存,我們使用函數(shù)來(lái)生成背景。具體函數(shù)是:R 的值由當(dāng)前像素點(diǎn)的 x 坐標(biāo)加上一個(gè)數(shù)值來(lái)給定,B 的值由當(dāng)前像素點(diǎn)的 y 坐標(biāo)加上一個(gè)數(shù)值來(lái)給定.而 G 的值則直接付全 1.因?yàn)槲覀兊臄?shù)據(jù)總線的位寬為 16 位,因此我們所取的像素點(diǎn)也是 16 位的,并且人為的法僅僅是為了是系統(tǒng)結(jié)構(gòu)簡(jiǎn)單化。R5G6B5 這種形式。這種做第二層右邊圖片的設(shè)計(jì),右邊圖片是直接從內(nèi)存

6、中提取的,由于屏幕的寬度和器大小有限,因此我們需要將內(nèi)存中的圖片的格式做一個(gè)規(guī)定 144*height,在生成頭文件時(shí)就規(guī)定了它的寬度,為了實(shí)現(xiàn)上的簡(jiǎn)單,我們正好把它設(shè)計(jì)為屏幕寬度的一半。圖片文件先是從SDRAM 中讀到 SRAM 中,然后再?gòu)?SRAM 中輸出到屏幕上。第三層左邊時(shí)鐘的顯示設(shè)計(jì),此部分的顯示有tiles 來(lái)實(shí)現(xiàn),tiles 如何時(shí)鐘里面的數(shù)字,文字可以參考后面 tiles 的設(shè)計(jì)。b) Tiles 的設(shè)計(jì)一個(gè)tile 設(shè)計(jì)為 32X32 的像素,并且附帶 4 為的深度。一共設(shè)計(jì) 72 個(gè) tiles(所有的 tiles 都在下圖)。tiles 存放在 RAM 中,因?yàn)?SRA

7、M中已經(jīng)存放了圖片,沒(méi)有的空間留給 tiles 存放,放在 SDRAM 沒(méi)有 SRAM 中好組織。大寫(xiě)數(shù)字,每一個(gè)都有 4 個(gè) tiles 組合而成,小寫(xiě)的數(shù)字和字母都只由一個(gè) tile 來(lái)實(shí)現(xiàn)。Tiles在屏幕上所放置的位置和位置編號(hào)如下圖所示。(四個(gè) tiles一個(gè)大數(shù)字):(tiles 在屏幕上的顯示位置):c) 混色的設(shè)計(jì)混色的問(wèn)題就是解決背景色和時(shí)間數(shù)字,圖片的疊加問(wèn)題。我們引進(jìn)并設(shè)置 alpha 值來(lái)解決這個(gè)問(wèn)題,alpha 值是調(diào)整顏色深度的一個(gè)指標(biāo),它滿(mǎn)足下面這個(gè)公式:d) 著色的設(shè)計(jì)的設(shè)計(jì)很簡(jiǎn)單,既是將每一個(gè) tile 的顏色值 R,G,B 都改成 11111111(這種情況

8、就是白色)。e) SRAM 的結(jié)構(gòu)設(shè)計(jì)SRAM 僅僅實(shí)現(xiàn)一個(gè)功能,既是 256X1024 的 16 位的幀輸出緩存器。但是因?yàn)橛野脒吰聊坏姆直媛适?320X480,而 SRAM 每一行最大只能存 256 個(gè)像素,因此我們想要將內(nèi)存結(jié)構(gòu)設(shè)計(jì)的簡(jiǎn)單,可以將圖片的于系統(tǒng)的設(shè)計(jì)。那么 SRAM 中就會(huì)有那些內(nèi)存)。f) 硬件和軟件的接口格式設(shè)計(jì)為 160X240,這樣內(nèi)存結(jié)構(gòu)就很清晰了,有利顯示到屏幕上的一部分內(nèi)存了(列數(shù)大于 60 的我們整個(gè)系統(tǒng)中,地址線將作為兩種用處,其一是傳輸數(shù)據(jù),其二是命令g) 命令的提交設(shè)計(jì)。為了防止命令時(shí)序的,我們?cè)谠O(shè)置命令提交時(shí),在 RAM 中設(shè)計(jì)了一個(gè) ring 用來(lái)

9、存放命令,并且設(shè)計(jì)了兩個(gè)指針,一個(gè)指向 head,一個(gè)指向 back。當(dāng)有命令提交時(shí),head 加一,當(dāng)命令完成時(shí) back 加一,CPU 所執(zhí)行的任務(wù)就是 back 所指向指向的是同一個(gè)位置時(shí),說(shuō)明ring 里面沒(méi)有命令了。令,當(dāng) back 和 head4.3.2:8MB SDRAMSDRAM 中為處理器存放指令和數(shù)據(jù)。它基本上是由 SOPC 來(lái)實(shí)現(xiàn)的,作為處理器的高速緩存。4.3.3:Time keeper在 50Mhz 的時(shí)鐘下,VGA設(shè)備每 5 千萬(wàn)個(gè)時(shí)鐘周期會(huì)產(chǎn)生一個(gè)中斷信號(hào)用來(lái)給數(shù)字鐘計(jì)時(shí),也就是每隔一秒產(chǎn)生一個(gè)時(shí)鐘信號(hào)。在有按鍵發(fā)生時(shí),VGA設(shè)備也會(huì)相應(yīng)的產(chǎn)生一個(gè)中斷信號(hào),用來(lái)改

10、變顯示的數(shù)據(jù)。實(shí)現(xiàn)相應(yīng)的功能。5.系統(tǒng):原代碼的圖形為:修改以后得到的圖形為:6.總結(jié):6.1 心得體會(huì)本次課題中出現(xiàn)了很多問(wèn)題,其中最為主要的一些問(wèn)題是如下幾個(gè)方1.版本問(wèn)題:我用的是Quartus 9.1。在 sopc Builder 生成系統(tǒng)發(fā)生兩個(gè)錯(cuò)誤原作者編寫(xiě) timer 模塊和 fdc_模塊的地址(address),輸入輸出數(shù)據(jù)端口(readdata,writedata)定義類(lèi)型unsigned 但在 9.1 里不支持這種類(lèi)型。解決方案:改變他們?nèi)齻€(gè)類(lèi)型然后在編譯按錯(cuò)誤找出其他地方類(lèi)型不一致的地方用強(qiáng)制類(lèi)型轉(zhuǎn)換。2.WIN7 系統(tǒng)和 Nios 不兼容造成編譯失敗,只 有少數(shù)情況下才

11、較大而 heap size 設(shè)置太小的造成的. 而多重復(fù)幾次可以。因?yàn)楣こ涛募鹊氖且驗(yàn)檫@個(gè),結(jié)果積累makefile 牽涉到許多次的編譯以及工作,而其中的 heap 沒(méi)有得到很好的下來(lái)就超過(guò)了所設(shè)置的heap 大小??梢栽?64 位操作系統(tǒng)里面沒(méi)有這種問(wèn)題。6.2 待改進(jìn)的功能待改進(jìn)的功能就是,將數(shù)字的顯示的空格區(qū)間全部填滿(mǎn),這樣看起來(lái)更加舒服。還有可以添加的是秒表計(jì)時(shí)器,用來(lái)精確計(jì)時(shí)。在鬧鐘部分把鬧鐘顯示到屏幕上并用 key 來(lái)調(diào)時(shí)間,鬧鐘的相應(yīng)部分我已經(jīng)做出來(lái)了。6.3 修改部分鬧鐘部分:此鬧鐘達(dá)到預(yù)定的時(shí)間點(diǎn)時(shí)啟動(dòng)LED發(fā)光延遲一段時(shí)間就關(guān)閉。這部分鬧鐘有點(diǎn)簡(jiǎn)單,以后可以把鬧鐘部分顯示

12、到屏幕上來(lái)調(diào).void comparator()/鬧鐘實(shí)現(xiàn)int i;if(bellhours=hours&&bellminutes=minutes&&bellseconds=seconds)for(i=0;i<10;i+)IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,1);/LED發(fā)光usleep(100000); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0);調(diào)鬧鐘:void alter_sec(void)bellseconds+;if(bellseconds>59 )

13、bellseconds=0;void alter_min(void)bellminutes+;if(bellminutes >59)bellminutes=0;void alter_hou(void)bellhours+;if(bellhours >23)bellhours = 0;/按鍵中斷服務(wù)void KEY_ISR(void* context,alt_u32 id)IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE, 0);IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_PIO_BASE, 0xff); flag=

14、IORD_ALTERA_AVALON_PIO_DATA(TIMERMODULE_BASE);if(flag)int button_value = IORD_ALTERA_AVALON_PIO_DATA(KEY_PIO_BASE);/取按鍵值if(button_valuealter_sec();&0x01)=0)/比較按鍵值并調(diào)鬧鐘if(button_valuealter_min();if(button_valuealter_hou();/按鍵初始化&0x02)=0)&0x04)=0)void button_init()IOWR_ALTERA_AVALON_PIO_IRQ

15、_MASK(KEY_PIO_BASE, 0xff); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE, 0x0);alt_irq_register(KEY_PIO_IRQ, NULL,(void*)KEY_ISR);a) 圖片的替換圖片的替換是將我們生成的圖片放到顯示器上顯示,將原來(lái)程序中的圖片去掉。具體做法是,首先,在網(wǎng)上python 軟件然后就用在 helpercode 的toarray.py 文件生成為.h 式的文件,然后將每一個(gè)文件當(dāng)做頭文件,替換掉原來(lái)的圖片文件。然后將main.c 中的相應(yīng)部分進(jìn)行改動(dòng),首先是include 處,將那些被我們

16、刪除了的頭文件的include 去掉,并且添加新的include,用來(lái) include 新的圖片頭文件。其次,將圖片數(shù)組unsigned short *ima 中的名稱(chēng)相應(yīng)的替換成我們的圖片文件名。最后,將圖片高度數(shù)組iheightsNUM_PICS相應(yīng)圖片高度替換成現(xiàn)有圖片高度。這樣,即可完成對(duì)圖片的替換。b) 數(shù)字突出行修改數(shù)字突出修改是將數(shù)字時(shí)鐘顯示時(shí)間的數(shù)字背景顏色進(jìn)行修改,我們這一部分的修改是在硬件 vhdl 代碼中進(jìn)行的,通過(guò)對(duì)代碼的閱讀與理解,我么發(fā)現(xiàn)在該代碼中,fdc_.vhd主要寫(xiě)的是有關(guān)圖片顯示,時(shí)鐘數(shù)字顯示,背景顏色生成,數(shù)字改變動(dòng)畫(huà)的實(shí)現(xiàn)這么幾個(gè)功能。因此,我們要修改背

17、景顏色,就必須在 fdc_.vhd 中修改相應(yīng)的代碼。在fdc_.vhd 中,我們通過(guò)閱讀代碼發(fā)現(xiàn),可以通過(guò) alpha 的值來(lái)數(shù)字背景的顏色是哪一段,因?yàn)?alpha 的時(shí)表示的是混色的深度,當(dāng) alpha 為 0 時(shí),表明表面的顏色的0,也就是說(shuō)該處表面顏色完以看到,了背景的顏色,因此,找到 alpha 為 0 的代碼,我們可if alpha = x"0" then- Show the background-no occlusionVGA_R<=(others => '0');-std_logic_vector(bg_x);VGA_B<

18、=std_logic_vector(bg_x);-std_logic_vector(bg_y);VGA_G<=std_logic_vector(bg_y);- (others => '0');以上代碼,后面的注釋部分(每一行兩個(gè)杠之后的代碼是注釋部分,兩個(gè)杠指的是-)是原代碼的寫(xiě)法,原代碼修改了,也就是將 R,G,B 三個(gè)通道的值的生成方法變了一下,就實(shí)現(xiàn)了顏色的變換。因?yàn)樵创a這個(gè)地方的顏色生成方法與背景的一樣,這樣看起來(lái)這部分的顏色就和背景顏色一個(gè)樣,但是這樣的話(huà),我感覺(jué)不夠使得數(shù)字顯眼,因此此處的背景顏色生成函數(shù)進(jìn)行修改變化。也就是上面代碼的修改方法。但是這樣

19、后,發(fā)現(xiàn)數(shù)字突出行效果并不好,于是又將數(shù)字突出行的背景顏色直接改為只有紅色的狀態(tài),代碼如下:if alpha = x"0" then- Show the background-no occlusionVGA_R VGA_BVGA_G<=<=<=std_logic_vector(bg_x); (others => '0');(others => '0');c) 背景顏色修改通過(guò)上面 b)的分析,可以知道,背景顏色就是當(dāng) alpha 值為 1 的時(shí)候的顏色,也就是說(shuō) toplevel 的顏色為全透明時(shí)顯示的顏色。我們

20、找到了該段代碼,并進(jìn)行修改:if alpha = x"0" thenelse- Show the background - no occlusionVGA_R <=gai guo(others => '0');-std_logic_vector(bg_x);-xiuVGA_B <=std_logic_vector(bg_x);-std_logic_vector(bg_y);VGA_G <=std_logic_vector(bg_y);-(others => '0');end if;在該部分代碼,R,G,B 三個(gè)通

21、道的值的生成方法進(jìn)行了改變,將 R 的生成方法改成 G的,將 B 的生成方法改成 R 的,將 G 的生成方法改成 B 的,這樣就得到了我們最后的背景顏色。d) 數(shù)字高亮度選中顏色修改由于原作者在寫(xiě)設(shè)置時(shí)鐘時(shí)間的代碼時(shí),將選中顏色調(diào)的很不明顯,因此,該處的顏色修改成容易分辨的。選中要修改的部分時(shí),就是TINT 為 1 的時(shí)候,這時(shí)候,顏色進(jìn)行改變,代碼如下:if tint = '1' thentemp13(C15 -:= ("111111111" * alpha) + (bg_x(9 downtoalpha);1)*VGA_R<= std_logic_v

22、ector(temp13(12 downto 3);temp13 := ("001001000" * alpha) + bg_y(9 downto(C15 - alpha);1)*VGA_B <= std_logic_vector(temp13(12 downto 3);此代碼中,VGA_R 與VGA_B 的顏色值都是混色而來(lái)的,該處的基色進(jìn)行修改,也就是temp13 的第一項(xiàng),我們都改成了 111111111。這樣生成的顏色就比較顯眼了,能夠讓人一眼看出來(lái)修改的部分是那一部分的時(shí)間。7.源程序:(注釋與代碼之比大于 1:3)#include #include#inc

23、lude<io.h><system.h><stdio.h>#include<altera_avalon_pio_regs.h> #include <unistd.h>#include <system.h>/* -Automatically generatedstart*/headers#include #include #include#include"BitstreamVeraMono.h" "fg_asianlick.h" "fg_aiguang.h"&quo

24、t;fg_bridge.h"/#include "fg_library.h"/#include "fg_cmongler.h"#include #include #include#include"fg_cone.h" "fg_dice.h" "fg_farm.h""fg_frogdog.h"#include "fg_japcar.h"#include "fg_lionking.h"/*#include "fg_sna

25、il.h"#include #include #include#include"fg_osprey.h" "fg_raptor.h" "fg_sagan.h""fg_joseph.h"*/#include"me.h" #include"meijing.h" #include"meijing1.h" #include"meijing2.h" #include"meijing3.h" #include"

26、;wa.h" #include"wa1.h"#include"think.h"/*Automaticallyheaders end -*/generated/*-Definitions-*/#define #define #define #define #define #define #define #define #define #define #define #define#defineOP_WRITE (0x0 << 1) /0000 OP_SET_VERT_OFFSET (0x1 << 1) /0010 OP_S

27、EEK_ROW (0x4 << 1) /0040 OP_TILE_SET_CURRENT (0x5 << 1) /0050OP_TILE_WRITE (0x6 << 1) /0060OP_TILE_SEEK (0x7 OP_TILE_TO_CHANGEOP_TILE_CHANGE_TO<< 1) /0070(0x8(0xA<< 1) /0080<< 1) /00A0(0xB << 1) /00B0OP_TILE_SET_ANIM_STATEOP_TINT (0xC << 1) /00C0 OP_TI

28、LE_TRANSFORMER_CHANGE (0xD << 1) /00D0 SEE_THRU 2047NUM_PICS 18/*-End_Definitions-*/*-Arrays_and_Variable_Definitions*/const int daytext79 = /tiles 顯示位置的編號(hào)TILE_blank, TILE_blank, TILE_M, TILE_o, TILE_n, TILE_d, TILE_a,TILE_y, TILE_blank,/這一行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_blank, TILE_T, TILE_u, T

29、ILE_e, TILE_s, TILE_d, TILE_a,TILE_y, TILE_blank,/這二行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_W, TILE_e, TILE_d, TILE_n, TILE_e, TILE_s, TILE_d, TILE_a,TILE_y,/這三行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_blank, TILE_T, TILE_h, TILE_u, TILE_r, TILE_s, TILE_d,TILE_a, TILE_y,/這四行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_blank, TILE_blank,

30、 TILE_F, TILE_r, TILE_i, TILE_d, TILE_a,TILE_y, TILE_blank,/這五行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_blank, TILE_S, TILE_a, TILE_t, TILE_u, TILE_r, TILE_d,TILE_a, TILE_y,/這六行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILETILE_blank, TILE_blank, TILE_S, TILE_u, TILE_n, TILE_d, TILE_a,TILE_y, TILE_blank,/這七行是顯示器第一行的TILE的相應(yīng)位置的各個(gè)TILE;

31、/-時(shí)間的初始化-int int intintsecondsminutes hours = 54;= 59;11;letterDay = 0; / 0 is monday, 1 tuesday, etc., used for displayingdays in wordsint int int int int intintday = 18;year = 11; / 20XX month = 12; bellseconds=20; bellminutes=0; bellhours=12; bell;/position 0 is minutes,1 is hours,2 is am or pm,

32、3 is day, 4 is month,5 is yearint incrementposition = 0;int flag=0;/ stores the last second in which a button was pressed, used to resettintinttintTimerSeconds = 0;intintPM = 1; /if 0, its PM. 1 = PMtint = 0; / if tint is 1 then whatever incrementposition is shouldbe tintedint intintx = 0;y = 0;time

33、sThrough = 0;unsigned short posPrev;int currentPicRow = 0;int currentPic = 0;unsignedunsignedint lfsr = 0xACE1u;randpic;unsigned unsigned unsignedunsignedshort short shortshortday_change; long_month; short_month;end_month;/* -List ofavailable images -*/unsigned short *imagesNUM_PICS imagesNUM_PICS=/

34、名字為fg_cmongler的圖片存放在/ fg_cmongler,/fg_asianlick, fg_frogdog, fg_farm, fg_japcar, fg_aiguang, fg_bridge,/ fg_hustgate,/ fg_library, fg_cone, fg_dice, fg_lionking,/ fg_snail,/ fg_osprey,/fg_raptor,/ fg_sagan,/fg_joseph, me,meijing, meijing1, meijing2, meijing3, wa,wa1, think, fg_frogdog, fg_farm,fg_ja

35、pcar,;/* *List*/int heightsNUM_PICS =/ 176, /* cmongler */194, asianlick 138, /* frogdog */ 90, /* farm */ 226,/ japcar99, /* aiguang */ 108, /* bridge */ 98, /* chair */125, /* daqiao */144, /* hust */94, /* gaotie */ 99, /* hustgate */ 108, /* library */oftheheightsoftheimagesabove142,108,102,/*/*

36、/*cone */dice */ lionking */86, /* snail */95, /* osprey */164, /* raptor */119, /* sagan */189 /* jospeh */ 108,/me 94,/meijing 93,/meijing1 108,/meijing2 102,/meijing3 108,/think 144,/wa108,/wa1138,90,226,;/*-Random NumberFunction-*/void random_number() /產(chǎn)生隨機(jī)數(shù),用來(lái)隨機(jī)選取圖像unsigned int bit;do /先做一系列的位運(yùn)

37、算,得到lfsr的值bit = (lfsr >> 0) (lfsr >> 2) (lfsr >> 3) (lfsr >>5) & 1; lfsr = (lfsr >> 1) | (bit << 15); while (randpic = lfsr % NUM_PICS); /*運(yùn)算過(guò)后的lfsr的值對(duì)NUM_PICS的值取模后,若等于上一次randpic值,則繼續(xù)做運(yùn)算。若不相等,則將取模后的值賦給randpic,從而保證randpic的值不同,且隨機(jī)*/randpic = lfsr % NUM_PICS;/*-E

38、nd Random Number Function-*/*Setup_Tiles_Function*/void setup_tiles() /在內(nèi)存中tilesint i = 0;int j = 0;for (i = 0; i < 72; i+)IOWR_16DIRECT(VGA_BASE, OP_TILE_SET_CURRENT, i); /將i作為當(dāng)前的tile的標(biāo)號(hào)IOWR_16DIRECT(VGA_BASE, OP_TILE_SEEK, 0); /將0寫(xiě)入所找到的tile的內(nèi)存,起到將當(dāng)前內(nèi)存清零的效果for (j = 0; j < 256; j+) IOWR_16DIRE

39、CT(VGA_BASE,OP_TILE_WRITE, tile_dataij);/將tile的data寫(xiě)入到所找到的當(dāng)前tile的內(nèi)存/* Now blank out centers for clock effect */for (i = 0; i < 32; i+) /將小數(shù)字和字母的tile中間一行改成空白的IOWR_16DIRECT(VGA_BASE, OP_TILE_SET_CURRENT, i); /將i的值賦給當(dāng)前tileIOWR_16DIRECT(VGA_BASE, OP_TILE_SEEK, 15 * 8); /找到下一個(gè)tile,然后賦值15*8for (j = 0;

40、j < 16; j+) IOWR_16DIRECT(VGA_BASE,OP_TILE_WRITE, 0); /將中間的部分全部寫(xiě)0,以達(dá)到中間顯示空白裂縫的目的/* Blank out centers of big number tiles */for (i = 32; i < 72; i+) /將大數(shù)字的4個(gè)tiles所組成的圖片的中間一行改成空白IOWR_16DIRECT(VGA_BASE,OP_TILE_SET_CURRENT, i);if (i-1) % 4 = 1) |shit */(i-1) % 4 = 2) /* CLean up thisIOWR_16DIRECT(

41、VGA_BASE,OP_TILE_SEEK, 0);else IOWR_16DIRECT(VGA_BASE, OP_TILE_SEEK, 31 * 8);for (j = 0; j < 8; j+) IOWR_16DIRECT(VGA_BASE, OP_TILE_WRITE, 0);/*End_Setup_Tiles_Function*/*-Change_Tile_Function-*/void change_tile(const int currentTile, const int newTile, consttransformTile,intconst int animationSt

42、ate, const int tint) /定義并實(shí)現(xiàn)change_tile函數(shù),用來(lái)改變某位置的tile,/以實(shí)現(xiàn)時(shí)鐘數(shù)字,字母的改變 /* This is the only function which changes the tile which thecurrent tile will* animate to ANIMATION state is either 0 for clear, 1 for noanimation, and 2* for animation, but the msb of the animation tells whetherit is part of a* b

43、ig number or small. */IOWR_16DIRECT(VGA_BASE, OP_TILE_TO_CHANGE, currentTile);/執(zhí)行命令,尋找到當(dāng)前需要改變的tileIOWR_16DIRECT(VGA_BASE, OP_TILE_CHANGE_TO, newTile);/執(zhí)行命令,將當(dāng)先需要改變的tile換成要變換/成的tileIOWR_16DIRECT(VGA_BASE, OP_TILE_SET_ANIM_STATE,animationState); /是否對(duì)當(dāng)先tile實(shí)現(xiàn)重力翻/轉(zhuǎn)動(dòng)畫(huà)效果IOWR_16DIRECT(VGA_BASE, OP_TILE_TRA

44、NSFORMER_CHANGE,transformTile);/改變后,指出下一個(gè)需要/改變的tile位置IOWR_16DIRECT(VGA_BASE, OP_TINT, tint);/對(duì)當(dāng)前tile執(zhí)行命令/*-End_Change_Tile_Function-*/*Place_Letter_Days_Function*/void place_letter_days(const int animation, const int tint)/將當(dāng)前日期寫(xiě)到顯示器上/* places the day of week as a word */int x;const int base = 41;fo

45、r (x = 0; x < 9; x+)/選擇tilechange_tile(base + x, daytextletterDayx,daytext(letterDay + 1) % 7x, animation, tint);/*End_Place_Letters_Days_Function*/*-Place_AM_PM_Function-*/void place_am_pm(const int animation, const int tint)/將當(dāng)前的時(shí)間是上午還是下午寫(xiě)到顯示器上change_tile(28, TILE_A+3*PM, TILE_A+3*(PM1), animat

46、ion,tint);change_tile(29, TILE_M, TILE_M, animation, tint);/*-End_Place_AM_PM_Function-*/*Place_Seconds_Function*/void place_seconds() /當(dāng)時(shí)間變了,將時(shí)間的秒顯示到屏幕相應(yīng)位置/if seconds 59, change 10s place to 0 not 6if (seconds = 59) change_tile(25,TILE_0 + seconds/10,TILE_0,2,0);/if seconds singles place is 9, chan

47、ge 10s to plus 1else if (seconds%10=9) change_tile(25,TILE_0 +seconds/10,TILE_0+seconds/10+1,2,0);else change_tile(25,TILE_0 + seconds/10,TILE_0+seconds/10+1,1,0);if (seconds % 10 = 9) change_tile(26,TILE_0 + seconds % 10,TILE_0,2,0);else change_tile(26,TILE_0 + seconds % 10,TILE_0+seconds%10 +1,2,0

48、);/*End_Place_Seconds_Function*/*-Place_Ones_Minutes-*/void place_ones_minutes(const int animation, const int tint)/當(dāng)時(shí)間變了,將時(shí)間的分的個(gè)位顯示到屏幕相應(yīng)位置 int correction;int tileOnes = TILE_0_NW + 4 * (minutes % 10);if (minutes % 10 = 9) correction = -40;else correction = 0;change_tile(8, tileOnes, tileOnes + 4 +

49、correction, animation, tint);change_tile(9, tileOnes + 1, tileOnes + 5 + correction, animation, tint);change_tile(18, tileOnes + 2, tileOnes + 6 +correction, animation, tint);change_tile(19, tileOnes + 3, tileOnes + 7 + correction,animation, tint);/*-End_Place_Ones_Minutes-*/*Place_Tens_Minutes*/voi

50、d place_tens_minutes(const int animation, const int tint)/當(dāng)時(shí)間變了,將時(shí)間的分的十位顯示到屏幕相應(yīng)位置 int correction;int tileTens = TILE_0_NW + 4 * (minutes / 10);if (minutes/10 = 5) correction = -24;else correction = 0;change_tile(6, tileTens, tileTens + 4 + correction, animation, tint);change_tile(7, tileTens + 1, tileTens + 5 + correction, animation,tint);change_tile(16, tileTens + 2, tileTens + 6 +correction, animation,tint);change_tile(17, tileTens + 3, tileTens + 7 + correction,animation, tint);/*End_Place_Tens_Minutes*/*-Place_Ones_Hours

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論