Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第1頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第2頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第3頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第4頁
Verilog硬件描述語言(9)cpu設(shè)計(jì)實(shí)例_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

西安郵電大學(xué)微電子系簡(jiǎn)化的RISCCPU設(shè)計(jì)簡(jiǎn)介前言

這個(gè)CPU模型只是一個(gè)教學(xué)模型,設(shè)計(jì)也不一定合理,只是從原理上說明了一個(gè)簡(jiǎn)單的RISC_CPU的構(gòu)成。我們?cè)谶@里介紹它的目的是想說明:VerilogHDL仿真和綜合工具的潛力和本文介紹的設(shè)計(jì)方法對(duì)軟硬件聯(lián)合設(shè)計(jì)是有重要意義的。我們也希望這一章能引起對(duì)CPU原理和復(fù)雜數(shù)字邏輯系統(tǒng)設(shè)計(jì)有興趣的同學(xué)的注意,加入我們的設(shè)計(jì)隊(duì)伍。由于我們的經(jīng)驗(yàn)與學(xué)識(shí)有限,不足之處敬請(qǐng)讀者指正。什么是CPU?

CPU即中央處理單元的英文縮寫,它是計(jì)算機(jī)的核心部件。計(jì)算機(jī)進(jìn)行信息處理可分為兩個(gè)步驟:1)

將數(shù)據(jù)和程序(即指令序列)輸入到計(jì)算機(jī)的存儲(chǔ)器中。2)從第一條指令的地址起開始執(zhí)行該程序,得到所需結(jié)果,結(jié)束運(yùn)行。CPU的作用是協(xié)調(diào)并控制計(jì)算機(jī)的各個(gè)部件執(zhí)行程序的指令序列,使其有條不紊地進(jìn)行。因此它必須具有以下基本功能:a)取指令:當(dāng)程序已在存儲(chǔ)器中時(shí),首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號(hào)。b)分析指令:即指令譯碼。是對(duì)當(dāng)前取得的指令進(jìn)行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作控制命令。

將其功能進(jìn)一步細(xì)化,可概括如下:

1)

能對(duì)指令進(jìn)行譯碼并執(zhí)行規(guī)定的動(dòng)作;2)

可以進(jìn)行算術(shù)和邏輯運(yùn)算;3)

能與存儲(chǔ)器,外設(shè)交換數(shù)據(jù);4)提供整個(gè)系統(tǒng)所需要的控制;c)執(zhí)行指令:根據(jù)分析指令時(shí)產(chǎn)生的“操作命令”形成相應(yīng)的操作控制信號(hào)序列,通過運(yùn)算器,存儲(chǔ)器及輸入/輸出設(shè)備的執(zhí)行,實(shí)現(xiàn)每條指令的功能,其中包括對(duì)運(yùn)算結(jié)果的處理以及下條指令地址的形成。盡管各種CPU的性能指標(biāo)和結(jié)構(gòu)細(xì)節(jié)各不相同,但它們所能完成的基本功能相同。由功能分析,可知任何一種CPU內(nèi)部結(jié)構(gòu)至少應(yīng)包含下面這些部件:1)算術(shù)邏輯運(yùn)算部件(ALU);

2)累加器;

3)程序計(jì)數(shù)器;

4)指令寄存器,譯碼器;5)時(shí)序和控制部件。RISC即精簡(jiǎn)指令集計(jì)算機(jī)(ReducedInstructionSetComputer)的縮寫。它是一種八十年代才出現(xiàn)的CPU,與一般的CPU相比不僅只是簡(jiǎn)化了指令系統(tǒng),而且是通過簡(jiǎn)化指令系統(tǒng)使計(jì)算機(jī)的結(jié)構(gòu)更加簡(jiǎn)單合理,從而提高了運(yùn)算速度。從實(shí)現(xiàn)的途徑看,RISC_CPU與一般的CPU的不同處在于:它的時(shí)序控制信號(hào)形成部件是用硬布線邏輯實(shí)現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構(gòu)成的狀態(tài)機(jī)和組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式快得多,因?yàn)檫@樣做省去了讀取微指令的時(shí)間。RISC_CPU也包括上述這些部件,下面就詳細(xì)介紹一個(gè)簡(jiǎn)化的用于教學(xué)目的的RISC_CPU的可綜合VerilogHDL模型的設(shè)計(jì)和仿真過程。RISCCPU結(jié)構(gòu)

RISC_CPU是一個(gè)復(fù)雜的數(shù)字邏輯電路,但是它的基本部件的邏輯并不復(fù)雜??砂阉殖砂藗€(gè)基本部件:

1)時(shí)鐘發(fā)生器2)指令寄存器3)累加器4)RISCCPU算術(shù)邏輯運(yùn)算單元

5)數(shù)據(jù)控制器

6)狀態(tài)控制器

7)程序計(jì)數(shù)器

8)地址多路器DATA<7..0>ALU_OUT<7..0>ACCUM<7..0>zeroalu_clkalu

opcode<2..0>data<7..0>opc_iraddr<15..0>enarstregisterclk1data<7..0>accum<7..0>enaaccumrstclk1CLK1INC_PCZEROLOAD_ACCFETCHLOAD_PCRSTCONTROLRDWROPCODE<2..0>LOAD_IRHALTDATACTL_ENA

In<7..0>data<7..0>

datactldata_enafetchaddr<12..0>ir_addr<12..0>adrpc_addr<12..0>ir_addr<12..0>pc_addr<12..0>loadclockcounterrst

clk1fetchclkalu_clk

clk_genDATA<7..0>\IRST\ICLK\I

OPCODE<2..>IR_ADDR<12..0>

ALU_OUT<7..0>ACCUM<7..0>ZEROOPCODE<2..0>DATA_ENAPC_ADDR<12..0>ADDR<12..0>DATA<7..0>\IHALT\ILOAD_IRIR_ADDR<2..0>WR\IRD\ILOAD_ACCINC_PCLOAD_PCRISC——CPU中各部件的相互連接關(guān)系1時(shí)鐘發(fā)生器

CLKCLK1CLKGENALU_CLKFETCHCLKCLK1ALU_CLK

FETCH時(shí)鐘發(fā)生器RESETRESET時(shí)鐘發(fā)生器clkgen利用外來時(shí)鐘信號(hào)clk來生成一系列時(shí)鐘信號(hào)clk1、fetch、alu_clk送往CPU的其他部件。其中fetch是外來時(shí)鐘clk的八分頻信號(hào)。利用fetch的上升沿來觸發(fā)CPU控制器開始執(zhí)行一條指令,同時(shí)fetch信號(hào)還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk1信號(hào)用作指令寄存器、累加器、狀態(tài)控制器的時(shí)鐘信號(hào)。alu_clk則用于觸發(fā)算術(shù)邏輯運(yùn)算單元。

clkclk1clk2clk4fetchalu_clk時(shí)鐘發(fā)生器clkgen的波形moduleclk_gen(clk,reset,clk1,clk2,clk4,fetch,alu_clk);inputclk,reset;outputclk1,clk2,clk4,fetch,alu_clk;wireclk,reset;regclk2,clk4,fetch,alu_clk;reg[7:0]state;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;assignclk1=~clk;always@(negedgeclk)if(reset)beginclk2<=0;clk4<=1;fetch<=0;alu_clk<=0;state<=idle;end

elsebegincase(state)S1:beginclk2<=~clk2;alu_clk<=~alu_clk;state<=S2;endS2:beginclk2<=~clk2;clk4<=~clk4;alu_clk<=~alu_clk;state<=S3;end

S3:beginclk2<=~clk2;state<=S4;endS4:beginclk2<=~clk2;clk4<=~clk4;fetch<=~fetch;state<=S5;endS5:beginclk2<=~clk2;state<=S6;end

S6:beginclk2<=~clk2;clk4<=~clk4;state<=S7;endS7:beginclk2<=~clk2;state<=S8;end

S8:beginclk2<=~clk2;clk4<=~clk4;fetch<=~fetch;state<=S1;endidle:state<=S1;default:state<=idle;endcaseendendmodule2指令寄存器

顧名思義,指令寄存器用于寄存指令。指令寄存器的觸發(fā)時(shí)鐘是clk1,在clk1的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入高8位或低8位寄存器中。但并不是每個(gè)clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。什么時(shí)候寄存,什么時(shí)候不寄存由CPU狀態(tài)控制器的load_ir信號(hào)控制。load_ir信號(hào)通過ena口輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。每條指令為2個(gè)字節(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位寄存器中。moduleregister(opc_iraddr,data,ena,clk1,rst);output[15:0]opc_iraddr;input[7:0]data;inputena,clk1,rst;reg[15:0]opc_iraddr;regstate;

always@(posedgeclk1)beginif(rst)beginopc_iraddr<=16'b0000_0000_0000_0000;state<=1'b0;endelsebeginif(ena)//如果加載指令寄存器信號(hào)load_ir到來,begin//分兩個(gè)時(shí)鐘每次8位加載指令寄存器casex(state) //先高字節(jié),后低字節(jié)1’b0:beginopc_iraddr[15:8]<=data;state<=1;end1’b1:beginopc_iraddr[7:0]<=data;state<=0;end

default:beginopc_iraddr[15:0]<=16'bxxxxxxxxxxxxxxxx;state<=1'bx;endendcaseendelsestate<=1'b0;endendendmodule3.累加器

累加器用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算其中一個(gè)數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自CPU狀態(tài)控制器load_acc信號(hào)時(shí),在clk1時(shí)鐘正跳沿時(shí)就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。moduleaccum(accum,data,ena,clk1,rst);output[7:0]accum;input[7:0]data;inputena,clk1,rst;reg[7:0]accum;always@(posedgeclk1)beginif(rst)accum<=8'b0000_0000; //Resetelseif(ena)//當(dāng)CPU狀態(tài)控制器發(fā)出load_acc信號(hào)accum<=data; //Accumulateendendmodule4.算術(shù)運(yùn)算器

算術(shù)邏輯運(yùn)算單元根據(jù)輸入的8種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等8種基本操作運(yùn)算。利用這幾種基本運(yùn)算可以實(shí)現(xiàn)很多種其它運(yùn)算以及邏輯判斷等操作。

modulealu(alu_out,zero,data,accum,alu_clk,opcode);output[7:0]alu_out;outputzero;input[7:0]data,accum;input[2:0]opcode;inputalu_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;assignzero=!accum;always@(posedgealu_clk)begin//操作碼來自指令寄存器的輸出opc_iaddr<15..0>的//低3位casex(opcode) HLT:alu_out<=accum;SKZ:alu_out<=accum;ADD:alu_out<=data+accum;ANDD:alu_out<=data&accum;XORR:alu_out<=data^accum;LDA:alu_out<=data;STO:alu_out<=accum;JMP:alu_out<=accum;default:alu_out<=8'bxxxx_xxxx;endcaseendendmodule5.數(shù)據(jù)控制器

數(shù)據(jù)控制器的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時(shí)傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時(shí)要傳輸指令,有時(shí)要傳送RAM區(qū)或接口的數(shù)據(jù)。計(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í)輸出ALU的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號(hào)datactl_ena決定。moduledatactl(data,in,data_ena);output[7:0]data;input[7:0]in;inputdata_ena;

assigndata=(data_ena)?In:8'bzzzz_zzzz;endmodule6.地址多路器

地址多路器用于選擇輸出的地址是PC(程序計(jì)數(shù))地址還是數(shù)據(jù)/端口地址。每個(gè)指令周期的前4個(gè)時(shí)鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個(gè)時(shí)鐘周期用于對(duì)RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號(hào)由時(shí)鐘信號(hào)的8分頻信號(hào)fetch提供。

moduleadr(addr,fetch,ir_addr,pc_addr);output[12:0]addr;input[12:0]ir_addr,pc_addr;inputfetch;

assignaddr=fetch?pc_addr:ir_addr;

endmodule7.程序計(jì)數(shù)器

程序計(jì)數(shù)器用于提供指令地址。以便讀取指令,指令按地址順序存放在存儲(chǔ)器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。復(fù)位后,指令指針為零,即每次CPU重新啟動(dòng)將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需2個(gè)時(shí)鐘,這時(shí)pc_addr已被增2,指向下一條指令。(因?yàn)槊織l指令占兩個(gè)字節(jié)。)如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時(shí)CPU狀態(tài)控制器將會(huì)輸出load_pc信號(hào),通過load口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器(pc_addr)將裝入目標(biāo)地址(ir_addr),而不是增2。modulecounter(pc_addr,ir_addr,load,clock,rst);output[12:0]pc_addr;input[12:0]ir_addr;inputload,clock,rst;reg[12:0]pc_addr;

always@(posedgeclockorposedgerst)beginif(rst)pc_addr<=13'b0_0000_0000_0000;elseif(load)pc_addr<=ir_addr;elsepc_addr<=pc_addr+1;endendmodule狀態(tài)控制器由兩部分組成:

1.狀態(tài)機(jī)(圖中的MACHINE部分)2.狀態(tài)機(jī)控制器(圖中的MACHINECTL部分)

狀態(tài)機(jī)控制器接受復(fù)位信號(hào)RST,當(dāng)RST有效時(shí)通過信號(hào)ena使其為0,輸入到狀態(tài)機(jī)中停止?fàn)顟B(tài)機(jī)的工作。8.狀態(tài)控制器

modulemachinectl(ena,fetch,rst);outputena;inputfetch,rst;regena;always@(posedgefetchorposedgerst)beginif(rst)ena<=0;elseena<=1;endendmodule狀態(tài)機(jī)是CPU的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件。CPU何時(shí)進(jìn)行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機(jī)來控制的。狀態(tài)機(jī)的當(dāng)前狀態(tài),由變量state記錄,state的值就是當(dāng)前這個(gè)指令周期中已經(jīng)過的時(shí)鐘數(shù)(從零計(jì)起)。指令周期是由8個(gè)時(shí)鐘周期組成,每個(gè)時(shí)鐘周期都要完成固定的操作1)第0個(gè)時(shí)鐘,因?yàn)镃PU狀態(tài)控制器的輸出:rd和load_ir為高電平,其余均為低電平。指令寄存器寄存由ROM送來的高8位指令代碼。2)第1個(gè)時(shí)鐘,與上一時(shí)鐘相比只是inc_pc從0變?yōu)?故PC增1,ROM送來低8位指令代碼,指令寄存器寄存該8位代碼。3)第2個(gè)時(shí)鐘,空操作。4)第3個(gè)時(shí)鐘,PC增1,指向下一條指令。若操作符為HLT,則輸出信號(hào)HLT為高。如果操作符不為HLT,除了PC增一外(指向下一條指令),其它各控制線輸出為零。5)第4個(gè)時(shí)鐘,若操作符為AND、ADD、XOR或LDA,讀相應(yīng)地址的數(shù)據(jù);若為JMP,將目的地址送給程序計(jì)數(shù)器;若為STO,輸出累加器數(shù)據(jù)。6)第5個(gè)時(shí)鐘,若操作符為ANDD、ADD或XORR,算術(shù)運(yùn)算器就進(jìn)行相應(yīng)的運(yùn)算;若為L(zhǎng)DA,就把數(shù)據(jù)通過算術(shù)運(yùn)算器送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否則保持原值;若為JMP,鎖存目的地址;若為STO,將數(shù)據(jù)寫入地址處。7)第6個(gè)時(shí)鐘,空操作。8)第7個(gè)時(shí)鐘,若操作符為SKZ且累加器值為0,則PC值再增1,跳過一條指令,否則PC無變化。modulemachine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,halt,clk1,zero,ena,opcode);

outputinc_pc,load_acc,load_pc,rd,wr,load_ir;outputdatactl_ena,halt;inputclk1,zero,ena;input[2:0]opcode;reginc_pc,load_acc,load_pc,rd,wr,load_ir;regdatactl_ena,halt;reg[2:0]state;

parameterHLT=3'b000,SKZ=3'b001, DD=3'b010, ANDD=3'b011, XORR=3'b100, LDA=3'b101, STO=3'b110, JMP=3'b111;always@(negedgeclk1)beginif(!ena)//接收到復(fù)位信號(hào)RST,進(jìn)行復(fù)位操作beginstate<=3'b000;{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;endelsectl_cycle;end//-----------------beginoftaskctl_cycle---------taskctl_cycle;begincasex(state)3’b000://loadhigh8bitsinstructionbegin{inc_pc,load_acc,load_pc,rd}<=4'b0001;{wr,load_ir,datactl_ena,halt}<=4'b0100;state<=3’b001;end3’b001://pcincreasedbyonethenloadlow8bitsinstructionbegin{inc_pc,load_acc,load_pc,rd}<=4'b1001;{wr,load_ir,datactl_ena,halt}<=4'b0100;state<=3’b010;end3’b010://idlebegin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;state<=3’b011;end3’b011://nextinstructionaddresssetup分析指令從這里開始beginif(opcode==HLT) //指令為暫停HLTbegin{inc_pc,load_acc,load_pc,rd}<=4'b1000;{wr,load_ir,datactl_ena,halt}<=4'b0001;endelsebegin{inc_pc,load_acc,load_pc,rd}<=4'b1000;{wr,load_ir,datactl_ena,halt}<=4'b0000;end state<=3’b100;end3’b100://fetchoprandbeginif(opcode==JMP)begin{inc_pc,load_acc,load_pc,rd}<=4'b0010;{wr,load_ir,datactl_ena,halt}<=4'b0000;endelseif(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)begin{inc_pc,load_acc,load_pc,rd}<=4'b0001;{wr,load_ir,datactl_ena,halt}<=4'b0000;end elseif(opcode==STO)begin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0010;end elsebegin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;end state<=3’b101;end3’b101://operationbeginif(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)begin//過一個(gè)時(shí)鐘后與累加器的內(nèi)容進(jìn)行運(yùn)算{inc_pc,load_acc,load_pc,rd}<=4'b0101;{wr,load_ir,datactl_ena,halt}<=4'b0000;end elseif(opcode==SKZ&&zero==1)begin{inc_pc,load_acc,load_pc,rd}<=4'b1000;{wr,load_ir,datactl_ena,halt}<=4'b0000;end

elseif(opcode==JMP)begin{inc_pc,load_acc,load_pc,rd}<=4'b1010;{wr,load_ir,datactl_ena,halt}<=4'b0000;end elseif(opcode==STO)begin//過一個(gè)時(shí)鐘后把wr變1就可寫到RAM中{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b1010;end elsebegin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;end state<=3’b110;end3’b110: //idlebeginIf(opcode==STO)begin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0010;endelseif(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)begin{inc_pc,load_acc,load_pc,rd}<=4'b0001;{wr,load_ir,datactl_ena,halt}<=4'b0000;endelsebegin{inc_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)begin{inc_pc,load_acc,load_pc,rd}<=4'b1000;{wr,load_ir,datactl_ena,halt}<=4'b0000;endelsebegin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;endstate<=3’b000;enddefault:begin{inc_pc,load_acc,load_pc,rd}<=4'b0000;{wr,load_ir,datactl_ena,halt}<=4'b0000;state<=3’b000;endendcaseendendtask//-----------------endoftaskctl_cycle---------

endmodule為了對(duì)RISC_CPU進(jìn)行測(cè)試,需要有存儲(chǔ)測(cè)試程序的ROM和裝載數(shù)據(jù)的RAM、地址譯碼器。9.外圍模塊1.地址譯碼器moduleaddr_decode(addr,rom_sel,ram_sel);outputrom_sel,ram_sel;input[12:0]addr;regrom_sel,ram_sel;

always@(addr)begincasex(addr)13'b1_1xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b01;13'b0_xxxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;13'b1_0xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;default:{rom_sel,ram_sel}<=2'b00;endcaseendendmodule地址譯碼器用于產(chǎn)生選通信號(hào),選通ROM或RAM。FFFFH---1800HRAM1800H---000

溫馨提示

  • 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)論