• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

MIPS多周期處理器Verilog代碼Quartus仿真

4小時前
150
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

2-2401100ZRU06.doc

共1個文件

名稱:MIPS多周期處理器Verilog代碼Quartus仿真

軟件:Quartus

語言:Verilog

代碼功能:

MIPS多周期處理器

##### Operation a

Load the data stored in locations X of the data memory into registers P.

P register=reg 4,X=22

1. *load* operation is `100011`.

2. *base* is `00000`.

3. *rt* is `00100` because P register=reg 4.

4. *offset* is `10110`, because the X=22 .

|? ?LW? ?| base? |? rt? ?|? ? ? offset? ? ? |

| :----: | :---: | :---: | :--------------: |

| 100011 | 00000 | 00100 | 0000000001011000 |

| 10001100000001000000000001011000 |

##### Operation a

Load the data stored in locations Y of the data memory into registers Q.

1. *load* operation is `100011`.

2. *base* is `00000`.

3. *rt* is `00101` because Q register=reg 5.

4. *offset* is `10111`, because the Y=23 .

|? ?LW? ?| base? |? rt? ?|? ? ? offset? ? ? |

| :----: | :---: | :---: | :--------------: |

| 100011 | 00000 | 00101 | 0000000001011100 |

| 10001100000001010000000001011100 |

##### Operation a

Load the data stored in locations 31 of the data memory into registers 1.

1. *load* operation is `100011`.

2. *base* is `00000`.

3. *rt* is `00001` because register=reg 1.

4. *offset* is `11111`, because the 31 .

|? ?LW? ?| base? |? rt? ?|? ? ? offset? ? ? |

| :----: | :---: | :---: | :--------------: |

| 100011 | 00000 | 00001 | 0000000001111100 |

| 10001100000000010000000001111100 |

##### Operation b

Add register P with constant 6 and store the result in the register R

The reasons:

add operation is 00000.

rs is 00100 because the P register is 4.

rt is 00001 because the 1 register is 1.

rd is 00110 because the R register is 6.

ADDUrs? ? ? rt? rd

00000000100000010011000000100000

00000000100000010011000000100000

##### Operation c

If the result in registers Q and R is equal to each other,

then branch to instruction a

beq是一條條件轉(zhuǎn)移指令:beq rs,rt, label # if (rs==rt) pc<---label

1. *BEQ* operation is `000100`.

2. *rs* is `00101` because the Q register is 5.

3. *rt* is `00110` because the R register is 6.

4. *label* is `11000` because the memory location is 24.

|? ?BEQ? | rs? ? |? rt? ?|? ? ? label? ? ? ?|

| :----: | :---: | :---: | :--------------: |

| 000100 | 00101 | 00110 | 1111111111111011 |

| 00010000101001101111111111111011 |

##### Operation d

Store the result in the register R into the memory location 24

1. *store* operation is `101011`.

2. *base* is `00000`.

3. *rt* is `00110` because the R register is 6.

4. *offset* is `11000` because the memory location is 24.

|? ?SW? ?| base? |? rt? ?|? ? ? offset? ? ? |

| :----: | :---: | :---: | :--------------: |

| 101011 | 00000 | 00110 | 0000000001100000 |

| 10101100000001100000000001100000 |

##### Operation e

Jump to instruction a

1. *jump* operation is `000010`.

|? ?J? ? |? ? ? target address? ? ? ? |

| :----: | :------------------------: |

| 000010 | 00000000000000000000000000 |

| 00001000000000000000000000000000 |

AND,func=100100

OR ,func=100101

sub,func=100010

slt,func=101010

NOR func=100111

100100: ALUOut <= A & B;

100101: ALUOut <= A | B;

100111: ALUOut <= ~(A | B);

100010: ALUOut <= A - B;

101010: ALUOut <= A < B ? 1:0;

##### Operation sub

**Q** sub **P** registers and store the result in the **R** register.

The reasons:

rs-rt=rd

1. *sub* R_Type? is `000000`, func=100010.

2. *rs* is `00101` because the Q register is 5.

3. *rt* is `00100` because the P register is 4.

4. *rd* is `00110` because the R register is 6.

 

|? SUB? ?|? rs? ?|? rt? ?|? rd? ?|? ? ? ?|? func? |

| :----: | :---: | :---: | :---: | :---: | :----: |

| 000000 | 00101 | 00100 | 00110 | 00000 | 100010 |

| 00000000101001000011000000100010 |

處理錯誤OP or CP到memeory16~31

FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com

演示視頻:

設計文檔:

指令如下:

指令仿真圖(Q=R后跳轉(zhuǎn)到起始地址)

指令仿真圖(Q/=R,存儲R到mem[24],后跳轉(zhuǎn)到起始地址)

減法仿真(bbbbbbbb-55555555=66666666):

部分代碼展示:

//?The?behavioural?specification?of?a?MIPS?multicycle?processor?originaly?developed
//for?simulation?by?Patterson?and?Hennesy
//?Modified?by?Dr.?M.?Xu?in?June?2010
module?CPU?(clock,?reset,?opcode,?state,?PC,?IR,?ALUOut,?MDR,?A,?B,?P,?Q,?R,error);
parameter?R_Type?=?6'b000000,?LW?=?6'b100011,?SW?=?6'b101011,?BEQ=6'b000100,
J=6'b000010;
input?clock,?reset;?//external?inputs
output?[31:0]?PC,?IR,?ALUOut,?MDR,?A,?B,?P,?Q,?R;
output?[2:0]?state;
output?[5:0]?opcode;
output?error;
//?The?architecturally?visible?registers?and?scratch?registers?for?implementation
reg?[31:0]?PC,?Regs[0:31],?Memory?[0:31],?IR,?ALUOut,?MDR,?A,?B;
reg?error;
reg?[2:0]?state;?//?processor?state
wire?[5:0]?opcode;?//use?to?get?opcode?easily
wire?[31:0]?SignExtend,PCOffset;?//used?to?get?sign?extended?offset?field
assign?opcode?=?IR[31:26];?//opcode?is?upper?6?bits
assign?SignExtend?=?{{16{IR[15]}},IR[15:0]};?//sign?extension?of?lower?16-bits?of?instruction
assign?PCOffset?=?SignExtend?<<?2;?//PC?offset?is?shifted
assign?P?=?Regs[4];?//?you?must?change?registers?according?to?your?tasks?!
assign?Q?=?Regs[5];
assign?R?=?Regs[6];
//?set?the?PC?to?0?and?start?the?control?in?state?1
initial?begin?PC?=?0;?state?=?1;?end
//The?state?machine--triggered?on?a?rising?clock
always?@(posedge?clock?or?posedge?reset)?begin
Regs[0]?=?0;?//?to?make?sure?R0?is?always?0
if?(reset)?begin
PC?=?0;

點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=521

  • 2-2401100ZRU06.doc
    下載

相關(guān)推薦