• 正文
  • 相关推荐
申请入驻 产业图谱

CPU处理器实验设计Verilog Vivado

06/16 07:27
85
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:CPU 处理器实验设计 Verilog Vivado

软件: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

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本站代码库拥有大量 Verilog/VHDL的FPGA代码资源:hdlcode.com。代码有详细注释、演示视频、仿真图等资料,适合入门学习

微信公众号