Verilog數(shù)字系統(tǒng)設(shè)計課程設(shè)計報告圖文_第1頁
Verilog數(shù)字系統(tǒng)設(shè)計課程設(shè)計報告圖文_第2頁
Verilog數(shù)字系統(tǒng)設(shè)計課程設(shè)計報告圖文_第3頁
Verilog數(shù)字系統(tǒng)設(shè)計課程設(shè)計報告圖文_第4頁
Verilog數(shù)字系統(tǒng)設(shè)計課程設(shè)計報告圖文_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Verilog HDL 數(shù)字系統(tǒng)設(shè)計課程設(shè)計課題:RISC_CPU設(shè)計與驗證第一章:RISC_CPU概述 (51.1課題的由來和設(shè)計環(huán)境介紹 (51.2什么是CPU (5第二章:RISC_CPU結(jié)構(gòu) (62.1 RISC_CPU整體結(jié)構(gòu) (62.2 時鐘發(fā)生器 (72.2.1 時鐘發(fā)生器的介紹 (72.2.2 時鐘發(fā)生器symbol (82.2.3 時鐘發(fā)生器RTL (82.2.4 時鐘發(fā)生器源代碼 (82.2.5 時鐘發(fā)生器測試代碼 (92.2.6 時鐘發(fā)生器仿真波形 (102.3指令寄存器 (102.3.1 指令寄存器介紹 (102.3.2 指令寄存器symbol (112.3.3 指令寄

2、存器RTL (112.3.4 指令寄存器源代碼 (112.3.5 指令寄存器測試代碼 (122.3.6指令寄存器仿真波形 (132.4 累加器 (132.4.1 累加器介紹 (132.4.2 累加器symbol (132.4.3 累加器RTL (142.4.4 累加器源代碼 (142.4.5 累加器仿真代碼 (142.4.6 累加器仿真波形 (152.5 算術(shù)運算器 (152.5.1 算術(shù)運算器介紹 (152.5.2 算術(shù)運算器symbol (162.5.3 算術(shù)運算器RTL (172.5.4 算術(shù)運算器源代碼 (182.5.5 算術(shù)元算器測試代碼 (192.5.6 算術(shù)運算器仿真波形 (20

3、2.6數(shù)據(jù)控制器 (202.6.1 數(shù)據(jù)控制器介紹 (202.6.2 數(shù)據(jù)控制器smybol (202.6.3 數(shù)據(jù)控制器RTL (212.6.4 數(shù)據(jù)控制器源代碼 (212.6.5 數(shù)據(jù)控制器測試代碼 (222.6.6 數(shù)據(jù)控制器仿真波形 (222.7 地址多路器 (222.7.1地址多路器介紹 (222.7.2 地址多路器smybol (232.7.3 地址多路器RTL (232.7.5 地址多路器測試代碼 (232.7.6 地址多路器仿真波形 (242.8程序計數(shù)器 (242.8.1 程序計數(shù)器介紹 (242.8.2 程序計數(shù)器symbol (252.8.3 程序計數(shù)器RTL (252.

4、8.4 程序計數(shù)器源代碼 (252.8.5 程序計數(shù)器測試代碼 (262.8.6 程序計數(shù)器仿真波形 (262.9 狀態(tài)控制器 (272.9.1 狀態(tài)控制器介器 (272.9.2 狀態(tài)控制器smybol (272.9.3 狀態(tài)控制器RTL (272.9.4 狀態(tài)控制器源代碼 (272.9.5 狀態(tài)控制器測試代碼 (282.9.6 狀態(tài)控制器仿真波形 (292.10狀態(tài)機 (292.10.1狀態(tài)機的介紹 (292.10.2 狀態(tài)機symbol (302.10.3 狀態(tài)機RTL (302.10.4狀態(tài)機源代碼 (312.10.5 狀態(tài)機測試代碼 (352.10.6 狀態(tài)機仿真波形 (362.11

5、CPU內(nèi)核模塊的整合 (362.11.1 CPU內(nèi)核原理圖 (362.11.2 CPU內(nèi)核smybol (37第三章:CPU外圍模塊的設(shè)計 (373.1 地址譯碼器 (373.1.1 地址譯碼器介紹 (373.1.2 地址譯碼器smybol (373.1.3 地址譯碼器RTL (383.1.4 地址譯碼器源代碼 (383.1.5 地址譯碼器測試代碼 (383.1.6 地址譯碼器仿真波形 (393.2 RAM (393.2.1 RAM的介紹 (393.2.2 RAM smybol (393.2.3 RAM RTL (403.2.4 RAM 源代碼 (403.2.5 RAM 測試代碼 (403.2

6、.6 RAM 仿真波形 (423.3 ROM (423.3.1 ROM的介紹 (423.3.3 ROM的高阻化處理 (423.4 I/O模塊 (433.4.1 I/O模塊源代碼 (433.4.2 I/O模塊smybol (443.5 CPU外圍模塊連接電路原理圖 (443.6 燒錄到FPGA上 (45第四章:CPU功能驗證 (454.1 CPU尋址方式和指令系統(tǒng) (454.2 HLT指令驗證 (464.3 SKZ指令驗證 (464.4 ADD指令驗證 (474.5 AND指令驗證 (474.6 LDA、STO、JMP指令驗證 (47第五章:總結(jié) (48參考文獻: (48第一章:RISC_CPU

7、概述1.1課題的由來和設(shè)計環(huán)境介紹在本設(shè)計課程中,我們通過自己動腦筋,設(shè)計出CPU的軟核和固核。這個CPU是一個簡化的專門為教學目的而設(shè)計的RISC_CPU。在設(shè)計中我們不但關(guān)心CPU 總體設(shè)計的合理性,而且還使得構(gòu)成這個RISC_CPU的每一個模塊不僅是可仿真的也都可以綜合成門級網(wǎng)表。因而從物理意義上說,這也是一個能真正通過具體電路結(jié)構(gòu)而實現(xiàn)的CPU。為了能在這個虛擬的CPU上運行較為復(fù)雜的程序并進行仿真, 我們把尋址空間規(guī)定為8K(即13位地址線字節(jié)。下面我們就一步一步地來設(shè)計這樣一個CPU,并進行RTL仿真、經(jīng)過綜合、布局布線后,再次進行一次仿真,從中我們可以體會到這種設(shè)計方法的潛力。次

8、課程設(shè)計中的V erilogHDL程序都為我們學習目的而編寫的,全部程序在CADENCE公司的NC-V erilog 環(huán)境、Synopsys VCS、Mentor 公司的ModelSim 6.1 等環(huán)境下用V erilog語言進行了仿真。同時我們分別用Synplify、Altera Quartus II 等工具,針對不同的FPGA進行了綜合。順利地通過RTL級仿真、綜合后門級邏輯網(wǎng)表仿真以及布線后的門級結(jié)構(gòu)電路模型仿真。這個CPU 模型只是一個教學模型,設(shè)計也不一定很合理,只是從原理上說明了簡單的RISC _CPU是如何構(gòu)成的。本次課程設(shè)計的內(nèi)容是想達到以下四個目的:1學習RISC CPU的基

9、本結(jié)構(gòu)和原理;2了解V erilog HDL仿真和綜合工具的潛力;2展示V erilog設(shè)計方法對軟/硬件聯(lián)合設(shè)計和驗證的意義;3學習并掌握一些常用的V erilog語法和驗證方法。作者也希望本章的內(nèi)容能引起對CPU和復(fù)雜數(shù)字邏輯系統(tǒng)設(shè)計有興趣的電子工程師們的注意,加入我國集成電路的設(shè)計隊伍,提高我國電子產(chǎn)品的檔次。1.2什么是CPUCPU 即中央處理單元的英文縮寫,它是計算機的核心部件。計算機進行信息處理可分為兩個步驟:1.將數(shù)據(jù)和程序(即指令序列輸入到計算機的存儲器中。2.從第一條指令的地址起開始執(zhí)行該程序,得到所需結(jié)果,結(jié)束運行。CPU的作用是協(xié)調(diào)并控制計算機的各個部件執(zhí)行程序,使其有條

10、不紊地進行。因此它必須具有以下基本功能:取指令:當程序已在存儲器中時,首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號。分析指令:即指令譯碼。是對當前取得的指令進行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作命令。執(zhí)行指令:根據(jù)分析指令時產(chǎn)生的操作命令形成相應(yīng)的操作控制信號序列,通過運算器,存儲器及輸入/輸出設(shè)備的執(zhí)行,實現(xiàn)每條指令的功能,其中包括對運算結(jié)果的處理以及下條指令地址的形成。將其功能進一步細化,可概括如下:能對指令進行譯碼并執(zhí)行規(guī)定的動作;可以進行算術(shù)和邏輯運算;能與存儲器,外設(shè)交換數(shù)據(jù);提供整個系統(tǒng)所需要的控制;盡管各種CPU的性能指標和結(jié)構(gòu)細節(jié)各不相同,但它們所能完

11、成的基本功能相同。由功能分析,可知任何一種CPU內(nèi)部結(jié)構(gòu)至少應(yīng)包含下面這些部件:算術(shù)邏輯運算部件(ALU,累加器,程序計數(shù)器,指令寄存器,譯碼器,時序和控制部件。RISC 即精簡指令集計算機(Reduced Instruction Set Computer的縮寫。它是一種八十年代出現(xiàn)的CPU,與一般的CPU 相比不僅只是簡化了指令系統(tǒng),而且是通過簡化指令系統(tǒng)使計算機的結(jié)構(gòu)更加簡單合理,從而提高了運算速度。從實現(xiàn)的途徑看,RISC_CPU與一般的CPU的不同處在于:它的時序控制信號形成部件是用硬布線邏輯實現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構(gòu)成的狀態(tài)機和

12、組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式快得多,因為這樣做省去了讀取微指令的時間。RISC_CPU也包括上述這些部件,下面就詳細介紹一個簡化的用于教學目的的RISC_CPU的可綜合V erilogHDL模型的設(shè)計和仿真過程。第二章:RISC_CPU結(jié)構(gòu)2.1 RISC_CPU整體結(jié)構(gòu)RISC_CPU是一個復(fù)雜的數(shù)字邏輯電路,但是它的基本部件的邏輯并不復(fù)雜。我們可把它分成八個基本部件來考慮:1時鐘發(fā)生器2指令寄存器3累加器4算術(shù)邏輯運算單元5數(shù)據(jù)控制器6狀態(tài)控制器7程序計數(shù)器8地址多路器9狀態(tài)機各部件的相互連接關(guān)系見圖17.1。其中時鐘發(fā)生器利用外來時鐘信號進行分頻生成一系列時鐘信號,送

13、往其他部件用作時鐘信號。各部件之間的相互操作關(guān)系則由狀態(tài)控制器來控制。各部件的具體結(jié)構(gòu)和邏輯關(guān)系在下面的小節(jié)里逐一進行介紹。 2.2 時鐘發(fā)生器2.2.1 時鐘發(fā)生器的介紹時鐘發(fā)生器CLK_GEN 利用外來時鐘信號clk 來生成一系列時鐘和控制信號:clk、fetch、alu_ena 送往CPU的其他部件。其中fetch是控制信號,clk 的八分頻信號,當fetch 高電平時,使clk能觸發(fā)CPU控制器開始執(zhí)行一條指令,同時fetch信號還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk信號用作指令寄存器、累加器、狀態(tài)控制器的時鐘信號。alu_ena 則用于控制算術(shù)邏輯運算單元的操作。由于在時鐘

14、發(fā)生器的設(shè)計中采用了同步狀態(tài)機的設(shè)計方法,不但使clk_gen模塊的源程序可以被各種綜合器綜合,也使得由其生成的fetch、alu_ena 在同步性能上有明顯的提高,為整個系統(tǒng)的性能提高打下了良好的基礎(chǔ)。2.2.2 時鐘發(fā)生器symbol 2.2.3 時鐘發(fā)生器RTL 2.2.4 時鐘發(fā)生器源代碼timescale 1ns/1nsmodule CLK_GEN (clk,reset,fetch,alu_ena,clk1; input clk;input reset;output fetch,alu_ena,clk1;reg fetch,alu_ena;reg 7:0 state;assign c

15、lk1=clk;parameters1=8'b00000001,s2=8'b00000010,s3=8'b00000100,s4=8'b00001000,s5=8'b00010000,s6=8'b00100000,s7=8'b01000000,s8=8'b10000000,idle=8'b00000000;always (posedge clk or negedge resetif(resetbeginfetch<=0;alu_ena<=0;state<=idle;endelsebegincase(sta

16、tes1:begin alu_ena<=1;state<=s2;ends2:begin alu_ena<=0;state<=s3;ends3:begin fetch<=1;state<=s4;ends4:begin state<=s5;ends5:begin state<=s6;ends6:begin state<=s7;ends7:begin fetch<=0;state<=s8;ends8:begin state<=s1;endidle: state<=s1;default: state<=idle;end

17、caseendendmodule2.2.5 時鐘發(fā)生器測試代碼timescale 1ns/1nsmodule TB(;reg clk;reg reset;wire fetch;wire alu_ena;wire clk1;CLK_GEN u1(.clk(clk,.reset(reset,.fetch(fetch,.alu_ena(alu_ena,.clk1(clk1;initialbeginclk<=0;reset<=0;endalwaysbegin#50 clk<=clk;#400 reset<=1;endendmodule2.2.6 時鐘發(fā)生器仿真波形 2.3指令寄

18、存器2.3.1 指令寄存器介紹指令寄存器,顧名思義,指令寄存器用于寄存指令。指令寄存器的觸發(fā)時鐘是clk,在clk的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入高8位或低8位寄存器中。但并不是每個clk的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因為數(shù)據(jù)總線上有時傳輸指令,有時傳輸數(shù)據(jù)。什么時候寄存,什么時候不寄存由CPU狀態(tài)控制器的load_ir信號控制。load_ir信號通過ena 口輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。每條指令為2個字節(jié),即16位。高3位是操作碼,低13位是地址。(CPU的地址總線為13位,尋址空間為8K字節(jié)。本設(shè)計的數(shù)據(jù)總線為8位,所以每條指令需取兩次。先取高8位,后取低8位

19、。而當前取的是高8位還是低8位,由變量state記錄。state為零表示取的高8位,存入高8位寄存器,同時將變量state置為1。下次再寄存時,由于state為1,可知取的是低8位,存入低8位寄存器中。2.3.2 指令寄存器symbol 2.3.3 指令寄存器RTL 2.3.4 指令寄存器源代碼timescale 1ns/1nsmodule REGISTER (opcode,ir_addr,data,ena,clk,rst; output2:0opcode;output12:0ir_addr;input7:0data;input ena,clk,rst;reg15:0opc_iraddr;re

20、g state;assign opcode,ir_addr = opc_iraddr;always(posedge clk or negedge rstbeginif(rstopc_iraddr<=16'b0000_0000_0000_0000;state<=1'b0;endelsebeginif(enabegincasex(state1'b0:beginopc_iraddr15:8<=data;state<=1;end1'b1:beginopc_iraddr7:0<=data;state<=0;enddefault:begi

21、nopc_iraddr15:0<=16'b0000000000000000;state<=1'b0;endendcaseendelsestate<=1'b0;endendendmodule2.3.5 指令寄存器測試代碼REGISTER u1 (.data(data,.ena(ena,.clk(clk,.rst(rst,.opcode(opcode,.ir_addr(ir_addr;initialbeginena<=1'b1;clk<=1'b0;rst<=1'b0;data<=8'b11111100

22、;endbegin#200 rst<=1'b1;#50 clk<=clk;endendmodule2.3.6指令寄存器仿真波形 2.4 累加器2.4.1 累加器介紹累加器用于存放當前的結(jié)果,它也是雙目運算其中一個數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當累加器通過ena口收到來自CPU狀態(tài)控制器load_acc信號時,在clk時鐘正跳沿時就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。2.4.2 累加器symbol 2.4.3 累加器RTL 2.4.4 累加器源代碼module ACCUM(accum,data,ena,clk,rst; input 7:0data;input ena,clk,rst

23、;output reg 7:0accum;always (posedge clk or negedge rst beginif(rstaccum<=8'b00000000;elseif(enaaccum<=data;endendmodule2.4.5 累加器仿真代碼timescale 1ns/1nsmodule TB(;wire7:0accum;reg 7:0data;reg clk;reg ena;reg rst;ACCUM u1(.accum(accum,.data(data,.clk(clk,.ena(ena,.rst(rst;initialbeginclk<=

24、1'b0;ena<=1'b0;rst<=1'b0;data<=8'b00000000;#400 rst<=1'b1;#400 ena<=1'b1;#800 data<=8'b00000011;#800 data<=8'b00001100;#800 data<=8'b00110000;#800 data<=8'b01000000;#800 data<=8'b10000000;#800 data<=8'b00001000;#800 dat

25、a<=8'b00100000;endalwaysbegin#50 clk<=clk;endendmodule2.4.6 累加器仿真波形 2.5 算術(shù)運算器2.5.1 算術(shù)運算器介紹算術(shù)邏輯運算單元根據(jù)輸入的8種不同操作碼分別實現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等8種基本操作運算。利用這幾種基本運算可以實現(xiàn)很多種其它運算以及邏輯判斷等操作。2.5.2 算術(shù)運算器symbol timescale 1ns/1nsmodule alu(alu_out,zero,data,accum,alu_ena,opcode,clk; output7:0 alu_out;output zero;inpu

26、t 7:0 data,accum;input 2:0 opcode;input alu_ena,clk;reg 7:0 alu_out;parameter HLT =3'b000,SKZ =3'b001,ADD =3'b010,ANDD =3'b011,XORR =3'b100,LDA=3'b101,STO =3'b110,JMP=3'b111;assign zero =! accum;always (posedge clk or negedge alu_enaif(alu_enabegincasex(opcodeHLT:alu_

27、out<=accum;SKZ:alu_out<=accum;ADD:alu_out<=data+accum;ANDD:alu_out<=data&accum;XORR:alu_out<=dataaccum;LDA:alu_out<=data;STO:alu_out<=accum;JMP:alu_out<=accum;default:alu_out<=8'bxxxx_xxxx;endcaseendendmoduletimescale 1ns/1nsmodule TB(;reg clk;reg 7:0data;reg 7:0ac

28、cum;reg 2:0opcode;reg alu_ena;wire 7:0alu_out;wire zero;alu u1( .alu_out(alu_out,.zero(zero,.data(data,.accum(accum,.alu_ena(alu_ena,.opcode(opcode,.clk(clk;initialbeginclk<=1'b0;alu_ena<=1'b0;data<=8'b0010_1100;accum<=8'b0101_1001; opcode<=3'b000;#200 opcode<=3

29、'b000; #200 opcode<=3'b001; #200 opcode<=3'b010; #200 opcode<=3'b011; #200 opcode<=3'b100; #200 opcode<=3'b101; #200 opcode<=3'b110; #200 opcode<=3'b111; endalways#50 clk<=clk;Endmodule 2.6數(shù)據(jù)控制器2.6.1 數(shù)據(jù)控制器介紹數(shù)據(jù)控制器的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時傳送數(shù)據(jù)的公

30、共通道,不同的情況下傳送不同的內(nèi)容。有時要傳輸指令,有時要傳送RAM區(qū)或接口的數(shù)據(jù)。累加器的數(shù)據(jù)只有在需要往RAM區(qū)或端口寫時才允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時,都需要一控制信號。而此控制信號的啟、停,則由CPU狀態(tài)控制器輸出的各信號控制決定。數(shù)據(jù)控制器何時輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號datactl_ena決定。2.6.2 數(shù)據(jù)控制器smybol 2.6.3 數(shù)據(jù)控制器RTL 2.6.4 數(shù)據(jù)控制器源代碼module datactl(data,in,data_ena; output7:0data;input7:0in;inp

31、ut data_ena;assign data=(data_ena?in:8'bzzzz_zzzz; endmodule2.6.5 數(shù)據(jù)控制器測試代碼timescale 1ns/1nsmodule TB(;reg data_ena;reg 7:0in;wire 7:0data;datactl u1(.data_ena(data_ena,.in(in,.data(data;initialbegindata_ena<=1'b0;in<=8'b0000_0000;#100 data_ena<=1'b1;#200 in<=8'b0100_

32、1100;#200 in<=8'b0011_0101;#200 in<=8'b1000_0100;#200 data_ena<=1'b0;#200 data_ena<=1'b1;#200 in<=8'b0011_0101;#200 in<=8'b1000_0100;endendmodule2.6.6 數(shù)據(jù)控制器仿真波形 2.7 地址多路器2.7.1地址多路器介紹地址多路器用于選擇輸出的地址是PC(程序計數(shù)地址還是數(shù)據(jù)/端口地址。每個指令周期的前4個時鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個時鐘周

33、期用于對RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號由時鐘信號的8分頻信號fetch提供。2.7.2 地址多路器smybol 2.7.3 地址多路器RTL 2.7.4 地址多路器源代碼module adr(addr,fetch,ir_addr,pc_addr; output 12:0addr;input 12:0ir_addr,pc_addr;input fetch;assign addr=fetch? pc_addr:ir_addr; endmodule2.7.5 地址多路器測試代碼timescale 1ns/1nsmodule TB(;reg 12:0ir_addr;reg

34、12:0pc_addr;reg fetch;wire 12:0addr;adr u1(.ir_addr(ir_addr,.pc_addr(pc_addr,.addr(addr,.fetch(fetch;initialbeginfetch<=1'b0;ir_addr<=13'b0_0000_0000_0000;pc_addr<=13'b0_0000_0000_0000;#200 ir_addr<=13'b1_0011_0001_1010;#200 pc_addr<=13'b1_0100_1000_0001;#200 ir_ad

35、dr<=13'b1_0110_1001_1010;#200 pc_addr<=13'b1_1010_1110_1101;#100 fetch<=1'b1;#100 ir_addr<=13'b1_0011_0001_1010;#200 pc_addr<=13'b1_0100_1000_0001;#200 ir_addr<=13'b1_0110_1001_1010;#200 pc_addr<=13'b1_1010_1110_1101;endendmodule2.7.6 地址多路器仿真波形 2.8程序計

36、數(shù)器2.8.1 程序計數(shù)器介紹程序計數(shù)器用于提供指令地址。以便讀取指令,指令按地址順序存放在存儲器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。下面就來詳細說明PC地址是如何建立的。復(fù)位后,指令指針為零,即每次CPU重新啟動將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需2個時鐘,這時pc_addr已被增2,指向下一條指令。(因為每條指令占兩個字節(jié)。如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時CPU狀態(tài)控制器將會輸出load_pc信號,通過load口進入程序計數(shù)器。程序計數(shù)器(pc_addr將裝入目標地址(ir_a

37、ddr,而不是增2。2.8.2 程序計數(shù)器symbol 2.8.3 程序計數(shù)器RTL 2.8.4 程序計數(shù)器源代碼timescale 1ns/1nsmodule counter(pc_addr,ir_addr,load,clock,rst; output12:0pc_addr;input12:0ir_addr;input load,clock,rst;reg12:0pc_addr;always (posedge clock or negedge rstbeginif(rstpc_addr<=13'b0_0000_0000_0000;else if(loadpc_addr<=

38、ir_addr;elsepc_addr<=pc_addr+1'b1;endendmodule2.8.5 程序計數(shù)器測試代碼timescale 1ns/1nsmodule TB(;reg 12:0ir_addr;reg load;reg clock;reg rst;wire 12:0pc_addr;counteru1(.ir_addr(ir_addr,.load(load,.clock(clock,.rst(rst,.pc_addr(pc_addr; initialbeginrst<=1'b0;clock<=1'b0;load<=1'b0;

39、ir_addr<=13'b0_0000_0000_0000;#100 rst<=1'b1;#600beginload<=1'b1;ir_addr<=13'b0_0110_1010_0111;end#200 load<=1'b0;endalways#50 clock<=clock;endmodule2.8.6 程序計數(shù)器仿真波形 2.9 狀態(tài)控制器2.9.1 狀態(tài)控制器介器狀態(tài)機控制器接受復(fù)位信號RST,當RST有效時通過信號ena使其為0,輸入到狀態(tài)機中停止狀態(tài)機的工作。2.9.2 狀態(tài)控制器smybol 2.9.3

40、狀態(tài)控制器RTL 2.9.4 狀態(tài)控制器源代碼timescale 1ns/1nmodule machinectl(ena,fetch,clk,rst;input fetch,clk,rst;output ena;reg ena;always (posedge clkbeginif(rstena<=0;elseif(fetchena<=1;endendmodule2.9.5 狀態(tài)控制器測試代碼timescale 1ns/1nsmodule TB(;reg fetch;reg clk;reg rst;wire ena;machinectl u1(.fetch(fetch,.clk(cl

41、k,.rst(rst,.ena(ena; initialbeginfetch<=1'b0;clk<=1'b0;rst<=1'b0;#200 rst<=1'b1;endalways#50 clk<=clk;always#600 fetch<=fetch;endmodule2.9.6 狀態(tài)控制器仿真波形 2.10狀態(tài)機2.10.1狀態(tài)機的介紹狀態(tài)機是CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。CPU何時進行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機來控制的。狀態(tài)機的當前狀態(tài),由變量state記錄,sta

42、te的值就是當前這個指令周期中已經(jīng)過的時鐘數(shù)(從零計起。指令周期是由8個時鐘周期組成,每個時鐘周期都要完成固定的操作。a第0個時鐘,因為CPU狀態(tài)控制器的輸出:rd和load_ir為高電平,其余均為低電平。指令寄存器寄存由ROM送來的高8位指令代碼。b第1個時鐘,與上一時鐘相比只是inc_pc從0變?yōu)?故PC增1,ROM送來低8位指令代碼,指令寄存器寄存該8位代碼。c第2個時鐘,空操作。d第3個時鐘,PC增1,指向下一條指令。若操作符為HLT,則輸出信號HLT為高。如果操作符不為HLT,除了PC增1外(指向下一條指令,其它各控制線輸出為零。e第4個時鐘,若操作符為AND、ADD、XOR或LDA

43、,讀相應(yīng)地址的數(shù)據(jù);若為JMP,將目的地址送給程序計數(shù)器;若為STO,輸出累加器數(shù)據(jù)。f第5個時鐘,若操作符為ANDD、ADD或XORR,算術(shù)運算器就進行相應(yīng)的運算;若為LDA,就把數(shù)據(jù)通過算術(shù)運算器送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否則保持原值;若為JMP,鎖存目的地址;若為STO,將數(shù)據(jù)寫入指定地址。g第6個時鐘,空操作。h第7個時鐘,若操作符為SKZ且累加器值為0,則PC值再增1,跳過一條指令,否則PC無變化。2.10.2 狀態(tài)機symbol 2.10.3 狀態(tài)機RTL 2.10.4狀態(tài)機源代碼timescale 1ns/1nsmodule mach

44、ine ( inc_pc, load_acc, load_pc, rd,wr, load_ir, datactl_ena, halt, clk, zero, ena, opcode ;output inc_pc, load_acc, load_pc, rd, wr, load_ir;output datactl_ena, halt;input clk, zero, ena;input 2:0 opcode;reg inc_pc, load_acc, load_pc, rd, wr, load_ir;reg datactl_ena, halt;reg 2:0 state;parameter HL

45、T = 3 'b000,SKZ = 3 'b001,ADD = 3 'b010,ANDD = 3 'b011,XORR = 3 'b100,LDA = 3 'b101,STO = 3 'b110,JMP = 3 'b111;always ( posedge clk beginif ( !ena beginstate<=3'b000;inc_pc,load_acc,load_pc,rd<=4'b0000;wr,load_ir,datactl_ena,halt<=4'b0000;endelse

46、ctl_cycle;endtask ctl_cycle;begincasex(state3'b000:begininc_pc,load_acc,load_pc,rd<= 4'b1001;wr,load_ir,datactl_ena,halt <= 4'b0100;state <= 3'b001;end3'b001:begininc_pc,load_acc,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt <= 4'b0100; state <= 3

47、9;b010;end3'b010:begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; state <= 3'b011;end3'b011:beginif(opcode=HLTbegininc_pc,load_acc,load_pc,rd<= 4'b1000; wr,load_ir,datactl_ena,halt <= 4'b0001; endelsebegininc_pc,load_acc,loa

48、d_pc,rd<=4'b1000; wr,load_ir,datactl_ena,halt <=4'b0000; endstate<=3'b100;end3'b100:beginif(opcode=JMPbegininc_pc,load_acc,load_pc,rd<= 4'b0010; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif( opcode=ADD | opcode =ANDD | opcode=XORR | opcode=LDAbegininc_pc,l

49、oad_acc,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif(opcode=STObegininc_pc,load_acc,load_pc,rd<=4'b0000; wr,load_ir,datactl_ena,halt <=4'b0010; endelsebegininc_pc,load_acc,load_pc,rd<=4'b0000; wr,load_ir,datactl_ena,halt<=4'b0000;

50、endstate<=3'b101;end3'b101:beginif ( opcode =ADD|opcode=ANDD|opcode=XORR|opcode=LDA begininc_pc,load_acc,load_pc,rd<= 4'b0101; wr,load_ir,datactl_ena,halt<= 4'b0000; endelseif( opcode =SKZ && zero=1begininc_pc,load_acc,load_pc,rd<= 4'b1000; wr,load_ir,datactl_

51、ena,halt<= 4'b0000; endelseif(opcode=JMPbegininc_pc,load_acc,load_pc,rd<= 4'b1010; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif(opcode = STObegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b1010; endelsebegininc_pc,load_acc,load_pc,rd

52、<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate <= 3'b110;3'b110:beginif ( opcode = STO begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0010; endelseif ( opcode =ADD|opcode =ANDD| opcode=XORR|opcode=LDAbegininc_pc,load_ac

53、c,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt<= 4'b0000; endelsebegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate<=3'b111;end3'b111:beginif( opcode=SKZ && zero=1 begininc_pc,load_acc,load_pc,rd<= 4'b

54、1000; wr,load_ir,datactl_ena,halt<= 4'b0000; endelsebegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate<=3'b000;enddefault:begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt <= 4'b0000; state <=3&

55、#39;b000;endendcaseendtaskendmodule2.10.5 狀態(tài)機測試代碼timescale 1ns/1nsmodule TB(;reg clk, zero, ena;reg 2:0 opcode;wire inc_pc, load_acc, load_pc, rd, wr, load_ir;wire datactl_ena, halt;machine u1(.clk(clk,.zero(zero,.ena(ena,.opcode(opcode,.halt(halt, .inc_pc(inc_pc,.load_acc(load_acc,.load_pc(load_pc,

56、.rd(rd,.wr(wr,.load_ir(load_ir,.datactl_ena(datactl_ena; initialbeginclk<=1'b0;zero<=1'b0;ena<=1'b0;#200 zero<=1'b1;#200 ena<=1'b1;endalwaysbegin#600 opcode<=3'b000;#600 opcode<=3'b001;#600 opcode<=3'b010;#600 opcode<=3'b011;#600 opcode&

57、lt;=3'b100;#600 opcode<=3'b101;#600 opcode<=3'b110;#600 opcode<=3'b111;endalways#50 clk<=clk;endmodule2.10.6 狀態(tài)機仿真波形 2.11 CPU內(nèi)核模塊的整合2.11.1 CPU內(nèi)核原理圖 2.11.2 CPU內(nèi)核smybol 第三章:CPU外圍模塊的設(shè)計為了對RISC_CPU進行測試,需要有存儲測試程序的ROM和裝載數(shù)據(jù)的RAM、地址譯碼器。3.1 地址譯碼器3.1.1 地址譯碼器介紹地址譯碼器用于產(chǎn)生選通信號,選通ROM或RAM。1FFFH-1800H RAM17FFH-0000H ROM3.1.2 地址譯碼器smybol 3.1.3 地址譯碼器RTL 3.1.4 地址譯碼器源代碼module addr_decode(addr,rom_sel,ram_sel,io1_sel,io2_sel,address; output rom_sel,ram_sel,io1_sel,io2_sel;output 7:0address;input 12:0addr;reg rom_sel,ram_sel,io1_sel,io2_sel;assign address=addr7:

溫馨提示

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

評論

0/150

提交評論