OpenCores
URL https://opencores.org/ocsvn/mlite/mlite/trunk

Subversion Repositories mlite

[/] [mlite/] [trunk/] [vhdl/] [reg_bank.vhd] - Diff between revs 261 and 333

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 261 Rev 333
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.