摘要:本文介紹了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可以分為:四位微處理器、八位微處理器、十六位微處理器、三十二位微處理器以及六十四位微處理器等等。隨著社會的發展,微處理器的應用已經深入到科學計算,信息處理,事務管理,過程控制,儀器儀表制造,民用產品和家用電器等各個方面。而且由于微處理器的發展,出現了一些不曾有的新儀器。比如,電子實驗室中,出現了微處理器控制的示波器――邏輯分析儀。在加電方面,冰箱和自動洗衣機的工作都離不開微處理器[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).