基于VerilogHDL的專用處理器的設(shè)計(jì)與仿真_第1頁(yè)
基于VerilogHDL的專用處理器的設(shè)計(jì)與仿真_第2頁(yè)
基于VerilogHDL的專用處理器的設(shè)計(jì)與仿真_第3頁(yè)
基于VerilogHDL的專用處理器的設(shè)計(jì)與仿真_第4頁(yè)
基于VerilogHDL的專用處理器的設(shè)計(jì)與仿真_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于Verilog HDL 的專用處理器的設(shè)計(jì)與仿真葛文婧, 龔詠梅, 江立平(安徽師范大學(xué) 數(shù)學(xué)計(jì)算機(jī)科學(xué)學(xué)院,安徽蕪湖,241000)關(guān)鍵詞:Verilog HDL;專用處理器;設(shè)計(jì);仿真照片尺寸為20mm*30mm;最好不用紅色背景摘 要:隨著對(duì)嵌入式系統(tǒng)研究的不斷深入,專用處理器的針對(duì)性使其被廣泛采用,這對(duì)嵌入式系統(tǒng)的運(yùn)用和發(fā)展起到了越來(lái)越大的推動(dòng)作用。本文采用Verilog HDL 來(lái)仿真能完成特定功能的專用處理器。論文討論了包括CPU的系統(tǒng)結(jié)構(gòu)設(shè)計(jì)、基本組成部件設(shè)計(jì)、指令系統(tǒng)設(shè)計(jì)和CPU的RTL級(jí)仿真在內(nèi)的基于Verilog 狀態(tài)機(jī)控制16位指令微處理器的設(shè)計(jì)。論文還討論了電路功能

2、的仿真、綜合以及實(shí)現(xiàn)過(guò)程,在Modelsim 的開發(fā)環(huán)境下對(duì)加法器的HDL程序進(jìn)行仿真,并且根據(jù)仿真波形來(lái)驗(yàn)證設(shè)計(jì)的正確性。Design and Simulation of CPU based on Verilog HDLWenjing Ge, Yongmei Gong, Liping Jiang(School of Mathematic Computer Science , Anhui Nornal University, Wuhu, Anhui, 241000, China)Key words:Verilog HDL; CPU; Design; SimulationAbstract:As

3、the embedded systems research went into deeply nowdays, the dedicated-used processor was widely used for its pertinency ,which promoted the use and development of embedded system. The authors simulated and designed a dedicated-used processor based on the verilog HDL. The essay was composed of the de

4、sign of sixteen bits micro dedicated-used processor based on verilog states control machine, which included the designs of the Central Processing Units system structure, basic modules, instructions system ,and RTL level simulation of the dedicated-used processor . The simulation,synthesization,and r

5、ealization of the circuit function were also included in this essay.The summators HDL program was simulated in the environment of Modelsim and checked the correctness of the function of Central Processing Unit by the wave forms in the Modelsim.計(jì)算機(jī)的核心構(gòu)件是處理器,處理器也是嵌入式系統(tǒng)中不可缺少的部分。根據(jù)處理的問(wèn)題的不同,處理機(jī)可分為三類:通用處理

6、器、單用途處理器和專用處理器。專用處理器有著廣泛的用途,這是因?yàn)閷S锰幚砥骶哂嗅槍?duì)性,針對(duì)應(yīng)用作了優(yōu)化,性能、功耗等方面有了顯著提高。專用處理器的設(shè)計(jì)可以給設(shè)計(jì)者創(chuàng)新的空間,設(shè)計(jì)出創(chuàng)新性的作品。Verilog HDL是一門硬件描述語(yǔ)言,是用于硬件設(shè)計(jì)的有利工具。 1 概述1.1 研究背景 目前許多的電子產(chǎn)品都使用了CPLD(復(fù)雜可編程邏輯器件),這些邏輯器可以使用硬件描述語(yǔ)言設(shè)計(jì)。Verilog HDL語(yǔ)言具有:設(shè)計(jì)的行為特性、設(shè)計(jì)的數(shù)據(jù)流特性、設(shè)計(jì)的結(jié)構(gòu)組成及包含響應(yīng)監(jiān)控和設(shè)計(jì)驗(yàn)證方面的時(shí)延和波形產(chǎn)生機(jī)制1 。用Verilog HDL語(yǔ)言設(shè)計(jì)硬件也較為方便設(shè)計(jì)邏輯器件。1.2 功能的實(shí)現(xiàn)(1

7、)程序預(yù)先存儲(chǔ)在程序存儲(chǔ)器ROM中;(2)控制器CTRL根據(jù)程序計(jì)數(shù)器PC的值從ROM取指令到指令寄存器IR中,并對(duì)IR中的指令進(jìn)行譯碼,產(chǎn)生控制信號(hào),將控制信號(hào)發(fā)送給其它器件;(3)數(shù)據(jù)通路DP負(fù)責(zé)接收CTRL傳送來(lái)的立即數(shù)、數(shù)據(jù)存儲(chǔ)器RAM傳送過(guò)來(lái)的操作數(shù),存入寄存器組RF中的寄存器中;負(fù)責(zé)接收CTRL傳送過(guò)來(lái)的運(yùn)算指令,并組織算術(shù)邏輯單元ALU進(jìn)行運(yùn)算;負(fù)責(zé)將CTRL傳送過(guò)來(lái)的立即數(shù)、寄存器中的操作數(shù)存入RAM中;(4)RAM可根據(jù)DP傳送過(guò)來(lái)的地址和讀寫控制信號(hào),進(jìn)行數(shù)據(jù)讀寫。2 系統(tǒng)構(gòu)成及功能模塊的劃分2.1 專用處理器的組成結(jié)構(gòu)專用處理器的結(jié)構(gòu)框圖如圖1,專用處理器主要有控制器和數(shù)

8、據(jù)路徑兩大部分構(gòu)成,另外,為了配合專用處理器完成系統(tǒng)任務(wù),還需要有程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器,前者用于存放程序指令的機(jī)器代碼,后者用于存放計(jì)算結(jié)果。完整的模塊劃分如表1所示。圖1 專用處理器的結(jié)構(gòu)框圖 Fig.1 The structure of the dedicated-used processor 2.2 系統(tǒng)的設(shè)計(jì)方法系統(tǒng)采用自頂向下的設(shè)計(jì)方法進(jìn)行設(shè)計(jì),頂層設(shè)計(jì)由專用處理器和存儲(chǔ)器通過(guò)雙向總線相連而構(gòu)成,其中程序存儲(chǔ)器與專用存儲(chǔ)器的控制器通過(guò)總線進(jìn)行交互信息,數(shù)據(jù)路徑通過(guò)總線和數(shù)據(jù)存儲(chǔ)器進(jìn)行信息交互。表1 模塊列表Table 1 List of modules模塊編號(hào) 模塊名稱模塊文件名模

9、塊功能1dpdp.v數(shù)據(jù)路徑,在控制器的控制下對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的運(yùn)算處理2alualu.v數(shù)據(jù)邏輯單元,完成算術(shù)運(yùn)算或邏輯運(yùn)算3registerregister.v寄存器,暫存立即數(shù)和中間結(jié)果4rfrf.v通用寄存器文件,存放指令所處理的立即數(shù),并且可對(duì)寄存器文件中的任一寄存器進(jìn)行讀/寫5mux21mux21.v二選一多路選擇器,選擇立即數(shù)或者寄存器數(shù)據(jù)6romrom程序存儲(chǔ)器,存儲(chǔ)程序代碼7ctrctr.v控制器,提供控制信號(hào)8ramram.v數(shù)據(jù)存儲(chǔ)器,實(shí)現(xiàn)數(shù)據(jù)的讀寫9div2fdiv2f.v分頻器,除法時(shí)鐘控制10cpucpu.v頂層系統(tǒng)cpu,將各個(gè)模塊連接起來(lái)注:具體代碼實(shí)現(xiàn)參見附錄1

10、。2.3 指令系統(tǒng)該專用處理器支持如下指令:(1)數(shù)據(jù)傳送指令將8位立即數(shù)傳送給寄存器 mov rn,#imm;rn<-imm將8位寄存器數(shù)傳送給寄存器mov rn,rm;rn<-rm將8位存儲(chǔ)器數(shù)傳送給寄存器mov rn,addr;rn<-addr將8位寄存器數(shù)傳送給數(shù)據(jù)存儲(chǔ)器mov addr,rn;addr<-rn(2)算術(shù)運(yùn)算指令(不考慮溢出)8位整數(shù)加add rn,rm;rn<-rn+rm8位整數(shù)減sub rn,rm;rn<-rn-rm8位整數(shù)乘mul rn,rm;rn<-rn*rm8位整數(shù)除div rn,rm;rn<-rn/rm(3)控

11、制指令無(wú)條件跳轉(zhuǎn)指令jmp relative;PC<-relative有條件跳轉(zhuǎn)指令jz rn,relative;PC<-relative(僅當(dāng)rn=0時(shí))(4)停機(jī)指令halt指令系統(tǒng)設(shè)計(jì)如表2所示,寄存器編號(hào)如表3所示。表2 指令系統(tǒng)設(shè)計(jì)Table 2 The design of instruction system指令 操作碼(4)寄存器(4)操作數(shù)(8)mov rn,#imm0000rnimmmov rn,rm0001rnimmmov rn,addr0010rnaddrmov addr,rn0011rnaddraddrn,rm0100rnrmsub rn,rm0101rnr

12、mmov rn,#imm0110rnrmdiv rn,rm0111rnrmjmp relative1000relativeJz rn,relative1001rnrelativehalt1111表3 寄存器編號(hào)Table 3 Register number寄存器 編號(hào)寄存器編號(hào)R00000R81000R10001R91001R20010R101010R30011R111011R40100R121100R50101R131101R60110R141110R70111R1511112.4 CTRL設(shè)計(jì)CTRL模塊的狀態(tài)圖如圖2所示。 圖2 CTRL模塊的狀態(tài)圖Fig.2 The modular s

13、tate graph of CTRL 其中:f1:Opcode=0000 f2:Opcode=0001 f3:Opcode=0010 f4:Opcode=0011 f5:Opcode=0100 f6:Opcode=0101 f7:Opcode=0110 f8:Opcode=0111f9:Opcode=1000 f10:Opcode=1001 f11:Opcode=1010 f12:Opcode=1011 f13:Opcode=1100 f14:Opcode=1101 f15 :Opcode=1110 f16:Opcode=11113 仿真驗(yàn)證3.1 仿真分析利用該專用處理器完成如下計(jì)算:分析得

14、其匯編代碼和對(duì)應(yīng)機(jī)器指令如下:MOV R0,#10;ROM0=16b0000_0000_0000_1010MOV 00H,R0;ROM1=16b0011_0000_0000_0000MOV R0,#0;ROM2=16b0000_0000_0000_0000MOV R1,00H;ROM3=16b0010_0001_0000_0000MOV R2,#1;ROM4=16b0000_0010_0000_0001NEXT:JZ R1,EXIT;ROM5=16b1001_0001_0000_1001ADD R0,R1;ROM6=16b0100_0000_0001_0000SUB R1,R2;ROM7=16

15、b0101_0001_0010_0000JMP NEXT;ROM8=16b1000_0000_0000_0101EXIT:MOV R1,00H;ROM9=16b0010_0001_0000_0000DIV R0,R1;ROM10=16b0111_0000_0001_0000MUL R0,R1;ROM11=160110_0000_0001_0000MOV 01H,R0;ROM11=16b0011_0000_0000_0001HATL;ROM12=16b1111_0000_0000_00003.2 仿真測(cè)試程序timescale 1ns/100psmodule test; parameter re

16、g_sel_width=4; parameter reg_width=8; parameter addr_width=8; reg start,clk,rst; wire reg_sel_width-1:0reg_sel; wire reg_width-1:0reg_out; wire alu_zero; wire wr_ram_out,cs_ram_out,rd_ram_out; wire addr_width-1:0addr_ram_out; cpu u0(clk,rst,start,reg_sel,reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram

17、_out,addr_ram_out); always #20 clk=clk; initial begin clk=0;start=0;rst=1; #100; rst=0;start=1; end initial begin $monitor("reg_sel=%b,reg_out=%b,alu_zero=%b,wr_ram_out=%b,cs_ram_out=%b,rd_ram_out=%b,addr_ram_out=%b",reg_sel,reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_out);

18、endendmoduleModelSim仿真波形截圖如圖3所示,驗(yàn)證了該處理器實(shí)現(xiàn)預(yù)期功能。圖3 ModelSim仿真波形截圖Fig.3 The screenshot of ModelSim simulation waveform 4 總結(jié)通過(guò)此次功能簡(jiǎn)單專用處理器的設(shè)計(jì)體會(huì)到了Verilog HDL大型電路的設(shè)計(jì)方法,有不少的心得和體會(huì)。首先,確定專用處理器的體系結(jié)構(gòu)及其組成部件;其次,設(shè)計(jì)希望該專用處理器達(dá)到什么預(yù)先的功能,由此并確定各個(gè)部件的功能,最后,合在一起能夠達(dá)到總的需要功能;再者,設(shè)計(jì)該專用處理器的指令系統(tǒng),最后編寫相關(guān)的模塊,通過(guò)一個(gè)實(shí)例(該實(shí)例能夠包含其所有的指令系統(tǒng)所含有的

19、指令)進(jìn)行測(cè)試,看能否正確的得出結(jié)果,若能則說(shuō)明該處理機(jī)可以達(dá)到預(yù)期的功能。本次的設(shè)計(jì)方法采用自頂向下的設(shè)計(jì)方法,通過(guò)對(duì)基本部件的設(shè)計(jì)實(shí)現(xiàn),進(jìn)而實(shí)現(xiàn)大的模塊,最后實(shí)現(xiàn)總的模塊即CPU。 對(duì)于這個(gè)課題先用匯編語(yǔ)言描述(1+2+n)/n*n算法,再轉(zhuǎn)化為機(jī)器碼并存放在rom中。控制器部分ctrl使用狀態(tài)機(jī)技術(shù)來(lái)實(shí)現(xiàn)??刂破鲝膔om中取指令,指令有16位,即可表示為IR15:0。IR15:12這4位代表操作碼。其中有l(wèi)oadi=4'b0000表示將立即數(shù)裝入寄存器,在本次實(shí)驗(yàn)中,有將存儲(chǔ)器中值送到寄存器的模塊,為實(shí)現(xiàn)此功能,在控制模塊中添加了load操作碼load=4'b0010。相

20、應(yīng)的再增加了幾個(gè)狀態(tài),即State_Load=6'b101001,State_Load2=6'b101010,State_Load3=6'b101011;接著具體實(shí)現(xiàn)這些新增的狀態(tài),如圖4所示。圖4 部分狀態(tài)的代碼Fig.4 The parts of status's codes 但是在這里遇到了問(wèn)題:從ram中讀數(shù)據(jù)要用到rd_ram,而原來(lái)的代碼中沒有用到rd_ram,只用到wr_ram(將數(shù)據(jù)寫入ram中)。于是我們繼續(xù)研究思考,開始用wr_ram<=0,后來(lái)找到問(wèn)題根源后,于是添加了rd_ram這個(gè)信號(hào),ctrl.v、cpu.v和test.v的相應(yīng)

21、位置都做了信號(hào)添加。預(yù)想就是這樣,應(yīng)該沒有問(wèn)題,可是仿真時(shí)出問(wèn)題了。前面1加到10結(jié)果是對(duì)的,為55,可是rom中mov R1,00H;div R0,R1;MUL R0,R1;MOV01H,R0這三條指令的結(jié)構(gòu)為高阻態(tài)。既然前面10個(gè)數(shù)相加的結(jié)果是對(duì)的,說(shuō)明添加的存儲(chǔ)器數(shù)送到寄存器狀態(tài)是對(duì)的。我們通過(guò)單步分析CPU的取指令、分析指令和執(zhí)行指令的過(guò)程,發(fā)現(xiàn)第一個(gè)MOV R1,00H寫進(jìn)R1了,但是第二個(gè)MOV R1,00H也執(zhí)行了,但是R1未得00H內(nèi)的值。難道將存儲(chǔ)器數(shù)送到寄存器在開始時(shí)可以,第二次就不可以了?如果按書上介紹的用立即數(shù)送到寄存器,再進(jìn)行仿真。結(jié)果是對(duì)的,但是還是未解決我們的問(wèn)題

22、。更深層進(jìn)行分析和思考,想起老師以前說(shuō)過(guò)時(shí)延問(wèn)題,還有同步運(yùn)行的問(wèn)題。猜測(cè)可能是運(yùn)行一段時(shí)間我們無(wú)法控制00H中的值進(jìn)入R1。我們就對(duì)00H內(nèi)重新賦值,即:MOV R2,#10 ;ROM0=16b0000_0010_0000_1010MOV 00H,R2;ROM1=16b0011_0010_0000_0000MOV R1,00H;ROM9=16b0010_0001_0000_0000此時(shí)仿真時(shí),就出現(xiàn)我們想要的結(jié)果了。經(jīng)過(guò)本次實(shí)驗(yàn),我們知道了構(gòu)造一個(gè)專用處理器需要用到程序存儲(chǔ)器ROM、數(shù)據(jù)存儲(chǔ)器RAM、指令寄存器IR、程序計(jì)數(shù)器PC、控制器CTRL、數(shù)據(jù)路徑DP、算術(shù)邏輯單元ALU和寄存器文件

23、RF這些部件之間的相互協(xié)調(diào)工作。同時(shí),通過(guò)單步執(zhí)行,我們明白了時(shí)序的重要性,而且感受到了設(shè)計(jì)的艱辛,不斷地測(cè)試修改,直到達(dá)到預(yù)期的效果。參考文獻(xiàn):1 賀敬凱. Verilog HDL數(shù)計(jì)設(shè)計(jì)教程M.西安:西安電子科技大學(xué)出版社,2010 附錄一 代碼模塊編號(hào)1:test模塊模塊功能說(shuō)明:CPU仿真輸入信號(hào)說(shuō)明:start,clk,rst,reg_sel。start為使CPU啟動(dòng)信號(hào),clk時(shí)鐘信號(hào),reg_sel寄存器選擇信號(hào)。輸出信號(hào)說(shuō)明:reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_outVerilog HDL代碼:t

24、imescale 1ns/100psmodule test; parameter reg_sel_width=4; parameter reg_width=8; parameter addr_width=8; reg start,clk,rst; wire reg_sel_width-1:0reg_sel; wire reg_width-1:0reg_out; wire alu_zero; wire wr_ram_out,cs_ram_out,rd_ram_out; wire addr_width-1:0addr_ram_out; cpu u0(clk,rst,start,reg_sel,re

25、g_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_out); always #20 clk=clk; initial begin clk=0;start=0;rst=1; #100; rst=0;start=1; end initial begin $monitor("reg_sel=%b,reg_out=%b,alu_zero=%b,wr_ram_out=%b,cs_ram_out=%b,rd_ram_out=%b,addr_ram_out=%b",reg_sel,reg_out,alu_zero,wr_ra

26、m_out,cs_ram_out,rd_ram_out,addr_ram_out); endendmodule/*/模塊編號(hào)2:cpu模塊模塊功能說(shuō)明:頂層系統(tǒng),它的功能就是將各個(gè)模塊連接起來(lái),形成一個(gè)整體,進(jìn)而可以對(duì)該系統(tǒng)進(jìn)行仿真驗(yàn)證。該模塊在對(duì)下層元件實(shí)例化時(shí),采用的是位置關(guān)聯(lián)法。輸入信號(hào)說(shuō)明:clk, rst, start,為輸入信號(hào)輸出信號(hào)說(shuō)明:reg_sel,alu_zero,reg_out, wr_ram_out, cs_ram_out, addr_ram_out為輸出信號(hào)Verilog HDL代碼:module cpu(clk,rst,start, reg_sel, reg_ou

27、t, alu_zero, wr_ram_out, cs_ram_out, rd_ram_out, addr_ram_out ); parameter reg_sel_width=4; parameter reg_width=8; parameter addr_width=8; parameter imm_width=8; parameter sel_rf_width=4; parameter sel_alu_width=4; parameter PC_width=8; parameter IR_width=16; input wire start,rst,clk; output wire re

28、g_sel_width-1:0reg_sel; output wire reg_width-1:0reg_out; output wire alu_zero; output wire wr_ram_out,cs_ram_out,rd_ram_out; output wire addr_width-1:0addr_ram_out; wire imm_width-1:0imm; wire sel_rf_width-1:0sel_rf; wire sel_alu_width-1:0sel_alu; wire sel_mux; wire f_wf,en_rf,en_reg,en_alu,en_imm;

29、 wire PC_width-1:0PC; wire ROM_en; wire IR_width-1:0IR; wire wr_ram,cs_ram,rd_ram; wire addr_width-1:0addr_ram; assign wr_ram_out=wr_ram,cs_ram_out=cs_ram,addr_ram_out=addr_ram,rd_ram_out=rd_ram; wire clk1,clk2; div2f divsion_frequence(clk,rst,clk1,clk2); dp datapth(rst,clk2, r_wf, en_rf, en_reg, en

30、_alu, en_imm, sel_rf, sel_alu,sel_mux,imm,alu_zero, reg_sel, reg_out ); rom rom_instruction(clk2,rst, ROM_en, IR, PC ); ram ram_data( clk1, rd_ram, wr_ram,cs_ram,addr_ram, reg_out, ); ctrl control(rst,start,clk1, alu_zero, r_wf, en_rf, en_reg, en_alu, en_imm, sel_rf, sel_alu,sel_mux,imm, PC,IR, ROM_

31、en, wr_ram,cs_ram, addr_ram, rd_ram );endmodule/*/模塊編號(hào)3:alu模塊模塊功能說(shuō)明:算術(shù)邏輯單元,實(shí)現(xiàn)算術(shù)邏輯運(yùn)算,這里主要實(shí)現(xiàn)算術(shù)運(yùn)算輸入信號(hào)說(shuō)明:clk,en,sel,in1,in2為輸入信號(hào)。sel為選擇功能,clk、en共同決定了out和alu_zero的輸出時(shí)刻。輸出信號(hào)說(shuō)明:out,alu_zero為輸出運(yùn)算結(jié)果。Verilog HDL代碼:module alu(clk,en,sel,in1,in2,out,alu_zero); parameter sel_width=4; parameter data_width=8; inpu

32、t wire en, clk; input wire sel_width-1:0 sel; input wire data_width-1:0 in1, in2; output reg data_width-1:0 out; output reg alu_zero; parameter THROUGH=4'b0000; parameter ZERO=4'b0001; parameter ADD=4'b0100; parameter SUB=4'b0101; parameter MUL=4'b0110; parameter DIV=4'b0111;

33、 always (posedge clk) begin if(en)case(sel)THROUGH:out=in1;ZERO:if(in1=0)alu_zero=1;elsealu_zero=0;ADD:out=in1+in2;SUB:out=in1-in2;MUL:out=in1*in2;DIV:out=in1/in2;endcase endendmodule/*/模塊編號(hào)4:ctrl模塊模塊功能說(shuō)明:控制器的主要功能是對(duì)輸入的指令I(lǐng)R進(jìn)行譯碼,然后產(chǎn)生數(shù)據(jù)路徑各部件按指令要求進(jìn)行操作所需要的控制信號(hào)。輸入信號(hào)說(shuō)明: rst,復(fù)位信號(hào) start,開始信號(hào) clk,時(shí)鐘脈沖alu_zero

34、, alu零號(hào)輸出 r_wf, ram讀信號(hào)en_rf, 通用寄存器使能信號(hào)en_reg, 寄存器使能 en_alu, alu使能信號(hào) en_imm, 立即數(shù)使能信號(hào)sel_rf, 通用寄存器選擇信號(hào)sel_alu, alu算術(shù)類型選擇信號(hào)sel_mux, 二路選擇器選擇信號(hào)imm, 立即數(shù)PC,指令計(jì)數(shù)IR,存放輸入的指令輸出信號(hào)說(shuō)明:ROM_en, rom使能信號(hào)wr_ram, ram寫信號(hào)cs_ram, ram片選信號(hào)addr_ram, 要寫入/讀取數(shù)所在的ram地址rd_ram ram讀信號(hào)Verilog HDL代碼:module ctrl( rst,start, clk,alu_ze

35、ro, r_wf, en_rf, en_reg,en_alu,en_imm, sel_rf, sel_alu, sel_mux, imm, PC, IR, ROM_en, wr_ram,cs_ram,addr_ram,rd_ram);parameter instruction_width=16; parameter sel_width=4; parameter data_width=8; parameter instruction_addr_width=8; parameter data_addr_width=8; input wire rst,start,clk; input wire al

36、u_zero; input wire instruction_width-1:0 IR; output reg r_wf,en_rf,en_reg,en_alu,en_imm; output reg sel_width-1:0 sel_rf,sel_alu; output reg sel_mux; output regdata_width-1:0 imm; output reginstruction_addr_width-1:0 PC; /Program Counter output reg ROM_en; output reg wr_ram,cs_ram,rd_ram; output reg

37、data_addr_width-1:0 addr_ram; parameter /state value State_Init=6'b000000, State_Start=6'b000001, State_Fetch=6'b000010, State_IncPC=6'b000011, State_Decode=6'b000100,State_Add=6'b001000,State_Add2=6'b001001,State_Add3=6'b001010,State_Add4=6'b001011,State_Add5=6&#

38、39;b001100,State_Sub=6'b001101,State_Sub2=6'b001110,State_Sub3=6'b001111,State_Sub4=6'b010000,State_Sub5=6'b010001,State_Mul=6'b010010,State_Mul2=6'b010011,State_Mul3=6'b010100,State_Mul4=6'b010101,State_Mul5=6'b010110,State_Div=6'b010111,State_Div2=6'

39、b011000,State_Div3=6'b011001,State_Div4=6'b011010,State_Div5=6'b011011,State_Jmp=6'b011100,State_Jz=6'b011101,State_Jz2=6'b011110,State_Jz3=6'b011111,State_Next=6'b100000,State_Done=6'b100001,State_Loadi=6'b100010,State_Loadi2=6'b100011,State_Loadi3=6'

40、b100100State_Store=6'b100101,State_Store2=6'b100110,State_Store3=6'b100111,State_Store4=6'b101000,State_Load=6'b101001,State_Load2=6'b101010,State_Load3=6'b101011;parameter state_reg_width=6; reg state_reg_width-1:0 state; parameter /operation code loadi=4'b0000, /mov

41、=4'b0001, load=4'b0010, store=4'b0011, add=4'b0100, sub=4'b0101, mul=4'b0110, div=4'b0111, jmp=4'b1000, jz=4'b1001, halt=4'b1111; parameter OPCODE_width=4; reg OPCODE_width-1:0 OPCODE; reg instruction_addr_width:0 address; reg sel_width-1:0 register; integer v

42、alue,value1,value2; always (posedge rst,posedge clk)Beginsel_mux=1'b1;en_rf=0;en_reg=0;en_alu=0;en_imm=0;ROM_en<=0; /ROM output controlling signalwr_ram<=0;cs_ram<=0;rd_ram=0; /RAM addr_ram<=0;if(rst)/resetbeginstate<=State_Init;PC<=0;$display("%t:.reset.",$time);ende

43、lse /normal workingbegincase(state)State_Init: /start workingbeginPC<=0;$display(".normal.");if(start=1'b1)begin state<=State_Start;$display(".start.");end elsebegin state<=State_Init; $display("#waiting for start#");endendState_Start: /Enable ROMbeginROM_e

44、n<=1;state<=State_Fetch;endState_Fetch: /fetch instructionbeginOPCODE<=IR15:12;register<=IR11:8;/rnaddress<=IR7:0;state<=State_IncPC;endState_IncPC: /PC=PC+1beginPC<=PC+1;state<=State_Decode;endState_Decode: /instrunction decodingbegincase(OPCODE)loadi:/mov rn,#imm:rn=imm sta

45、te<=State_Loadi;store:/mov addr,rn:addr=rn state<=State_Store;add: /add rn,rm:rn=rn+rmstate<=State_Add;sub: /sub rn,rm:rn=rn-rmstate<=State_Sub;mul:/mul rn,rm:rn=rn*rmstate<=State_Mul;div:/div rn,rm:rn=rn/rmstate<=State_Div;state<=State_Jmp;jz: /jz rn,relative:PC=relative iff rn

46、=0state<=State_Jz;load: state<=State_Load;halt: /halt:PC=haltstate<=State_Done;default:state<=State_Start;endcaseendState_Loadi: /load immediate operandbeginimm<=address;/imm=addressen_imm<=1;state<=State_Loadi2;endState_Loadi2:beginsel_mux<=0;en_alu<=1;sel_alu<=4'b

47、0000;state<=State_Loadi3;endState_Loadi3:beginen_rf<=1;r_wf<=0;sel_rf<=register; /rn=registerstate<=State_Next;endState_Add: /plusbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Add2;endState_Add2:beginen_reg<=1; state<=State_Add3;

48、endState_Add3:beginsel_rf<=register;/rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rnstate<=State_Add4;endState_Add4:begin en_alu<=1; /enable alusel_alu<=4'b0100; /addstate<=State_Add5;endState_Add5:beginsel_rf<=register;/rn en_rf<=1; /enbale rfr_wf<=0; /put data

49、into rnstate<=State_Next;endState_Sub: /minusbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Sub2;endState_Sub2:beginen_reg<=1;state<=State_Sub3;endState_Sub3:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rns

50、tate<=State_Sub4; endState_Sub4:beginen_alu<=1; /enable alusel_alu<=4'b0101; /substate<=State_Sub5;endState_Sub5:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=0; /put data into rnstate<=State_Next;endState_Mul: /timesbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rf

51、r_wf<=1; /fetch data from rm state<=State_Mul2;endState_Mul2:beginen_reg<=1;state<=State_Mul3;endState_Mul3:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rnstate<=State_Mul4;endState_Mul4:beginen_alu<=1; /enable alusel_alu<=4'b0110; /mulsta

52、te<=State_Mul5;endState_Mul5:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=0; /put data into rnstate<=State_Next;endState_Div: /divbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Div2;endState_Div2:beginen_reg<=1;state<=State_Div3;endState_Div3:beginsel_r

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論