寄存器堆(register file)是CPU中多个寄存器组成的阵列,通常由快速的静态随机读写存储器(SRAM)实现。这种RAM具有专门的读端口与写端口,可以多路并发访问不同的寄存器。
本人所写的RF寄存器堆,其中包含4个8位寄存器(R0、R1、R2、R3),有三个控制端口。其中两个端口控制读操作,一个端口控制写操作,三个端口可同时操作。RD1、RD0选择从A端口读出的寄存器,RS1、RS0选择从B端口读出的寄存器,WR1、WR0选择被写入的寄存器。WRD 控制写操作。当WRD = 0时,禁止写操作;当WRD = 1 时,将来自ER寄存器的数据写入由WR1、WR0 选中的寄存器。
代码如下:
library ieee;
use ieee.std_logic_1164.all;
entity RF is
port(
RS:in std_logic_vector(1 downto 0);
RD:in std_logic_vector(1 downto 0);
WR:in std_logic_vector(1 downto 0);
WRD:in std_logic;
D_ER_i:in std_logic_vector(7 downto 0);
D_RA_o:out std_logic_vector(7 downto 0);
D_RB_o:out std_logic_vector(7 downto 0)
);
end RF;
architecture behave of Rf is
signal R0: std_logic_vector(7 downto 0);
signal R1: std_logic_vector(7 downto 0);
signal R2: std_logic_vector(7 downto 0);
signal R3: std_logic_vector(7 downto 0);
begin
process(WR) --write
begin
if(WRD='1') then
case WR is
when "00"=>
R0<=D_ER_i;
when "01"=>
R1<=D_ER_i;
when "10"=>
R2<=D_ER_i;
when "11"=>
R3<=D_ER_i;
when others=>null;
end case;
end if;
end process;
process(RD) ---read A
begin
case RD is
when "00"=>
D_RA_o<=R0;
when "01"=>
D_RA_o<=R1;
when "10"=>
D_RA_o<=R2;
when "11"=>
D_RA_o<=R3;
when others=>null;
end case;
end process;
process(RS) ---read B
begin
case RS is
when "00"=>
D_RB_o<=R0;
when "01"=>
D_RB_o<=R1;
when "10"=>
D_RB_o<=R2;
when "11"=>
D_RB_o<=R3;
when others=>null;
end case;
end process;
end behave;
随后进行仿真,验证读写功能,波形图如下:
此时读写控制信号WRD为1,表明可以进行写操作。WR为01,选中R1,向寄存器R1写入10101010。RD、RS同时为01,选中R1寄存器,从R1中读取数据。可以看出,D_RA_o与D_RB_o读出的数据相同,均为10101010,既验证了D_ER_i中的数据成功写入R1中,也验证了A、B两端口成功读出R1中数据。
再次进行对比仿真,将RS改为11,即B端口从R3读取数据。由于并未向R3中写入数据,因此B端口读不出数据,而A端口仍然正常读出数据。说明读写功能均正确:)