基于FPGA的M2M异构虚拟化系统(三)
因为8086混合8位和16位寄存器,所以经常需要将8位寄存器移出至临时寄存器,运算完以后再从临时寄存器移入8086寄存器。这些操作比较频繁,可以将其封装成函数。
本文引用地址:https://www.eepw.com.cn/article/201808/388221.htm指令的操作码决定了进行何种运算,指令还具有各种操作数。每条指令一般都有多种操作数类型。常见的8086指令类型如下。

图 40 常见8086指令类型
以加法指令add为例。
add reg, reg类型。根据reg位宽不一样,可分成五类:16位的一种,低8位跟高8位两两组合形成四种。
其余类型都是在reg,reg类型的基础上。遇到reg,mem类型,先计算出内存地址,再取出内存内容将其载入到辅助寄存器,接下来就是reg,reg类型的操作。mem,reg与reg,mem类似,只是运算方向相反,最后要将结果从寄存器写回内存。遇到立即数类型,则是将立即数载入寄存器再做运算。
4.2.11.代码执行及转移分发器
当一个基本块翻译完以后,经上下文切换后,由MIPS环境转入8086环境,开始执行已翻译的代码块。当执行至代码块末尾时,遇到跳转指令,然后转入转移分发器进行处理。转移分发器计算跳转目标地址(8086),以此地址在跳转缓存中寻找对应的MIPS地址。如果找到了,说明跳转目标是已翻译过的,那么继续跳过去执行。如果没找到,说明目标块还没有翻译,那么先执行翻译过程,再执行翻译块。
4.3.系统库及应用程序详细设计方案
4.3.1.系统可用资源及其分配
系统可用内存空间有1MB的空间。内存地址空间的分配如下图:

图 46 内存分配(1M)
系统通过wishbone开源总线,与virtex-5硬件开发板自带的键盘、鼠标和串口等外设互联。键盘的硬件接口是PS/2标准,virtex-5支持16位色液晶显示器,串口用来与其他电脑主机连接,进行通信和数据传输。
端口类型 | 端口地址 |
rs232数据端口 | 20000000H |
rs232忙位检测 | 20000004H |
vga显示基址 | 50000000H |
led | 70000000H |
键盘 | 90000000H |
表 1 系统常用端口及其地址
系统库函数设计与实现
系统最初只支持MIPS汇编语言。用MIPS汇编语言开发出俄罗斯方块游戏。这个应用程序,不仅帮助找出了硬件系统存在的一些bug,如流水线CPU中存在的数据相关和控制相关问题,指令集的功能问题,而且还验证了硬件系统与RS232串口之间的数据传输功能的正确性,以及键盘接口和显示器接口的正确性和易用性。
系统宏定义和端口常量
系统的内存和外设的地址空间是连续分配的。为了提高开发应用程序的过程中的设备无关性和应用程序的通用性,我们把各个端口定义为常量,供系统库和应用程序参考使用。
unsigned int* text_base = (int *)0x000C0000;
unsigned int* graphics_base = (int *)0x50000000; //VGA 端口
unsigned int* ps2_base = (int *)0x90000000; //ps2键盘 端口
unsigned int* rs232_base = (int *)0xFFFFE000;
unsigned int* rs232_busy = (int *)0xFFFFF000;
unsigned int* font_base = (int *)0x000C12C0; //字库 端口
表 2 系统端口常量定义
系统的显示器支持16位色,即R5G5B6。为了保持应用程序开发的一致性,我们定义了一些供应用程序使用的颜色常量。
#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 系统常用颜色常量定义
键盘接口函数
checkkey函数
原型:int checkkey();
功能:检查键盘是否有按键被按下
说明:有键被按下返回 1,否则返回 0
checkandgetkey函数
原型:int checkandgetkey(int* key);
功能:检查键盘是否有按键被按下,并得到按键的ASCII码
说明:有键被按下返回 1,按键的ASCII由指针 key 保存;否则返回 0
getchar函数
原型:int getchar();
功能:读键
说明:从键盘上读取一个键,并返回该键的键值
显示器接口函数
putpixel函数
原型:void putpixel(int x, int y, int color);
功能:在屏幕的指定位置上画点
说明: (x,y)为屏幕上点坐标,指定颜色 color
getpixel函数
原型:int getpixel(int x, int y);
功能:返回屏幕上指定点的状态
说明:(x,y)为屏幕上点的坐标,如果点为清除状态返回零,否则返回非零值
printchar函数
原型:void printchar(int x, int y, int ch, int color);
功能:打印给定的字符
说明: (x,y)为起点坐标,ch 为要打印的字符的ASCII码,指定字体颜色 font_color,背景颜色
printword函数
原型:void printword(int x, int y, int word, int color);
功能:打印给定的字,调试时使用
说明: (x,y)为起点坐标,word 为要打印的字即4个字节,先打印高字节,指定颜色 color
printnum函数
原型:void printnum(int x, int y, int num, int color);
功能:打印给定的数字,调试时使用
说明: (x,y)为起点坐标,num 为要打印的数字,指定字体颜色 font_color 背景色bkg_color,目前该函数只支持 0=
line函数
原型:void line(int x1,int y1,int x2,int y2, int color);
功能:在屏幕上画直线
说明: (x1,y1)为起点坐标,(x2,y2)为终点坐标
circle函数
原型:void circle(int x, int y, int radius, int color);
功能:画圆框
说明:x和y分别为圆心的横纵坐标,radius 为半径,color 为圆边框的颜色
circlefilled函数
原型:void circlefilled(int x, int y, int radius, int color)
功能:画圆,并填充
说明:x 和 y 分别为圆心的横纵坐标,radius 为半径,color 为圆边框以及填充的的颜色该函数还有待改进
rectangle函数
原型:void rectangle(int left, int top, int right, int bottom, int color);
功能:在屏幕上画一矩形边框
说明: (left,top)指定左上角坐标,(right,bottom)指定右下角坐标,指定边框颜色color
串口接口函数
rs232Check函数
原型:int rs232Check()
功能:检查rs232是否busy
说明: return 返回值1为忙,0为空闲
rs232ReceiveByte
原型:char rs232ReceiveByte()
功能:从rs232接收一个字节,轮询方式
说明: return 返回一个字节
rs232SendByte
原型:void rs232SendByte(char b)
功能:给rs232发送一个字节
说明: param b 要发送的字节
LED接口函数
_lightLeds函数
原型:void _lightLeds(int leds);
功能:控制LED的显示
说明:leds的低8位有效
评论