版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 用硬件描述語言設(shè)計(jì)CPU</p><p><b> 摘要</b></p><p> 本次設(shè)計(jì)完全用verilog硬件描述語言編寫微處理器的各個(gè)部件,在頂層文件里將各個(gè)部件連接起來,形成一個(gè)簡單的微處理器,加上一些外圍模塊來實(shí)現(xiàn)一些功能。本次設(shè)計(jì)在合理性與實(shí)用性上沒有考慮。只為了達(dá)到技術(shù)指標(biāo),從原理上完成一個(gè)簡單的cpu設(shè)計(jì)。</p>
2、;<p> 關(guān)鍵字:verilog,微處理器,CPU設(shè)計(jì)</p><p> Design CPU In Hardware Description Language</p><p><b> Abstract</b></p><p> The design completely microprocessor verilog
3、hardware description language in all parts, the top file in the various components connected together to form a simple microprocessor, plus some peripheral modules to achieve some functionality. The design does not have
4、a reasonable and practical considerations. Only to achieve technical indicators, from the principles of the cpu to complete a simple cpu design.</p><p> Key Words:verilog, microprocessor, CPU design</p&g
5、t;<p><b> 目錄</b></p><p> 第1章 設(shè)計(jì)任務(wù)和技術(shù)指標(biāo).........................................5</p><p> 第2章 簡單介紹...................................................6</p><p>
6、2.1微處理器硬件系統(tǒng)及原理......................................6</p><p> 2.1.1內(nèi)部組成...............................................6</p><p> 2.1.2外圍模塊...............................................8</p&
7、gt;<p> 2.2處理器指令系統(tǒng)及功能........................................8</p><p> 第3章 各模塊的設(shè)計(jì)及實(shí)現(xiàn).........................................9</p><p> 3.1時(shí)鐘發(fā)生器的設(shè)計(jì)及實(shí)現(xiàn)...................................
8、...9</p><p> 3.2程序計(jì)數(shù)器的設(shè)計(jì)及實(shí)現(xiàn).....................................12</p><p> 3.3指令寄存器的設(shè)計(jì)及實(shí)現(xiàn).....................................13</p><p> 3.4運(yùn)算器的設(shè)計(jì)及實(shí)現(xiàn).............................
9、............14</p><p> 3.5累加器的設(shè)計(jì)及實(shí)現(xiàn).........................................16</p><p> 3.6地址選擇器的設(shè)計(jì)及實(shí)現(xiàn).....................................17</p><p> 3.7數(shù)據(jù)選擇器的設(shè)計(jì)及實(shí)現(xiàn)...............
10、......................17</p><p> 3.8控制器的設(shè)計(jì)及實(shí)現(xiàn).........................................18</p><p> 3.9 ROM的設(shè)計(jì)及實(shí)現(xiàn)..........................................25</p><p> 3.10 RAM的設(shè)計(jì)及實(shí)現(xiàn).
11、........................................26</p><p> 第4章 CPU的測試...............................................27</p><p> 4.1乘法測試...................................................29</p>&
12、lt;p> 4.2除法測試...................................................29</p><p> 4.3減1測試...................................................29</p><p> 4.4加、減1測試...................................
13、............30</p><p> 4.5測試結(jié)果...................................................30</p><p> 第5章 總結(jié)......................................................33</p><p> 第6章 參考文獻(xiàn).......
14、...........................................34</p><p> 第1章 設(shè)計(jì)任務(wù)和技術(shù)指標(biāo)</p><p> 運(yùn)用在“數(shù)字電路與邏輯設(shè)計(jì)”課程中學(xué)過的基本理論知識(shí),設(shè)計(jì)并用可編程邏輯器件實(shí)現(xiàn)一個(gè)簡單的八位操作數(shù)的微處理器。完成微處理器硬件系統(tǒng)設(shè)計(jì)和指令系統(tǒng)設(shè)計(jì)兩個(gè)方面的任務(wù),使微處理器能實(shí)現(xiàn)。</p><p><
15、;b> 第2章 簡單介紹</b></p><p> 本次設(shè)計(jì)完全用verilog硬件描述語言編寫微處理器的各個(gè)部件,在頂層文件里將各個(gè)部件連接起來,形成一個(gè)簡單的微處理器,加上一些外圍模塊來實(shí)現(xiàn)一些功能。本次設(shè)計(jì)在合理性與實(shí)用性上沒有考慮。只為了達(dá)到技術(shù)指標(biāo),從原理上完成一個(gè)簡單的CPU設(shè)計(jì)。</p><p> 2.1微處理器硬件系統(tǒng)及原理</p>&
16、lt;p><b> 2.1.1內(nèi)部組成</b></p><p> 微處理器硬件由以下八個(gè)基本部件組成:</p><p> 運(yùn)算器、控制器、指令寄存分離器、時(shí)鐘發(fā)生器、程序計(jì)數(shù)器、累加器、地址選擇器、數(shù)據(jù)選擇器。</p><p> 時(shí)鐘發(fā)生器clk-gen:利用輸入時(shí)鐘信號(hào)生成三個(gè)時(shí)鐘信號(hào)送往對(duì)應(yīng)的部件。</p>&l
17、t;p> 程序計(jì)數(shù)器PC:存放將要執(zhí)行的指令地址。</p><p> 指令寄存器IR:存放被執(zhí)行的操作碼和操作數(shù)的地址,直接供運(yùn)算器與控制器。</p><p> 控制器CON:根據(jù)操作碼產(chǎn)生一系列時(shí)序邏輯信號(hào),控制微處理器各個(gè)部件協(xié)調(diào)一致地完成每條指令相應(yīng)的操作。</p><p> 運(yùn)算器ALU:當(dāng)時(shí)鐘上升沿來時(shí)對(duì)累加器與數(shù)據(jù)總線上的數(shù)進(jìn)行加減乘除或邏
18、輯運(yùn)算。</p><p> 累加器ACC:暫時(shí)存放運(yùn)算結(jié)果。</p><p> 地址選擇器:選擇輸出到地址總線上的地址,是PC還是操作數(shù)地址。</p><p> 數(shù)據(jù)選擇器:選通ALU的運(yùn)算結(jié)果輸出到數(shù)據(jù)總線上去。</p><p><b> 下面是內(nèi)部連接圖:</b></p><p>&l
19、t;b> 2.1.2外圍模塊</b></p><p> 程序存儲(chǔ)器ROM:存放程序指令。</p><p> 數(shù)據(jù)存儲(chǔ)器RAM:讀取存放運(yùn)算中間變量等臨時(shí)數(shù)據(jù)。</p><p> 輸入輸出特殊寄存器:數(shù)據(jù)的輸入輸出。</p><p><b> 外部部分連接圖:</b></p>&l
20、t;p> 外圍設(shè)備通過總線連接CPU</p><p> 2.2 處理器指令系統(tǒng)及功能</p><p> 處理器的基本指令字長為W位,指令的每一位從高到低用DW,DW-1,…,D1,D0表示,有些微處理器的一條指令包括多個(gè)指令字長,即每條指令的長度不一樣,例如intel的80386等。本實(shí)驗(yàn)為了簡化設(shè)計(jì),規(guī)定所有的指令都是單指令字的指令,且所有指令的長度都是8,即一個(gè)字節(jié)。因此可
21、以有8種操作,5根地址線尋址空間為32B。</p><p> 指令的前三位為操作碼,后5位為操作數(shù)的地址,尋址方式只設(shè)計(jì)了直接尋址。詳細(xì)如下表:</p><p><b> 表2-1</b></p><p> 第3章 各模塊的設(shè)計(jì)及實(shí)現(xiàn)</p><p><b> 3.1時(shí)鐘發(fā)生器:</b>&l
22、t;/p><p> 時(shí)鐘發(fā)生器clk-gen的波形見下圖:</p><p> Verilog代碼:</p><p> module clk_gen(clk,reset,fetch,alu_clk,clk1);</p><p> input clk,reset;</p><p&
23、gt; output fetch,alu_clk,clk1;</p><p> wire clk,reset;</p><p> reg fetch,alu_clk;</p><p> reg[7:0] state;</p><p> param
24、eterSSS0 = 8'b00000000,</p><p> SSS1 = 8'b00000001,</p><p> SSS2 = 8'b00000010</p><p> SSS3
25、160;= 8'b00000100</p><p> SSS4 = 8'b00001000,</p><p> SSS5 = 8'b00010000,</p><p> SSS6 =
26、8'b00100000,</p><p> SSS7 = 8'b01000000,</p><p> SSS8 = 8'b10000000;</p><p> assign clk1 =
27、0;clk;</p><p> always @ (posedge clk)</p><p><b> if(reset)</b></p><p><b> begin</b></p><p> fetch
28、0; <= 0;</p><p> alu_clk <= 0;</p><p> state <= SSS0;</p><p><b> end</b></p><p><
29、b> else</b></p><p><b> begin</b></p><p> case(state)</p><p><b> SSS0:</b></p><p><b> begin</b></p><p> s
30、tate <= SSS1;</p><p><b> end</b></p><p><b> SSS1:</b></p><p><b> begin</b></p><p> fetch<=~fetch;<
31、;/p><p> state<=SSS2;</p><p><b> end</b></p><p><b> SSS2:</b></p><p><b> begin</b></p><p> state<=SSS3;</p&g
32、t;<p><b> end</b></p><p><b> SSS3:</b></p><p><b> begin</b></p><p> state<=SSS4;</p><p><b> end</b></p
33、><p><b> SSS4:</b></p><p><b> begin</b></p><p> state<=SSS5;</p><p><b> end</b></p><p><b> SSS5:</b>&l
34、t;/p><p><b> begin</b></p><p> fetch<=~fetch;</p><p> state<=SSS6;</p><p><b> end</b></p><p><b> SSS6:</b></
35、p><p><b> begin</b></p><p> alu_clk<=~alu_clk;</p><p> state<=SSS7;</p><p><b> end</b></p><p><b> SSS7:</b><
36、/p><p><b> begin</b></p><p> alu_clk<=~alu_clk;</p><p> state<=SSS8;</p><p><b> end</b></p><p><b> SSS8:</b><
37、;/p><p><b> begin</b></p><p> state<=SSS1;</p><p><b> end</b></p><p> default:state<=8’bxxxxxxxx;</p><p><b> endcase&
38、lt;/b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b> 3.2 程序計(jì)數(shù)器</b></p><p> 程序計(jì)數(shù)器用于提供指令地址,以便讀取指令,指令按地址順序存放在存儲(chǔ)器中。有兩種途徑
39、可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變書序指令的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。</p><p> 復(fù)位后,指令指針為零,即每次CPU重新啟動(dòng)將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需1個(gè)時(shí)鐘,這時(shí)pc_addr已被增1,指向下一條指令。如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時(shí)CPU狀態(tài)控制器將會(huì)輸出load_pc信號(hào),通過load口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器(pc_add
40、r)將裝入目標(biāo)地址(ir_addr),而不是增1.</p><p> verilog代碼:</p><p> module counter ( pc_addr, ir_addr, load,</p>&l
41、t;p> clock, rst);</p><p> output [4:0] pc_addr;</p><p> input [4:0] ir_addr;</p><p> inpu
42、t load, clock, rst;</p><p> reg [4:0] pc_addr;</p><p> always @ ( posedge&
43、#160; clock or posedge rst )</p><p><b> begin</b></p><p><b> if(rst)</b></p><p> pc_addr<=0;</p>
44、<p><b> else</b></p><p><b> if(load)</b></p><p> pc_addr<=ir_addr;</p><p><b> else</b></p><p> pc_addr
45、60;<= pc_addr + 1;</p><p><b> end</b></p><p><b> endmodule</b></p><p><b> 3.3 指令寄存器</b>&
46、lt;/p><p> 指令寄存器的觸發(fā)時(shí)鐘是clk1,在clk1的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入opcode(高3位)或ir_addr(低5位)中。但并不是每個(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ù)位后,指令寄存器被清為零。</p>
47、<p> Verilog代碼:</p><p><b> module</b></p><p> output[2:0] opcode;</p><p> output [4:0] ir_addr;</p><p> input&
48、#160; [7:0] data;</p><p> input ena, clk, rst;</p><p> reg [2:0] opcode;</p&
49、gt;<p> reg [4:0] ir_addr;</p><p> always @ (posedge clk)</p><p><b> begin</b></p>
50、;<p><b> if(rst)</b></p><p><b> begin</b></p><p> opcode<=3'b000;</p><p> ir_addr<=5'b00000;</p><p><b> end</
51、b></p><p><b> else</b></p><p><b> begin</b></p><p><b> if(ena)</b></p><p><b> begin</b></p><p> opc
52、ode<=data[7:5];</p><p> ir_addr<=data[4:0];</p><p><b> end</b></p><p><b> end</b></p><p><b> end</b></p><p>&
53、lt;b> endmodule</b></p><p><b> 3.4運(yùn)算器</b></p><p> 根據(jù)8種不同的操作碼分別實(shí)現(xiàn)相應(yīng)的運(yùn)算,結(jié)果由alu_out輸出。</p><p> verilog代碼:</p><p> module alu
54、0; (alu_out ,zero, bz,data,</p><p> accum,alu_clk, opcode);</p><p> output [7:0]alu_out;</p><p> ou
55、tput zero,bz;</p><p> input [7:0] data, accum;</p><p> input [2:0] opcode;</p><
56、p> input alu_clk;</p><p> reg [7:0] alu_out,tmp;</p><p> reg bzt;</p><p> initial bzt=0;&
57、lt;/p><p> parameterDIV=3'b000,</p><p> JMP=3'b001,</p><p> ADD=3'b010,</p><p> SUB =3'b011,</p><p> MUL
58、 =3'b100,</p><p> LDA=3'b101,</p><p> STO=3'b110,</p><p> JA=3'b111;</p><p> assign zero=!accum;</p><p> alwa
59、ys @(posedge alu_clk)</p><p><b> begin</b></p><p> casex (opcode)</p><p> DIV: alu_out<=accum/d
60、ata;</p><p> JMP: alu_out<=accum;</p><p> ADD: alu_out<=data+accum;</p><p> SUB: alu_out<=accum-data;</p><p
61、><b> MUL:begin</b></p><p><b> if(!bzt)</b></p><p><b> begin</b></p><p> {tmp,alu_out}<=data*accum;</p><p><b> bzt&l
62、t;=1;</b></p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p> alu_out<=tmp;</p><p><b&g
63、t; bzt<=0;</b></p><p><b> end</b></p><p><b> end</b></p><p> LDA: alu_out<=data;</p><p> STO:
64、;alu_out<=accum;</p><p> JA: alu_out<=accum;</p><p> default: alu_out<=8'bxxxx_xxxx;</p><p><b> endcase</b></p>
65、<p><b> end</b></p><p> assign bz=bzt;</p><p><b> endmodule</b></p><p><b> 3.5 累加器</b></p><p> 累加器用于存放當(dāng)前的
66、結(jié)果,它也是alu其中一個(gè)數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自cpu狀態(tài)控制器load_acc信號(hào)時(shí),在clk1時(shí)鐘正跳沿就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。</p><p> verilog代碼:</p><p> module accum( accum, data
67、, ena, clk, rst);</p><p> output[7:0] accum;</p><p> input[7:0] data;</p><p> input
68、0; ena,clk,rst;</p><p> reg[7:0] accum;</p><p> always @ (posedge clk)</p><p><b> begin</b>&l
69、t;/p><p><b> if(rst)</b></p><p> accum<=8'b0000_0000;</p><p><b> //Reset</b></p><p><b> else</b></p><p> if(en
70、a) //當(dāng) CPU 狀態(tài)控制器發(fā)</p><p> 出 load_acc 信號(hào)</p><p> accum<=data;
71、160; //接收來自</p><p><b> ALU 的數(shù)據(jù)</b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b> 3.6 地址選擇器</b&
72、gt;</p><p> 地址選擇器用于選擇輸出的地址是pc(程序計(jì)數(shù))地址還是數(shù)據(jù)/端口地址。每個(gè)指令周期的前4個(gè)時(shí)鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個(gè)時(shí)鐘周期用于對(duì)RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號(hào)有fetch提供。</p><p> verilog代碼:</p><p><b> module<
73、/b></p><p> addrchoose(addr,fetch,ir_addr,pc_addr);</p><p> output [4:0] addr;</p><p> input [4:0] ir_addr,
74、 pc_addr;</p><p> inputfetch;</p><p> assign addr = (fetch)? pc_addr :</p&
75、gt;<p><b> ir_addr;</b></p><p><b> endmodule</b></p><p> 3.7 數(shù)據(jù)選擇器:</p><p> 累加器的數(shù)據(jù)只有在需要往RAM區(qū)或輸出口寫時(shí)才允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時(shí),都需要
76、一控制信號(hào)。而此控制信號(hào)的啟停,則由CPU狀態(tài)控制器輸出的各信號(hào)控制決定。數(shù)據(jù)控制器何時(shí)輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號(hào)datactl_ena決定。</p><p> verilog代碼:</p><p> module datactl (data,in,ena);</p><p> output [7:0] data;</p
77、><p> input [7:0] in;</p><p> input ena;</p><p> assign data = (ena)? in : 8'bzzzz_zzzz;</p><p><b> endmodule</b></p><p><
78、;b> 3.8 控制器</b></p><p> 控制器是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ù)。</p><p> 第1個(gè)時(shí)鐘:讀指令,將 rd 與 load_ir 置高電平,
79、其余為低電平。此時(shí)地址輸出的是 PC,所以會(huì)將PC 所指的 ROM 里的數(shù)據(jù)取到數(shù)據(jù)總線,并分開存入指令寄存器中。</p><p><b> 第2個(gè)時(shí)鐘:同上。</b></p><p> 第3個(gè)時(shí)鐘:空,輸出全低。</p><p> 第4個(gè)時(shí)鐘:PC 加 1,將 inc_pc 置高電平,其余為低電平。</p><p&g
80、t; 第5個(gè)時(shí)鐘:這個(gè)時(shí)鐘 fetch 翻轉(zhuǎn),由高變低,開始分析操作碼并輸出相應(yīng)的信號(hào)。</p><p> 第6個(gè)時(shí)鐘:這個(gè)時(shí)鐘 alu_clk 翻轉(zhuǎn),由低變高,alu 分析操作碼并進(jìn)行相應(yīng)運(yùn)算,繼續(xù)分析操作碼并輸出相應(yīng)的信號(hào)。</p><p><b> 第7個(gè)時(shí)鐘:空。</b></p><p> 第8個(gè)時(shí)鐘:空,輸出全低。</p
81、><p> verilog代碼:</p><p> modulemachine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,clk,zero,rst,opcode ,bz);</p><p> output inc_pc, load_acc, load_pc, rd, wr, loa
82、d_ir ,datactl_ena;</p><p> input clk, zero, rst,bz;</p><p> input [2:0] opcode;</p><p> reg inc_pc, load_acc, load_pc, rd, wr, load_ir, datactl_ena;<
83、/p><p> reg [7:0] state;</p><p> parameterDIV= 3'b000,</p><p> JMP= 3'b001,</p><p> ADD= 3'b010,</p><p> SUB= 3'b011,<
84、;/p><p> MUL= 3'b100,</p><p> LDA= 3'b101,</p><p> STO= 3'b110,</p><p> JA= 3'b111;</p><p> parameterSS0 = 8'b000000
85、00,</p><p> SS1 = 8'b00000001,</p><p> SS2 = 8'b00000010,</p><p> SS3 = 8'b00000100,</p><p> SS4 = 8'b00001000,</p><p>
86、 SS5 = 8'b00010000,</p><p> SS6 = 8'b00100000,</p><p> SS7 = 8'b01000000,</p><p> SS8 = 8'b10000000;</p><p> always @( posedge
87、 clk )</p><p><b> begin</b></p><p> if ( rst )//接收到復(fù)位信號(hào) RST,進(jìn)行復(fù)位操作</p><p><b> begin</b></p><p> state<=SS0;</p><p&g
88、t; {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p><p
89、><b> begin</b></p><p> case(state)</p><p><b> SS0:</b></p><p><b> begin</b></p><p> state<=SS1;</p><p><b
90、> end</b></p><p> SS1://讀指令</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p> {wr,load_ir,datactl_ena}<=3
91、'b010;</p><p> state<=SS2;</p><p><b> end</b></p><p><b> SS2:</b></p><p><b> begin</b></p><p> {inc_pc,load
92、_acc,load_pc,rd}<=4'b0001;</p><p> {wr,load_ir,datactl_ena}<=3'b010;</p><p> state<=SS3;</p><p><b> end</b></p><p><b> SS3:</b
93、></p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p> state<=SS4;&
94、lt;/p><p><b> end</b></p><p> SS4://pc+1</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b1000;</p><p> {wr,
95、load_ir,datactl_ena}<=3'b000;</p><p> state<=SS5;</p><p><b> end</b></p><p> SS5://fetch 翻轉(zhuǎn)</p><p><b> begin</b></p><
96、;p> if(opcode==JA && zero==1)</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0010;</p><p> {wr,load_ir,datactl_ena}<=3'b0
97、00;</p><p><b> end</b></p><p><b> else</b></p><p> if( opcode==JMP)</p><p><b> begin</b></p><p> {inc_pc,load_ac
98、c,load_pc,rd}<=4'b0010;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p><p> if( opcode==A
99、DD || opcode==SUB || opcode==MUL || opcode==LDA||opcode==DIV)</p><p><b> begin</b></p><p><b> if(!bz)</b></p><p><b> begin</b></p>
100、<p> {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p&g
101、t;<p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b001;</p><p><b> end</b></
102、p><p><b> end</b></p><p><b> else</b></p><p> if(opcode==STO)</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,r
103、d}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b001;</p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b>
104、</p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p> state<=SS6;</p&
105、gt;<p><b> end</b></p><p> SS6://alu_clock上升</p><p><b> begin</b></p><p> if ( opcode==ADD||opcode==SUB||opcode==MUL||opcode==LDA ||opcode
106、==DIV)</p><p><b> begin</b></p><p><b> if(!bz)</b></p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0101;<
107、;/p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p>
108、 {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b101;</p><p><b> end</b></p><p><b> end</b></p><p>
109、<b> else</b></p><p> if( opcode==JMP)</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b1010;</p><p> {wr,load_ir,data
110、ctl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p><p> if(opcode==JA && zero==1)</p><p><b> begin</b&g
111、t;</p><p> {inc_pc,load_acc,load_pc,rd}<=4'b1010;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b
112、></p><p> if(opcode==STO)</p><p><b> begin</b></p><p> //過一個(gè)時(shí)鐘后把 wr 變 1 就可寫到 RAM 中</p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p>&
113、lt;p> {wr,load_ir,datactl_ena}<=3'b101;</p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p> {inc_pc,l
114、oad_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p><b> end</b></p><p> state<=SS7;</p><p><b> end<
115、/b></p><p><b> SS7:</b></p><p><b> begin</b></p><p> if ( opcode==STO )</p><p><b> begin</b></p><p> {inc
116、_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b001;</p><p><b> end</b></p><p><b> else</b></p><p> if
117、 ( opcode==ADD||opcode==SUB||opcode==MUL||opcode==LDA||opcode==DIV)</p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p> {wr,load_ir,d
118、atactl_ena}<=3'b000;</p><p><b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<
119、=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b001;</p><p><b> end</b></p><p> state<=SS8;</p><p><b> end</b></p><p
120、><b> SS8:</b></p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p>&
121、lt;p> state<=SS1;</p><p><b> end</b></p><p><b> default:</b></p><p><b> begin</b></p><p> {inc_pc,load_acc,load_pc,rd}<
122、;=4'b0000;</p><p> {wr,load_ir,datactl_ena}<=3'b000;</p><p> state<=8'bxxxxxxxx;</p><p><b> end</b></p><p><b> endcase</b>
123、</p><p><b> end</b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b> 3.9 ROM</b></p><p> 這里的 ROM
124、 不是真正的 ROM,只是是一種用 verilog 語言模擬的 ROM,代碼如下:</p><p> module rom( data, addr, rd, ena );</p><p> output [7:0] data;</p><p> input [4:0] addr;</p><p> input r
125、d, ena;</p><p> reg [7:0] memory [31:0];</p><p> wire [7:0] data;</p><p><b> initial</b></p><p><b> begin</b></p><p> me
126、mory[0]=8'b 101_00000; //(00H)→ A</p><p> memory[1]=8'b 100_00001; // A*(01H) →TA</p><p> memory[2]=8'b 100_11100; // T → 1CH</p><p> memory[3]=8'b 110_11
127、101; // A → 1DH</p><p> memory[4]=8'b 001_00000; // 00H → PC</p><p> //1CH:輸出口 0,1DH:輸出口 1</p><p><b> end</b></p><p> assign data= ( rd
128、 && ena )? memory[addr] : 8'bzzzzzzzz;</p><p><b> endmodule</b></p><p><b> 3.10 RAM</b></p><p> verilog代碼:</p><p> module r
129、am( data, addr, ena, rd, wr );</p><p> inout [7:0] data;</p><p> input [4:0] addr;</p><p> input ena;</p><p> input rd, wr;</p><p> reg
130、[7:0] ram [27:0];</p><p><b> initial</b></p><p><b> begin</b></p><p> ram[0]=250;</p><p> ram[1]=100;</p><p><b> end&l
131、t;/b></p><p> assign data = ( rd && (!ena) )? ram[addr] :8'hzz;</p><p> always @ (posedge wr)</p><p><b> begin</b></p><p> ram[add
132、r]<=data;</p><p><b> end</b></p><p><b> endmodule</b></p><p> 第4章 CPU的測試:</p><p> 這里增加兩個(gè)數(shù)碼管譯碼輸出口,連接如下:</p><p> 其功能是將輸入的8位數(shù)據(jù)
133、譯碼供數(shù)碼管顯示。</p><p> verilog代碼:</p><p><b> module</b></p><p> shuamguan(data_in,leda,ledb,ena,wr,addr);</p><p> input [7:0] data_in;&
134、lt;/p><p> input ena,wr,addr;</p><p> output [7:0] leda,ledb;</p><p> reg [7:0] leda,ledb;</p><p> reg
135、0;[3:0] high,low;</p><p> always @ ( wr or ena or addr )</p><p><b> begin</b><
136、/p><p> if((!ena) && wr && addr)</p><p><b> begin</b></p><p> high = data_in[7:4];</p><p> lo
137、w = data_in[3:0];</p><p> case(high)</p><p> 8'd0: leda = 8'b11111100;</p><p> 8'd1: leda = 8'b01100000;</p><p> 8'd2: leda = 8'b110110
138、10;</p><p> 8'd3: leda = 8'b11110010;</p><p> 8'd4: leda = 8'b01100110;</p><p> 8'd5: leda = 8'b10110110;</p><p> 8'd6: leda = 8
139、39;b10111110;</p><p> 8'd7: leda = 8'b11100000;</p><p> 8'd8: leda = 8'b11111110;</p><p> 8'd9: leda = 8'b11110110;</p><p> 8'd
140、10: leda = 8'b11101110;</p><p> 8'd11: leda = 8'b00111110;</p><p> 8'd12: leda = 8'b10011100;</p><p> 8'd13: leda = 8'b01111010;</p>
141、<p> 8'd14: leda = 8'b10011110;</p><p> 8'd15: leda = 8'b10001110;</p><p> default : leda=8'hx;</p><p><b> endcase</b></p>
142、<p><b> case(low)</b></p><p> 8'd0: ledb = 8'b11111100;</p><p> 8'd1: ledb = 8'b01100000;</p><p> 8'd2: ledb = 8'b11011010;</p>&
143、lt;p> 8'd3: ledb = 8'b11110010;</p><p> 8'd4: ledb = 8'b01100110;</p><p> 8'd5: ledb = 8'b10110110;</p><p> 8'd6: ledb = 8
144、'b10111110;</p><p> 8'd7: ledb = 8'b11100000;</p><p> 8'd8: ledb = 8'b11111110;</p><p> 8'd9: ledb = 8'b11110110;</p><p> 8'
145、;d10: ledb = 8'b11101110;</p><p> 8'd11: ledb = 8'b00111110;</p><p> 8'd12: ledb = 8'b10011100;</p><p> 8'd13: ledb = 8'b01111010;</p&g
146、t;<p> 8'd14: ledb = 8'b10011110;</p><p> 8'd15: ledb = 8'b10001110;</p><p> default : ledb=8'hx;</p><p><b> endcase</b></p>
147、<p><b> end</b></p><p><b> end</b></p><p><b> endmodule</b></p><p><b> 測試用例:</b></p><p><b> 乘法</b&g
148、t;</p><p><b> ROM:</b></p><p> //1CH:輸出口 0 的地址,1DH:輸出口 1 的地址</p><p> memory[0]=8'b 101_00000; //(00H)→ A</p><p> memory[1]=8'b 100_00001; /
149、/ A*(01H) → TA</p><p> memory[2]=8'b 100_11101; // T → 1DH</p><p> memory[3]=8'b 110_11100; // A → 1CH</p><p> memory[4]=8'b 001_00000; // 00H → PC&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)組成原理cpu設(shè)計(jì)
- 16位cpu綜合設(shè)計(jì) 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 《計(jì)算機(jī)組成原理》課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)---內(nèi)存擴(kuò)充與cpu連接
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)---模型機(jī)組成設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)---內(nèi)存擴(kuò)充與cpu連接
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)--計(jì)算機(jī)組成原理算法實(shí)現(xiàn)
- 16位精簡指令cpu設(shè)計(jì)—計(jì)算機(jī)組成原理課程設(shè)計(jì)
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)組成原理-課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)日志
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)組成原理課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)組成原理課程設(shè)計(jì) (2)
評(píng)論
0/150
提交評(píng)論