软件:Vivado
语言:Verilog
功能介绍
本设计实现了一个基础 CPU 处理器实验系统,采用 Verilog 编写并在 Vivado 工程中组织。CPU 顶层模块以时钟 clk 和低有效复位 rst_n 作为主要输入,对外给出当前 PC、指令 inst、寄存器地址 Addr1/Addr2/Addr3、寄存器读出数据 Read_data1/Read_data2 以及 ALU 运算结果 aluRes,便于在仿真中观察处理器内部关键执行状态。
系统围绕简化指令执行流程搭建,包括程序计数、指令读取、操作码译码、寄存器堆访问和算术逻辑运算等环节。指令高 4 位作为 Opcode,由控制模块生成 ALU 控制信号和寄存器写使能信号;指令中的寄存器地址字段用于读取和写回寄存器数据;ALU 结果作为写回数据,形成较完整的数据通路。
该工程适合用于计算机组成原理、CPU 数据通路、Verilog 模块化设计和 Vivado 仿真实验。通过顶层输出信号可以直观看到 PC 变化、指令内容、寄存器地址选择、寄存器读数据以及运算结果,对于理解简单 CPU 的取指、译码、执行和写回过程具有较好的参考价值。
运行环境
开发语言:Verilog
开发软件:Vivado
工程类型:Vivado FPGA 工程,包含 Verilog 源码、testbench、行为仿真相关文件和综合运行文件。
设计思路
设计采用模块化 CPU 数据通路结构,由顶层 cpu 模块统一连接指令存储器、控制器、寄存器堆、程序计数器和 ALU。顶层模块从指令中拆分操作码和寄存器地址字段,将操作码送入控制器产生 aluOp 与 writereg,将寄存器地址送入寄存器堆完成读写寻址,再由 ALU 根据控制信号对两个寄存器读出数据进行运算。
程序计数器 pc 模块负责在时钟驱动下输出当前 PC 地址,指令存储器 im 根据 PC 输出对应指令。CPU 顶层将 inst[15:12] 作为 Opcode,inst[11:8]、inst[7:4]、inst[3:0] 分别作为寄存器相关地址字段,使指令字段与数据通路控制关系清晰,便于课堂实验和后续扩展。
控制器 ctr 根据 Opcode 生成 ALU 操作控制信号 aluOp 和寄存器写使能 writereg。寄存器堆 rf 在时钟和复位信号控制下,根据 Addr1、Addr2 读取两个操作数,并根据 Addr3、Write_data 和 writereg 完成写回。ALU 使用 Read_data1 与 Read_data2 作为输入,输出 aluRes,同时保留 Zero 信号接口用于运算结果状态判断。
整体结构强调基础 CPU 的核心执行链路:PC 给出取指地址,指令存储器输出指令,控制器解析操作码,寄存器堆提供操作数,ALU 执行运算,运算结果再回写寄存器。各部分接口简洁,便于查看波形、修改指令集或扩展跳转、访存等功能。
模块结构
顶层模块:cpu
主要子模块包括:
cpu:CPU 顶层模块,完成各功能模块例化和数据通路连接。
pc:程序计数器模块,输出当前 PC。
im:指令存储器模块,根据 PC 地址输出指令 inst。
ctr:控制器/指令译码模块,根据 Opcode 输出 aluOp 和 writereg。
rf:寄存器堆模块,完成寄存器读写和写回控制。
alu:算术逻辑运算模块,根据 aluOp 对两个输入操作数进行运算并输出 aluRes。
cpu_tb:测试平台,用于 Vivado 行为仿真。
仿真图/仿真说明/设计文档图片
工程包含 Vivado 行为仿真相关文件,可通过 cpu_tb 测试平台观察 CPU 顶层输出信号,包括 PC、inst、寄存器地址、寄存器读出数据和 ALU 运算结果等。Vivado 仿真配置文件和仿真数据库文件可用于复现实验波形观察流程。
部分代码
以下展示顶层模块 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 [3:0] Addr1,Addr2,Addr3;
wire [15:0] Write_data;
//wire [15:0] Read_data1,Read_data2;
//wire [15:0] aluRes;
wire [15:0] input1,input2;
wire writereg;
assign Opcode = inst[15:12]; //操作码为指令的高四位
assign Addr1 = inst[11:8]; //当指令为跳转指令时,跳转地址为低10位
assign Addr2 = inst[ 7:4]; //当指令为跳转指令时,跳转地址为低10位
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
代码获取:点击来源:www.hdlcode.com
85