30.2. ФАЙЛ РЕГИСТРОВ




Файл регистров (Register file) - это многопортовая сверхоперативная
память, которая используется для хранения обрабатываеммых данных.


Файл регистров как черный ящик: +---------+ |+-------+| || R0 ||< ------- A |+-------+| C ------ >|| ... || |+-------+|< ------- B || RN || |+-------+| +---------+ ^ | Control Cигналы: Вход: Шина С - для записи в файл регистров Control - управляющие входы: EN_A - разрешить bus A EN_B - разрешить bus B EN_C - разрешить bus C REG_A - выбор регистра для шины A REG_B - выбор регистра для шины B REG_C - выбор регистра для шины C CLK - синхросигнал [в отличии от ALU необходим т.к. внутри триггеры] (как правило выборка на A,B по фронту, запись из C по спаду) (но может быть и двойная синхронизация) RESET - cброс по включению питания (в принципе необязательно) Выходы: Шина A - чтение из файла регистров Шина B - чтение из файла регистров


Общая архитектура регистрового файла:



Регистровый файл состоит из многопортовой памяти, защелок на шинах и управляющего блока (который содержит дешифраторы для выборы конктретного регистра на конкретную шину). Эта архитектура допускает чтобы все 3 шины (A,B,C) были открыты на один и тот же регистр.

Пример схемы для обработки бита в регистровом файле (для одной шины).

Пример оптимизировааного на транзисторах бита файла регистров для трех шин:


Это пример реализации Register File на VHDL: (Синтезируется в использования Internal RAM в FPGA) library ieee; use ieee.std_logic_1164.all; entity regfile is generic( lnum_reg : integer := 4; -- logarithm of number of registers reg_width : integer := 16); -- register width port( REG_A: in std_logic_vector(lnum_reg-1 downto 0); REG_B: in std_logic_vector(lnum_reg-1 downto 0); REG_W: in std_logic_vector(lnum_reg-1 downto 0); A: out std_logic_vector(reg_width-1 downto 0); B: out std_logic_vector(reg_width-1 downto 0); W: in std_logic_vector(reg_width-1 downto 0); CLK: in std_logic; -- clock EN_A: in std_logic; -- enable A EN_B: in std_logic; -- enable B EN_W: in std_logic); -- enable W end regfile; architecture RTL of regfile is constant num_reg : integer := 2 ** lnum_reg; -- number of registers type rmem_type is array(num_reg-1 downto 0) of std_logic_vector(reg_width-1 downto 0); function value(BV:in std_logic_vector) return natural is variable E: natural := 0; begin for i in BV'LOW to BV'HIGH loop E := E * 2; if BV(i) = '1' then E := E + 1; elsif BV(i) /= '0' then report "Wrong bit"; E := 0; exit; end if; end loop; return E; end value; signal TEMP_A: std_logic_vector(reg_width-1 downto 0); signal TEMP_B: std_logic_vector(reg_width-1 downto 0); signal WRL: std_logic := '0'; shared variable mem:rmem_type; begin process(CLK) begin if rising_edge(CLK) then TEMP_A <= (others => 'Z'); TEMP_B <= (others => 'Z'); if EN_A = '1' then TEMP_A <= mem(value(REG_A)); end if; if EN_B = '1' then TEMP_B <= mem(value(REG_B)); end if; if EN_W = '1' then WRL <= '1' after 5 ns, '0' after 10 ns; end if; end if; end process; process(WRL) begin if WRL = '1' then mem(value(REG_W)) := W; end if; end process; A <= TEMP_A; B <= TEMP_B; end RTL;


Index Prev Next