新聞中心

EEPW首頁(yè) > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > 基于FPGA的M2M異構(gòu)虛擬化系統(tǒng)(三)

基于FPGA的M2M異構(gòu)虛擬化系統(tǒng)(三)

作者: 時(shí)間:2018-08-31 來(lái)源:網(wǎng)絡(luò) 收藏

因?yàn)?086混合8位和16位寄存器,所以經(jīng)常需要將8位寄存器移出至臨時(shí)寄存器,運(yùn)算完以后再?gòu)呐R時(shí)寄存器移入8086寄存器。這些操作比較頻繁,可以將其封裝成函數(shù)。

本文引用地址:http://2s4d.com/article/201808/388221.htm

  指令的操作碼決定了進(jìn)行何種運(yùn)算,指令還具有各種操作數(shù)。每條指令一般都有多種操作數(shù)類型。常見(jiàn)的8086指令類型如下。

  

  圖 40 常見(jiàn)8086指令類型

  以加法指令add為例。

  add reg, reg類型。根據(jù)reg位寬不一樣,可分成五類:16位的一種,低8位跟高8位兩兩組合形成四種。

  其余類型都是在reg,reg類型的基礎(chǔ)上。遇到reg,mem類型,先計(jì)算出內(nèi)存地址,再取出內(nèi)存內(nèi)容將其載入到輔助寄存器,接下來(lái)就是reg,reg類型的操作。mem,reg與reg,mem類似,只是運(yùn)算方向相反,最后要將結(jié)果從寄存器寫(xiě)回內(nèi)存。遇到立即數(shù)類型,則是將立即數(shù)載入寄存器再做運(yùn)算。

  4.2.11.代碼執(zhí)行及轉(zhuǎn)移分發(fā)器

  當(dāng)一個(gè)基本塊翻譯完以后,經(jīng)上下文切換后,由MIPS環(huán)境轉(zhuǎn)入8086環(huán)境,開(kāi)始執(zhí)行已翻譯的代碼塊。當(dāng)執(zhí)行至代碼塊末尾時(shí),遇到跳轉(zhuǎn)指令,然后轉(zhuǎn)入轉(zhuǎn)移分發(fā)器進(jìn)行處理。轉(zhuǎn)移分發(fā)器計(jì)算跳轉(zhuǎn)目標(biāo)地址(8086),以此地址在跳轉(zhuǎn)緩存中尋找對(duì)應(yīng)的MIPS地址。如果找到了,說(shuō)明跳轉(zhuǎn)目標(biāo)是已翻譯過(guò)的,那么繼續(xù)跳過(guò)去執(zhí)行。如果沒(méi)找到,說(shuō)明目標(biāo)塊還沒(méi)有翻譯,那么先執(zhí)行翻譯過(guò)程,再執(zhí)行翻譯塊。

  4.3.系統(tǒng)庫(kù)及應(yīng)用程序詳細(xì)設(shè)計(jì)方案

  4.3.1.系統(tǒng)可用資源及其分配

  系統(tǒng)可用內(nèi)存空間有1MB的空間。內(nèi)存地址空間的分配如下圖:

  

  圖 46 內(nèi)存分配(1M)

  系統(tǒng)通過(guò)wishbone開(kāi)源總線,與virtex-5硬件開(kāi)發(fā)板自帶的鍵盤(pán)、鼠標(biāo)和串口等外設(shè)互聯(lián)。鍵盤(pán)的硬件接口是PS/2標(biāo)準(zhǔn),virtex-5支持16位色液晶顯示器,串口用來(lái)與其他電腦主機(jī)連接,進(jìn)行通信和數(shù)據(jù)傳輸。

端口類型

端口地址

rs232數(shù)據(jù)端口

20000000H

rs232忙位檢測(cè)

20000004H

vga顯示基址

50000000H

led

70000000H

鍵盤(pán)

90000000H

表 1 系統(tǒng)常用端口及其地址

  系統(tǒng)庫(kù)函數(shù)設(shè)計(jì)與實(shí)現(xiàn)

  系統(tǒng)最初只支持MIPS匯編語(yǔ)言。用MIPS匯編語(yǔ)言開(kāi)發(fā)出俄羅斯方塊游戲。這個(gè)應(yīng)用程序,不僅幫助找出了硬件系統(tǒng)存在的一些bug,如流水線CPU中存在的數(shù)據(jù)相關(guān)和控制相關(guān)問(wèn)題,指令集的功能問(wèn)題,而且還驗(yàn)證了硬件系統(tǒng)與RS232串口之間的數(shù)據(jù)傳輸功能的正確性,以及鍵盤(pán)接口和顯示器接口的正確性和易用性。

  系統(tǒng)宏定義和端口常量

  系統(tǒng)的內(nèi)存和外設(shè)的地址空間是連續(xù)分配的。為了提高開(kāi)發(fā)應(yīng)用程序的過(guò)程中的設(shè)備無(wú)關(guān)性和應(yīng)用程序的通用性,我們把各個(gè)端口定義為常量,供系統(tǒng)庫(kù)和應(yīng)用程序參考使用。

  unsigned int* text_base = (int *)0x000C0000;

  unsigned int* graphics_base = (int *)0x50000000; //VGA 端口

  unsigned int* ps2_base = (int *)0x90000000; //ps2鍵盤(pán) 端口

  unsigned int* rs232_base = (int *)0xFFFFE000;

  unsigned int* rs232_busy = (int *)0xFFFFF000;

  unsigned int* font_base = (int *)0x000C12C0; //字庫(kù) 端口

  表 2 系統(tǒng)端口常量定義

  系統(tǒng)的顯示器支持16位色,即R5G5B6。為了保持應(yīng)用程序開(kāi)發(fā)的一致性,我們定義了一些供應(yīng)用程序使用的顏色常量。

  #define COLOR_WHITE 0xFFFF

  #define COLOR_BLACK 0x0000

  #define COLOR_RED 0xF800

  #define COLOR_GREEN 0x07E0

  #define COLOR_BLUE 0x001F

  #define COLOR_BROWN 0xFC00

  #define COLOR_PURPLE 0x9009

  #define COLOR_YELLOW 0xFFE0

  #define COLOR_PINK 0xF81F

  圖表 3 系統(tǒng)常用顏色常量定義

  鍵盤(pán)接口函數(shù)

  checkkey函數(shù)

  原型:int checkkey();

  功能:檢查鍵盤(pán)是否有按鍵被按下

  說(shuō)明:有鍵被按下返回 1,否則返回 0

  checkandgetkey函數(shù)

  原型:int checkandgetkey(int* key);

  功能:檢查鍵盤(pán)是否有按鍵被按下,并得到按鍵的ASCII碼

  說(shuō)明:有鍵被按下返回 1,按鍵的ASCII由指針 key 保存;否則返回 0

  getchar函數(shù)

  原型:int getchar();

  功能:讀鍵

  說(shuō)明:從鍵盤(pán)上讀取一個(gè)鍵,并返回該鍵的鍵值

  顯示器接口函數(shù)

  putpixel函數(shù)

  原型:void putpixel(int x, int y, int color);

  功能:在屏幕的指定位置上畫(huà)點(diǎn)

  說(shuō)明: (x,y)為屏幕上點(diǎn)坐標(biāo),指定顏色 color

  getpixel函數(shù)

  原型:int getpixel(int x, int y);

  功能:返回屏幕上指定點(diǎn)的狀態(tài)

  說(shuō)明:(x,y)為屏幕上點(diǎn)的坐標(biāo),如果點(diǎn)為清除狀態(tài)返回零,否則返回非零值

  printchar函數(shù)

  原型:void printchar(int x, int y, int ch, int color);

  功能:打印給定的字符

  說(shuō)明: (x,y)為起點(diǎn)坐標(biāo),ch 為要打印的字符的ASCII碼,指定字體顏色 font_color,背景顏色

  printword函數(shù)

  原型:void printword(int x, int y, int word, int color);

  功能:打印給定的字,調(diào)試時(shí)使用

  說(shuō)明: (x,y)為起點(diǎn)坐標(biāo),word 為要打印的字即4個(gè)字節(jié),先打印高字節(jié),指定顏色 color

  printnum函數(shù)

  原型:void printnum(int x, int y, int num, int color);

  功能:打印給定的數(shù)字,調(diào)試時(shí)使用

  說(shuō)明: (x,y)為起點(diǎn)坐標(biāo),num 為要打印的數(shù)字,指定字體顏色 font_color 背景色bkg_color,目前該函數(shù)只支持 0=

  line函數(shù)

  原型:void line(int x1,int y1,int x2,int y2, int color);

  功能:在屏幕上畫(huà)直線

  說(shuō)明: (x1,y1)為起點(diǎn)坐標(biāo),(x2,y2)為終點(diǎn)坐標(biāo)

  circle函數(shù)

  原型:void circle(int x, int y, int radius, int color);

  功能:畫(huà)圓框

  說(shuō)明:x和y分別為圓心的橫縱坐標(biāo),radius 為半徑,color 為圓邊框的顏色

  circlefilled函數(shù)

  原型:void circlefilled(int x, int y, int radius, int color)

  功能:畫(huà)圓,并填充

  說(shuō)明:x 和 y 分別為圓心的橫縱坐標(biāo),radius 為半徑,color 為圓邊框以及填充的的顏色該函數(shù)還有待改進(jìn)

  rectangle函數(shù)

  原型:void rectangle(int left, int top, int right, int bottom, int color);

  功能:在屏幕上畫(huà)一矩形邊框

  說(shuō)明: (left,top)指定左上角坐標(biāo),(right,bottom)指定右下角坐標(biāo),指定邊框顏色color

  串口接口函數(shù)

  rs232Check函數(shù)

  原型:int rs232Check()

  功能:檢查rs232是否busy

  說(shuō)明: return 返回值1為忙,0為空閑

  rs232ReceiveByte

  原型:char rs232ReceiveByte()

  功能:從rs232接收一個(gè)字節(jié),輪詢方式

  說(shuō)明: return 返回一個(gè)字節(jié)

  rs232SendByte

  原型:void rs232SendByte(char b)

  功能:給rs232發(fā)送一個(gè)字節(jié)

  說(shuō)明: param b 要發(fā)送的字節(jié)

  LED接口函數(shù)

  _lightLeds函數(shù)

  原型:void _lightLeds(int leds);

  功能:控制LED的顯示

  說(shuō)明:leds的低8位有效


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉