|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
ENTITY memory_timing_bridge IS
|
|
PORT
|
|
(
|
|
clk : in std_logic;
|
|
clk7x : in std_logic;
|
|
reset_n : in std_logic;
|
|
|
|
fast_memory_request : in std_logic;
|
|
registered_read_data : out std_logic_vector(7 downto 0);
|
|
|
|
memory_request : out std_logic;
|
|
read_data : in std_logic_vector(7 downto 0)
|
|
);
|
|
END memory_timing_bridge;
|
|
|
|
ARCHITECTURE vhdl OF memory_timing_bridge IS
|
|
signal memory_next : std_logic_vector(7 downto 0);
|
|
signal memory_reg : std_logic_vector(7 downto 0);
|
|
|
|
signal fast_request_toggle_next : std_logic;
|
|
signal fast_request_toggle_reg : std_logic;
|
|
signal slow_request_toggle_next : std_logic;
|
|
signal slow_request_toggle_reg : std_logic;
|
|
|
|
signal make_request_next : std_logic;
|
|
signal make_request_reg : std_logic;
|
|
begin
|
|
-- register
|
|
process(clk,reset_n)
|
|
begin
|
|
if (reset_n='0') then
|
|
memory_reg <= (others=>'0');
|
|
slow_request_toggle_reg <= '0';
|
|
make_request_reg <= '0';
|
|
elsif (clk'event and clk='1') then
|
|
memory_reg <= memory_next;
|
|
slow_request_toggle_reg <= slow_request_toggle_next;
|
|
make_request_reg <= make_request_next;
|
|
end if;
|
|
end process;
|
|
|
|
process(clk7x,reset_n)
|
|
begin
|
|
if (reset_n='0') then
|
|
fast_request_toggle_reg <= '0';
|
|
elsif (clk7x'event and clk7x='1') then
|
|
fast_request_toggle_reg <= fast_request_toggle_next;
|
|
end if;
|
|
end process;
|
|
|
|
fast_request_toggle_next <= fast_request_toggle_reg xor fast_memory_request;
|
|
slow_request_toggle_next <= fast_request_toggle_reg;
|
|
|
|
process(memory_reg,read_data,make_request_reg)
|
|
begin
|
|
memory_next <= memory_reg;
|
|
|
|
if (make_request_reg = '1') then
|
|
memory_next <= read_data;
|
|
end if;
|
|
end process;
|
|
|
|
make_request_next <= slow_request_toggle_reg xor fast_request_toggle_reg;
|
|
|
|
registered_read_data <= memory_reg;
|
|
|
|
memory_request <= make_request_reg;
|
|
|
|
end vhdl;
|
|
|
|
|