Line 236... |
Line 236... |
-- Option #4
|
-- Option #4
|
-- Altera LPM_RAM_DP
|
-- Altera LPM_RAM_DP
|
-- Xilinx users may need to comment out this section!!!
|
-- Xilinx users may need to comment out this section!!!
|
altera_mem:
|
altera_mem:
|
if memory_type = "ALTERA_LPM" generate
|
if memory_type = "ALTERA_LPM" generate
|
|
signal clk_delayed : std_logic;
|
|
signal addr_reg : std_logic_vector(4 downto 0);
|
|
signal data_reg : std_logic_vector(31 downto 0);
|
|
signal q1 : std_logic_vector(31 downto 0);
|
|
signal q2 : std_logic_vector(31 downto 0);
|
|
begin
|
|
-- Altera dual port RAMs must have the addresses registered (sampled
|
|
-- at the rising edge). This is very unfortunate.
|
|
-- Therefore, the dual port RAM read clock must delayed so that
|
|
-- the read address signal can be sent from the mem_ctrl block.
|
|
-- This solution also delays the how fast the registers are read so the
|
|
-- maximum clock speed is cut in half (12.5 MHz instead of 25 MHz).
|
|
|
|
clk_delayed <= not clk; --Could be delayed by 1/4 clock cycle instead
|
|
dpram_bypass: process(clk, addr_write, reg_dest_new)
|
|
begin
|
|
if rising_edge(clk) and write_enable = '1' then
|
|
addr_reg <= addr_write;
|
|
data_reg <= reg_dest_new;
|
|
end if;
|
|
end process; --dpram_bypass
|
|
|
|
-- Bypass dpram if reading what was just written (Altera limitation)
|
|
data_out1 <= q1 when addr_read1 /= addr_reg else data_reg;
|
|
data_out2 <= q2 when addr_read2 /= addr_reg else data_reg;
|
|
|
lpm_ram_dp_component1 : lpm_ram_dp
|
lpm_ram_dp_component1 : lpm_ram_dp
|
GENERIC MAP (
|
generic map (
|
lpm_width => 32,
|
LPM_WIDTH => 32,
|
lpm_widthad => 5,
|
LPM_WIDTHAD => 5,
|
rden_used => "FALSE",
|
--LPM_NUMWORDS => 0,
|
intended_device_family => "UNUSED",
|
LPM_INDATA => "REGISTERED",
|
lpm_indata => "REGISTERED",
|
LPM_OUTDATA => "UNREGISTERED",
|
lpm_wraddress_control => "REGISTERED",
|
LPM_RDADDRESS_CONTROL => "REGISTERED",
|
lpm_rdaddress_control => "UNREGISTERED",
|
LPM_WRADDRESS_CONTROL => "REGISTERED",
|
lpm_outdata => "UNREGISTERED",
|
LPM_FILE => "UNUSED",
|
use_eab => "ON",
|
LPM_TYPE => "LPM_RAM_DP",
|
lpm_type => "LPM_RAM_DP"
|
USE_EAB => "ON",
|
)
|
INTENDED_DEVICE_FAMILY => "UNUSED",
|
PORT MAP (
|
RDEN_USED => "FALSE",
|
wren => write_enable,
|
LPM_HINT => "UNUSED")
|
wrclock => clk,
|
port map (
|
data => reg_dest_new,
|
RDCLOCK => clk_delayed,
|
rdaddress => addr_read1,
|
RDCLKEN => '1',
|
wraddress => addr_write,
|
RDADDRESS => addr_read1,
|
q => data_out1
|
RDEN => '1',
|
);
|
DATA => reg_dest_new,
|
|
WRADDRESS => addr_write,
|
|
WREN => write_enable,
|
|
WRCLOCK => clk,
|
|
WRCLKEN => '1',
|
|
Q => q1);
|
lpm_ram_dp_component2 : lpm_ram_dp
|
lpm_ram_dp_component2 : lpm_ram_dp
|
GENERIC MAP (
|
generic map (
|
lpm_width => 32,
|
LPM_WIDTH => 32,
|
lpm_widthad => 5,
|
LPM_WIDTHAD => 5,
|
rden_used => "FALSE",
|
--LPM_NUMWORDS => 0,
|
intended_device_family => "UNUSED",
|
LPM_INDATA => "REGISTERED",
|
lpm_indata => "REGISTERED",
|
LPM_OUTDATA => "UNREGISTERED",
|
lpm_wraddress_control => "REGISTERED",
|
LPM_RDADDRESS_CONTROL => "REGISTERED",
|
lpm_rdaddress_control => "UNREGISTERED",
|
LPM_WRADDRESS_CONTROL => "REGISTERED",
|
lpm_outdata => "UNREGISTERED",
|
LPM_FILE => "UNUSED",
|
use_eab => "ON",
|
LPM_TYPE => "LPM_RAM_DP",
|
lpm_type => "LPM_RAM_DP"
|
USE_EAB => "ON",
|
)
|
INTENDED_DEVICE_FAMILY => "UNUSED",
|
PORT MAP (
|
RDEN_USED => "FALSE",
|
wren => write_enable,
|
LPM_HINT => "UNUSED")
|
wrclock => clk,
|
port map (
|
data => reg_dest_new,
|
RDCLOCK => clk_delayed,
|
rdaddress => addr_read2,
|
RDCLKEN => '1',
|
wraddress => addr_write,
|
RDADDRESS => addr_read2,
|
q => data_out2
|
RDEN => '1',
|
);
|
DATA => reg_dest_new,
|
|
WRADDRESS => addr_write,
|
|
WREN => write_enable,
|
|
WRCLOCK => clk,
|
|
WRCLKEN => '1',
|
|
Q => q2);
|
end generate; --altera_mem
|
end generate; --altera_mem
|
|
|
end; --architecture ram_block
|
end; --architecture ram_block
|
|
|
No newline at end of file
|
No newline at end of file
|