寄存器组 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;代码获取点击下方公众号卡片