基于VHDL語言的RISC-CPU系統(tǒng)設計.doc_第1頁
基于VHDL語言的RISC-CPU系統(tǒng)設計.doc_第2頁
基于VHDL語言的RISC-CPU系統(tǒng)設計.doc_第3頁
基于VHDL語言的RISC-CPU系統(tǒng)設計.doc_第4頁
基于VHDL語言的RISC-CPU系統(tǒng)設計.doc_第5頁
免費預覽已結束,剩余40頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

xx大學 畢業(yè)設計(論文)題 目: 基于VHDL語言的 RISC-CPU系統(tǒng)設計 學 院:電氣與電子工程學院 專 業(yè):電子信息工程 學生姓名: 指導教師: 畢業(yè)設計時間:二 九 年 二 月 二十三 日 六 月 十四 共 十 七 周中 文 摘 要摘 要本課題利用CPLD做載體,借助MAX+PLUS軟件平臺,完成了RISC-CPU系統(tǒng)的設計。本文主要闡述了應用CPLD技術實現(xiàn)這一IP核的設計方法。RISC即精簡指令集計算機(Reduced Instruction Set Computer)的縮寫,RISC-CPU與一般的CPU相比不僅只是簡化了指令系統(tǒng),而且是通過簡化指令系統(tǒng)使計算機的結構更加合理,從而提高了運算速度。本課題采用硬件描述語言VHDL設計了8位RISC-CPU系統(tǒng),采用自頂向下(Top-down)的設計方法,根據(jù)設計流程,首先將RISC-CPU劃分成八個基本功能模塊。然后對各個模塊進行VHDL代碼描述,再應用開發(fā)系統(tǒng)中的各種工具進行編譯、功能仿真、邏輯綜合、時序仿真、布局布線等,并最終給出了指令執(zhí)行的仿真波形,驗證了CPU指令的功能。設計表明應用CPLD技術實現(xiàn)RISC-CPU系統(tǒng)設計的方法是完全可行的。關鍵詞:復雜可編程邏輯器件,VHDL語言,RISC-CPU- II -AbstractAbstractBased on MAX+PLUS and CPLD (Complex Programmable Logic Devices),an IP Core Compatible with instructions of RISC-CPU was designed. This thesis mainly researches a method that uses CPLD technology to design the IP core.RISC is the acronym of Reduced Instruction Set Computer.Compared with the common CPU,RISC not only simplifies the instruction set but also makes the computer construction simpler and more reasonable.Consequently it increases the work frequency.Part of 8 bits RISC-CPU was designed with VHSIC hardware description language(VHDL). This paper uses the Top-down design method. According to the designing course, firstly, RISC-CPU was divided into eight modules that the function was single.Secondly, every module was described with VHDL. Then all programs were synthesized and simulated with Quartus II ,and the simulation waves are also provided. As a result,the mehtod that uses VHDL to form the strcture of RISC-CPU is feasible.Keywords: CPLD, VHDL,RISC-CPU 目 錄目 錄摘 要IAbstractII目 錄III第一章緒論11.1課題的背景及意義11.2國內外研究現(xiàn)狀21.3本設計的主要內容2第二章RISC-CPU系統(tǒng)及設計方案32.1 RISC的特點32.2 RISC-CPU基本框架32.3 RISC-CPU系統(tǒng)的設計方案5第三章八位RISC-CPU各模塊設計及仿真83.1 時鐘電路83.2 累加器103.3 算術邏輯運算單元(ALU)123.4 指令寄存器163.5 狀態(tài)控制電路183.6 數(shù)據(jù)控制電路293.7 程序計數(shù)器303.8 地址多路器32第四章RISC-CPU的綜合及操作時序344.1 RISC-CPU的綜合344.2 CPU復位啟動操作時序38第五章設計結論及展望39參考文獻40致謝41- 41 -第一章 緒論第一章 緒論隨著信息產(chǎn)業(yè)的飛速發(fā)展,以軟硬件協(xié)同設計(Software/Hardware Co-Design ),IP核復用(Intellectual Property Core Reuse)和超深亞微米技術(Very Deep Sub-M)為支撐的SOC(系統(tǒng)級芯片System-On-a-Chip)成為集成電路發(fā)展的主流。本文以SOC關鍵技術之一嵌入式IP和設計技術為研究的出發(fā)點,以八位RISC-CPU IP核的設計為目標,對IP核的設計技術進行了實踐與研究。1.1 課題的背景及意義隨著可編程邏輯芯片與基于IP(知識產(chǎn)權)的SOC片上系統(tǒng)技術的發(fā)展,RISC軟核處理器的研究與設計越來越受到人們的重視。研究RISC軟核處理器的現(xiàn)實意義有以下幾方面:(1)對基于FPGA的嵌入式系統(tǒng)的開發(fā)具有現(xiàn)實意義?,F(xiàn)在FPGA在各種嵌入式系統(tǒng)中發(fā)揮著越來越大的作用,F(xiàn)PGA的內部邏輯也越來越復雜,導致了開發(fā)難度的增加。而應用RISC軟核處理器來設計FPGA的內部邏輯就可以大大降低設計的難度,并可以代替嵌入式系統(tǒng)中的硬處理器,從而可以把系統(tǒng)的大部分,甚至全部功能都做到一片F(xiàn)PGA中,使整個系統(tǒng)變得緊湊、小巧,并能提高系統(tǒng)的穩(wěn)定性。(2)對基于IP的SOC的設計開發(fā)具有一定的實用價值。SOC芯片的設計開發(fā)一般是基于IP模塊的復用來設計的,一個SOC 芯片往往會包括一個內嵌的RISC處理器,用來完成其核心處理功能。RISC軟核處理器的設計可以很方便的轉化成相應的IP,從而可以用來設計SOC芯片。(3 )對商用RISC處理器的開發(fā)具有指導意義。RISC軟核處理器包括了所有RISC的基本技術,給商用RISC處理器的開發(fā)提供了一個很好的框架。由于RISC軟核處理器在驗證與修改上比較方便,并且軟核處理器設計完成后,可以很方便的轉化成相應硬處理器的前端設計,因此可以用RISC軟核處理器的設計替代原來硬處理器的前端設計,從而節(jié)省開發(fā)時間,并降低設計難度。由上可知,研究RISC軟核處理器是很有現(xiàn)實意義的。1.2 國內外研究現(xiàn)狀目前國內總體來說在IP的開發(fā)和應用方面做的不夠,但可喜的是,近年來國家己經(jīng)在IP產(chǎn)業(yè)上也有了很大的動作??萍疾坑?000年啟動了“十五”國家在國家高技術研究發(fā)展863計劃中,SOC作為微電子重大專項己列入了信息技術領域的重大專項啟動項目中,在若干關鍵IP核的開發(fā)、軟硬件協(xié)同設計、IP復用、VDSM設計、新工藝新器件等等方面都布置了預研性課題。CPU的IP核是構成SOC技術的核心,開發(fā)出具有自主知識產(chǎn)權的CPU IP核對我國在電子設計技術方面跟上世界先進的步伐,提高信息產(chǎn)業(yè)在世界上的核心競爭力和效益具有重大意義。在國內,基于SOC的CPU設計研究很少有人涉足。雖然市場上應用較為廣泛的微控制器、嵌入式處理器等都有了很成熟的產(chǎn)品,但這些產(chǎn)品主要靠從國外引進,技術基礎比較薄弱。前不久,中芯微系統(tǒng)公司生產(chǎn)出我國第一個具有自主知識產(chǎn)權的實用化32位嵌入式CPU芯片“方舟一號”,這表明我國的RISC CPU設計在嵌入式領域達到了先進水平。1.3本設計的主要內容本設計主要應用VHDL語言實現(xiàn)八位RISC-CPU系統(tǒng)的設計。本論文詳細介紹了關于RISC-CPU的結構以及利用硬件描述語言進行設計的的方法,通過對RISC-CPU結構和指令執(zhí)行的分析將整個系統(tǒng)劃分為各個功能模塊,并闡明各模塊間的接口信號,給出了每個模塊內部設計實現(xiàn)的詳細敘述,最后介紹對設計的綜合和驗證工作,給出了仿真驗證數(shù)據(jù)以及時序圖。第二章RISC-CPU系統(tǒng)及其設計方案第二章 RISC-CPU系統(tǒng)及設計方案RISC-CPU的設計,首先是架構設計。首先要考慮:RISC指令集的特點;RISC-CPU基本框架;然后由指令集特點及RISC-CPU基本框架得出RISC-CPU系統(tǒng)的設計方案。2.1 RISC的特點計算機體系結構中的一個根本性的變革是RISC處理器的出現(xiàn)。RISC即精簡指令集計算機(Reduced Instruction Set Computer)的縮寫。RISC-CPU與一般的CPU相比不僅只是簡化了指令系統(tǒng),而且是通過簡化指令系統(tǒng)使計算機的結構更加簡單合理,從而提高了運算速度。從實現(xiàn)的途徑看,RISC-CPU與一般的CPU的不同之處在于:它的時序控制信號形成部件是用硬布線邏輯實現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構成的狀態(tài)機和組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式快得多,因為這樣做省去了讀取微指令的時間。RISC處理器可以說既簡單又復雜:簡單之處在于,相比于復雜指令集CISC (Complex Instruction Set Computer,復雜指令系統(tǒng)計算機),這種處理器的指令和變量非常少,正如它的英文字母縮寫RISC所代表的“精簡指令集”的含義一樣;說RISC復雜,是因為它們容易實現(xiàn)更高的并行性,而這個特點只有與設計得很好的編譯器結合起來,才能顯現(xiàn)出其優(yōu)越性。2.2 RISC-CPU基本框架雖然RISC-CPU采用精簡指令系統(tǒng)但是它具有和其它CPU一樣的基本功能,也就是其基本組成部分和一般的CPU相同由運算器、控制器和存儲器組成。存儲器存放指令和數(shù)據(jù);數(shù)據(jù)通路包括ALU、程序計數(shù)器等,圖2-1 RISC-CPU基本結構讀寫控制信號控制信號存儲器數(shù)據(jù)通路控制器指令狀態(tài)信號主要功能是對操作數(shù)進行運算,得到結果,并產(chǎn)生程序計數(shù)器的值,作為要執(zhí)行的下一條指令的地址;控制器內有指令寄存器,它對指令進行譯碼,產(chǎn)生相應的控制信號,完成對存儲器和數(shù)據(jù)通路部分的控制。存儲器、數(shù)據(jù)通路和控制器這三部分的基本關系如圖2-1所示。 存儲器存儲器中存放了要執(zhí)行的指令和相應數(shù)據(jù)。存儲器的讀寫信號由控制器給出。存儲器的地址來源有兩個:程序計數(shù)器和指令寄存器。在取新指令時,用程序計數(shù)器的值作為存儲器地址:在執(zhí)行指令時,用指令中的地址部分作為存儲器地址。 數(shù)據(jù)通路數(shù)據(jù)通路主要包括累加器、程序計數(shù)器和算術邏輯單元。累加器用于保存參加運算的數(shù)據(jù)以及運算的中間結果。實際上,累加器也是寄存器,不過,它有特殊性,即許多指令執(zhí)行過程以累加器為中心。往往在運算指令前,累加器中存放一個操作數(shù),指令執(zhí)行后,由累加器保存運算結果。另外輸入輸出指令一般也通過累加器來完成。程序計數(shù)器指向下一條要執(zhí)行的指令。由于程序一般存放在內存的一個連續(xù)區(qū)域,所以,順序執(zhí)行程序時,每取一個指令字節(jié),程序計數(shù)器便加一。算術邏輯單元是專門用來處理各種運算的數(shù)據(jù)信息的,它可以進行加、減、乘、除算術運算和與、或、非、異或等邏輯運算。 控制器控制器產(chǎn)生相應的控制信號送到時序和控制邏輯電路,從而,組合成外部電路所需要的時序和控制信號。這些信號送往其他部件,以控制這些部件協(xié)調工作。實現(xiàn)RISC-CPU的設計,將數(shù)據(jù)和程序(指令序列)統(tǒng)一存放在一個數(shù)據(jù)存儲器中。對圖2-1中的結構進行細化,可以得到一個簡單CPU的構架,如圖2-2所示該CPU采用總線結構,即控制器所需的指令,數(shù)據(jù)通路所需的數(shù)據(jù)都是從總線上得到的。控制信號操作碼地址信號數(shù)據(jù)輸入控制器指令寄存器狀態(tài)控制器指令譯碼器地址信號 執(zhí)行部件(數(shù)據(jù)通路)數(shù)據(jù)輸出圖2-2 RISC-CPU簡單構架2.3 RISC-CPU系統(tǒng)的設計方案計算機進行信息處理可分為兩個步驟:1)將數(shù)據(jù)和程序(即指令序列)輸入到計算機的存儲器中。2)從第一條指令的地址起開始執(zhí)行該程序,得到所需結果,結束運行。CPU的作用是防調并控制計算機的各個部件執(zhí)行程序的指令序列,使其有條不紊地進行。因此它必須具有以下基本功能:取指令:當程序已在存儲器中時,首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號。分析指令:即指令譯碼。是對當前取得的指令進行分析,指出它要求什么操作,并產(chǎn)生相應的操作控制命令。執(zhí)行指令:根據(jù)分析指令時產(chǎn)生的“操作命令”形成相應的操作控制信號序列,通過運算器,存儲器及輸入/輸出設備的執(zhí)行,實現(xiàn)每條指令的功能,其中包括對運算結果的處理以及下條指令地址的形成。本設計的RISC-CPU數(shù)據(jù)總線為8位,而每條指令為兩個字節(jié)(高3位為操作碼,低13位是地址),所以每條指令需取兩次。CPU每次取到指令后,其狀態(tài)控制器(CPU控制中心)分析操作碼后,產(chǎn)生一系列控制信號,啟動或停止某些部件。其中時鐘發(fā)生器利用外來時鐘信號進行分頻生成一系列時鐘信號,送往其他部件用作時鐘信號。由功能分析,RISC-CPU是一個復雜的數(shù)字邏輯電路,但是它的基本部件的邏輯并不復雜,可把它分成以下八個基本部件,各個模塊之間的互連關系如圖2-3所示。clkresetetet累加器地址多路器程序計數(shù)器數(shù)據(jù)控制電路狀態(tài)控制電路時鐘電路邏輯運算單元指令寄存器圖2-3 RISC-CPU 結構框圖1.時鐘電路(clock):產(chǎn)生一系列的時鐘信號送往CPU其他部件;2.狀態(tài)控制電路(state-contrl):CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件;3.指令寄存器(reg):存儲指令;4.累加器(acc):存放算術邏輯運算單元當前的結果,它也是算術邏輯運算單元雙目運算中的一個數(shù)據(jù)來源;5.算術邏輯運算單元(alu):根據(jù)輸入的8種不同操作碼分別實現(xiàn)相應的加、與、讀、寫、異或,跳轉等指令;6.數(shù)據(jù)控制電路(datactrl)控制累加器的數(shù)據(jù)輸出;7.程序計數(shù)器(pc):提供指令地址;8.地址多路器(addr-mux):選擇輸出的地址是PC(程序計數(shù))地址還是跳轉的目標地址。第三章 八位RISC-CPU各摸塊設計及仿真第三章 八位RISC-CPU各模塊設計及仿真八位RISC-CPU可以劃分為八個基本部件:時鐘電路、累加器、RISC-CPU算術邏輯運算單元、指令寄存器、狀態(tài)控制電路、數(shù)據(jù)控制電路、程序計數(shù)器、地址多路器,下面將具體闡述各子模塊的功能和設計思想。3.1 時鐘電路時鐘電路用于產(chǎn)生CPU各部件的時鐘。單片機的時鐘可以由兩種方式產(chǎn)生,一種是內部方式,利用芯片內部的振蕩電路;另一種方式為外部方式。在此采用外部時鐘的方式,即利用外部振蕩信號經(jīng)過分頻以后產(chǎn)生所需時鐘。綜合后的引腳圖,如圖3-1所示。3-1時鐘電路圖中clk為輸入引腳接外部振蕩信號,在此設計中,外部振蕩信號由4M晶振提供。clk1、clk8和alu_clk是輸出信號,分別用來控制CPU的其它部件。其中clkl信號經(jīng)clk反相后到,用作指令寄存器、累加器、狀態(tài)控制電路的時鐘信號:clk信號8分頻后得到clk8,clk8的上升沿到來觸發(fā)CPU的狀態(tài)控制電路,控制CPU開始執(zhí)行一條指令,同時clk8信號還用于控制地址多路器:clk的2分頻信號、4分頻信號和clk8的反相信號相與得到ALU電路的時鐘信號alu_clk。clkl和alu_clk信號的邏輯算式如下: clkl=not clk; alu_clk=clk2 and clk4 and (not clk8);時鐘電路源程序及仿真波形如下:library ieee;use ieee.std_logic_1164.all;entity clock isport(clk: in std_logic; clk1: buffer std_logic; clk8: buffer std_logic:=0; alu_clk: out std_logic);end clock;architecture behave of clock issignal clk2: std_logic:=0;signal clk4: std_logic:=1;begin alu_clk=clk2 and clk4 and (not clk8);process(clk1)beginclk1=not clk; if clk1event and clk1=1then clk2=not clk2; end if;end process;process(clk2)begin if clk2event and clk2=0 then clk4=not clk4; end if;end process;process(clk4)begin if clk4event and clk4=1 then clk8=not clk8; end if;end process;end behave;圖3-2 時鐘電路各信號波形3.2 累加器累加器是一個最常用的專用寄存器,大部分單操作數(shù)指令的操作數(shù)取自累加器,很多雙操作數(shù)指令的一個操作數(shù)也取自累計器。同時累加器還用來存放算術運算指令的結果,綜合后的引腳圖,如圖3-3所示。圖3-3 累加器累加器的時鐘信號由時鐘電路產(chǎn)生的clkl信號提供。累加器采用同步復位方式,當reset信號為高電平時,累加器的值為零。在reset信號變低以后,當ena信號有效時,clk上升沿到來后接收來自于數(shù)據(jù)總線的數(shù)據(jù),由d7.0端輸入:當ena信號無效時,累加器的值保持不變。累加器的ena信號由狀態(tài)控制電路產(chǎn)生。累加器的VHDL代碼主要采用PROCESS語句編寫。如前所述,PROCESS語句本身是一種并行處理語句,但進程的內部結構由一系列順序語句構成,語句逐條執(zhí)行,順序與語句的書寫順序相一致。之所以采用PROCESS語句的原因是:進程必須由敏感信號表中定義的任一敏感信號的變化激活。而累加器的一切操作都由時鐘信號控制進行,因此采用PROCESS語句可以很方便的實現(xiàn)這一要求。其源程序如下:library ieee;use ieee.std_logic_1164.all;entity acc isport(clk,reset,ena:in std_logic; d:in std_logic_vector(7 downto 0); accum:out std_logic_vector(7 downto 0);end acc;architecture art of acc isbeginprocess(clk, ena)beginif clkevent and clk=1then if reset=1then accum=00000000; elsif ena=1then accum=d; end if; end if;end process;end art;3-4 累加器各信號波形圖3-4為累加器各信號仿真波形圖。如圖所示,當復位信號reset=0、使能信號ena=1時,在每個clk上升沿到來后,ACC接收來自于數(shù)據(jù)總線d7.0的數(shù)據(jù)(00、01、02、03、04);當ena=0,ACC保持04不變;當ena又變?yōu)橛行盘柡?,ACC繼續(xù)接受來自數(shù)據(jù)總線的數(shù)據(jù);當reset=1,ACC復位,輸出accum清零。3.3 算術邏輯運算單元(ALU)ALU的功能十分強大,它不僅可以進行邏輯“與”“或”“異或”等邏輯運算,還可以進行加、減算術運算。除此之外還可以進行停機、跳轉等操作。邏輯運算單元模塊引腳圖如3-5所示。圖3-5 算術邏輯運算單元圖3-5中clk為ALU的時鐘信號,由時鐘電路生成的alu_clk信號提供;opcode為操作碼輸入端,取自指令寄存器的高3位,ALU根據(jù)輸入的不同操作碼進行不同的操作;data輸入來自數(shù)據(jù)總線上的數(shù)據(jù);accum端輸入來自累加器的一個操作數(shù);alu_out端用來保存或輸出操作后的結果;zero用于標志累加器的結果accum是否為0,如果為0,則zero為1,否則zero為0。在程序設計時,首先定義指令的編碼,然后規(guī)定各個指令所對應的操作,編寫程序時采用CASE語句實現(xiàn)。CASE語句用來描述總線或編碼、譯碼的行為,從許多不同語句的序列中選擇其中之一執(zhí)行,屬于數(shù)據(jù)流描述法,是結構體描述方法的一種。當然此處也可以采用IF語句實現(xiàn)。沒有采用IF語句的原因有以下幾個:首先CASE語句的可讀性比IF語句要強的多,程序的閱讀者很容易找出條件式和動作的對應關系。其次在CASE語句中,WHEN語句可以顛倒次序而不至于發(fā)生錯誤:而在IF語句中,顛倒條件判別的次序往往會使綜合的邏輯功能發(fā)生變化。另外,在IF語句中,先處理最起始的條件,如果不滿足,再處理下一個條件:而在CASE語句中,沒有值的順序號,所有值是并行處理的,這樣就縮短了程序的執(zhí)行時間。算術邏輯運算單元程序及仿真波形如下,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity alu isport(clk: in std_logic; opcode: in std_logic_vector(2 downto 0); data,accum: in std_logic_vector(7 downto 0); zero: out std_logic; alu_out: out std_logic_vector(7 downto 0);end alu;architecture behave of alu issignal alu_out_latch: std_logic_vector(7 downto 0);constant NOP: std_logic_vector(2 downto 0):=000;constant JZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant ANL: std_logic_vector(2 downto 0):=011;constant XRL: std_logic_vector(2 downto 0):=100;constant MOV: std_logic_vector(2 downto 0):=101;constant MEM: std_logic_vector(2 downto 0):=110;constant AJMP: std_logic_vector(2 downto 0):=111;begin zeroalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latch=XXXXXXXX; end case;end if;end process; alu_out=alu_out_latch;end behave;仿真波形如圖3-6所示:圖3-6 算術邏輯運算單元仿真波形在此仿真波形圖中,clk為時鐘信號輸入端口,zero為判accum是否為零的輸出端口。opcode為操作碼輸入端,data為數(shù)據(jù)輸入端,accum為另一輸入端口,它接累加器的輸出端。opcode不同的值代表不同的操作,在此圖中,假設data為“1”(十進制),accum為“2”,兩者相與為“0”,相加為“3”,跳轉時則輸出accum的值“2”,數(shù)據(jù)傳輸時輸出data的值“1”。3.4 指令寄存器指令寄存器用來寄存指令,其引腳圖如圖3-7所示。指令寄存器的觸發(fā)時鐘是clk1。clk1的上升沿觸發(fā),寄存器開始工作。每條指令為兩個字節(jié),即16位。高3位是操作碼,低13位是地址。本設計的數(shù)據(jù)總線為8位,所以每條指令需要取兩次,先取高8位,后取低8位。由狀態(tài)變量state來標志從數(shù)據(jù)總線上取來的數(shù)據(jù)是高8位還是低8位。如果state為0表示取得的是高8位,存入高8位寄存器,同時將變量state置為1。下次再寄存時,由于state為1,可知取得的是低8位,存入低8位寄存器中,同時將state置為0。圖3-7指令寄存器由于數(shù)據(jù)總線既可以傳輸指令也可以傳輸數(shù)據(jù),而且只有指令需要寄存到指令寄存器中,因此需要一個信號指示是否進行寄存。圖中ena引腳用來控制是否寄存。當數(shù)據(jù)總線傳輸?shù)氖侵噶顣r,ena端由控制電路置為1,指令寄存;如果數(shù)據(jù)總線傳輸?shù)氖菙?shù)據(jù),則ena為0,指令寄存器停止工作。指令寄存時,分為高3位和低13位分別寄存到操作碼寄存器opcode和地址寄存器instr_addr。指令寄存器源程序如下:library ieee;use ieee.std_logic_1164.all;entity reg isport(clk, reset, ena: in std_logic; data: in std_logic_vector(7 downto 0); opcode: out std_logic_vector(2 downto 0); instr_addr: out std_logic_vector(12 downto 0);end reg;architecture behave of reg issignal opc_iraddrs: std_logic_vector(15 downto 0);beginprocess(clk)variable state: std_logic:=0;begin if(clkevent and clk=1)then if reset=1then opc_iraddrs0); elsif ena=1 then case state is when 0 =opc_iraddrs(15 downto 8)opc_iraddrs(7 downto 0)null; end case; else state:=0; end if;end if;end process; opcode=opc_iraddrs(15 downto 13); instr_addr=opc_iraddrs(12 downto 0);end behave;仿真波形如圖3-8如下:圖3-8 指令寄存器仿真波形在此仿真波形圖中,clk為時鐘輸入信號,ena為使能輸入端口,reset為復位端口,這里假設data傳輸?shù)囊恢笔恰?1”(十六進制),則當state為0時,傳輸高八位,當state為1時,傳輸?shù)桶宋?。其?3至15位存入opcode中,0至12位存入str_addr中。所以這里的opcode為“1”,str_addr為“0121”。3.5 狀態(tài)控制電路狀態(tài)控制電路是CPU的控制核心。用于產(chǎn)生一系列的控制信號,來控制各部件的啟動或者停止。clk1、clk8由時鐘產(chǎn)生電路產(chǎn)生;reset為高電平時,復位狀態(tài)控制電路所有輸出信號;opcode為操作碼輸入端,取自指令寄存器的高三位;pc_clk作為程序計數(shù)器的時鐘信號;acc_ena輸出到累加器的使能端;pc_ena為指令寄存器的使能信號,控制指令寄存器的啟、停;datactrl_ena作為數(shù)據(jù)控制電路的使能信號;idle為停機信號,輸出到片外。圖3-9 狀態(tài)控制電路如果將狀態(tài)控制電路作為一個整體進行程序編寫,有許多語句需要反復描述。這樣降低了程序的可讀性,而且在硬件實現(xiàn)時也會增加不必要的重復的邏輯電路。因此將狀態(tài)控制電路又分為狀態(tài)機和狀態(tài)控制器兩部分。狀態(tài)控制器產(chǎn)生使能信號ena控制狀態(tài)機的啟、停。當復位信號reset有效時,狀態(tài)控制器將ena置零,從而使狀態(tài)機停止工作,各輸出信號復位。狀態(tài)控制器中當復位脈沖過后,clk8上升沿到來,ena 輸出為1,否則為0。下面重點說明狀態(tài)機的設計。圖3-11狀態(tài)機 圖3-10狀態(tài)控制器此設計中,指令周期由8個時鐘周期組成,每個時鐘周期完成固定的工作。因此狀態(tài)控制器有8個狀態(tài),當前狀態(tài)由某一變量記錄,此變量的值就是當前這個指令周期中經(jīng)過的時鐘數(shù)(從零開始記錄)。各時鐘周期,CPU 進行的操作如下:第0個時鐘,從ROM讀取指令。由于指令長度為16位,數(shù)據(jù)總線為8位,所以讀取一條指令需要兩個時鐘周期。第0個時鐘讀取指令的高8位代碼,并存入指令寄存器。此時狀態(tài)機使讀信號rd和reg_ena輸出1(表示高電平),其余全部為0(表示低電平)。第1個時鐘,從ROM讀取指令的低8位代碼并存入指令寄存器。此時鐘結束后一條指令讀完,程序指針將指向下一個存儲單元。因此與上一時鐘相比pc_clk也從0變?yōu)?,使程序計數(shù)器(PC)增1。第2個時鐘,空操作。所有的輸出信號均為0。第3個時鐘,開始分析前兩個時鐘讀取的指令。如果操作符為NOP ,則輸出信號idle為高;如果操作符不為NOP,則PC增1,指向下一條指令,其他各控制線輸出為零。第4個時鐘,若取得的操作符為ANL,ADD,XRL或MOV,則rd輸出1,讀取相應地址的數(shù)據(jù),地址由所讀取的指令的低13位給出;若為AJMP,則pc_ena信號輸出為1,使程序計數(shù)器讀入目的地址;若為MEM,則datactrl_ena輸出1,使數(shù)據(jù)控制電路輸出累加器數(shù)據(jù);若為其它指令,則輸出全為0。第5個時鐘,若取得的操作符為ANL,ADD或XRL,則ALU將從ROM讀取的數(shù)據(jù)和累加器數(shù)據(jù)進行相應的運算;若為MOV,就把從ROM讀取的數(shù)據(jù)通過ALU送給累加器;若為JZ,先通過zero判斷累加器的值是否為0,如果為0,pc_clk輸出1,使PC增1,否則PC保持原值不變;若為AJMP,鎖存目的地址;若為MEM,將數(shù)據(jù)寫入ROM中的相應地址處;若為其它指令,則輸出全為0。第6個時鐘,空操作。第7個時鐘,若操作符為JZ且累加器值為0,則PC值再加1,跳過一條指令,否則PC保持原值不變;如果操作符不是JZ,則所有輸出為0。根據(jù)上述描述,畫出狀態(tài)機的狀態(tài)轉換圖,如圖4-12所示。其中輸入為opcode,輸出為狀態(tài)機的各個輸出信號。然后根據(jù)各狀態(tài)編寫狀態(tài)機的VHDL代碼。AJMPADD,ANL,XRL,MOVMEM其他讀取高八位空操作JZ其他S0S7NOP其他S1S2S3S6S5S4讀取低八位空操作AJMPANL,ADD,XRLMOVJZMEM 其他圖3-12 狀態(tài)機狀態(tài)轉換狀態(tài)控制器程序如下: library ieee;use ieee.std_logic_1164.all;entity mach_ctr isport(clk8,reset: in std_logic; ena: out std_logic);end mach_ctr;architecture behave of mach_ctr isbeginprocess(clk8)begin if clk8event and clk8=1 then if reset=1then ena=0; else ena=1; end if; end if;end process;end behave;狀態(tài)機程序如下:library ieee;use ieee.std_logic_1164.all;package mypack is component mach_ctr port(clk8,reset: in std_logic; ena: out std_logic); end component; component state_machine port(clk, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,reg_ena,idle,datactrl_ena:out std_logic); end component;end mypack;library ieee;use ieee.std_logic_1164.all;use work.mypack.all;entity state_contrl isport(clkl,zero,clk8,reset: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,reg_ena,idle,datactrl_ena:out std_logic);end state_contrl;architecture rt1 of state_contrl issignal ena_b: std_logic;beginUl:mach_ctr port map(clk8,reset,ena_b);U2:state_machine port map (clkl,ena_b, zero, opcode, pc_clk, acc_ena,pc_ena, rd, wr, reg_ena, idle, datactrl_ena);end rt1;library ieee;use ieee.std_logic_1164.all;entity state_machine isport(clk, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk, acc_ena, pc_ena, rd, wr, reg_ena, idle, datactrl_ena: out std_logic);end state_machine;architecture behave of state_machine istype state_type is (s0, s1,s2, s3, s4, s5, s6, s7);signal state: state_type;constant NOP: std_logic_vector(2 downto 0):=000;constant JZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant ANL: std_logic_vector(2 downto 0):=011;constant XRL: std_logic_vector(2 downto 0):=100;constant MOV: std_logic_vector(2 downto 0):=101;constant MEM: std_logic_vector(2 downto 0):=110;constant AJMP: std_logic_vector(2 downto 0):=111;beginprocess(clk)begin if clkevent and clk=1then if ena=0 then state=s0; pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; reg_ena=0; idle=0; datactrl_enapc_clk=0; acc_ena=0; pc_ena=0; rd=1; wr=0; reg_ena=1; datactrl_ena=0; idle=0; statepc_clk=1; acc_ena=0; pc_ena=0; rd=1; wr=0; reg_ena=1; datactrl_ena=0; idle=0; statepc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; reg_ena=0; datactrl_ena=0; i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論