⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ramlib_xil.vhd

📁 该文件时RAM的源文件和测试文件以及仿真文件
💻 VHD
📖 第 1 页 / 共 3 页
字号:
  signal rd_data_int	:std_logic_vector (data_bits-1 downto 0);
  
  signal wr_dout	:std_logic_vector (data_bits-1 downto 0);
begin
  RAM_DP:  for i in data_bits-1 downto 0 generate
  begin
    RAMX1: component ram_x1_dp_lut
      generic map (addr_bits)
      port map (wr_clk, wr_en, wr_addr, wr_data(i), wr_dout(i),
                rd_addr, rd_data_int(i));
  end generate RAM_DP;

  RAM_BUF:  if register_out_flag=0 generate
  begin
    rd_data <= rd_data_int;
  end generate RAM_BUF;

  RAM_REG:  if register_out_flag/=0 generate
  begin
    process (reset, rd_clk)
    begin
      if reset='1' then
        rd_data <= (others=>'0');
      elsif rd_clk'event and rd_clk='1' then
        rd_data <= rd_data_int;
      end if;
    end process;
  end generate RAM_REG; 
end arch_ram_dp_lut;


----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Note:  This entity only works for addr_bits>12
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.ram_lib.all;

entity ram_x1_dp_block is
    generic (addr_bits	:integer);
    port (reset		:in  std_logic;
	  wr_clk	:in  std_logic;
	  wr_en		:in  std_logic;
	  wr_addr	:in  std_logic_vector (addr_bits-1 downto 0);
	  wr_data	:in  std_logic;
	  rd_clk	:in  std_logic;
	  rd_addr	:in  std_logic_vector (addr_bits-1 downto 0);
	  rd_data	:out std_logic
         );
end ram_x1_dp_block;


architecture arch_ram_x1_dp_block of ram_x1_dp_block is
  signal d_port1_dout :std_logic_vector ((2**(addr_bits-12))-1 downto 0);
  signal d_port2_dout :std_logic_vector ((2**(addr_bits-12))-1 downto 0);
  signal write_enable :std_logic_vector ((2**(addr_bits-12))-1 downto 0);

  signal rd_addr_reg  :std_logic_vector (addr_bits-12-1 downto 0);
  
  signal always_one	:std_logic;
  signal always_zero	:std_logic;

  signal always_zero_v	:std_logic_vector (0 downto 0);
  signal wr_data_v	:std_logic_vector (0 downto 0);
begin
  always_one <= '1';
  always_zero <= '0';
  always_zero_v <= "0";

  wr_data_v(0) <= wr_data;
  
  ------------------------------------
  -- Array of RAM Blocks
  RAMX1_DP: for i in (2**(addr_bits-12))-1 downto 0 generate
  begin
    RAMX1:  component RAMB4_S1_S1 port map
          (write_enable(i), always_one, reset, wr_clk, wr_addr(11 downto 0), wr_data_v,     d_port1_dout(i downto i),
          always_zero,      always_one, reset, rd_clk, rd_addr(11 downto 0), always_zero_v, d_port2_dout(i downto i));
  end generate RAMX1_DP;


  ------------------------------------
  -- Generate the write enables
  WE_GEN:  for i in (2**(addr_bits-12))-1 downto 0 generate
  begin
    process (wr_en, wr_addr)
    begin
      if integer_to_slv(i, addr_bits-12) = wr_addr(addr_bits-1 downto 12) and wr_en='1' then
        write_enable(i) <= '1';
      else
        write_enable(i) <= '0';
      end if;
    end process;
  end generate WE_GEN;

  ------------------------------------
  -- Register the upper read address bits
  process (reset, rd_clk)
  begin
    if reset='1' then
      rd_addr_reg <= (others=>'0');
    elsif rd_clk'event and rd_clk='1' then
      rd_addr_reg <= rd_addr (addr_bits-1 downto 12);
    end if;
  end process;

  ------------------------------------
  -- Mux the data outputs
  rd_data <= d_port2_dout(slv_to_integer(rd_addr_reg));
end arch_ram_x1_dp_block;


----------------------------------------------------------------------------
----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.ram_lib.all;

entity ram_dp_block is
    generic (addr_bits		:integer;
             data_bits		:integer;
             register_out_flag	:integer := 0;
             block_type		:integer := 0);
    port (reset		:in  std_logic;
          wr_clk	:in  std_logic;
    	  wr_en	    	:in  std_logic;
          wr_addr	:in  std_logic_vector (addr_bits-1 downto 0);
          wr_data	:in  std_logic_vector (data_bits-1 downto 0);
	  rd_clk	:in  std_logic;
          rd_addr	:in  std_logic_vector (addr_bits-1 downto 0);
          rd_data	:out std_logic_vector (data_bits-1 downto 0)
         ); 
end ram_dp_block;


architecture arch_ram_dp_block of ram_dp_block is
  signal always_one	:std_logic;
  signal always_zero	:std_logic;

  signal wr_dummy 	:std_logic_vector (data_bits-1 downto 0);
  signal rd_dummy 	:std_logic_vector (data_bits-1 downto 0);

  signal wr_dummy2 	:std_logic_vector (15 downto 0);
  signal rd_dummy2 	:std_logic_vector (15 downto 0);

  signal last_in	:std_logic_vector (15 downto 0);
  signal last_out	:std_logic_vector (15 downto 0);
  
  signal wr_addr2	:std_logic_vector (7 downto 0);
  signal rd_addr2	:std_logic_vector (7 downto 0);    

begin
  always_one <= '1';
  always_zero <= '0';
  rd_dummy <= (others=>'0');
  rd_dummy2 <= (others=>'0');
  
  --------------------------------------------
  -- Needs smaller than a 256xN RAM, use 256x16's anyway
  --------------------------------------------
  ADDRMIN:  if addr_bits<8 generate
  begin
    CLEARMIN_ADDR: for i in rd_addr2'high downto addr_bits generate
    begin
      rd_addr2(i) <= '0';
      wr_addr2(i) <= '0';
    end generate CLEARMIN_ADDR;
    
    rd_addr2(addr_bits-1 downto 0) <= rd_addr;
    wr_addr2(addr_bits-1 downto 0) <= wr_addr;
    
    RAMMIN:  for i in 0 to (data_bits/16)-1 generate
    begin
      RAMX16:  component RAMB4_S16_S16 port map
          (wr_en      , always_one, reset, wr_clk, wr_addr2, wr_data(16*i+15 downto 16*i),  wr_dummy(16*i+15 downto 16*i),
           always_zero, always_one, reset, rd_clk, rd_addr2, rd_dummy(16*i+15 downto 16*i), rd_data(16*i+15 downto 16*i));
    end generate RAMMIN;

    RAMMINA:  if (data_bits mod 16) /= 0 generate
    begin
      CLEARMIN: for i in last_in'high downto (data_bits mod 16) generate
      begin
        last_in(i) <= '0';
      end generate CLEARMIN;
      
      last_in((data_bits mod 16)-1 downto 0) <= wr_data(data_bits-1 downto data_bits-(data_bits mod 16));
      rd_data(data_bits-1 downto data_bits-(data_bits mod 16)) <= last_out((data_bits mod 16)-1 downto 0);
      
      RAMX16A:  component RAMB4_S16_S16 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr2, last_in(15 downto 0),  wr_dummy2(15 downto 0),
           always_zero, always_one, reset, rd_clk, rd_addr2, rd_dummy2(15 downto 0), last_out(15 downto 0));
    end generate RAMMINA;
  end generate ADDRMIN;


  --------------------------------------------
  -- Use 256x16 RAM's
  --------------------------------------------
  ADDR8:  if addr_bits=8 generate
  begin
    RAM8:  for i in 0 to (data_bits/16)-1 generate
    begin
      RAMX16:  component RAMB4_S16_S16 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, wr_data(16*i+15 downto 16*i),  wr_dummy(16*i+15 downto 16*i),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy(16*i+15 downto 16*i), rd_data(16*i+15 downto 16*i));
    end generate RAM8;

    RAM8A:  if (data_bits mod 16) /= 0 generate
    begin
      CLEAR8: for i in last_in'high downto (data_bits mod 16) generate
      begin
        last_in(i) <= '0';
      end generate CLEAR8;

      last_in((data_bits mod 16)-1 downto 0) <= wr_data(data_bits-1 downto data_bits-(data_bits mod 16));
      rd_data(data_bits-1 downto data_bits-(data_bits mod 16)) <= last_out((data_bits mod 16)-1 downto 0);

      RAMX16A:  component RAMB4_S16_S16 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, last_in(15 downto 0),   wr_dummy2(15 downto 0),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy2(15 downto 0), last_out(15 downto 0));
    end generate RAM8A;
  end generate ADDR8;

  --------------------------------------------
  -- Use 512x8 RAM's 
  --------------------------------------------
  ADDR9:  if addr_bits=9 generate
  begin
    RAM9:  for i in 0 to (data_bits/8)-1 generate
    begin     
      RAMX8:  component RAMB4_S8_S8 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, wr_data(8*i+7 downto 8*i),  wr_dummy(8*i+7 downto 8*i),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy(8*i+7 downto 8*i), rd_data(8*i+7 downto 8*i));
    end generate RAM9;

    RAM9A:  if (data_bits mod 8) /= 0 generate
    begin
      CLEAR9: for i in last_in'high downto (data_bits mod 8) generate
      begin
        last_in(i) <= '0';
      end generate CLEAR9;
      
      last_in((data_bits mod 8)-1 downto 0) <= wr_data(data_bits-1 downto data_bits-(data_bits mod 8));
      rd_data(data_bits-1 downto data_bits-(data_bits mod 8)) <= last_out((data_bits mod 8)-1 downto 0);

      RAMX8A:  component RAMB4_S8_S8 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, last_in(7 downto 0), wr_dummy2(7 downto 0),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy2(7 downto 0), last_out(7 downto 0));
    end generate RAM9A;
  end generate ADDR9;

  --------------------------------------------
  -- Use 1k x 4 RAM's
  --------------------------------------------
  ADDR10:  if addr_bits=10 generate
  begin
    RAM10:  for i in 0 to (data_bits/4)-1 generate
    begin
      RAMX4:  component RAMB4_S4_S4 port map
          (wr_en      , always_one, reset, wr_clk, wr_addr, wr_data(4*i+3 downto 4*i),  wr_dummy(4*i+3 downto 4*i),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy(4*i+3 downto 4*i), rd_data(4*i+3 downto 4*i));
    end generate RAM10;

    RAM10A:  if (data_bits mod 4) /= 0 generate
    begin
      CLEAR10: for i in last_in'high downto (data_bits mod 4) generate
      begin
        last_in(i) <= '0';
      end generate CLEAR10;

      last_in((data_bits mod 4)-1 downto 0) <= wr_data(data_bits-1 downto data_bits-(data_bits mod 4));
      rd_data(data_bits-1 downto data_bits-(data_bits mod 4)) <= last_out((data_bits mod 4)-1 downto 0);

      RAMX4A:  component RAMB4_S4_S4 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, last_in(3 downto 0), wr_dummy2(3 downto 0),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy2(3 downto 0), last_out(3 downto 0));
    end generate RAM10A;
  end generate ADDR10;

  --------------------------------------------
  -- Use 2k x 2 RAM's
  --------------------------------------------
  ADDR11:  if addr_bits=11 generate
  begin
    RAM11:  for i in 0 to (data_bits/2)-1 generate
    begin
      RAMX2:  component RAMB4_S2_S2 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, wr_data(2*i+1 downto 2*i),  wr_dummy(2*i+1 downto 2*i),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy(2*i+1 downto 2*i), rd_data(2*i+1 downto 2*i));
    end generate RAM11;

    RAM11A:  if (data_bits mod 2) /= 0 generate
    begin
      CLEAR11: for i in last_in'high downto (data_bits mod 2) generate
      begin
        last_in(i) <= '0';
      end generate CLEAR11;

      last_in((data_bits mod 2)-1 downto 0) <= wr_data(data_bits-1 downto data_bits-(data_bits mod 2));
      rd_data(data_bits-1 downto data_bits-(data_bits mod 2)) <= last_out((data_bits mod 2)-1 downto 0);

      RAMX2A:  component RAMB4_S2_S2 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, last_in(1 downto 0), wr_dummy2(1 downto 0),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy2(1 downto 0), last_out(1 downto 0));
    end generate RAM11A;
  end generate ADDR11;

  --------------------------------------------
  -- Use 4x k 1 RAM's
  --------------------------------------------
  ADDR12:  if addr_bits=12 generate
  begin
    RAM12:  for i in 0 to data_bits-1 generate
    begin
      RAMX1:  component RAMB4_S1_S1 port map
          (wr_en    ,   always_one, reset, wr_clk, wr_addr, wr_data(i downto i),  wr_dummy(i downto i),
           always_zero, always_one, reset, rd_clk, rd_addr, rd_dummy(i downto i), rd_data(i downto i));
    end generate RAM12;
  end generate ADDR12;

  --------------------------------------------
  -- Requires larger than a 4K x N RAM, use a 2-D array of 4Kx1's
  --------------------------------------------
  ADDRMAX:  if addr_bits>12 generate
      signal wr_en_col :std_logic_vector ((2**(addr_bits-12))-1 downto 0);
  begin
    RAMMAX:  for i in 0 to data_bits-1 generate
    begin
      RAMXMAXA:  component ram_x1_dp_block generic map
                    (addr_bits)
                  port map
                    (reset, wr_clk, wr_en, wr_addr, wr_data(i),
                            rd_clk, rd_addr, rd_data(i));
    end generate RAMMAX;
  end generate ADDRMAX;
  
end arch_ram_dp_block;


----------------------------------------------------------------------------
----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.ram_lib.all;

entity ram_dp is
    generic (addr_bits		:integer;
             data_bits		:integer;
             register_out_flag	:integer := 0;
             block_type		:integer := 0);
    port (reset		:in  std_logic;
          wr_clk	:in  std_logic;
    	  wr_en	    	:in  std_logic;
          wr_addr	:in  std_logic_vector (addr_bits-1 downto 0);
          wr_data	:in  std_logic_vector (data_bits-1 downto 0);
	  rd_clk	:in  std_logic;
          rd_addr	:in  std_logic_vector (addr_bits-1 downto 0);
          rd_data	:out std_logic_vector (data_bits-1 downto 0)
         ); 
end ram_dp;


architecture arch_ram_dp of ram_dp is
begin
  RAM_LUT: if (((2**addr_bits)*data_bits)<1024 and block_type=0)
              or block_type=1
              or register_out_flag=0 generate
  begin
    RAM_LUT0: component ram_dp_lut
        generic map (addr_bits, data_bits, register_out_flag, block_type)
        port map (reset, wr_clk, wr_en, wr_addr, wr_data, rd_clk, rd_addr, rd_data);
  end generate RAM_LUT;

  RAM_BLOCK: if (((2**addr_bits)*data_bits)>=1024 and block_type=0 and register_out_flag=1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -