8051单片机的FPGA设计与实现--毕业论文(4)

2019-04-16 18:30

其运算结果(和或差)产生由低半个字节(位3)向高半个字节有半进位(或借位)时,AC位将被硬件自动置“1”,否则AC被自动清“0”。

F0(PSW.5)用户标志位。用户可以根据自己的需要对FO位赋予~定的含义.由用户执行置位、复位操作,作为软件标志。

RS0和RS 1(PSW.4和PSW.5)工作寄存器组选择控制位。这两位的值决定选择哪一组工作寄存器为当前工作寄存器组。由用户用软件改变RS1和RS 0值的组合,以切换当前选用的工作寄存器组,其组合关系详见表2。

8051上电复位后,(RS1)=(RS0)=O,CPU自然选择第0作为当前工作寄存器组。根据需要,可利用传送指令对PSW整字节操作,或使用位操作指令改变RS1和RS0的状态,以切换当前工作寄存器组。

RS1 0 0 1 1 RS0 0 1 0 1 寄存器组 第0组 第1组 第2组 第3组 片内RAM地址 00H~07H 08H~0FH 10H~17H 18H~1FH 表 3 RS0、RS1的组合关系

(4)栈指针SP(81H)

堆栈指针SP为8位特殊功能寄存器,SP的内容即堆栈指针,可指向8051片内00H~7FH的RAM的任何单元。系统复位后,SP初始化为07H,即指向07H的RAM单元。

8051的堆栈指针SP是一个双向计数器。在压栈时SP内容自动增值,出栈时自动减值,存取信息必需按着“先进后出”或“后进先出”的原则。

(5)数据指针DPTR(83H,82H)

DPTR是一个16位的特殊功能寄存器,其高位字节寄存器用DPH表示(地址83H),低位字节寄存器用DPL表示(82H)。DPRT既可以作为一个16位寄存器来处理,也可以作为二个独立的8位寄存器DPH和DPL使用。

DPTR主要用以存放16位地址,以便对64K片外RAM作间接寻址。 (6)I/O端口P0~P3(80H,90H,AOH,BOH)

P0~P3为四个8位特殊功能寄存器,分别是四个并行I/O端的锁存器。它们都有字节地址,每一个口锁存器还有位地址,所以每一条I/O线独立地用作输入或输出时,数据可以锁存;作输入时,数据可以缓冲。

当I/O端口某一位用于输入信号时,对应的锁存器位须先置“1”。

符号 ACC B PSW SP DPH DPL P0 P1 P2 P3 IP IE TMOD TCON TH0 TL0 TH1 TL1 SCON SBUF PCON 名称 累加器 B寄存器 程序状态字 栈指针 数据指针高位 数据指针地位 P0锁存寄存器 P1锁存寄存器 P2锁存寄存器 P3锁存寄存器 中断优先级控制寄存器 中断允许控制寄存器 定时/计数器工作方式、状态寄存器 定时/计数器控制寄存器 定时/计数器0(高字节) 定时/计数器0(低字节) 定时/计数器1(高字节) 定时/计数器1(低字节) 串行口控制寄存器 串行数据缓冲器 电源控制寄存器 地址 E0H F0H D0H 81H 83H 82H 80H 90H A0H B0H B8H A8H 89H 88H 8CH 8AH 8DH 8BH 98H 99H 97H 表 2 51系列单片机的特殊功能寄存器表

第四节 8051单片机的FPGA设计与实现

本设计采用现在流行的模块化设计方式,将8051单片机按照其内部的结构设计成为3个大的模块,即运算器、存储器和控制器模块。

一、运算器模块的设计

运算器模块包括一个可进行8位算术运算和逻辑运算的ALU单元,8位的暂存器1、暂存器2、8位的累加器ACC,寄存器B和程序状态寄存器PSW。 (1)ALU(算术逻辑运算单元)模块的信号

该模块的信号如图4所示,负责进行算术逻辑运算,它能完成加、减、乘、除算术运算以及与、或、非等逻辑运算。其中:

rst为复位标志,高有效。

op-code是4位代码,用来定义ALU所要进行的操作,它的内容已经在8051 1沁文件中定义完毕。例如,要进行加法操作,则op code为0001。

src-1为送入ALU的第一源操作数,8位输入,当做加法运算时它是被加数,做减法运算时它是被减数,做除法运算时它是被除数。

src_2为送入的第二源操作数,8位输入,当做减法运算时,它是减数;做除法运算时,它是除数。

src_3为送入ALU的第三源操作数,8位输入。 src_cy为第一源操作数的第7位。 src_ac为第一源操作数的第4位。

des_1为第一目标操作数,8位输出,用来存放ALU计算后的数据。 des_2为第二目标操作数,8位输出,用来存放ALU计算后的剩余数据,如除法没有整除的小数等。

des_cy为ALU运算完数据的第7位。 des_ac为ALU运算完数据的第4位。 des_ov位溢出标志位。

op_code<3:0>scr_1<7:0>scr_2<7:0>scr_3<7:0>rstdes_cvsrc_acsrc_cydes_ovdes_2<7:0>des_acdes_1<7:0> 图4 ALU模块信号图

二、ALU(算术逻辑运算单元)模块的层次化设计(详见图5)

图5 ALU(算术逻辑运算单元)模块的层次化设计

三、ALU模块的VHDL语言描述

①ALU模块中实现乘法操作的VHDL语言描述

Procedure DO_MUL (a: in unsigned( 7 down to 0 ); b: in unsigned( 7 down to 0 ); r: in unsigned( 15 down to 0 ); ov: out std_logic) is variable

v1:unsigned(15 down to 0); begin

v1:=a*b; r:=v1;

if(v1(15 down to 8)/=C0_8)then ov:=’1’; else

ov:=’0’; end if: end DO_MUL;

其中,a为被乘数,8位输入信号,b为乘数,8位输人信号,r为a、b相乘后的结果,16位输出信号,OV为溢出标志,当计算所得的结果的高8位的值不等于0时,ov=1,表示计算结果溢出。

②ALU模块中实现BCD码调整操作的VHDL语言描述

procedure DO_DA(a: in unsigned(7 down to 0) ; c1:In std_logic;

c2:In std_logic;

r: out unsigned(7 down to 0); cy: out std_logic) is

variable v:tmsigIl6d(8 down to U); begin

v:=”0”&a;

fi((c2=’1’)or(v(3 down to 0)>C9_4))then v:=v+“O00000110”; end if;

v(8):=v(8)or c1; if(v(8)=‘1’)then v:=v+“O01100000”; end if;

r: v(7 down to0); cy:=v(8); end DO_DA;

其中,当输入的信号低4位大于9(1001 B)时, 进行加6(110B)操作;当输入信号最高位为1时,进行加96(00110000B)操作。

③ALU模块的主程序的部分如下: begin

process(rst,op_code,scr_1, scr_2, scr_3 scr_cy, scr_ac) variable v16: unsigned(15 down to 0); variable v8: unsigned(7 down to 0); variable v_cy, v_ac, v_ov: std_logic; begin

if(rst=’1’)then

des_1<=CD_8; des_2<=CD_8;

des_cy<=’-’; des_ac<=’-’; des_ov<=’-’; else

case op_code is

when ALU OPC ADD =>

DO_ADD(src_T, src_2, src_cy,v8,v_cy,v_ac,v_ov); des_1<=v8;

des_2<=CD_8; des_cy<=v_cy; des_ac<=v_ac; des_ov<=v_ov;

when ALU OPC SUB =>

DO_SUB(src_T, src_2, src_cy,v8,v_cy,v_ac,v_ov);

des_1<=v8;

des_2<=CD_8; des_cy<=v_cy; des_ac<=v_ac; des_ov<=v_ov; ??

当RST=1时,ALU复位;,当RST=0时,ALU根据OP—CODE的值进行相应的操作。 四、ALU模块功能仿真

运算代码 ALU_OPC_NONE 代码内容 0000

对应操作 ——


8051单片机的FPGA设计与实现--毕业论文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:星巴克辞职信

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: