基于VHDL实现8086 IP核的设计

时间:2022-08-31 02:30:40

基于VHDL实现8086 IP核的设计

摘要:本文介绍了8086的内部结构和工作原理,其中包括执行单元、总线接口单元、算术逻辑单元、寄存器组和地址加法器。使用VHDL实现了IP核的设计,并使用Modelsim进行了仿真,仿真结果表明IP核可以正常工作。

关键词:中央处理器; 算数逻辑单元; VHDL

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)31-0969-02

A Design of the 8086 IP Core Based on VHDL

WU Jun-da, WU Xiu-long

(Institute of Electronic Science and Technology, Anhui University, Hefei 230039, China)

Abstract: This article introduces the inner structure of 8086 and the working principle。It includes the EU(Executing Unit), BIU(Bus Interface Unit), ALU (Arithmetic Logical Unit), the array of registers and address adder. Implemented the 8086 IP core with VHDL, and simulated the design with Modelsim. The simulation results show that the IP core works normally.

Key words: CPU; ALU; VHDL

1 引言

CPU是Central Processing Unit的英文缩写,又叫微处理器,它是计算机的核心部件,由运算器和控制器组成。按照其处理信息的字长,CPU可以分为:四位微处理器、八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等等。随着社会的发展,微处理器的应用已经深入到科学计算,信息处理,事务管理,过程控制,仪器仪表制造,民用产品和家用电器等各个方面。而且由于微处理器的发展,出现了一些不曾有的新仪器。比如,电子实验室中,出现了微处理器控制的示波器DD逻辑分析仪。在加电方面,冰箱和自动洗衣机的工作都离不开微处理器[1-2]。微处理器在我们的生活中应用的越来越广泛了。

随着微电子技术及计算机硬件技术的迅速发展,数字设计所使用的器件发生了很大变化:从最初的分立元件、中小规模集成电路到大规模、超大规模集成电路,从标准的通用芯片到可编程逻辑器件(PLD)到现在的CPLD和FPGA。这一变化导致数字设计的方法不断更新,使数字系统的逻辑设计从“纯硬件”设计演变为借助于软件工具来完成硬件设计。

VHDL是VHSIC(Very High Speed Integrated Circuits) Hardware Description Language的缩写,是用于逻辑设计的硬件描述语言,在1987年成为IEEE标准。最早是美国国防部为描述电子电路所开发的一种语言,它可以很容易地描述一个系统的功能,也可以详细描述一个器件的状态。特点在于:能形式化地抽象表示电路的行为和结构、支持逻辑设计中层次与范围的描述、可借用高级语言的精巧结构来简化电路行为的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用[3-4]。

2 8086内部结构和工作原理

8086是英特尔于1978年推出了首枚16位微处理器,有29000只晶体管,速度可分为5MHz、8MHz、10MHz,内部数据总线(处理器内部传输数据的总线)、外部数据总线(处理器外部传输数据的总线)均为16位,地址总线为20位,可寻址1MB内存,为双列直插式封装,有40根引脚,电源为5V[5]。

8086从功能上分执行单元EU(Execution Unit),和总线接口单元BIU(Bus Interface Unit)。执行单元的功能就是负责指令的执行,由8个16位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI),1个16位标志寄存器(FLAGS),1个16位暂存寄存器,1个16位算术逻辑单元ALU及EU控制电路组成。

总线接口单元的功能是负责与存储器,I/O端口传送数据,由4个16位段寄存器(CS,DS,SS,ES),1个16位的指令指针寄存器IP,1个与EU通信的内部暂存器,1个指令队列,1个计算20位物理地址的加法器及总线控制电路构成。8086的指令队列为6个字节,会在执行指令的同时,从内存中取指令,取来的指令就放在指令队列中。EU单元每次都是从指令队列的前部取指令,然后在本单元中执行指令,这样CPU执行完一条指令就可以立即执行下一条指令,不需要从内存取指令,然后再执行,从而提高效率。8086的内部寄存器都是16位的,所以需要一个附加的部件来根据16位寄存器提供的信息来计算出20位的物理地址,地址加法器就是用来完成这个作用的。计算方法为:将代码段寄存器CS的内容左移4位,然后再与IP的内容相加得到最终的物理地址。

总线接口部件和执行部件之间不是同步工作的,但两者的动作仍然是有管理原则的,体现在以下几个方面:

1) 每当指令队列中有2个空字节时,总线接口部件就会自动把指令取到指令队列中。

2) 当执行部件请求总线接口部件访问总线时,总线接口部件正在将某个指令取到指令队列中去,这时,总线接口部件将首先完成这个取指令的总线周期,然后再去响应执行部件发出的访问总线的请求。

3) 当指令队列已满,而且执行部件对总线又没有总线访问请求,则总线接口部件进入空闲状态。

4) 在执行转移指令,调用指令和返回指令时,指令队列中的原有内容会被制动清除,总线接口部件会接着往指令队列中装入另一个程序段中的指令。

当复位信号来时,CPU内部的部件都初始化,段寄存器被设为0XFFFF,其他寄存器都被设为0,指令队列被清空,总线接口部件开始读取指令(指令的地址由段寄存器和指令指针通过地址加法器相加给出,为0XFFFF0),送往指令队列,然后指令执行部件可以不停地从指令队列读取指令,开始解释执行指令,周而复始地进行下去。在整个过程中执行部件和总线接口部件以一种并行方式工作。如果指令执行所需要的数据以及最后的结果都不需要访问I/O部件或存储器,则EU的工作将和BIU的取指令工作并行,这样就可以节省时间开销,极大地提高了工作效率[1]。

3 设计

这里我们使用VHDL,采用层次化,模块化的方式来设计整个系统。由前面讨论的内容我们知道CPU作为最外层模块(记做MAIN),它包含了ALU,EU,BIU和寄存器组,还有指令队列,地址加法器。这里EU的实现为ECC(execute control circuit),BIU的实现为IOCC(I/O control circuit),指令队列的实现为FIFO(first in first out)即队列,其中地址加法器包含在IOCC中。为了验证CPU,设计了TOP模块,RAM,ROM,AL模块,用于测试MAIN模块,相当于用这些模块组建了一个简单的电脑主板。AL模块的作用是:地址锁存。由于8086采用的是数据和地址复用总线,所以总线上不能同时出现数据和地址信号。当出现数据信号是,地址信号已经消失了,所以在把存储器模块需要的地址和数据信号传给存储器模块时,要对地址信号进行锁存,同时锁存的还有BHE信号(bus high enable)。BHE用来控制对于字节还是字的读写操作。程序的接口如下:

library ieee;

use ieee.std_logic_1164.all;

entity Al is

port(AlAddrIn: in std_logic_vector(19 downto 0);

AlAddrOut : outstd_logic_vector(19 downto 0);

AlBhebin: instd_logic;

AlBhebOut : out std_logic;

Alls: instd_logic;

Alle: instd_logic);

end Al;

CPU的作用抽象地说,其实就是数据处理,所以从这个角度来说,ALU是整个CPU的核心,虽然它不是最复杂的部件。ALU完成运算功能,运算包括算数运算和逻辑运算。算数运算包括加法和减法操作。逻辑运算包括AND, OR , NOT,XOR。这些基本上都是二元操作符,所以ALU的接口需要定义两个参与运算的操作数(ALUP1和ALUP2),同还要定义进行的是何种操作(ALUOP)以区分不同的操作。8086是16位的CPU,但处于兼容地考虑,同时也实现了8位的指令,所以我们要在实现中定义接口信号ALUBYTE来区分当前进行的是字节还是字操作。在8086中有带进位的加法操作,所以在接口中要有CARRY信号的输入(即ALUCI信号)。其他还包含的信号有:ALURES, ALUC, ALUZ等,程序接口如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY Alu IS

PORT(AluP1: INSTD_LOGIC_VECTOR(15 DOWNTO 0);

AluP2 : INSTD_LOGIC_VECTOR(15 DOWNTO 0);

AluOp : INSTD_LOGIC_VECTOR(3 DOWNTO 0);

AluByte : INSTD_LOGIC;

AluCi : INSTD_LOGIC;

AluA: OUT STD_LOGIC;

AluC: OUT STD_LOGIC;

AluO: OUT STD_LOGIC;

AluP: OUT STD_LOGIC;

AluS: OUT STD_LOGIC;

AluZ: OUT STD_LOGIC;

AluRes: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));

END Alu;

IOCC模块负责与存储器,I/O端口之间传送数据。在最小模式下,要负责产生相应的读写时序图。在实现读写时序时,一些信号需要在一个时钟周期内不同的时刻改变,所以需要延时。在仿真的时候,可以使用AFTER语句进行延时,但AFTER语句是不可综合的,这里采用双时钟的方法,低频的时钟信号作为总线周期的时钟,高频的时钟信号用作计数,这样在不同的计数时刻就可以改变要改变的信号。

ECC出于简单考虑采用直接组合电路的方式进行译码,采用状态机的方式,根据不同指令功能,产生控制信号,在时钟的控制下,执行相应的动作,限于篇幅代码就不一一列出了,这里给出一段小的程序进行测试:

MOV AX,1000

MOV CX,2000

INC AX

XCHG AX,CX

ADD AX,CX

HLT

程序运行状态如图1所示。

4 小结

随着集成电路设计规模越来越大,数字电路越来越复杂,未来的发展趋势是:增加标准功能的模块,减少设计人员的重复劳动,从而缩短设计周期,提高效率。

参考文献:

[1] 戴梅萼. 微型计算机技术及应用,清华大学出版社,1994.

[2] Douglas L. Perry, VHDL Progamming by Example 4th.Ed, McGraw-Hill.

[3] 巴斯克尔. VHDL教程,机械工业出版社,2006.

[4] 刘清,国海欣. IP软核的VHDL设计与复用方法研究,武汉理工大学学报(交通科学与工程版),2003,(5).

[5] 程作仁, 张多利, 高明伦, 李丽. 8位RISC微控制器IP软核的设计[J]. 微电子学与计算机,2001(3).

上一篇:办公网络的设备选择与维护 下一篇:高校网站设计初探