VHDL でレジスタ ファイルを書き込もうとしています。このファイルには、16 個の 64 ビット レジスタが含まれています。各サイクルで、2 つのレジスタが読み取られ、1 つのレジスタが書き込まれます (書き込みが有効になっている場合)。1 つのサイクルで同じレジスタに対して読み書きを行う場合、書き込まれたばかりの値が出力に直接転送されるように、データ バイパス (転送) が必要です。
私のアイデアは、これを 1 サイクルで完了するために、クロックの立ち上がりエッジで書き込み、立ち下がりエッジで読み取ることでした。ただし、私のデザインは機能していません (立ち上がりエッジをチェックするifブロック内の立ち下がりエッジのチェックが期待どおりに機能するとは思わないため、期待していたわけではありません)。
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;
どんな助けでも大歓迎です。