【MCU】16bit CPU设计实战(二)

david 2022-03-01 09:00:10 3393

本CPU设计基于16bit RISC指令集、哈佛结构完成,架构图如下:

CPU架构

A. Memory Access Instructions
1. Load Word:

LD ws, offset(rs1) ws:=Mem16[rs1 + offset]
2. Store Word:

ST rs2, offset(rs1) Mem16[rs1 + offset]=rs2

B. Data Processing Instructions
1. Add:

ADD ws, rs1, rs2 ws:=rs1 + rs2
2. Subtract:

SUB ws, rs1, rs2 ws:=rs1 – rs2
3. Invert (1‘s complement):

INV ws, rs1 ws:=!rs1
4. Logical Shift Left:

LSL ws, rs1, rs2 ws:=rs1
5. Logical Shift Right:

LSR ws, rs1, rs2 ws:=rs1 >> rs2
6. Bitwise AND:

AND ws, rs1, rs2 ws:=rs1 • rs2
7. Bitwise OR:

OR ws, rs1, rs2 ws:=rs1 | rs2
8. Set on Less Than:
SLT ws, rs1, rs2 ws:=1 if rs1

C. Control Flow Instructions
1. Branch on Equal:
BEQ rs1, rs2, offset
Branch to (PC + 2 + (offset
2. Branch on Not Equal:
BNE rs1, rs2, offset
Branch to (PC + 2 + (offset
3. Jump: JMP offset Jump to {PC [15:13], (offset

Instruction Format of the RISC

Processor Control Unit Design:

ALU Control Unit Design:

Verilog code for the RISC processor:

1. Verilog code for Instruction Memory :
<pre style="color: rgb(0, 0, 0);font-size: 18.48px;line-height: 23.1px;"><span style="color: rgb(0, 51, 102);font-weight: bold;"></span>
  • 1
<pre class="code-snippet__js" data-lang="cpp">```
<span class="code-snippet_outer">`include <span class="code-snippet__string">"Parameter.v"</span></span>
  • 1
  • 2

// fpga4student.com

<span class="code-snippet_outer"><span class="code-snippet__comment">// FPGA projects, VHDL projects, Verilog projects </span></span>
  • 1

// Verilog code for RISC Processor

<span class="code-snippet_outer"><span class="code-snippet__comment">// Verilog code for Instruction Memory</span></span>
  • 1

module Instruction_Memory(

<span class="code-snippet_outer"> input[<span class="code-snippet__number">15</span>:<span class="code-snippet__number">0</span>] pc,</span>
  • 1

output[15:0] instruction

<span class="code-snippet_outer"><span class="code-snippet_outer">)</span>;</span>
  • 1



<span class="code-snippet_outer"> reg [`col - <span class="code-snippet__number">1</span>:<span class="code-snippet__number">0</span>] memory [`row_i - <span class="code-snippet__number">1</span>:<span class="code-snippet__number">0</span>];</span>
  • 1

wire [3 : 0] rom_addr = pc[4 : 1];

<span class="code-snippet_outer"> initial</span>
  • 1

begin

<span class="code-snippet_outer">  $readmemb(<span class="code-snippet__string">"./test/test.prog"</span>, memory,<span class="code-snippet__number">0</span>,<span class="code-snippet__number">14</span>);</span>
  • 1

end

<span class="code-snippet_outer"> assign instruction =  memory[rom_addr]; </span>
  • 1



<span class="code-snippet_outer">endmodule</span>
  • 1


    ``` #### 2. Verilog code for register file: ```
    
    ```
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    `timescale 1ns / 1ps
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog code for register file
    ``````
    module GPRs(
    ``````
     input    clk,
    ``````
     // write port
    ``````
     input    reg_write_en,
    ``````
     input  [2:0] reg_write_dest,
    ``````
     input  [15:0] reg_write_data,
    ``````
     //read port 1
    ``````
     input  [2:0] reg_read_addr_1,
    ``````
     output  [15:0] reg_read_data_1,
    ``````
     //read port 2
    ``````
     input  [2:0] reg_read_addr_2,
    ``````
     output  [15:0] reg_read_data_2
    ``````
    );
    ``````
     reg [15:0] reg_array [7:0];
    ``````
     integer i;
    ``````
     // write port
    ``````
     //reg [2:0] i;
    ``````
     initial begin
    ``````
      for(i=0;i
    ``````
       reg_array[i] 
    ``````
     end
    ``````
     always @ (posedge clk ) begin
    ``````
       if(reg_write_en) begin
    ``````
        reg_array[reg_write_dest] 
    ``````
       end
    ``````
     end
    ``````
     
    ``````
     assign reg_read_data_1 = reg_array[reg_read_addr_1];
    ``````
     assign reg_read_data_2 = reg_array[reg_read_addr_2];
    ``````
    

    `````` endmodule ``` ``` ```


    ``` #### 3. Verilog code for Data Memory: ```
    
    ```
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    `include "Parameter.v"
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog code for data Memory
    ``````
    module Data_Memory(
    ``````
     input clk,
    ``````
     // address input, shared by read and write port
    ``````
     input [15:0]   mem_access_addr,
    ``````
     
    ``````
     // write port
    ``````
     input [15:0]   mem_write_data,
    ``````
     input     mem_write_en,
    ``````
     input mem_read,
    ``````
     // read port
    ``````
     output [15:0]   mem_read_data
    ``````
    );
    ``````
    

    `````` reg [`col - 1:0] memory [`row_d - 1:0]; `````` integer f; `````` wire [2:0] ram_addr=mem_access_addr[2:0]; `````` initial `````` begin `````` $readmemb("./test/test.data", memory); `````` `````` f = $fopen(`filename); `````` $fmonitor(f, "time = %d\n", $time, `````` "\tmemory[0] = %b\n", memory[0], `````` "\tmemory[1] = %b\n", memory[1], `````` "\tmemory[2] = %b\n", memory[2], `````` "\tmemory[3] = %b\n", memory[3], `````` "\tmemory[4] = %b\n", memory[4], `````` "\tmemory[5] = %b\n", memory[5], `````` "\tmemory[6] = %b\n", memory[6], `````` "\tmemory[7] = %b\n", memory[7]); `````` `simulation_time; `````` $fclose(f); `````` end `````` `````` always @(posedge clk) begin `````` if (mem_write_en) `````` memory[ram_addr] `````` end `````` assign mem_read_data = (mem_read==1'b1) ? memory[ram_addr]: 16'd0; ``````

    `````` endmodule ``` ``` ```
    ``` #### 4. Verilog code for ALU unit: ```
    
    ```
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog code for ALU
    ``````
    module ALU(
    ``````
     input  [15:0] a,  //src1
    ``````
     input  [15:0] b,  //src2
    ``````
     input  [2:0] alu_control, //function sel
    ``````
     
    ``````
     output reg [15:0] result,  //result 
    ``````
     output zero
    ``````
        );
    ``````
    

    `````` always @(*) `````` begin `````` case(alu_control) `````` 3'b000: result = a + b; // add `````` 3'b001: result = a - b; // sub `````` 3'b010: result = ~a; `````` 3'b011: result = a `````` 3'b100: result = a>>b; `````` 3'b101: result = a & b; // and `````` 3'b110: result = a | b; // or `````` 3'b111: begin if (a16'd1; `````` else result = 16'd0; `````` end `````` default:result = a + b; // add `````` endcase `````` end `````` assign zero = (result==16'd0) ? 1'b1: 1'b0; `````` `````` endmodule ``` ``` #### #### 5. Verilog code for ALU Control Unit of the RISC processor: ```
    
    ```
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    `timescale 1ns / 1ps
    ``````
    //fpga4student.com: FPGA projects, Verilog projects, VHDL projects
    ``````
    // Verilog code for 16-bit RISC processor
    ``````
    // ALU_Control Verilog code
    ``````
    module alu_control( ALU_Cnt, ALUOp, Opcode);
    ``````
     output reg[2:0] ALU_Cnt;
    ``````
     input [1:0] ALUOp;
    ``````
     input [3:0] Opcode;
    ``````
     wire [5:0] ALUControlIn;
    ``````
     assign ALUControlIn = {ALUOp,Opcode};
    ``````
     always @(ALUControlIn)
    ``````
     casex (ALUControlIn)
    ``````
       6'b10xxxx: ALU_Cnt=3'b000;
    ``````
       6'b01xxxx: ALU_Cnt=3'b001;
    ``````
       6'b000010: ALU_Cnt=3'b000;
    ``````
       6'b000011: ALU_Cnt=3'b001;
    ``````
       6'b000100: ALU_Cnt=3'b010;
    ``````
       6'b000101: ALU_Cnt=3'b011;
    ``````
       6'b000110: ALU_Cnt=3'b100;
    ``````
       6'b000111: ALU_Cnt=3'b101;
    ``````
       6'b001000: ALU_Cnt=3'b110;
    ``````
       6'b001001: ALU_Cnt=3'b111;
    ``````
      default: ALU_Cnt=3'b000;
    ``````
      endcase
    ``````
    endmodule
    ```
    ```
    
    ```
    


    ``` ### 6. Verilog code for Datapath of the RISC processor: ```
    
    ```
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    `timescale 1ns / 1ps
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog code for Data Path of the processor
    ``````
    module Datapath_Unit(
    ``````
     input clk,
    ``````
     input jump,beq,mem_read,mem_write,alu_src,reg_dst,mem_to_reg,reg_write,bne,
    ``````
     input[1:0] alu_op,
    ``````
     output[3:0] opcode
    ``````
    );
    ``````
     reg  [15:0] pc_current;
    ``````
     wire [15:0] pc_next,pc2;
    ``````
     wire [15:0] instr;
    ``````
     wire [2:0] reg_write_dest;
    ``````
     wire [15:0] reg_write_data;
    ``````
     wire [2:0] reg_read_addr_1;
    ``````
     wire [15:0] reg_read_data_1;
    ``````
     wire [2:0] reg_read_addr_2;
    ``````
     wire [15:0] reg_read_data_2;
    ``````
     wire [15:0] ext_im,read_data2;
    ``````
     wire [2:0] ALU_Control;
    ``````
     wire [15:0] ALU_out;
    ``````
     wire zero_flag;
    ``````
     wire [15:0] PC_j, PC_beq, PC_2beq,PC_2bne,PC_bne;
    ``````
     wire beq_control;
    ``````
     wire [12:0] jump_shift;
    ``````
     wire [15:0] mem_read_data;
    ``````
     // PC 
    ``````
     initial begin
    ``````
      pc_current 
    ``````
     end
    ``````
     always @(posedge clk)
    ``````
     begin 
    ``````
       pc_current 
    ``````
     end
    ``````
     assign pc2 = pc_current + 16'd2;
    ``````
     // instruction memory
    ``````
     Instruction_Memory im(.pc(pc_current),.instruction(instr));
    ``````
     // jump shift left 2
    ``````
     assign jump_shift = {instr[11:0],1'b0};
    ``````
     // multiplexer regdest
    ``````
     assign reg_write_dest = (reg_dst==1'b1) ? instr[5:3] :instr[8:6];
    ``````
     // register file
    ``````
     assign reg_read_addr_1 = instr[11:9];
    ``````
     assign reg_read_addr_2 = instr[8:6];
    ``````
    

    `````` // GENERAL PURPOSE REGISTERs `````` GPRs reg_file `````` ( `````` .clk(clk), `````` .reg_write_en(reg_write), `````` .reg_write_dest(reg_write_dest), `````` .reg_write_data(reg_write_data), `````` .reg_read_addr_1(reg_read_addr_1), `````` .reg_read_data_1(reg_read_data_1), `````` .reg_read_addr_2(reg_read_addr_2), `````` .reg_read_data_2(reg_read_data_2) `````` ); `````` // immediate extend `````` assign ext_im = {{10{instr[5]}},instr[5:0]}; `````` // ALU control unit `````` alu_control ALU_Control_unit(.ALUOp(alu_op),.Opcode(instr[15:12]),.ALU_Cnt(ALU_Control)); `````` // multiplexer alu_src `````` assign read_data2 = (alu_src==1'b1) ? ext_im : reg_read_data_2; `````` // ALU `````` ALU alu_unit(.a(reg_read_data_1),.b(read_data2),.alu_control(ALU_Control),.result(ALU_out),.zero(zero_flag)); `````` // PC beq add `````` assign PC_beq = pc2 + {ext_im[14:0],1'b0}; `````` assign PC_bne = pc2 + {ext_im[14:0],1'b0}; `````` // beq control `````` assign beq_control = beq & zero_flag; `````` assign bne_control = bne & (~zero_flag); `````` // PC_beq `````` assign PC_2beq = (beq_control==1'b1) ? PC_beq : pc2; `````` // PC_bne `````` assign PC_2bne = (bne_control==1'b1) ? PC_bne : PC_2beq; `````` // PC_j `````` assign PC_j = {pc2[15:13],jump_shift}; `````` // PC_next `````` assign pc_next = (jump == 1'b1) ? PC_j : PC_2bne; ``````

    `````` /// Data memory `````` Data_Memory dm `````` ( `````` .clk(clk), `````` .mem_access_addr(ALU_out), `````` .mem_write_data(reg_read_data_2), `````` .mem_write_en(mem_write), `````` .mem_read(mem_read), `````` .mem_read_data(mem_read_data) `````` ); `````` `````` // write back `````` assign reg_write_data = (mem_to_reg == 1'b1)? mem_read_data: ALU_out; `````` // output to control unit `````` assign opcode = instr[15:12]; `````` endmodule ``` ``` ### 7. Verilog code for the Control Unit of the RISC processor: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ```
    ```
    `timescale 1ns / 1ps
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog code for Control Unit 
    ``````
    module Control_Unit(
    ``````
          input[3:0] opcode,
    ``````
          output reg[1:0] alu_op,
    ``````
          output reg jump,beq,bne,mem_read,mem_write,alu_src,reg_dst,mem_to_reg,reg_write    
    ``````
        );
    ``````
    

    `````` always @(*) `````` begin `````` case(opcode) `````` 4'b0000: // LW `````` begin `````` reg_dst = 1'b0; `````` alu_src = 1'b1; `````` mem_to_reg = 1'b1; `````` reg_write = 1'b1; `````` mem_read = 1'b1; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b10; `````` jump = 1'b0; `````` end `````` 4'b0001: // SW `````` begin `````` reg_dst = 1'b0; `````` alu_src = 1'b1; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b0; `````` mem_read = 1'b0; `````` mem_write = 1'b1; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b10; `````` jump = 1'b0; `````` end `````` 4'b0010: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b0011: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b0100: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b0101: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b0110: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b0111: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b1000: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b1001: // data_processing `````` begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` 4'b1011: // BEQ `````` begin `````` reg_dst = 1'b0; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b0; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b1; `````` bne = 1'b0; `````` alu_op = 2'b01; `````` jump = 1'b0; `````` end `````` 4'b1100: // BNE `````` begin `````` reg_dst = 1'b0; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b0; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b1; `````` alu_op = 2'b01; `````` jump = 1'b0; `````` end `````` 4'b1101: // J `````` begin `````` reg_dst = 1'b0; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b0; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b1; `````` end `````` default: begin `````` reg_dst = 1'b1; `````` alu_src = 1'b0; `````` mem_to_reg = 1'b0; `````` reg_write = 1'b1; `````` mem_read = 1'b0; `````` mem_write = 1'b0; `````` beq = 1'b0; `````` bne = 1'b0; `````` alu_op = 2'b00; `````` jump = 1'b0; `````` end `````` endcase `````` end ``````

    `````` endmodule ``` ``` ### 8. Verilog code for the 16-bit RISC processor: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ```
    ```
    `timescale 1ns / 1ps
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    

    `````` module Risc_16_bit( `````` input clk `````` ); `````` wire jump,bne,beq,mem_read,mem_write,alu_src,reg_dst,mem_to_reg,reg_write; `````` wire[1:0] alu_op; `````` wire [3:0] opcode; `````` // Datapath `````` Datapath_Unit DU `````` ( `````` .clk(clk), `````` .jump(jump), `````` .beq(beq), `````` .mem_read(mem_read), `````` .mem_write(mem_write), `````` .alu_src(alu_src), `````` .reg_dst(reg_dst), `````` .mem_to_reg(mem_to_reg), `````` .reg_write(reg_write), `````` .bne(bne), `````` .alu_op(alu_op), `````` .opcode(opcode) `````` ); `````` // control unit `````` Control_Unit control `````` ( `````` .opcode(opcode), `````` .reg_dst(reg_dst), `````` .mem_to_reg(mem_to_reg), `````` .alu_op(alu_op), `````` .jump(jump), `````` .bne(bne), `````` .beq(beq), `````` .mem_read(mem_read), `````` .mem_write(mem_write), `````` .alu_src(alu_src), `````` .reg_write(reg_write) `````` ); ``````

    `````` endmodule ``` ``` ### 9. Verilog Testbench code for the 16-bit RISC Processor: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ```
    ```
    `timescale 1ns / 1ps
    ``````
    `include "Parameter.v"
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Verilog testbench code to test the processor
    ``````
    module test_Risc_16_bit;
    ``````
    

    `````` // Inputs `````` reg clk; ``````

    `````` // Instantiate the Unit Under Test (UUT) `````` Risc_16_bit uut ( `````` .clk(clk) `````` ); ``````

    `````` initial `````` begin `````` clk 0; `````` `simulation_time; `````` $finish; `````` end ``````

    `````` always `````` begin `````` #5 clk = ~clk; `````` end ``````

    `````` endmodule ``` ``` #### Parameter file: - - - - - - - - - - - - - ```
    ```
    `ifndef PARAMETER_H_
    ``````
    `define PARAMETER_H_
    ``````
    // fpga4student.com 
    ``````
    // FPGA projects, VHDL projects, Verilog projects 
    ``````
    // Verilog code for RISC Processor 
    ``````
    // Parameter file
    ``````
    `define col 16 // 16 bits instruction memory, data memory
    ``````
    `define row_i 15 // instruction memory, instructions number, this number can be changed. Adding more instructions to verify your design is a good idea.
    ``````
    `define row_d 8 // The number of data in data memory. We only use 8 data. Do not change this number. You can change the value of each data inside test.data file. Total number is fixed at 8. 
    ``````
    `define filename "./test/50001111_50001212.o"
    ``````
    `define simulation_time #160
    ``````
    

    `````` `endif ``` ``` **test.prog (Intruction memory)** #### **Example instruction memory file:** - - - - - - - - - - - - - - - ```
    ```
    0000_0100_0000_0000 // load R0 0)
    ``````
    0000_0100_0100_0001 // load R1 1)
    ``````
    0010_0000_0101_0000 // Add R2 
    ``````
    0001_0010_1000_0000 // Store Mem(R1 + 0) 
    ``````
    0011_0000_0101_0000 // sub R2 
    ``````
    0100_0000_0101_0000 // invert R2 
    ``````
    0101_0000_0101_0000 // logical shift left R2 
    ``````
    0110_0000_0101_0000 // logical shift right R2 >R1 
    ``````
    0111_0000_0101_0000 // AND R2AND R1 
    ``````
    1000_0000_0101_0000 // OR R2OR R1 
    ``````
    1001_0000_0101_0000 // SLT R2 1 if R0 
    ``````
    0010_0000_0000_0000 // Add R0 
    ``````
    1011_0000_0100_0001 // BEQ branch to jump if R0=R1, PCnew= PC+2+offset1 = 28 => offset = 1
    ``````
    1100_0000_0100_0000 // BNE branch to jump if R0!=R1, PCnew= PC+2+offset1 = 28 => offset = 0
    ``````
    1101_0000_0000_0000 // J jump to the beginning address
    ```
    ```
    
    **test.data (Initial content of data memory)**
    
    #### **Example data memory file:**
    
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    - 
    
    ```
    
    ```
    0000_0000_0000_0001
    ``````
    0000_0000_0000_0010
    ``````
    0000_0000_0000_0001
    ``````
    0000_0000_0000_0010
    ``````
    0000_0000_0000_0001
    ``````
    0000_0000_0000_0010
    ``````
    0000_0000_0000_0001
    ``````
    0000_0000_0000_0010
    ```
    ```
    
    感谢阅读,别走!点赞、关注、转发后再走吧
    
    ![](https://ebaina.oss-cn-hangzhou.aliyuncs.com/wechat-official-crawl/2022-03/164609640947836.jpg)
    
    参考链接:
    
    https://www.fpga4student.com/2017/01/verilog-code-for-single-cycle-MIPS-processor.html
    
    https://www.fpga4student.com/2017/04/verilog-code-for-16-bit-risc-processor.html
    
    转载:全栈芯片工程师
                    
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    <
    声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
    david
    红包 点赞 收藏 评论 打赏
    评论
    0个
    内容存在敏感词
    手气红包
      易百纳技术社区暂无数据
    相关专栏
    置顶时间设置
    结束时间
    删除原因
    • 广告/SPAM
    • 恶意灌水
    • 违规内容
    • 文不对题
    • 重复发帖
    打赏作者
    易百纳技术社区
    david
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1易百纳技术社区
    ¥5易百纳技术社区
    ¥10易百纳技术社区
    ¥50易百纳技术社区
    ¥100易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    拼手气红包 红包规则
    祝福语
    恭喜发财,大吉大利!
    红包金额
    红包最小金额不能低于5元
    红包数量
    红包数量范围10~50个
    余额支付
    当前余额:
    可前往问答、专栏板块获取收益 去获取
    取 消 确 定

    小包子的红包

    恭喜发财,大吉大利

    已领取20/40,共1.6元 红包规则

      易百纳技术社区