




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章VGA圖形圖像顯示控制器12.1CRT顯示器原理12.2VGA同步電路12.3像素產(chǎn)生電路12.4位圖顯示方案本章小結(jié)
12.1CRT顯示器原理
12.1.1CRT顯示的基本原理
CRT顯示的基本框圖如圖12-1所示,電子槍(陰極)產(chǎn)生會(huì)聚的電子束,穿過真空管后最終撞擊到熒光屏上,在電子撞擊在熒光屏的一剎那產(chǎn)生光。由于外部輸入信號(hào)的電壓不同,電子束的強(qiáng)度和撞擊點(diǎn)的亮度就會(huì)不同,從而能夠形成不同的顏色和亮度。在圖12-1上用mono標(biāo)識(shí)外部輸入信號(hào),mono信號(hào)是電壓值范圍在0~0.7V的模擬信號(hào)。圖12-1CRT顯示器結(jié)構(gòu)框圖顯示器的掃描方式是由外部控制電路中的垂直偏轉(zhuǎn)和水平偏轉(zhuǎn)控制的電子束的運(yùn)動(dòng)方向決定的。在現(xiàn)代顯示器中,一般電子束的運(yùn)動(dòng)是在一個(gè)固定的模式下,水平方向從左到右,垂直方向從上到下,按照如圖12-2箭頭所示的方向掃描的。圖12-2CRT顯示器掃描模式12.1.2視頻顯示基本術(shù)語
1.像素與分辨率
顯示器上輸出的所有信息,包括數(shù)值、文字、圖表、動(dòng)畫等都是由電子束撞擊熒光屏產(chǎn)生的光點(diǎn)(也就是像素)構(gòu)成的。組成屏幕顯示畫面的最小單位是像素。像素之間的最小距離為點(diǎn)距(Pitch),點(diǎn)距越小,像素密度越大,畫面越清晰。顯示器的點(diǎn)距有0.31mm、0.28mm、0.24mm、0.22mm等多種。
分辨率是指整屏顯示的像素多少,是衡量顯示器的一個(gè)常用指標(biāo)。它同屏幕尺寸以及點(diǎn)距密切相關(guān),可用屏幕實(shí)際顯示的尺寸與點(diǎn)距相除來近似求得。點(diǎn)距為0.28mm的15英寸顯示器,其分辨率最高為1024×768。
2.掃描頻率
電子束從屏幕的左上角一點(diǎn)開始,向右逐點(diǎn)進(jìn)行掃描,形成一條水平線,到達(dá)最右端后,又回到下一條水平線的左端,重復(fù)上面的過程。當(dāng)電子束完成右下角一點(diǎn)的掃描后,形成一幀,此后電子束又回到左上方起點(diǎn),開始下一幀的掃描。完成一行掃描所需的時(shí)間稱為水平掃描時(shí)間,其倒數(shù)稱為行頻率(簡(jiǎn)稱行頻);完成一幀(整個(gè)屏幕)掃描所需的時(shí)間稱為垂直掃描時(shí)間,其倒數(shù)為垂直掃描頻率,又稱屏幕刷新率或場(chǎng)頻。常見的屏幕刷新率有60Hz、75Hz等,標(biāo)準(zhǔn)VGA顯示器的場(chǎng)頻為60Hz,行頻為31.5kHz。
3.顯示帶寬
顯示帶寬即顯示器可以處理的頻率范圍。如果是VGA方式,刷新率為60Hz,則其帶寬達(dá)640×480×60=18.4MHz;如果是SVGA標(biāo)準(zhǔn),刷新率為70Hz,分辨率為1024?×?768,則其帶寬為1024×768×70=55.1MHz。12.1.3S3開發(fā)板上的VGA端口
在VGA端口有5根信號(hào)線,包括水平同步信號(hào)(hsync)線、垂直同步信號(hào)(vsync)線以及三根視頻信號(hào)線(R、G、B)。物理上采用標(biāo)準(zhǔn)的DB—15連接器連接顯示器和開發(fā)板。視頻信號(hào)屬于模擬信號(hào),所以視頻控制器需要一個(gè)D/A轉(zhuǎn)換器將數(shù)字信號(hào)轉(zhuǎn)換成模擬電平。如果某個(gè)視頻信號(hào)采用N位數(shù)字信號(hào)表示,那么可以轉(zhuǎn)換成2N種電平,三根視頻信號(hào)線可以產(chǎn)生23N種不同的顏色。在S3板子上,每位視頻信號(hào)用1位數(shù)字信號(hào)表示,所以三根視頻信號(hào)線總共可以產(chǎn)生8種顏色,如表12-1所示,雖然能夠顯示的顏色不多,但是對(duì)于我們理解VGA的時(shí)序原理以及顯示簡(jiǎn)單的字符和圖形是足夠用的。12.1.4VGA視頻控制器
VGA顯示控制器的設(shè)計(jì)實(shí)質(zhì)上就是完成VGA顯示的功能。
(1)在一定的工作頻率下,產(chǎn)生正確的時(shí)序關(guān)系(工作時(shí)鐘信號(hào)、水平同步信號(hào)(hsync)、垂直同步信號(hào)(vsync)、消隱信號(hào)之間的關(guān)系);
(2)在正確的時(shí)序控制下讀出視頻數(shù)據(jù)輸出信號(hào),其簡(jiǎn)單的原理框圖如圖12-3所示,主要包含同步電路產(chǎn)生模塊和像素產(chǎn)生電路。
VGA同步電路模塊產(chǎn)生相關(guān)時(shí)序和同步信號(hào)。其核心電路為一個(gè)計(jì)數(shù)器,計(jì)數(shù)器的輸出信號(hào)為pixel_x和pixel_y,反映了當(dāng)前掃描像素的位置,而水平同步信號(hào)hsync和垂直同步信號(hào)vsync也是由內(nèi)部計(jì)數(shù)器譯碼產(chǎn)生的,它們與VGA端口連接并控制顯示器的水平和垂直掃描。VGA同步電路還產(chǎn)生video_on信號(hào),控制是否使能顯示,具體電路后面將詳細(xì)介紹。
像素產(chǎn)生電路主要產(chǎn)生RGB視頻信號(hào)。視頻信號(hào)色彩值根據(jù)當(dāng)前像素坐標(biāo)(pixel_x和pixel_y)以及外部控制和數(shù)據(jù)信號(hào)組成。這部分電路在后邊的章節(jié)中會(huì)詳細(xì)介紹。圖12-3VGA視頻控制器原理框圖
12.2VGA同步電路
VGA同步電路產(chǎn)生hsync信號(hào)和vsync信號(hào),它們分別代表了電子束掃描一行和整個(gè)屏幕所需要的時(shí)間。下面以分辨率為640×480,顯示帶寬為25MHz的VGA顯示模式舉例。
CRT顯示器通常包含有一圈黑邊,屬于消隱區(qū),即不可視區(qū)域。如圖12-4所示,中間矩形部分屬于可視區(qū)。需要注意的是,通常我們定義屏幕的垂直坐標(biāo)軸是從上至下的,也就是說屏幕坐標(biāo)的左上角坐標(biāo)為(0,0),而右下角坐標(biāo)為(639,479)。12.2.1水平同步
水平同步詳細(xì)時(shí)序如圖12-4所示,水平信號(hào)包含800像素,并且分成4個(gè)區(qū)域。
(1)顯示區(qū):屏幕上實(shí)際能夠顯示的像素位置。其長(zhǎng)度為640個(gè)像素點(diǎn)。
(2)折回區(qū):電子束返回左邊界時(shí),由于顯示器的原因,需要禁止視頻信號(hào)的區(qū)域。其長(zhǎng)度為96個(gè)像素點(diǎn)。
(3)右邊界區(qū):顯示屏右邊界顯示區(qū),也稱為前沿(折回之前),同樣需要禁止視頻信號(hào)輸出。其長(zhǎng)度為16個(gè)像素點(diǎn)。
(4)左邊界區(qū):顯示屏左邊界顯示區(qū),也稱為后沿(折回之后),同樣需要禁止視頻信號(hào)輸出。其長(zhǎng)度為48個(gè)像素點(diǎn)。需要注意的是,對(duì)于不同的顯示器,左右邊界區(qū)的像素點(diǎn)數(shù)有所差異。
hsync信號(hào)由模800計(jì)數(shù)器和譯碼電路產(chǎn)生。在圖12-4上,計(jì)數(shù)器標(biāo)注在hsync信號(hào)上面。我們從顯示區(qū)的開始點(diǎn)開始計(jì)數(shù),這樣一來,就可以直接利用計(jì)數(shù)器的輸出作為水平坐標(biāo)值。計(jì)數(shù)器輸出直接送到pixel_x信號(hào),當(dāng)計(jì)數(shù)器計(jì)數(shù)在656~751之間時(shí),hsync信號(hào)輸出為低;其它時(shí)刻時(shí),hsync信號(hào)輸出為高。
由于CRT顯示器在左右邊界以及折回區(qū)輸出為黑屏,所以我們采用h_video_on信號(hào)反映當(dāng)前水平坐標(biāo)是否在顯示區(qū),當(dāng)像素計(jì)數(shù)值小于640時(shí)h_video_on有效。圖12-4水平掃描時(shí)序圖12.2.2垂直同步
在垂直掃描過程中,電子束首先從顯示器的開始位置掃描到底部,然后返回到開始進(jìn)行掃描,這個(gè)過程需要的時(shí)間為刷新整個(gè)屏幕的時(shí)間。垂直同步信號(hào)vsync的時(shí)序產(chǎn)生與水平同步信號(hào)hsync相似,如圖12-5所示。對(duì)于垂直掃描而言,掃描基本移動(dòng)單元就是水平掃描線,vsync信號(hào)周期為525根水平掃描線,整個(gè)可以劃分為四個(gè)區(qū)域。圖12-5垂直掃描時(shí)序圖
(1)顯示區(qū):在屏幕上水平掃描線可以顯示的區(qū)域。其長(zhǎng)度為480(水平掃描線)。
(2)折回區(qū):電子束返回到屏幕頂部時(shí),視頻信號(hào)需要禁止的區(qū)域。其長(zhǎng)度為2(水平掃描線)。
(3)底部邊界:顯示區(qū)底部區(qū)域,也稱為前端(折回之前),視頻信號(hào)需要禁止的區(qū)域。其長(zhǎng)度為10(水平掃描線)。
(4)頂部邊界:顯示區(qū)頂部區(qū)域,也稱為后端(折回之后),視頻信號(hào)需要禁止的區(qū)域。其長(zhǎng)度為33(水平掃描線)。與水平掃描一樣,顯示器不同,底部和頂部邊界長(zhǎng)度也不同。
vsync信號(hào)同樣是由一個(gè)模525的計(jì)數(shù)器譯碼產(chǎn)生的,計(jì)數(shù)器在顯示區(qū)開始時(shí)刻計(jì)數(shù),這樣,我們就可以直接使用計(jì)數(shù)器的輸出作為垂直方向(y軸)坐標(biāo),用pixel_y表示。vsync信號(hào)在計(jì)數(shù)器計(jì)數(shù)值為490或者491時(shí)為低,其它情況為高。
與水平同步處理方法一樣,采用v_video_on信號(hào)作為反映當(dāng)前坐標(biāo)是否顯示的標(biāo)志信號(hào),當(dāng)水平掃描線計(jì)數(shù)值小于480時(shí)有效。12.2.3HDL實(shí)現(xiàn)
經(jīng)過上述討論,理解了同步時(shí)序電路模塊的功能。假設(shè)系統(tǒng)時(shí)鐘為25MHz,那么可以直接使用它產(chǎn)生一個(gè)模800計(jì)數(shù)器和一個(gè)模525計(jì)數(shù)器,分別用來產(chǎn)生水平掃描和垂直掃描同步信號(hào),由于在驗(yàn)證板上采用的時(shí)鐘為50MHz,為了不違背同步電路設(shè)計(jì)原則,在產(chǎn)生25MHz的時(shí)鐘時(shí)還需要采用一個(gè)時(shí)鐘脈沖使能信號(hào)來啟動(dòng)或者停止計(jì)數(shù)器。這個(gè)時(shí)鐘脈沖信號(hào)同樣連接在p_tick端口,作為像素產(chǎn)生電路的坐標(biāo)信號(hào)。實(shí)現(xiàn)hsync同步電路功能如程序12-1所示,它包含一個(gè)模2計(jì)數(shù)器(用來產(chǎn)生25MHz使能脈沖信號(hào))、針對(duì)產(chǎn)生水平同步和垂直同步信號(hào)的計(jì)數(shù)器。我們使用兩個(gè)狀態(tài)信號(hào)h_end和v_end信號(hào)表示完成水平和垂直掃描。在程序設(shè)計(jì)中,應(yīng)該將所有代表掃描區(qū)域值的常數(shù)定義為constant,這樣如果刷新率改變,則程序修改起來就很容易。為了降低潛在的干擾,在hsync和vsync信號(hào)的輸出端插入緩沖器,這樣一來,就會(huì)導(dǎo)致一個(gè)時(shí)鐘周期的延遲,所以在像素產(chǎn)生電路中針對(duì)RGB輸出信號(hào)插入緩沖器來匹配此信號(hào)一個(gè)時(shí)鐘周期的延遲。
【程序12-1】VGA同步時(shí)序電路。
modulevga_sync
(
input
wireclk,reset,
output
wirehsync,vsync,video_on,p_tick,
output
wire[9:0]pixel_x,pixel_y
);
//常數(shù)定義
//VGA640?×?480同步參數(shù)
localparamHD=640; //水平顯示區(qū)域
localparamHF=48; //水平掃描左邊界
localparamHB=16; //水平掃描右邊界
localparamHR=96; //水平折回區(qū)
localparamVD=480; //垂直顯示區(qū)域
localparamVF=10; //垂直掃描頂部邊界
localparamVB=33; //垂直掃描底部邊界
localparamVR=2; //垂直折回區(qū)
//模2計(jì)數(shù)器
regmod2_reg;
wiremod2_next;
//同步計(jì)數(shù)器
reg[9:0]h_count_reg,h_count_next;
reg[9:0]v_count_reg,v_count_next;
//輸出緩沖器
regv_sync_reg,h_sync_reg;
wirev_sync_next,h_sync_next;
//狀態(tài)信號(hào)
wireh_end,v_end,pixel_tick;
always@(posedgeclk,posedgereset)
if(reset)
begin
mod2_reg<=1'b0;
v_count_reg<=0;
h_count_reg<=0;
v_sync_reg<=1'b0;
h_sync_reg<=1'b0;
end
else
begin
mod2_reg<=mod2_next;
v_count_reg<=v_count_next;
h_count_reg<=h_count_next;
v_sync_reg<=v_sync_next;
h_sync_reg<=h_sync_next;
end
//模2計(jì)數(shù)器產(chǎn)生25MHz時(shí)鐘使能信號(hào)
assignmod2_next=~mod2_reg;
assignpixel_tick=mod2_reg;
//狀態(tài)信號(hào)
//水平掃描計(jì)數(shù)器結(jié)束信號(hào)(799)
assignh_end=(h_count_reg==(HD+HF+HB+HR-1));
//垂直掃描計(jì)數(shù)器結(jié)束信號(hào)(524)
assignv_end=(v_count_reg==(VD+VF+VB+VR-1));
//水平同步掃描模800計(jì)數(shù)器下一狀態(tài)邏輯
always@*
if(pixel_tick) //25MHz脈沖
if(h_end)
h_count_next=0;
else
h_count_next=h_count_reg+1;
else
h_count_next=h_count_reg;
//垂直同步掃描模525計(jì)數(shù)器下一狀態(tài)邏輯
always
@*
if(pixel_tick&h_end)
if(v_end)
v_count_next=0;
else
v_count_next=v_count_reg+1;
else
v_count_next=v_count_reg;
//同步緩沖器
//h_sync_next信號(hào)在計(jì)數(shù)器計(jì)數(shù)值為656和751時(shí)賦值
assignh_sync_next=(h_count_reg>=(HD+HB)&&
h_count_reg<=(HD+HB+HR-1));
//vh_sync_next信號(hào)在計(jì)數(shù)器值為490和491時(shí)賦值
assignv_sync_next=(v_count_reg>=(VD+VB)&&
v_count_reg<=(VD+VB+VR-1));
//產(chǎn)生video_on信號(hào)
assignvideo_on=(h_count_reg<HD)&&(v_count_reg<VD);
//輸出
assignhsync=h_sync_reg;
assignvsync=v_sync_reg;
assignpixel_x=h_count_reg;
assignpixel_y=v_count_reg;
assignp_tick=pixel_tick;
endmodule12.2.4測(cè)試電路
為了驗(yàn)證同步電路,我們首先驗(yàn)證整個(gè)可視區(qū)域能夠顯示一種顏色的情況。將RGB信號(hào)連接在三個(gè)撥碼開關(guān)上,可以通過改變撥碼開關(guān)來顯示8種顏色(如表12-1所示)。驗(yàn)證代碼如程序12-2所示。
【程序12-2】單色可視區(qū)域驗(yàn)證。
modulevga_test
(
input
wireclk,reset,
input
wire[2:0]sw,
output
wirehsync,vsync,
output
wire[2:0]rgb
);
//信號(hào)聲明
reg[2:0]rgb_reg;
wirevideo_on;
//例化vga同步電路
vga_syncvsync_unit
(.clk(clk),.reset(reset),.hsync(hsync),.vsync(vsync),
.video_on(video_on),.p_tick(),.pixel_x(),.pixel_y());
//rgb緩沖器
always@(posedgeclk,posedgereset)
if(reset)
rgb_reg<=0;
else
rgb_reg<=sw;
//邏輯輸出
assignrgb=(video_on)?rgb_reg:3'b0;
endmodule
12.3像素產(chǎn)生電路
像素產(chǎn)生電路用來產(chǎn)生3位的RGB信號(hào)給VGA端口。外部控制信號(hào)和數(shù)據(jù)信號(hào)指定顯示的內(nèi)容,VGA同步電路產(chǎn)生的pixel_x和pixel_y信號(hào)提供當(dāng)前顯示像素的坐標(biāo)。為了能夠更好地理解各種顯示情況,可以將像素產(chǎn)生電路分成三類:(1)按位顯示方案;(2)按區(qū)域顯示方案;(3)按目標(biāo)顯示方案。按位顯示方案中,需要一個(gè)視頻存儲(chǔ)器存儲(chǔ)要顯示在屏幕上的數(shù)據(jù)。屏幕上的每個(gè)像素點(diǎn)對(duì)應(yīng)顯存中的一個(gè)存儲(chǔ)單元。pixel_x和pixel_y信號(hào)作為視頻存儲(chǔ)器的地址。另外,需要一個(gè)視頻處理電路不斷給視頻存儲(chǔ)器寫入新的內(nèi)容,從而更新顯示內(nèi)容;還需要一個(gè)數(shù)據(jù)讀取電路不斷從視頻存儲(chǔ)器中讀回顯示數(shù)據(jù),然后送到VGA端口顯示出來。此種方案也是目前高端視頻控制器所采用的顯示方案。對(duì)于640?×?480分辨率的VGA顯示來說,整個(gè)屏幕約包含310000(640?×?480)個(gè)像素點(diǎn),那么僅僅對(duì)于單色顯示,就需要310kb的視頻存儲(chǔ)器;對(duì)于3位的RGB信號(hào),則需要930kb的視頻存儲(chǔ)器。顯然,對(duì)存儲(chǔ)器的要求比較高。為了降低對(duì)存儲(chǔ)器的要求,可以采用分區(qū)域顯示的方法。即將一組像素點(diǎn)構(gòu)成的顯示區(qū)域塊作為顯示單元,比如說可以定義一個(gè)8?×?8(也就是64像素點(diǎn))的矩形區(qū)域作為顯示單元,那么對(duì)于640?×?480像素點(diǎn)也就是80?×?60個(gè)顯示區(qū)域單元。如此一來,僅僅需要4800個(gè)存儲(chǔ)單元來存儲(chǔ)這些區(qū)域單元的顯示值。每個(gè)顯示區(qū)域的顯示值根據(jù)顯示模式不同而不同。假如一共有32種顯示模式,那么每個(gè)存儲(chǔ)單元需要5bit來表示,整個(gè)視頻存儲(chǔ)器的容量為24kb。分區(qū)域顯示方案中,經(jīng)常需要一個(gè)ROM來存儲(chǔ)每種模式的顯示值,稱為模式存儲(chǔ)器。假設(shè)在前面的例子中我們采用單色顯示,那么每個(gè)8?×?8模式需要64bit,32種模式共需要模式存儲(chǔ)器容量為2kb(8?×?8?×?32),所以總共需要的存儲(chǔ)器容量為26kb,遠(yuǎn)遠(yuǎn)小于按位顯示的310kb存儲(chǔ)器。在顯示字符的應(yīng)用中,我們經(jīng)常采用此種方案。在有些應(yīng)用中,視頻顯示會(huì)比較簡(jiǎn)單,只包含一些簡(jiǎn)單的圖形,這時(shí)在顯示器上會(huì)有大量的地方都不顯示任何東西。可以采用簡(jiǎn)單的圖形產(chǎn)生電路產(chǎn)生這些圖形,其它地方不予考慮,這種方法稱為按目標(biāo)顯示。
以上三種顯示方案可以混合使用。比如說可以采用按位顯示產(chǎn)生背景,采用按目標(biāo)顯示產(chǎn)生主要的圖形?;蛘呖梢圆捎冒次伙@示某個(gè)區(qū)域的畫面而按區(qū)域顯示的方式顯示另外一個(gè)區(qū)域??偠灾梢造`活地搭配。下面舉例來說明像素產(chǎn)生電路的不同顯示方法。如圖12-6所示,包含三個(gè)顯示圖形,整體方案包括三個(gè)圖形產(chǎn)生電路和一個(gè)顯示模塊。該模塊負(fù)責(zé)選擇顯示圖像并送到顯示端口,稱為rgb_mux模塊。圖12-6多目標(biāo)圖像像素產(chǎn)生框圖圖形產(chǎn)生電路的功能包括:
(1)比較當(dāng)前圖形的顯示坐標(biāo)由pixel_x及pixel_y信號(hào)提供的當(dāng)前掃描坐標(biāo)。
(2)如果當(dāng)前掃描坐標(biāo)落在了圖形顯示坐標(biāo)區(qū)域中,那么使obj_i_on信號(hào)有效,表示當(dāng)前顯示有效。
(3)輸出所需要的顏色值到obj_i_rgb信號(hào)。
rgb_mux電路按照優(yōu)先次序選擇顯示圖形進(jìn)行顯示。它首先檢測(cè)每個(gè)圖形對(duì)應(yīng)的obj_i_on信號(hào),然后根據(jù)優(yōu)先級(jí)順序決定顯示對(duì)應(yīng)的obj_i_rgb輸出信號(hào)。12.3.1矩形圖形顯示
矩形圖形從屏幕左邊開始顯示。如圖12-7所示的游戲靜態(tài)圖像,主要包含三個(gè)物體,左邊為墻,中間為矩形球,右邊為目標(biāo)棒。另外,在顯示區(qū)需要顯示矩形球的坐標(biāo)值。需要注意的是,坐標(biāo)值沿Y軸向下增加。圖12-7游戲界面圖考慮如何實(shí)現(xiàn)這堵墻。非常簡(jiǎn)單,首先定義墻的相關(guān)邊界參數(shù)以及尺寸大小,那么在程序中定義如下:
//定義墻的左右邊界
localparamWALL_X_L=32;
localparamWALL_X_R=35;
…
//墻所在區(qū)域像素的顯示
assignwall_on=(WALL_X_L<=pix_x)&&(pix_x<=WALL_X_R);
//墻顯示為藍(lán)色
assignwall_rgb=3'b001; //藍(lán)色顯示目標(biāo)墻的厚度為4個(gè)像素點(diǎn)。我們定義其坐標(biāo)在32到35之間,分別定義為常數(shù)WALL_X_L和WALL_X_R,代表墻在X軸的左右坐標(biāo)。顯示目標(biāo)墻有兩個(gè)輸出信號(hào):wall_on和wall_rgb。wall_on信號(hào)代表目標(biāo)“墻”是否可以顯示,當(dāng)水平掃描到顯示區(qū)域時(shí),wall_on信號(hào)有效;因?yàn)檎麄€(gè)Y軸都被覆蓋,所以Y軸邊界我們無須考慮。wall_rgb信號(hào)賦值為“001”,表示顯示色彩為藍(lán)色。針對(duì)右邊顯示目標(biāo)棒的代碼如下:
//目標(biāo)棒左右邊界定義
localparamBAR_X_L=600;
localparamBAR_X_R=603;
//目標(biāo)棒上下邊界
localparamBAR_Y_SIZE=72;
localparamBAR_Y_T=MAX_Y/2-BAR_Y_SIZE/2;//204
localparamBAR_Y_B=BAR_Y_T+BAR_Y_SIZE-1;
…
//--------------------------------------------
//目標(biāo)棒的顯示區(qū)域
assignbar_on=(BAR_X_L<=pix_x)&&(pix_x<=BAR_X_R)&&
(BAR_Y_T<=pix_y)&&(pix_y<=BAR_Y_B);
//目標(biāo)棒顯示綠色
assignbar_rgb=3'b010; //綠色其實(shí)通過圖12-7可以看出,棒和墻的區(qū)別在于:它的Y軸不是全部顯示的,所以顯示棒需要考慮Y軸邊界。定義棒的長(zhǎng)度為參數(shù)BAR_Y_SIZE,其值為72。由于我們想將目標(biāo)棒放在屏幕的中間,所以棒的頂部邊界用BAR_Y_T表示,其值為Y軸最大值(480/2)減去棒長(zhǎng)度的一半。棒的底部邊界為棒的頂部邊界加上棒的長(zhǎng)度。bar_on信號(hào)的產(chǎn)生與wall_on信號(hào)的產(chǎn)生一樣,只是垂直掃描必須要在棒的Y軸邊界顯示區(qū)之內(nèi)。
用同樣的方法可以在屏幕上顯示球。而要顯示這三個(gè)目標(biāo)物體,需要一個(gè)多路選擇電路,檢測(cè)哪個(gè)目標(biāo)顯示信號(hào)有效,就顯示其對(duì)應(yīng)的rgb信號(hào)。其代碼如下:
//輸出選擇電路
//--------------------------------------------
always@*
if(~video_on)
graph_rgb=3'b000;//blank
else
if(wall_on)
graph_rgb=wall_rgb;
else
if(bar_on)
graph_rgb=bar_rgb;
else
if(sq_ball_on)
graph_rgb=ball_rgb;
else
graph_rgb=3'b110; //背景顏色為黃色檢查video_on信號(hào),如果有效,則輪流檢測(cè)三個(gè)目標(biāo)顯示有效信號(hào),當(dāng)顯示信號(hào)有效時(shí),在其對(duì)應(yīng)掃描區(qū)域顯示目標(biāo)物體。如果沒有顯示有效信號(hào),則顯示背景顏色,輸出“110”黃色。
【程序12-3】目標(biāo)顯示完整代碼。
modulepong_graph_st
(
input
wirevideo_on,
input
wire[9:0]pix_x,pix_y,
output
reg[2:0]graph_rgb
);
//常數(shù)和信號(hào)量聲明
//x,y坐標(biāo)范圍是(0,0)到(639,479)
localparamMAX_X=640;
localparamMAX_Y=480;
//--------------------------------------------
//左邊垂直墻的定義
//--------------------------------------------
//墻的左右邊界定義
localparamWALL_X_L=32;
localparamWALL_X_R=35;
//--------------------------------------------
//右邊垂直棒的定義
//--------------------------------------------
//棒的左右邊界定義
localparamBAR_X_L=600;
localparamBAR_X_R=603;
//棒的上下邊界定義
localparamBAR_Y_SIZE=72;
localparamBAR_Y_T=MAX_Y/2-BAR_Y_SIZE/2;//204
localparamBAR_Y_B=BAR_Y_T+BAR_Y_SIZE-1;
//--------------------------------------------
//矩形球定義
//--------------------------------------------
localparamBALL_SIZE=8;
//球的左右邊界定義
localparamBALL_X_L=580;
localparamBALL_X_R=BALL_X_L+BALL_SIZE-1;
//球的上下邊界定義
localparamBALL_Y_T=238;
localparamBALL_Y_B=BALL_Y_T+BALL_SIZE-1;
//--------------------------------------------
//目標(biāo)輸出信號(hào)
//--------------------------------------------
wirewall_on,bar_on,sq_ball_on;
wire[2:0]wall_rgb,bar_rgb,ball_rgb;
//主體
//--------------------------------------------
//左邊墻
//--------------------------------------------
//墻顯示范圍
assignwall_on=(WALL_X_L<=pix_x)&&(pix_x<=WALL_X_R);
//墻顏色輸出
assignwall_rgb=3'b001;//blue
//--------------------------------------------
//右邊垂直棒
//--------------------------------------------
//棒顯示范圍
assignbar_on=(BAR_X_L<=pix_x)&&(pix_x<=BAR_X_R)&&
(BAR_Y_T<=pix_y)&&(pix_y<=BAR_Y_B);
//棒顏色輸出
assignbar_rgb=3'b010;//green
//--------------------------------------------
//矩形球
//--------------------------------------------
//球顯示范圍
assignsq_ball_on=
(BALL_X_L<=pix_x)&&(pix_x<=BALL_X_R)&&
(BALL_Y_T<=pix_y)&&(pix_y<=BALL_Y_B);
assignball_rgb=3'b100;//球顯示紅色
//--------------------------------------------
//rgb輸出選擇電路
//--------------------------------------------
always
@*
if(~video_on)
graph_rgb=3'b000; //blank
else
if(wall_on)
graph_rgb=wall_rgb;
else
if(bar_on)
graph_rgb=bar_rgb;
else
if(sq_ball_on)
graph_rgb=ball_rgb;
else
graph_rgb=3'b110; //背景顏色為黃色
endmodule
完成像素產(chǎn)生電路后,可以將其與VGA同步電路結(jié)合在一起完成視頻接口。頂層HDL代碼如程序12-4所示。需要注意的是,graph_rgb信號(hào)通過輸出緩沖器送到輸出端口,這與VGA同步電路中同步信號(hào)也是經(jīng)過緩沖器輸出時(shí)序保持一致。
【程序12-4】VGA視頻接口頂層電路。
modulepong_top_st
(
input
wireclk,reset,
output
wirehsync,vsync,
output
wire[2:0]rgb
);
//信號(hào)聲明
wire[9:0]pixel_x,pixel_y;
wirevideo_on,pixel_tick;
reg[2:0]rgb_reg;
wire[2:0]rgb_next;
//主體部分
//例化VGA同步電路
vga_syncvsync_unit
(.clk(clk),.reset(reset),.hsync(hsync),.vsync(vsync),
.video_on(video_on),.p_tick(pixel_tick),
.pixel_x(pixel_x),.pixel_y(pixel_y));
//例化像素產(chǎn)生電路
pong_graph_stpong_grf_unit
(.video_on(video_on),.pix_x(pixel_x),.pix_y(pixel_y),
.graph_rgb(rgb_next));
//rgb緩沖器
always@(posedgeclk)
if(pixel_tick)
rgb_reg<=rgb_next;
//輸出邏輯
assignrgb=rgb_reg;
endmodule12.3.2非矩形目標(biāo)顯示
對(duì)于非矩形目標(biāo)來說,直接檢測(cè)其邊界是非常困難的。有一種更好的辦法,就是將非矩形目標(biāo)以位圖的方式顯示,并根據(jù)位圖產(chǎn)生RGB輸出信號(hào)和顯示允許信號(hào)。下面舉例來解釋。比如,在剛才的游戲界面設(shè)計(jì)中,設(shè)計(jì)了一個(gè)矩形“球”,現(xiàn)在要將這個(gè)矩形“球”變成圓形球,這個(gè)球的位圖顯示如圖12-8所示。這個(gè)圓形目標(biāo)需要按照下面的步驟來生成:
(1)檢測(cè)掃描坐標(biāo)是否在球的8?×?8區(qū)域中。
(2)如果掃描坐標(biāo)在球的8?×?8區(qū)域中,則從位圖中獲取相關(guān)顯示像素。
(3)使用取回來的位圖數(shù)據(jù)生成rgb輸出信號(hào)和顯示允許信號(hào)。圖12-8圓形球的位圖要用HDL語言實(shí)現(xiàn)上述想法,需要定義一個(gè)圖形ROM來存儲(chǔ)位圖數(shù)據(jù),并且用ROM的地址映射電路轉(zhuǎn)換掃描坐標(biāo)為ROM的行與列。下面實(shí)現(xiàn)這個(gè)圓形的“球”。首先,采用case語句實(shí)現(xiàn)存儲(chǔ)圖形位圖數(shù)據(jù)的ROM:
wire[2:0]rom_addr,rom_col;
reg[7:0]rom_data;
…
always
@*
case(rom_addr)
3‘h0:rom_data=8’b00111100; //****
3‘h1:rom_data=8’b01111110; //******
3‘h2:rom_data=8’b11111111; //********
3‘h3:rom_data=8’b11111111; //********
3‘h4:rom_data=8’b11111111; //********
3‘h5:rom_data=8’b11111111; //********
3‘h6:rom_data=8’b01111110; //******
3‘h7:rom_data=8’b00111100; //****
endcase
其次,我們擴(kuò)展圓形“球”程序段,包括圓形位圖映射。為了兼容后面開發(fā)的動(dòng)態(tài)圖形,在圖形顯示邊界我們依然用信號(hào)來代替原來的常數(shù)。具體實(shí)現(xiàn)代碼如下:
//顯示球像素區(qū)域
assignsq_ball_on=
(ball_x_l<=pix_x)&&(pix_x<=ball_x_r)&&
(ball_y_t<=pix_y)&&(pix_y<=ball_y_b);
//映射當(dāng)前像素坐標(biāo)到ROM地址列空間
assignrom_addr=pix_y[2:0]-ball_y_t[2:0];
assignrom_col=pix_x[2:0]-ball_x_l[2:0];
assignrom_bit=rom_data[rom_col];
//像素顯示區(qū)域
assignrd_ball_on=sq_ball_on&rom_bit;
//球顯示紅色
assignball_rgb=3'b100;程序檢測(cè)當(dāng)前掃描坐標(biāo)是否落入矩形球區(qū)域,如果是,則置位顯示允許信號(hào)sq_ball_on。這部分與程序12-3中的處理方法一致,只不過邊界是用信號(hào)量代替了原來的常數(shù)。接下來根據(jù)當(dāng)前掃描坐標(biāo)獲取對(duì)應(yīng)ROM值,如果當(dāng)前掃描坐標(biāo)落入矩形球顯示區(qū)域中,則垂直掃描坐標(biāo)減去球的頂部邊界值為ROM的行地址,同時(shí)水平掃描坐標(biāo)減去球的底部邊界值為ROM的列地址。通過索引查找ROM表,獲取最終位圖數(shù)據(jù),與sq_ball_on相與產(chǎn)生rd_ball_on信號(hào)。在程序中球的顏色直接賦值為紅色。
最后,需要做一個(gè)小小的修改,將sq_ball_on信號(hào)替換為rd_ball_on信號(hào):
…
else
if(rd_ball_on)
graph_rgb=ball_rgb;
…12.3.3動(dòng)態(tài)目標(biāo)顯示
當(dāng)目標(biāo)物體在每次顯示時(shí)不斷改變其位置時(shí),就會(huì)給人運(yùn)動(dòng)的感覺,也就是動(dòng)態(tài)顯示。為了實(shí)現(xiàn)動(dòng)態(tài)顯示,可以用寄存器存儲(chǔ)物體邊界值,然后每次掃描時(shí)更新這個(gè)坐標(biāo)值。在乒乓游戲中,右邊的棒由兩個(gè)按鈕控制,可以上下移動(dòng),然后球可以移動(dòng)和在各個(gè)方向彈跳。下面介紹如何設(shè)計(jì)這兩個(gè)動(dòng)態(tài)顯示的目標(biāo)。
由于VGA控制器的像素頻率為25MHz,整個(gè)屏幕的VGA顯示刷新率為60Hz,所以動(dòng)態(tài)顯示圖形的邊界值寄存器更新頻率至少也為60Hz。我們產(chǎn)生一個(gè)使能脈沖信號(hào)refr_tick,其頻率為60Hz,用來作為邊界值更新的標(biāo)志信號(hào)。首先考慮游戲中右邊的“棒”。為了能動(dòng)態(tài)更新Y軸的坐標(biāo)值,使得“棒”可以靈活地上下移動(dòng),可以分別用兩個(gè)信號(hào)bar_y_t和bar_y_b替換代表頂部和底部邊界的常數(shù),并產(chǎn)生一個(gè)寄存器bar_y_reg信號(hào),存儲(chǔ)當(dāng)前頂部邊界的Y軸坐標(biāo)值。當(dāng)有按鍵按下時(shí),如果rerf_tick信號(hào)有效,則bar_y_reg信號(hào)增加或者減少一個(gè)固定的常量。這個(gè)固定常量定義為一個(gè)常參數(shù)BAR_V,代表了棒的運(yùn)動(dòng)速度。我們假設(shè)btn[1]和btn[0]按鍵用來控制“棒”的上下移動(dòng)。當(dāng)物體移動(dòng)到屏幕的頂部或者底部時(shí),應(yīng)該停止移動(dòng)。更新bar_y_reg信號(hào)的設(shè)計(jì)如下:
//新的Y軸坐標(biāo)
always
@*
begin
bar_y_next=bar_y_reg;//nomove
if(refr_tick)
if(btn[1]&(bar_y_b<(MAX_Y-1-BAR_V)))
bar_y_next=bar_y_reg+BAR_V; //向下移動(dòng)
else
if(btn[0]&(bar_y_t>BAR_V))
bar_y_next=bar_y_reg-BAR_V; //向上移動(dòng)
end
關(guān)于運(yùn)動(dòng)的“球”的設(shè)計(jì)會(huì)更加復(fù)雜些,既需要替換四個(gè)邊界常數(shù)為信號(hào),又需要?jiǎng)?chuàng)建兩個(gè)寄存器信號(hào)ball_x_reg和ball_y_reg,存儲(chǔ)當(dāng)前X軸的左邊界以及Y軸的上邊界。通常球的運(yùn)動(dòng)速度為常數(shù),當(dāng)它撞擊到“墻”、“棒”或者屏幕頂部或者底部時(shí)會(huì)改變方向。將速度分解成沿X軸和Y軸的分量,其值要么為正值BALL_V_P,要么為負(fù)值BALL_V_N,這兩個(gè)分量的當(dāng)前值分別存儲(chǔ)到x_delta_reg和y_delta_reg寄存器中。下面代碼實(shí)現(xiàn)了ball_x_reg和ball_y_reg寄存器信號(hào)的更新:
//球的位置更新
assignball_x_next=(refr_tick)?ball_x_reg+x_delta_reg:
ball_x_reg;
assignball_y_next=(refr_tick)?ball_y_reg+y_delta_reg:
ball_y_reg;
更新x_delta_reg和y_delta_reg寄存器的代碼實(shí)現(xiàn)如下:
//球的速度
always
@*
begin
x_delta_next=x_delta_reg;
y_delta_next=y_delta_reg;
if(ball_y_t<1)//到達(dá)頂部
y_delta_next=BALL_V_P;
else
if(ball_y_b>(MAX_Y-1)) //到達(dá)底部
y_delta_next=BALL_V_N;
else
if(ball_x_l<=WALL_X_R) //碰到墻1
x_delta_next=BALL_V_P; //彈回來
else
if((BAR_X_L<=ball_x_r)&&(ball_x_r<=BAR_X_R)&&
(bar_y_t<=ball_y_b)&&(ball_y_t<=bar_y_b))
//到達(dá)棒的右邊,受到撞擊之后反彈回
x_delta_next=BALL_V_N;
end
【程序12-5】
完整游戲程序。
modulepong_graph_animate
(
input
wireclk,reset,
input
wirevideo_on,
input
wire[1:0]btn,
input
wire[9:0]pix_x,pix_y,
output
reg[2:0]graph_rgb
);
//常數(shù)與信號(hào)聲明
//X和Y起始值從(0,0)到(639,479)
localparamMAX_X=640;
localparamMAX_Y=480;
wirerefr_tick;
//--------------------------------------------
//垂直豎條“墻”
//--------------------------------------------
//墻左右邊界
localparamWALL_X_L=32;
localparamWALL_X_R=35;
//--------------------------------------------
//右側(cè)豎條“棒”
//--------------------------------------------
//“棒”的左右邊界
localparamBAR_X_L=600;
localparamBAR_X_R=603;
//棒的上下邊界
wire[9:0]bar_y_t,bar_y_b;
localparamBAR_Y_SIZE=72;
//“棒”y軸跟蹤寄存器
reg[9:0]bar_y_reg,bar_y_next;
//當(dāng)有按鍵按下去時(shí)棒移動(dòng)
localparamBAR_V=4;
//--------------------------------------------
//矩形球
//--------------------------------------------
localparamBALL_SIZE=8;
//矩形球左右邊界
wire[9:0]ball_x_l,ball_x_r;
//矩形球上下邊界
wire[9:0]ball_y_t,ball_y_b;
//跟蹤矩形球左側(cè)與上側(cè)寄存器
reg[9:0]ball_x_reg,ball_y_reg;
wire[9:0]ball_x_next,ball_y_next;
//跟蹤矩形球速度
reg[9:0]x_delta_reg,x_delta_next;
reg[9:0]y_delta_reg,y_delta_next;
//矩形球速度可以為正為負(fù)
localparamBALL_V_P=2;
localparamBALL_V_N=-2;
//--------------------------------------------
//圓形球l
//--------------------------------------------
wire[2:0]rom_addr,rom_col;
reg[7:0]rom_data;
wirerom_bit;
//--------------------------------------------
//輸出信號(hào)
//--------------------------------------------
wirewall_on,bar_on,sq_ball_on,rd_ball_on;
wire[2:0]wall_rgb,bar_rgb,ball_rgb;
//主體
//--------------------------------------------
//圓形球圖像映射ROM
//--------------------------------------------
always@*
case(rom_addr)
3'h0:rom_data=8'b00111100; //****
3'h1:rom_data=8'b01111110; //******
3'h2:rom_data=8'b11111111; //********
3'h3:rom_data=8'b11111111; //********
3'h4:rom_data=8'b11111111; //********
3'h5:rom_data=8'b11111111; //********
3'h6:rom_data=8'b01111110; //******
3'h7:rom_data=8'b00111100; //****
endcase
//寄存器
always@(posedgeclk,posedgereset)
if(reset)
begin
bar_y_reg<=0;
ball_x_reg<=0;
ball_y_reg<=0;
x_delta_reg<=10'h004;
y_delta_reg<=10'h004;
end
else
begin
bar_y_reg<=bar_y_next;
ball_x_reg<=ball_x_next;
ball_y_reg<=ball_y_next;
x_delta_reg<=x_delta_next;
y_delta_reg<=y_delta_next;
end
//屏幕刷新率為60Hz,rerf_tick表示垂直同步開始
assignrerf_tick=(pix_y==481)&&(pix_x==0);
//--------------------------------------------
//“墻”的顯示
//--------------------------------------------
//墻顯示區(qū)域
assignwall_on=(WALL_X_L<=pix_x)&&(pix_x<=WALL_X_R);
//墻顯示顏色
assignwall_rgb=3'b001; //blue
//--------------------------------------------
//右邊棒顯示
//--------------------------------------------
//邊界
assignbar_y_t=bar_y_reg;
assignbar_y_b=bar_y_t+BAR_Y_SIZE-1;
//棒顯示區(qū)域
assignbar_on=(BAR_X_L<=pix_x)&&(pix_x<=BAR_X_R)&&
(bar_y_t<=pix_y)&&(pix_y<=bar_y_b);
//棒顯示顏色
assignbar_rgb=3'b010; //green
//棒在Y軸方向移動(dòng)到新的起始坐標(biāo)
always
@*
begin
bar_y_next=bar_y_reg; //不動(dòng)
if(refr_tick)
if(btn[1]&(bar_y_b<(MAX_Y-1-BAR_V)))
bar_y_next=bar_y_reg+BAR_V; //向下移動(dòng)
else
if(btn[0]&(bar_y_t>BAR_V))
bar_y_next=bar_y_reg-BAR_V; //向上移動(dòng)
end
//--------------------------------------------
//矩形球
//--------------------------------------------
//邊界
assignball_x_l=ball_x_reg;
assignball_y_t=ball_y_reg;
assignball_x_r=ball_x_l+BALL_SIZE-1;
assignball_y_b=ball_y_t+BALL_SIZE-1;
//球顯示區(qū)域
assignsq_ball_on=
(ball_x_l<=pix_x)&&(pix_x<=ball_x_r)&&
(ball_y_t<=pix_y)&&(pix_y<=ball_y_b);
//映射當(dāng)前像素位置到ROM地址空間
assignrom_addr=pix_y[2:0]-ball_y_t[2:0];
assignrom_col=pix_x[2:0]-ball_x_l[2:0];
assignrom_bit=rom_data[rom_col];
//球顯示區(qū)域
assignrd_ball_on=sq_ball_on&rom_bit;
//球顯示顏色
assignball_rgb=3‘b100;
//紅色
//球新的位置
assignball_x_next=(refr_tick)?ball_x_reg+x_delta_reg:
ball_x_reg;
assignball_y_next=(refr_tick)?ball_y_reg+y_delta_reg:
ball_y_reg;
//球運(yùn)動(dòng)
always
@*
begin
x_delta_next=x_delta_reg;
y_delta_next=y_delta_reg;
if(ball_y_t<1)//reachtop
y_delta_next=BALL_V_P;
else
if(ball_y_b>(MAX_Y-1)) //到達(dá)底部
y_delta_next=BALL_V_N;
else
if(ball_x_l<=WALL_X_R) //碰到墻
x_delta_next=BALL_V_P; //彈回
else
if((BAR_X_L<=ball_x_r)&&(ball_x_r<=BAR_X_R)&&
(bar_y_t<=ball_y_b)&&(ball_y_t<=bar_y_b))
//到達(dá)棒右側(cè)并受到撞擊后反彈
x_delta_next=BALL_V_N;
end
//--------------------------------------------
//顯示選擇電路
//--------------------------------------------
always
@*
if(~video_on)
graph_rgb=3'b000; //顯示黑色
else
if(wall_on)
graph_rgb=wall_rgb;
else
if(bar_on)
graph_rgb=bar_rgb;
else
if(rd_ball_on)
graph_rgb=ball_rgb;
else
graph_rgb=3‘b110;
//背景為黃色
endmodule
12.4位圖顯示方案
位圖顯示方案中,映射每個(gè)像素顯示值在視頻存儲(chǔ)器中,分辨率為640
×
480的情況下,整個(gè)屏幕像素?cái)?shù)為310K個(gè)。所以理論上對(duì)于單色顯示和彩色顯示需要的存儲(chǔ)器容量分別為310Kb和910Kb。實(shí)際上所需要的視頻存儲(chǔ)器容量遠(yuǎn)遠(yuǎn)大于這個(gè)值。因?yàn)闉榱丝焖俅鎯?chǔ),存儲(chǔ)器地址必須合理分配。比如,為了映射像素當(dāng)前坐標(biāo)到存儲(chǔ)地址空間中,可以連接像素的X軸坐標(biāo),其位寬為10bit(lb640),Y軸坐標(biāo)為9bit(lb480),所以就需要額外的電路將像素坐標(biāo)映射到存儲(chǔ)器地址,那么就會(huì)在存儲(chǔ)器中產(chǎn)生許多無用的“空區(qū)”,存儲(chǔ)器大小也由310Kb增加到512Kb。對(duì)于S3板來說,存儲(chǔ)器資源包括外部SRAM芯片以及內(nèi)嵌塊RAM資源,整個(gè)Spartan系列3S200的塊RAM資源共192Kb,根本無法滿足顯示滿屏的數(shù)據(jù)存儲(chǔ)。所以我們需要使用外部RAM資源。在本小節(jié)中,我們?cè)谄聊簧巷@示一個(gè)大小為128
×
128的區(qū)域位圖,那么在屏幕上共有16K(214)個(gè)像素點(diǎn)。如果要顯示的彩色圖像共需要16K
×
3大小的存儲(chǔ)空間,那么可以用三個(gè)嵌入式塊RAM實(shí)現(xiàn)。這個(gè)區(qū)域位圖位置在屏幕的左上角,顯示一個(gè)像素點(diǎn)的彈跳軌跡,如圖12-9所示。電路采用3位的開關(guān)控制像素點(diǎn)軌跡顏色,一個(gè)按鈕隨機(jī)選擇軌跡的初始位置。當(dāng)按鈕按下時(shí),像素點(diǎn)開始移動(dòng)。運(yùn)動(dòng)方式如同上例的球一樣。像素點(diǎn)由于在狹小的矩形空間運(yùn)動(dòng),并受四面“墻”的碰撞,最后形成的運(yùn)動(dòng)軌跡也為矩形框,每次啟動(dòng)按鈕按下,都會(huì)產(chǎn)生新的運(yùn)動(dòng)軌跡。圖12-9彈跳軌跡12.4.1采用雙端口RAM實(shí)現(xiàn)
電路框圖如圖12-10所示。視頻存儲(chǔ)器由16Kb
×
3的同步雙端口RAM組成,其中像素坐標(biāo)Y軸的低7位為存儲(chǔ)器地址的高7位,像素坐標(biāo)X軸的低7位為存儲(chǔ)器地址的低7位,信號(hào)dot_xy追蹤原點(diǎn)的坐標(biāo)位置并產(chǎn)生當(dāng)前Y軸和X軸坐標(biāo),外部輸入端口sw為RGB輸入值,與存儲(chǔ)器的din_a端口相連接,像素坐標(biāo)信號(hào)pixel_y和pixel_x組
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院火災(zāi)應(yīng)急演練計(jì)劃方案
- 碎石材料采購合同
- 那天如果我能和偶像對(duì)話
- 養(yǎng)老院電子病歷管理系統(tǒng)建設(shè)方案
- 成人學(xué)歷教育服務(wù)合同協(xié)議書
- 醫(yī)療機(jī)構(gòu)設(shè)備租賃及維保服務(wù)合同
- 海鮮產(chǎn)品購銷合同
- 2025-2030年中國草坪仿真音響行業(yè)深度研究分析報(bào)告
- 信息技術(shù)在農(nóng)村土地流轉(zhuǎn)中的應(yīng)用合同
- 2025-2030年中國單層金屬通風(fēng)軟管項(xiàng)目投資可行性研究分析報(bào)告
- 市政供水管線保護(hù)專項(xiàng)施工方案
- 學(xué)?!皦炎迦氯被顒?dòng)工作方案
- 名詞性從句、定語從句、狀語從句高考真題+詳細(xì)解析
- 第單元 世界民族之聲(一)-《星星索》課件 湘教版初中音樂八年級(jí)下冊(cè)
- 2023年青島職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)模擬試題及答案解析
- 第一課《不經(jīng)歷風(fēng)雨怎能見彩虹》課件
- 高新技術(shù)企業(yè)自評(píng)表
- 中國十二生肖文化-英文版
- 全科醫(yī)學(xué)課件:第四章 以人為中心的健康照顧
- 國家開放大學(xué)《城市管理學(xué)》形考任務(wù)1-4試題及答案
- YY/T 1282-2022一次性使用靜脈留置針
評(píng)論
0/150
提交評(píng)論