Я пытаюсь написать файл регистра в VHDL. Файл содержит 16 64-битных регистров. Каждый цикл, два регистра считываются и записывается один регистр (при условии, что запись включена). Должен быть обход данных (пересылка), так что только что написанное значение пересылается непосредственно на выход, если мы читаем и записываем в/из одного и того же регистра за один цикл.Запись файла регистра в VHDL
Моя идея состояла в том, чтобы писать на переднем фронте и читать на заднем фронте часов, чтобы завершить это за один цикл. Тем не менее, мой проект не работает (не то, что я ожидал от него, так как не считаю, что проверка на падение в пределах , если блок, который проверяет передний фронт, будет работать, как ожидалось).
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity register_file is
port
(
outA : out std_logic_vector(63 downto 0);
outB : out std_logic_vector(63 downto 0);
input : in std_logic_vector(63 downto 0);
writeEnable : in std_logic;
regASel : in std_logic_vector(5 downto 0);
regBSel : in std_logic_vector(5 downto 0);
writeRegSel : in std_logic_vector(5 downto 0);
clk : in std_logic
);
end register_file;
architecture behavioral of register_file is
type registerFile is array(0 to 15) of std_logic_vector(63 downto 0);
signal registers : registerFile;
begin
regFile: process(clk)
begin
if rising_edge(clk) then
if(writeEnable = '1') then
registers(to_integer(unsigned(writeRegSel))) <= input;
end if;
if falling_edge(clk) then
outA <= registers(to_integer(unsigned(regASel)));
outB <= registers(to_integer(unsigned(regBSel)));
end if;
end if;
if falling_edge(clk) then
outA <= registers(to_integer(unsigned(regASel)));
outB <= registers(to_integer(unsigned(regBSel)));
end if;
end process;
end behavioral;
Любая помощь будет оценена по достоинству.
Если вы хотите только 16 (2^4) регистров, то почему у вас есть 6-битная строка «адрес», дающая вам 64 (2^6) возможных комбинаций? –
да, ты прав. Я думаю, что я просто сделал это по привычке из-за работы с MIPS – audiFanatic