名称:处理器CPU设计Verilog代码vivado仿真(文末获取)
软件:vivado
语言:Verilog
代码功能:
处理器CPU设计
设计一个简单的处理器,可以实现加减法以及简单的逻辑运算。
设计包括程序计数器电路,指令存储器电路,指令译码器电路(控制器),运算电路,数据存储器(寄存器)电路。
1. Cpu
工程文件
程序文件
程序编译
RTL图
Testbench
仿真图
指令格式:
-----------------------
opcode | rs | rt | rd |
-----------------------
15-12 11-8 7-4 3-0
支持8个指令:ADD,SUB,INC ,DEC,AND,OR,NOT,XOR
操作方式如下:
ADD R1,R2,R3
=> R3 = R1 + R2;
SUB与ADD一致
INC:
INC R1,0,R1
=> R1 = R1 +1;
DEC,R1,0,R1
=> R1 = R1 -1;
测试指令如下:
2101 # INC R1 结果:R1 =1
2101 # INC R1 结果:R1 =2
2101 # INC R1 结果:R1 =3
2202 # INC R2 结果:R2 =1
2202 # INC R2 结果:R2 =2
0123 # ADD R1,R2,R3 结果:R3 =3 + 2 = 5
1124 # SUB R1,R2,R4 结果:R4 =3 -2 =1
3303 # DEC R3 结果:R3 =5 -1 = 4
4123 # AND R1,R2,R3 结果:R3 =00000011 & 00000010 = 0010
5123 # OR R1,R2,R3 结果:R3 =00000011 | 00000010 = 0011
6103 # NOT R1,,R3 结果:R3 =~00000011 = 11111100
7123 # XOR R1,R2,R3 结果:R3 =00000011 ^ 00000010 = 00000001
部分代码展示:
`timescale 1ns / 1ps //CPU顶层模块:设计包括程序计数器电路,指令存储器电路,指令译码器电路,运算电路,数据存储器电路 module cpu( input wire clk, input wire rst_n, output [15:0] PC, output [15:0] inst, output [3:0] Addr1, output [3:0] Addr2, output [3:0] Addr3, output [15:0] Read_data1, output [15:0] Read_data2, output [15:0] aluRes ); //wire [15:0] inst; //wire [15:0] PC; wire [3:0] Opcode; wire [2:0] aluOp; wire [15:0] imm; wire [15:0] Write_data; wire [15:0] input1,input2; wire writereg; assign Opcode = inst[15:12]; //操作码为指令的高四位 assign Addr1 = inst[11:8]; assign Addr2 = inst[ 7:4]; assign Addr3 = inst[ 3:0]; assign Write_data = aluRes; assign input1 = Read_data1; assign input2 = Read_data2; //指令存储器例化 im u_im( .Addr(PC), .inst(inst) ); //指令译码器例化 ctr u_ctr( .Opcode(Opcode), .aluOp(aluOp), .writereg(writereg) ); //数据存储器例化 rf u_rf( .clk(clk), .rst_n(rst_n), .Addr1(Addr1), .Addr2(Addr2), .Addr3(Addr3), .Write_data(Write_data), .writereg(writereg), .Read_data1(Read_data1), .Read_data2(Read_data2) ); //程序计数器电路例化 pc u_pc( .clk(clk), .rst_n(rst_n), .current_pc(PC) ); //运算电路例化 alu u_alu( .aluOp(aluOp), .input1(input1), .input2(input2), .aluRes(aluRes), .Zero(Zero) ); endmodule
源代码
扫描文章末尾的公众号二维码