基于VHDL語言的8位RISC-CPU的設(shè)計(jì)_第1頁
基于VHDL語言的8位RISC-CPU的設(shè)計(jì)_第2頁
基于VHDL語言的8位RISC-CPU的設(shè)計(jì)_第3頁
基于VHDL語言的8位RISC-CPU的設(shè)計(jì)_第4頁
基于VHDL語言的8位RISC-CPU的設(shè)計(jì)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、基于VHDL語言的8位RISC-CPU的設(shè)計(jì) 畢業(yè)設(shè)計(jì)說明書基于VHDL語言的8位RISC-CPU的設(shè)計(jì) 學(xué) 院: 專 業(yè): 學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師: 201 年 月摘 要 RISC即精簡指令集計(jì)算機(jī)(Reduced Instruction Set Computer)的縮寫。RISC-CPU與一般的CPU相比,通過簡化指令系統(tǒng)使計(jì)算機(jī)的結(jié)構(gòu)更加簡單合理,從而提高了運(yùn)算速度。本文對(duì)RISC-CPU的架構(gòu)進(jìn)行了分析,并使用VHDL語言設(shè)計(jì)了8位RISC-CPU IP軟核。 RISC-CPU由八大根本模塊構(gòu)成:時(shí)鐘發(fā)生器、指令存放器、累加器、算術(shù)邏輯單元、數(shù)據(jù)輸出控制器、地址多路器、程序計(jì)數(shù)

2、器、狀態(tài)控制器。本設(shè)計(jì)中借助+PLUS軟件平臺(tái)對(duì)各模塊進(jìn)行時(shí)序仿真,并最終給出了指令執(zhí)行的仿真波形,驗(yàn)證了CPU的功能。 設(shè)計(jì)仿真結(jié)果說明,該8位RISC-CPU能夠完成既定的任務(wù)指標(biāo),而且在運(yùn)行效率上有一定程度改善。關(guān)鍵詞:RISC-CPU、VHDL、+PLUS、IP軟核、時(shí)序仿真AbstractRISC reduced instruction set computer that Reduced Instruction Set Computer acronym. RISC-CPU and CPU in general compared to instruction by simplifyin

3、g the structure of the computer is more simple and reasonable, thereby increasing processing speed. In this paper, RISC-CPU architecture is analyzed, and by using the VHDL language, I designed an 8-bit RISC-CPU IP soft core.RISC-CPU is based on 8 modules: clock generator, instruction register, accum

4、ulator, arithmetic logic unit, data output controller, address multiplexer, program counter, state controller. In the design, each module are timing simulated on +PLUS software platform, and finally the simulated waveform of instruction execution that verifies the CPU features is given.Design and si

5、mulation results show that the 8-bit RISC-CPU can complete the tasks, and also has a certain degree of improvement on operational efficiency.Keywords: RISC-CPU, VHDL, +PLUS, IP soft core, Timing Simulation目 錄摘 要IAbstract(英文摘要)II目 錄III第一章引言11.1 課題背景與開展現(xiàn)狀11.1.1 課題背景11.1.2 RISC-CPU的開展現(xiàn)狀11.2 RISC-CPU優(yōu)勢(shì)與

6、現(xiàn)實(shí)意義11.2.1 RISC-CPU具備的優(yōu)勢(shì)11.2.2 本課題的現(xiàn)實(shí)意義21.3 本設(shè)計(jì)的主要內(nèi)容2第二章RISC-CPU的架構(gòu)設(shè)計(jì)32.1 RISC-CPU根本架構(gòu)32.2 RISC-CPU模塊的劃分4第三章八位RISC-CPU各模塊設(shè)計(jì)與仿真63.1 時(shí)鐘發(fā)生器63.2 指令存放器73.3 累加器103.4 算術(shù)邏輯單元113.5 數(shù)據(jù)輸出控制器133.6 地址多路器143.7 程序計(jì)數(shù)器153.8 狀態(tài)控制器17第四章RISC-CPU的綜合及操作時(shí)序254.1 RISC-CPU各模塊綜合254.2 CPU復(fù)位啟動(dòng)操作時(shí)序29結(jié)論30參考文獻(xiàn)31致謝32引 言1.1 題背景與開展現(xiàn)狀

7、1.1.1 課題背景 CPU是Central Processing Unit?中央處理器的縮寫,它是計(jì)算機(jī)中最重要的一個(gè)局部。CPU由運(yùn)算器和控制器組成,其內(nèi)部結(jié)構(gòu)歸納起來可以分為控制單元、邏輯單元和存儲(chǔ)單元三大局部,這三個(gè)局部相互協(xié)調(diào),便可以進(jìn)行分析,判斷、運(yùn)算并控制計(jì)算機(jī)各局部協(xié)調(diào)工作。CPU從最初開展至今已經(jīng)有幾十年的歷史了,這期間,按照其處理信息的字長,CPU可以分為:四位微處理器、八位微處理器、十六位微處理器、三十二位微處理器以及六十四位微處理器。而RISC處理器的出現(xiàn)標(biāo)志著計(jì)算機(jī)體系結(jié)構(gòu)中的一個(gè)根本性變革。 RISC即精簡指令集計(jì)算機(jī)Reduced Instruction Set

8、Computer的縮寫。從實(shí)現(xiàn)的途徑看,RISC-CPU與一般的CPU的不同處在于:它的時(shí)序控制信號(hào)形成部件是用硬布線邏輯實(shí)現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構(gòu)成的狀態(tài)機(jī)和組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式快得多,因?yàn)檫@樣做省去了讀取微指令的時(shí)間。1.1.2 RISC-CPU的開展現(xiàn)狀 IBM公司在1975年成功開發(fā)出第一款RISC處理器,從此RISC架構(gòu)開始走進(jìn)超級(jí)計(jì)算機(jī)中。由于指令高度簡約,RISC處理器的晶體管規(guī)模普遍都很小而性能強(qiáng)大,深受超級(jí)計(jì)算機(jī)廠商所青睞。很快,許多廠商都開發(fā)出了自己的RISC指令系統(tǒng),除了IBM的Power

9、和PowerPC外,還有DEC的Alpha、SUN的SPARC、HP的PA-RISC、MIPS技術(shù)公司的MIPS、ARM公司的ARM等。它的應(yīng)用范圍也遠(yuǎn)比X86來得廣泛,大到各種超級(jí)計(jì)算機(jī)、工作站、高階效勞器,小到各類嵌入式設(shè)備、家用游戲機(jī)、消費(fèi)電子產(chǎn)品、工業(yè)控制計(jì)算機(jī),都可以看到RISC的身影。1.2 RISC-CPU優(yōu)勢(shì)與現(xiàn)實(shí)意義1.2.1 RISC-CPU具備的優(yōu)勢(shì) RISC有一套優(yōu)化過的指令架構(gòu),它是根據(jù)著名的80/20法那么所訂立。早在上個(gè)世紀(jì)60年代,計(jì)算機(jī)科學(xué)家們發(fā)現(xiàn),計(jì)算機(jī)中80%的任務(wù)只是動(dòng)用了大約20%的指令,而剩下20%的任務(wù)才有時(shí)機(jī)使用到其他80%的指令。如果對(duì)指令系統(tǒng)

10、作相應(yīng)的優(yōu)化,就可以從根本上快速提高處理器的執(zhí)行效率。 RISC與CISC(一般指普通的X86CPU)比擬,有以下優(yōu)勢(shì): 指令簡單而且少;指令系統(tǒng)選用那些使用頻度高的簡單指令和一些實(shí)用的但不十分復(fù)雜的指令,一般指令不超過100條;指令字長固定,尋址方式一般不超過四種,指令格式也不超過四種;所有指令幾乎所有指令均在單指令周期完成;指令系統(tǒng)中只允許存STORE和取LOAD指令訪問主存,其它指令均在存放器之間進(jìn)行;CPU中設(shè)置大量的存放器,稱作存放器堆;指令的運(yùn)行采用高效的流水線方式;以硬布線控制邏輯為主,不用或少用微碼;優(yōu)化的編譯程序,簡單有效地支持高級(jí)語言;超低功耗。1.2.2 本課題的現(xiàn)實(shí)意義

11、 本課題的設(shè)計(jì)具有重要的意義: 從IP設(shè)計(jì)技術(shù)層面看,本課題按照自頂向下Top-Down的設(shè)計(jì)方法,從系統(tǒng)級(jí)結(jié)構(gòu)和模塊劃分到硬件描述、綜合、仿真燈,研究了Altera公司的+plusII工具的使用,掌握了IP正向設(shè)計(jì)的根本方法,積累了珍貴經(jīng)驗(yàn)。 從RISC-CPU設(shè)計(jì)技術(shù)層面看,通過本課題的設(shè)計(jì)過程,了解掌握了MIPS指令系統(tǒng)CPU體系結(jié)構(gòu)設(shè)計(jì)的關(guān)鍵技術(shù)。 從嵌入式系統(tǒng)設(shè)計(jì)技術(shù)層面看,集成電路開展已進(jìn)入IP core復(fù)用的SoC時(shí)代,8位嵌入式微處理器開展的一個(gè)重要特點(diǎn)是片上系統(tǒng)SoC化。本課題也為基于IP核的嵌入式系統(tǒng)設(shè)計(jì)積累了珍貴經(jīng)驗(yàn)。 從市場(chǎng)應(yīng)用層面看,8位RISC-CPU是目前市場(chǎng)上同

12、類產(chǎn)品占市場(chǎng)份額最大的一塊,符合我國集成電路當(dāng)前的設(shè)計(jì)水平,以它作為參與市場(chǎng)競(jìng)爭(zhēng)的突破口,來提高企業(yè)的市場(chǎng)競(jìng)爭(zhēng)能力和技術(shù)創(chuàng)新能力,是一個(gè)切實(shí)可行的方案。1.3 本設(shè)計(jì)的主要內(nèi)容 本文對(duì)RISC-CPU的架構(gòu)進(jìn)行了探討,介紹了如何設(shè)計(jì)RISC-CPU,并且立足于八位的 RISC-CPU設(shè)計(jì)實(shí)例,應(yīng)用硬件描述語言VHDL語言實(shí)現(xiàn)8位簡化RISC-CPU IP軟核的設(shè)計(jì),通過對(duì)RISC-CPU結(jié)構(gòu)和指令執(zhí)行的分析將整個(gè)系統(tǒng)劃分為各個(gè)功能模塊,并說明各模塊間的接口信號(hào),給出了每個(gè)模塊內(nèi)部設(shè)計(jì)實(shí)現(xiàn)的詳細(xì)表達(dá),最后介紹對(duì)設(shè)計(jì)的綜合和驗(yàn)證工作,給出了仿真驗(yàn)證數(shù)據(jù)以及時(shí)序圖。設(shè)計(jì)需要實(shí)現(xiàn)的這個(gè)簡化的8位 RI

13、SC-CPU采用MIPS的局部指令集,同時(shí)對(duì)MIPS CPU的結(jié)構(gòu)進(jìn)行一定的修改。RISC-CPU的架構(gòu)設(shè)計(jì)2.1 RISC-CPU根本架構(gòu) 一個(gè)根本的CPU要包括三局部功能:數(shù)據(jù)的存儲(chǔ)、數(shù)據(jù)的運(yùn)算和控制局部。與之相對(duì)應(yīng)的硬件結(jié)構(gòu)也分為三局部:存儲(chǔ)器、數(shù)據(jù)通路和控制器。存儲(chǔ)器存放指令和數(shù)據(jù);數(shù)據(jù)通路包括ALU、程序計(jì)數(shù)器等,主要功能是對(duì)操作數(shù)進(jìn)行運(yùn)算,得到結(jié)果,并產(chǎn)生程序計(jì)數(shù)器的值,作為要執(zhí)行的下一條指令的地址;控制器內(nèi)有指令存放器,它對(duì)指令進(jìn)行譯碼,產(chǎn)生相應(yīng)的控制信號(hào),完成對(duì)存儲(chǔ)器和數(shù)據(jù)通路局部的控制。 存儲(chǔ)器、數(shù)據(jù)通路和控制器這三局部的根本關(guān)系下列圖所示: 存儲(chǔ)器中存放了要執(zhí)行的指令和相應(yīng)

14、數(shù)據(jù)。存儲(chǔ)器的讀寫信號(hào)由控制器給出。存儲(chǔ)器的地址來源有兩個(gè):程序計(jì)數(shù)器和指令存放器。在取新指令時(shí),用程序計(jì)數(shù)器的值作為存儲(chǔ)器地址;在執(zhí)行指令時(shí),用指令中的地址局部作為存儲(chǔ)器地址。 數(shù)據(jù)通路主要包括累加器、程序計(jì)數(shù)器和算術(shù)邏輯單元。 累加器用于保存參加運(yùn)算的數(shù)據(jù)以及運(yùn)算的中間結(jié)果。實(shí)際上,累加器也是存放器,不過,它有特殊性,即許多指令執(zhí)行過程以累加器為中心。往往在運(yùn)算指令前,累加器中存放一個(gè)操作數(shù),指令執(zhí)行后,由累加器保存運(yùn)算結(jié)果。另外輸入輸出指令一般也通過累加器來完成。 程序計(jì)數(shù)器指向下一條要執(zhí)行的指令。由于程序一般存放在內(nèi)存的一個(gè)連續(xù)區(qū)域,所以,順序執(zhí)行程序時(shí),每取一個(gè)指令字節(jié),程序計(jì)數(shù)器便

15、加一。 算術(shù)邏輯單元是專門用來處理各種運(yùn)算的數(shù)據(jù)信息的,它可以進(jìn)行加、減、乘、除算術(shù)運(yùn)算和與、或、非、異或等邏輯運(yùn)算。 控制器產(chǎn)生相應(yīng)的控制信號(hào)送到時(shí)序和控制邏輯電路,從而,組合成外部電路所需要的時(shí)序和控制信號(hào)。這些信號(hào)送往其他部件,以控制這些部件協(xié)調(diào)工作。 對(duì)圖2-1中的結(jié)構(gòu)進(jìn)行細(xì)化,可以得到一個(gè)簡單的架構(gòu),如下列圖所示。該CPU采用總線結(jié)構(gòu),即控制器所需的指令和數(shù)據(jù)通路所需的數(shù)據(jù)都是從總線上得到的。2.2 RISC-CPU模塊的劃分 計(jì)算機(jī)進(jìn)行信息處理可分為兩個(gè)步驟: 一、將數(shù)據(jù)和程序(即指令序列)輸入到計(jì)算機(jī)的存儲(chǔ)器中。 二、從第一條指令的地址起開始執(zhí)行該程序,得到所需結(jié)果,結(jié)束運(yùn)行。

16、CPU的作用是協(xié)調(diào)并控制計(jì)算機(jī)的各個(gè)部件執(zhí)行程序的指令序列,使其有條不紊地進(jìn)行。因此它必須具有以下根本功能: 取指令:當(dāng)程序已在存儲(chǔ)器中時(shí),首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號(hào)。 分析指令:即指令譯碼。是對(duì)當(dāng)前取得的指令進(jìn)行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作控制命令。 執(zhí)行指令:根據(jù)分析指令時(shí)產(chǎn)生的“操作命令形成相應(yīng)的操作控制信號(hào)序列,通過運(yùn)算器,存儲(chǔ)器及輸入/輸出設(shè)備的執(zhí)行,實(shí)現(xiàn)每條指令的功能,其中包括對(duì)運(yùn)算結(jié)果的處理以及下條指令地址的形成。 由功能分析,RISC-CPU應(yīng)至少包含八個(gè)根本組成部件,即:時(shí)鐘發(fā)生器、指令存放器、累加器、算術(shù)邏輯單元、數(shù)據(jù)輸出控

17、制器、地址多路器、程序計(jì)數(shù)器、狀態(tài)控制器,各個(gè)模塊之間的互連關(guān)系如下列圖: 1.時(shí)鐘發(fā)生器clkgen:產(chǎn)生一系列的時(shí)鐘信號(hào)送往 CPU 其他部件; 2.指令存放器register:存儲(chǔ)指令; 3.累加器accum:存放算術(shù)邏輯單元當(dāng)前的結(jié)果,它也是算術(shù)邏輯單元雙目運(yùn)算中的一個(gè)數(shù)據(jù)來源; 4.算術(shù)邏輯單元alu:根據(jù)輸入的 8 種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、讀、寫、異或,跳轉(zhuǎn)等指令; 5.數(shù)據(jù)輸出控制器datactl:控制累加器的數(shù)據(jù)輸出; 6.狀態(tài)控制器control:CPU 的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件; 7.程序計(jì)數(shù)器counter:提供指令地址,以便讀取

18、指令; 8.地址多路器adr:選擇輸出的地址是 PC(程序計(jì)數(shù))地址還是跳轉(zhuǎn)的目標(biāo)地址。八位RISC-CPU各模塊設(shè)計(jì)與仿真3.1 時(shí)鐘發(fā)生器 時(shí)鐘發(fā)生器Clock Generator如上圖所示,利用外來時(shí)鐘信號(hào)CLK來生成一系列時(shí)鐘信號(hào)CLK1、FETCH、ALU_CLK送往CPU的其他部件,各分頻時(shí)鐘信號(hào)功能如下:CLK1信號(hào)經(jīng)CLK反相后用作指令存放器、累加器、狀態(tài)控制器的時(shí)鐘信號(hào)。FETCH是外來時(shí)鐘CKL的8分頻信號(hào),其上升沿觸發(fā)CPU控制器開始執(zhí)行一條指令,該信號(hào)同時(shí)還控制地址多路器輸出指令地址和數(shù)據(jù)地址。ALU電路的時(shí)鐘信號(hào)ALU_CLK,由CLK的2分頻信號(hào)、4分頻信號(hào)和FET

19、CH的反相信號(hào)相與得到,用于觸發(fā)算術(shù)邏輯單元。 時(shí)鐘發(fā)生器源程序如下: library ieee; use ieee.std_logic_1164.all; entity clkgen is portclk: in std_logic; clk1: buffer std_logic; fetch: buffer std_logic:0; alu_clk: out std_logic; end clkgen; architecture behave of clkgen is signal clk2: std_logic:0; signal clk4: std_logic:1; begin alu

20、_clkclk2 and clk4 and not fetch; processclk1 begin clk1not clk; if clk1event and clk11then clk2not clk2; end if; end process; processclk2 begin if clk2event and clk20 then clk4not clk4; end if; end process; processclk4 begin if clk4event and clk41 then fetchnot fetch; end if; end process; end behave

21、; 外來時(shí)鐘為12MHz,周期T0.083us,取每格41.6ns。仿真波形如下:3.2 指令存放器 指令存放器Instruction Register用于存放指令。如圖3-3,指令存放器的觸發(fā)時(shí)鐘是CLK1,在CLK1的上升沿觸發(fā)下,存放器將數(shù)據(jù)總線送來的指令存入高8位或低8位存放器中。但并不是每個(gè)CLK1的上升沿都存放數(shù)據(jù)總線的數(shù)據(jù),因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。存放與否,由CPU狀態(tài)控制器的IR_ENA信號(hào)控制。IR_ENA信號(hào)通過ENA口輸入到指令存放器。當(dāng)數(shù)據(jù)總線傳輸?shù)氖侵噶顣r(shí),ENA置1,指令存放;當(dāng)數(shù)據(jù)總線傳輸?shù)氖菙?shù)據(jù)時(shí),ENA置0,指令存放器不工作。 每條指令為2個(gè)

22、字節(jié),即16位。高3位是操作碼,低13位是地址(CPU的地址總線為13位,尋址空間為8K字節(jié))。本設(shè)計(jì)的數(shù)據(jù)總線為8位,所以每條指令需取兩次。先取高8位,后取低8位。而當(dāng)前取的是高8位還是低8位,由變量STATE記錄。STATE為零表示取的高8位,存入高8位存放器,同時(shí)將變量STATE置為1。再次存放時(shí),因STATE為1,取低8位并存入低8位存放器中,同時(shí)將STATE置為0,如此往復(fù)。指令存放時(shí),將高3位和低13位分別存放到操作碼存放器OPCODE和地址存放器IR_ADDR。 復(fù)位后,指令存放器被清為零。 指令存放器源程序如下: library ieee; use ieee.std_logic

23、_1164.all; entity ir is portclk1, rst, ena: in std_logic; data: in std_logic_vector7 downto 0; opcode: out std_logic_vector2 downto 0; ir_addr: out std_logic_vector12 downto 0; end ir; architecture behave of ir is signal opc_iraddrs: std_logic_vector15 downto 0; begin processclk1 variable state: std

24、_logic:0; begin ifclk1event and clk11then if rst1then opc_iraddrsothers0; elsif ena1 then case state is when 0 opc_iraddrs15 downto 8data; state:1; when 1opc_iraddrs7 downto 0data; state:0; when othersnull; end case; else state:0; end if; end if; end process; opcodeopc_iraddrs15 downto 13; ir_addrop

25、c_iraddrs12 downto 0; end behave; 仿真波形如下列圖:續(xù) 在此仿真波形圖中,clk1為時(shí)鐘輸入信號(hào),ena為使能輸入端口,rst為置位端口,這里假設(shè)在ena1之前data00000000,ena1后傳輸了10011001、01100110、11001100、00110011四個(gè)數(shù)據(jù),那么當(dāng)state為0時(shí),傳輸高八位,當(dāng)state為1時(shí),傳輸?shù)桶宋?。其中?5至第13位存入opcode中并替換舊數(shù)據(jù),第12至第0位存入str_addr中并替換舊數(shù)據(jù)。3.3 累加器 累加器Accumulator用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算其中的一個(gè)數(shù)據(jù)來源,同時(shí)累加器還用來

26、存放算術(shù)運(yùn)算指令的結(jié)果,如圖3-5所示。累加器采用同步復(fù)位方式,即當(dāng)RST信號(hào)為高電平時(shí),累加器的值為零。當(dāng)累加器通過ENA口收到來自CPU狀態(tài)控制器ACC_ENA信號(hào)時(shí),即ENA1時(shí),在CLK1時(shí)鐘正跳沿時(shí)就收到來自于數(shù)據(jù)總線的數(shù)據(jù),由DATA7.0輸入;而當(dāng)ENA0時(shí),累加器保持不變。 累加器源程序如下: library ieee; use ieee.std_logic_1164.all; entity acc is portclk1,rst,ena:in std_logic; data:in std_logic_vector7 downto 0; accum:out std_logic_

27、vector7 downto 0; end acc; architecture art of acc is begin processclk1, ena begin if clk1event and clk11then if rst1then accum00000000; elsif ena1then accumdata; end if; end if; end process; end art; 在仿真時(shí),設(shè)定6個(gè)周期假設(shè)中,data端每周期輸入不同的8位二進(jìn)制數(shù),觀察accum端輸出數(shù)據(jù)與rst和ena值的對(duì)應(yīng)關(guān)系,仿真波形如下: 如下圖,當(dāng)復(fù)位信號(hào)rst0、使能信號(hào)ena1時(shí),在每個(gè)cl

28、k1上升沿到來后,accum接收來自于數(shù)據(jù)總線的數(shù)據(jù);當(dāng)?shù)?周期ena0時(shí),accum保持01010101不變,故該數(shù)據(jù)占兩個(gè)周期;當(dāng)ena又變?yōu)橛行盘?hào),因同時(shí)rst由0變?yōu)?,累加器復(fù)位,accum輸出清零。3.4 算術(shù)邏輯單元 算術(shù)邏輯單元ALU的全稱是Arithmetic Logic Unit,該模塊用來執(zhí)行諸如加減乘除以及存放器中的值之間的邏輯運(yùn)算,通常在一般的處理器上被設(shè)成一個(gè)周期上升沿運(yùn)行一次,這主要是由附屬于ALU的輸入輸出存放器以及在ALU輸入處插入旁路乘法器來決定的。算術(shù)邏輯單元根據(jù)輸入的8種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等8種根本操作運(yùn)算,利用這幾種根本運(yùn)算可

29、以實(shí)現(xiàn)很多種其它運(yùn)算以及邏輯判斷等操作。 算術(shù)邏輯單元如上圖所示,其各端口功能如下:ALU_CLOCK為ALU的時(shí)鐘信號(hào),由時(shí)鐘發(fā)生器輸出;OPCODE取自指令存放器的高3位,ALU根據(jù)輸入OPCODE的8種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等根本操作運(yùn)算;DATA輸入來自數(shù)據(jù)總線上的數(shù)據(jù);ACCUM輸入來自累加器的一個(gè)操作數(shù);ALU_OUT用來保存或輸出操作后的值;ZERO用于標(biāo)志ACCUM是否為0,其值為0時(shí)標(biāo)ZERO1,否那么ZERO0。 算術(shù)邏輯單元源程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_lo

30、gic_unsigned.all; entity alu is portalu_clk: in std_logic; opcode: in std_logic_vector2 downto 0; data,accum: in std_logic_vector7 downto 0; zero: out std_logic; alu_out: out std_logic_vector7 downto 0; end alu; architecture behave of alu is signal alu_out_latch: std_logic_vector7 downto 0; constant

31、 HLT: std_logic_vector2 downto 0:000; constant SKZ: std_logic_vector2 downto 0:001; constant ADD: std_logic_vector2 downto 0:010; constant AN_D: std_logic_vector2 downto 0:011; constant XO_R: std_logic_vector2 downto 0:100; constant LDA: std_logic_vector2 downto 0:101; constant STO: std_logic_vector

32、2 downto 0:110; constant JMP: std_logic_vector2 downto 0:111; begin zero1when accum00000000 else 0; processalu_clk variable temp:std_logic_vector2 downto 0; begin temp:opcode; if alu_clkevent and alu_clk1then case temp is when HLTalu_out_latchaccum; when SKZalu_out_latchaccum; when ADDalu_out_latchd

33、ata+accum; when AN_Dalu_out_latchdata and accum; when XO_Ralu_out_latchdata xor accum; when LDAalu_out_latchdata; when STOalu_out_latchaccum; when JMPalu_out_latchaccum; when othersalu_out_latchXXXXXXXX; end case; end if; end process; alu_outalu_out_latch; end behave; 在仿真過程中,假設(shè)操作碼依次為上述8種操作碼。數(shù)據(jù)值為5,累加

34、器值為由3變0,以此來驗(yàn)證zero作用。仿真波形下列圖所示: alu_clk為時(shí)鐘信號(hào)輸入端口,zero為判accum是否為零的輸出端口。opcode為操作碼輸入端,data為數(shù)據(jù)輸入端,accum為累加器輸入端口。opcode不同的值代表不同的操作。alu_out中的06代表5轉(zhuǎn)化為二進(jìn)制101異或3轉(zhuǎn)化為二進(jìn)制011得6二進(jìn)制110,而其他數(shù)值均正確反映不同操作碼下的運(yùn)算結(jié)果。3.5 數(shù)據(jù)輸出控制器 數(shù)據(jù)輸出控制器Data Control的作用是控制累加器數(shù)據(jù)輸出,如圖3-9由于數(shù)據(jù)總線是各種操作時(shí)傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時(shí)要傳輸指令,有時(shí)要傳送RAM區(qū)或接口的數(shù)

35、據(jù)。累加器的數(shù)據(jù)只有在需要往RAM區(qū)或端口寫時(shí)才允許輸出,否那么應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時(shí),都需要控制信號(hào)。而此控制信號(hào)的啟、停,那么由CPU狀態(tài)控制器輸出的各信號(hào)控制決定。數(shù)據(jù)控制器何時(shí)輸出累加器的數(shù)據(jù)那么由狀態(tài)控制器輸出的控制信號(hào)DATACTL_ENA決定。 數(shù)據(jù)控制電路源程序如下: library ieee; use ieee.std_logic_1164.all; entity datactrl is portdata_ena: in std_logic; alu_out: in std_logic_vector7 downto 0; da

36、ta: out std_logic_vector7 downto 0; end datactrl; architecture behave of datactrl is begin dataalu_out when data_ena1 else ZZZZZZZZ; end behave; 在此波形圖3-10中,假設(shè)累加器輸出值由00000000遞增,驗(yàn)證當(dāng)data_ena為0時(shí),data輸出alu_out的值,當(dāng)data_ena為1時(shí),data輸出ZZZZZZZZ。3.6 地址多路器 地址多路器ADDR用于選擇輸出的地址是PC(程序計(jì)數(shù))地址還是數(shù)據(jù)/端口地址,如圖3-11所示。每個(gè)指令周期的

37、前4個(gè)時(shí)鐘周期用于從ROM中讀取指令,輸出PC地址。后4個(gè)時(shí)鐘周期用于對(duì)RAM或端口的讀寫,輸出數(shù)據(jù)或端口地址。地址的選擇輸出信號(hào)由時(shí)鐘信號(hào)的8分頻信號(hào)FETCH提供,其上升沿到來時(shí)輸出PC地址,其他時(shí)候輸出數(shù)據(jù)或端口地址。 地址多路器源程序如下: library ieee; use ieee.std_logic_1164.all; entity addr_mux is portfetch:in std_logic; pc_addr, ir_addr: in std_logic_vector12 downto 0; addr: out std_logic_vector12 downto 0;

38、end addr_mux; architecture behave of addr_mux is begin addrpc_addr when fetch1 else ir_addr; end behave; 當(dāng)fetch0時(shí)addr輸出ir_addr的值,當(dāng)fetch1時(shí)addr輸出pc_addr的值。3.7 程序計(jì)數(shù)器 程序計(jì)數(shù)器Program Counter用于提供指令地址,如圖3-13,以便讀取指令,指令按地址順序存放在存儲(chǔ)器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。 復(fù)位后,指令指針為零,即每次

39、CPU重新啟動(dòng)將從ROM的零地址開始讀取指令并執(zhí)行。指令為雙字節(jié),每條指令執(zhí)行完需2個(gè)時(shí)鐘,這時(shí)PC_ADDR已被增2,指向下一條指令。如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時(shí)CPU狀態(tài)控制器將會(huì)輸出PC_ENA信號(hào),通過LOAD口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器PC_ADDR將裝入目標(biāo)地址IR_ADDR,而不是增2。 程序計(jì)數(shù)器源程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity pc is portclk, rst, ena: in std_logic; ir_addr: in

40、std_logic_vector12 downto 0; pc_addr: out std_logic_vector12 downto 0; end pc; architecture behave of pc is signal pc_addr_latch: std_logic_vector12 downto 0; begin processclk begin if clkevent and clk1then if rst1then pc_addr_latchothers0; elsif ena1 then pc_addr_latchir_addr; elsif ena0 then pc_ad

41、dr_latchpc_addr_latch+1; end if; end if; end process; pc_addrpc_addr_latch; end behave; 假設(shè)指令地址為0、1、2、3,為便于顯示,設(shè)置地址指令和程序計(jì)數(shù)器輸出為數(shù)制十進(jìn)制,仿真波形如下列圖: clk的上升沿啟動(dòng)電路,當(dāng)rst為低電平, ena為低電平時(shí),pc_addr自身加1;ena為高電平那么pc_addr輸出ir_addr的值。rst為高電平時(shí)輸出清0。3.8 狀態(tài)控制器 狀態(tài)控制器State Control是CPU的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件,由狀態(tài)機(jī)STATE_MACHI

42、NE和狀態(tài)機(jī)控制器MACH_CTR組成,如上圖。狀態(tài)機(jī)控制器接受復(fù)位信號(hào)RST,當(dāng)RST有效時(shí)通過信號(hào)ENA使其為0,輸入到狀態(tài)機(jī)中停止?fàn)顟B(tài)機(jī)的工作。狀態(tài)機(jī)的當(dāng)前狀態(tài),由變量STATE記錄,STATE的值就是當(dāng)前這個(gè)指令周期中已經(jīng)過的時(shí)鐘數(shù)。 指令周期是由8個(gè)時(shí)鐘周期組成,每個(gè)時(shí)鐘周期都要完成固定的操作。 狀態(tài)轉(zhuǎn)換如下列圖: 1 第1個(gè)時(shí)鐘S0,CPU狀態(tài)控制器的輸出:RD和IR_ENA為高電平,其余均為低電平。指令存放器存放由ROM送來的高8位指令代碼。 2 第2個(gè)時(shí)鐘S1,與上一時(shí)鐘相比只是PC_CLK從0變?yōu)?,故PC增1;同時(shí)ROM送來低8位指令代碼,指令存放器存放該8位代碼。 3 第

43、3個(gè)時(shí)鐘S2,空操作。 4 第4個(gè)時(shí)鐘S3,PC增1,指向下一條指令。假設(shè)操作符為HLT,那么輸出信號(hào)HLT為高。如果操作符不為HLT,除了PC增1外(指向下一條指令),其它各控制線輸出為零。 5第5個(gè)時(shí)鐘S4,假設(shè)操作符為AND、ADD、XOR或LDA,讀相應(yīng)地址的數(shù)據(jù);假設(shè)為JMP,將目的地址送給程序計(jì)數(shù)器;假設(shè)為STO,輸出累加器數(shù)據(jù)。 6 第6個(gè)時(shí)鐘S5,假設(shè)操作符為AND、ADD或XOR,算術(shù)邏輯單元就進(jìn)行相應(yīng)的運(yùn)算;假設(shè)為LDA,就把數(shù)據(jù)通過算術(shù)邏輯單元送給累加器;假設(shè)為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否那么保持原值;假設(shè)為JMP,鎖存目的地址;假設(shè)為STO

44、,將數(shù)據(jù)寫入地址處。 7 第7個(gè)時(shí)鐘S6,空操作。 8 第8個(gè)時(shí)鐘S7,假設(shè)操作符為SKZ且累加器值為0,那么PC值再增1,跳過一條指令,否那么PC無變化。 在實(shí)體編寫過程中,首先定義8個(gè)狀態(tài)為S0S7,然后定義8個(gè)指令代碼為常量。由于只有8條指令,所以采用3位二進(jìn)制數(shù)編碼。因AND和XOR指令為VHDL關(guān)鍵字,故用AN_D和XO_R代替。指令HLTSKZADDAN_DXO_RLDASTOJMP代碼000001010011100101110111 狀態(tài)機(jī)控制器源程序如下: library ieee; use ieee.std_logic_1164.all; entity mach_ctr is

45、 portfetch,rst: in std_logic; ena: out std_logic; end mach_ctr; architecture behave of mach_ctr is begin processfetch begin if fetchevent and fetch1 then if rst1then ena0; else ena1; end if; end if; end process; end behave; 狀態(tài)機(jī)源程序如下: library ieee; use ieee.std_logic_1164.all; entity state_machine is

46、 portclk1, ena, zero: in std_logic; opcode: in std_logic_vector2 downto 0; pc_clk, acc_ena, pc_ena, rd, wr, ir_ena, halt, datactl_ena: out std_logic; end state_machine; architecture behave of state_machine is type state_type is s0, s1,s2, s3, s4, s5, s6, s7; signal state: state_type; constant HLT: s

47、td_logic_vector2 downto 0:000; constant SKZ: std_logic_vector2 downto 0:001; constant ADD: std_logic_vector2 downto 0:010; constant AN_D: std_logic_vector2 downto 0:011; constant XO_R: std_logic_vector2 downto 0:100; constant LDA: std_logic_vector2 downto 0:101; constant STO: std_logic_vector2 downt

48、o 0:110; constant JMP: std_logic_vector2 downto 0:111; begin processclk1 begin if clk1event and clk11then if ena0 then states0; pc_clk0; acc_ena0; pc_ena0; rd0; wr0; ir_ena0; halt0; datactl_ena0; elsif ena1then case state is when s0pc_clk0; acc_ena0; pc_ena0; rd1; wr0; ir_ena1; datactl_ena0; halt0; states1; when s1pc_clk1; acc_ena0; pc_ena0; rd1; wr0; ir_ena1; datactl_ena0; halt0; states2; when s2pc_clk0; acc_ena

溫馨提示

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

評(píng)論

0/150

提交評(píng)論