寄存器组 register_bank FPGA 设计 VHDL Vivado
名称:寄存器组 register_bank FPGA 设计 VHDL Vivado
软件:Vivado
语言:VHDL
功能介绍
本项目实现的是一个 VHDL 寄存器组 register_bank 设计,支持同步时钟、复位、写使能控制、单写端口以及双读端口数据输出。寄存器组可通过参数配置寄存器位宽和寄存器数量,适合用于 FPGA 数字系统课程设计、处理器数据通路实验、寄存器堆模块验证等场景。 模块提供 RA、RB 两组读选择信号,可同时读取两个寄存器的数据;提供 WA 写选择信号、WEN 写使能信号和 W_data 写入数据端口,用于控制指定寄存器的数据更新。RA_data 和 RB_data 分别输出两个读端口选中的寄存器内容,方便接入 ALU、控制器或其他数据处理模块。 工程使用 Vivado 开发环境,包含 VHDL 源码、顶层寄存器组模块、子模块以及 testbench。仿真内容展示了向多个寄存器写入指定数据,并通过两个读端口读取对应地址数据的过程,可作为理解寄存器组读写时序和模块化 VHDL 设计的参考。
运行环境
开发语言:VHDL 开发软件:Vivado 工程类型:FPGA/VHDL 寄存器组设计与仿真工程 顶层模块:register_bank 仿真平台:Vivado Simulator / XSIM
设计思路
本设计采用参数化寄存器组结构,将寄存器位宽、寄存器数量以及地址选择相关参数通过 generic 进行配置,便于在不同规模的数据通路中复用。默认结构包含 16 个寄存器,每个寄存器宽度为 8 位,外部通过写地址、写使能和写数据完成寄存器写入,通过两个独立读端口输出不同寄存器的数据。 寄存器组的核心思路是将写入通路和读取通路分开处理。写入时,WEN 作为写使能控制信号,仅在有效时把 W_data 写入 WA 指定的寄存器;读取时,RA 和 RB 分别选择两个读端口对应的寄存器内容,并输出到 RA_data 与 RB_data。这样的结构适合用作简化 CPU、数据通路实验、寄存器堆教学设计或多端口数据缓存模块。 工程中还包含独立寄存器模块和多路选择模块,便于把寄存器存储单元与读端口选择逻辑分层实现。测试平台对连续写入和双端口读取过程进行了验证,覆盖了向多个寄存器地址写入不同数据后再从两个读端口读取的基本工作流程。
模块结构
工程主要由以下 VHDL 模块组成: 1. register_bank:顶层寄存器组模块,负责组织多个寄存器单元,完成写入控制和双端口读取输出。 2. registers:寄存器存储单元模块,用于保存写入数据,并在时钟及复位控制下更新状态。 3. multiplexer:多路选择模块,根据读选择信号从寄存器组中选出对应数据。 4. register_bank_tb:仿真测试平台,用于产生时钟、复位、写入和读取激励,验证寄存器组功能。
仿真图/仿真说明/设计文档图片
设计文档中给出了工程文件、程序文件、编译过程、Testbench 和仿真图说明。仿真过程包含向寄存器地址 0 写入 0x8000、地址 1 写入 0xc000、地址 2 写入 0xe000、地址 3 写入 0xf000,随后通过两个读取端口分别读取这些地址的数据。 仿真结果说明端口 0 可读取地址 0 的 0x8000 和地址 2 的 0xe000,端口 1 可读取地址 1 的 0xc000 和地址 3 的 0xf000,体现了寄存器组写入后通过双读端口读取数据的基本功能。
部分代码
以下展示顶层模块register_bank的部分代码,完整代码可关注下方公众号卡片获取。
ENTITY register_bank IS GENERIC ( REG_SIZE : INTEGER := 8;-- size of the registers (number of bits); NUM_REG : INTEGER := 16;-- the number of registers in the register bank LOG_NUM_REG : INTEGER := 4-- upper bound of the logarithm (base 2) of NUM_REG ); PORT ( clock : IN STD_LOGIC; reset : IN STD_LOGIC; RA : IN STD_LOGIC_VECTOR(NUM_REG - 1 DOWNTO 0);--RA identifies which register will be read for the first output RB : IN STD_LOGIC_VECTOR(NUM_REG - 1 DOWNTO 0);--RB identifies which register will be read for the second output; WA : IN STD_LOGIC_VECTOR(NUM_REG - 1 DOWNTO 0);--WA identifies which register will be written to; WEN : IN STD_LOGIC;--WEN, which takes the value 1 when a write operation is to be carried out, 0 otherwise. W_data : IN STD_LOGIC_VECTOR(REG_SIZE - 1 DOWNTO 0);--write data RA_data : OUT STD_LOGIC_VECTOR(REG_SIZE - 1 DOWNTO 0);--read data 1 RB_data : OUT STD_LOGIC_VECTOR(REG_SIZE - 1 DOWNTO 0)--read data 2 ); END register_bank;
代码获取:点击下方公众号卡片
