📄 mem_xilinx_gen.vhd
字号:
------------------------------------------------------------------------------ This file is a part of the GRLIB VHDL IP LIBRARY-- Copyright (C) 2004 GAISLER RESEARCH---- This program is free software; you can redistribute it and/or modify-- it under the terms of the GNU General Public License as published by-- the Free Software Foundation; either version 2 of the License, or-- (at your option) any later version.---- See the file COPYING for the full details of the license.--------------------------------------------------------------------------------- Entity: various-- File: mem_xilinx_gen.vhd-- Author: Jiri Gaisler - Gaisler Research-- Description: Memory generators for Xilinx rams------------------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;library unisim;use unisim.vcomponents.all;entity virtex_syncram is generic ( abits : integer := 6; dbits : integer := 8); port ( clk : in std_ulogic; address : in std_logic_vector (abits -1 downto 0); datain : in std_logic_vector (dbits -1 downto 0); dataout : out std_logic_vector (dbits -1 downto 0); enable : in std_ulogic; write : in std_ulogic );end;architecture behav of virtex_syncram issignal gnd : std_ulogic;signal do, di : std_logic_vector(129 downto 0);signal xa, ya : std_logic_vector(19 downto 0);begin gnd <= '0'; dataout <= do(dbits-1 downto 0); di(dbits-1 downto 0) <= datain; di(129 downto dbits) <= (others => '0'); xa(abits-1 downto 0) <= address; xa(19 downto abits) <= (others => '0'); ya(abits-1 downto 0) <= address; ya(19 downto abits) <= (others => '1'); a7 : if (abits <= 7) and (dbits <= 32) generate r0 : RAMB4_S16_S16 port map ( do(31 downto 16), do(15 downto 0), xa(7 downto 0), ya(7 downto 0), clk, clk, di(31 downto 16), di(15 downto 0), enable, enable, gnd, gnd, write, write); end generate; a8 : if ((abits <= 7) and (dbits > 32)) or (abits = 8) generate x : for i in 0 to ((dbits-1)/16) generate r : RAMB4_S16 port map ( do (((i+1)*16)-1 downto i*16), xa(7 downto 0), clk, di (((i+1)*16)-1 downto i*16), enable, gnd, write ); end generate; end generate; a9 : if abits = 9 generate x : for i in 0 to ((dbits-1)/8) generate r : RAMB4_S8 port map ( do (((i+1)*8)-1 downto i*8), xa(8 downto 0), clk, di (((i+1)*8)-1 downto i*8), enable, gnd, write ); end generate; end generate; a10 : if abits = 10 generate x : for i in 0 to ((dbits-1)/4) generate r : RAMB4_S4 port map ( do (((i+1)*4)-1 downto i*4), xa(9 downto 0), clk, di (((i+1)*4)-1 downto i*4), enable, gnd, write ); end generate; end generate; a11 : if abits = 11 generate x : for i in 0 to ((dbits-1)/2) generate r : RAMB4_S2 port map ( do (((i+1)*2)-1 downto i*2), xa(10 downto 0), clk, di (((i+1)*2)-1 downto i*2), enable, gnd, write ); end generate; end generate; a12 : if abits = 12 generate x : for i in 0 to (dbits-1) generate r : RAMB4_S1 port map ( do (i downto i), xa(11 downto 0), clk, di(i downto i), enable, gnd, write ); end generate; end generate;-- pragma translate_off a_to_high : if abits > 12 generate x : process begin assert false report "Address depth larger than 12 not supported for virtex_syncram" severity failure; wait; end process; end generate;-- pragma translate_onend;library ieee;use ieee.std_logic_1164.all;library unisim;use unisim.vcomponents.all;entity virtex_syncram_dp is generic ( abits : integer := 6; dbits : integer := 8 ); port ( clk1 : in std_ulogic; address1 : in std_logic_vector((abits -1) downto 0); datain1 : in std_logic_vector((dbits -1) downto 0); dataout1 : out std_logic_vector((dbits -1) downto 0); enable1 : in std_ulogic; write1 : in std_ulogic; clk2 : in std_ulogic; address2 : in std_logic_vector((abits -1) downto 0); datain2 : in std_logic_vector((dbits -1) downto 0); dataout2 : out std_logic_vector((dbits -1) downto 0); enable2 : in std_ulogic; write2 : in std_ulogic);end;architecture behav of virtex_syncram_dp issignal gnd, vcc : std_ulogic;signal do1, do2, di1, di2 : std_logic_vector(129 downto 0);signal addr1, addr2 : std_logic_vector(19 downto 0);begin gnd <= '0'; vcc <= '1'; dataout1 <= do1(dbits-1 downto 0); dataout2 <= do2(dbits-1 downto 0); di1(dbits-1 downto 0) <= datain1; di1(129 downto dbits) <= (others => '0'); di2(dbits-1 downto 0) <= datain2; di2(129 downto dbits) <= (others => '0'); addr1(abits-1 downto 0) <= address1; addr1(19 downto abits) <= (others => '0'); addr2(abits-1 downto 0) <= address2; addr2(19 downto abits) <= (others => '0'); a8 : if abits <= 8 generate x : for i in 0 to ((dbits-1)/16) generate r0 : RAMB4_S16_S16 port map ( do1(((i+1)*16)-1 downto i*16), do2(((i+1)*16)-1 downto i*16), addr1(7 downto 0), addr2(7 downto 0), clk1, clk2, di1(((i+1)*16)-1 downto i*16), di2(((i+1)*16)-1 downto i*16), enable1, enable2, gnd, gnd, write1, write2); end generate; end generate; a9 : if abits = 9 generate x : for i in 0 to ((dbits-1)/8) generate r0 : RAMB4_S8_S8 port map ( do1(((i+1)*8)-1 downto i*8), do2(((i+1)*8)-1 downto i*8), addr1(8 downto 0), addr2(8 downto 0), clk1, clk2, di1(((i+1)*8)-1 downto i*8), di2(((i+1)*8)-1 downto i*8), enable1, enable2, gnd, gnd, write1, write2); end generate; end generate; a10: if abits = 10 generate x : for i in 0 to ((dbits-1)/4) generate r0 : RAMB4_S4_S4 port map ( do1(((i+1)*4)-1 downto i*4), do2(((i+1)*4)-1 downto i*4), addr1(9 downto 0), addr2(9 downto 0), clk1, clk2, di1(((i+1)*4)-1 downto i*4), di2(((i+1)*4)-1 downto i*4), enable1, enable2, gnd, gnd, write1, write2); end generate; end generate; a11: if abits = 11 generate x : for i in 0 to ((dbits-1)/2) generate r0 : RAMB4_S2_S2 port map ( do1(((i+1)*2)-1 downto i*2), do2(((i+1)*2)-1 downto i*2), addr1(10 downto 0), addr2(10 downto 0), clk1, clk2, di1(((i+1)*2)-1 downto i*2), di2(((i+1)*2)-1 downto i*2), enable1, enable2, gnd, gnd, write1, write2); end generate; end generate; a12: if abits = 12 generate x : for i in 0 to ((dbits-1)/1) generate r0 : RAMB4_S1_S1 port map ( do1(((i+1)*1)-1 downto i*1), do2(((i+1)*1)-1 downto i*1), addr1(11 downto 0), addr2(11 downto 0), clk1, clk2, di1(((i+1)*1)-1 downto i*1), di2(((i+1)*1)-1 downto i*1), enable1, enable2, gnd, gnd, write1, write2); end generate; end generate;-- pragma translate_off a_to_high : if abits > 12 generate x : process begin assert false report "Address depth larger than 12 not supported for virtex_syncram_dp" severity failure; wait; end process; end generate;-- pragma translate_onend;-- parametrisable sync ram generator using virtex2 select ramslibrary ieee;use ieee.std_logic_1164.all;library unisim;use unisim.vcomponents.all;entity virtex2_syncram is generic ( abits : integer := 9; dbits : integer := 32); port ( clk : in std_ulogic; address : in std_logic_vector (abits -1 downto 0); datain : in std_logic_vector (dbits -1 downto 0); dataout : out std_logic_vector (dbits -1 downto 0); enable : in std_ulogic; write : in std_ulogic );end;architecture behav of virtex2_syncram issignal gnd : std_ulogic;signal do, di : std_logic_vector(256 downto 0);signal xa, ya : std_logic_vector(19 downto 0);begin gnd <= '0'; dataout <= do(dbits-1 downto 0); di(dbits-1 downto 0) <= datain; di(256 downto dbits) <= (others => '0'); xa(abits-1 downto 0) <= address; xa(19 downto abits) <= (others => '0'); ya(abits-1 downto 0) <= address; ya(19 downto abits) <= (others => '1'); a8 : if abits <= 8 generate x : for i in 0 to ((dbits-1)/72) generate r0 : RAMB16_S36_S36 port map ( do(i*72+36+31 downto i*72+36), do(i*72+31 downto i*72), do(i*72+36+32+3 downto i*72+36+32), do(i*72+32+3 downto i*72+32), xa(8 downto 0), ya(8 downto 0), clk, clk, di(i*72+36+31 downto i*72+36), di(i*72+31 downto i*72), di(i*72+36+32+3 downto i*72+36+32), di(i*72+32+3 downto i*72+32), enable, enable, gnd, gnd, write, write); end generate; end generate; a9 : if (abits = 9) generate x : for i in 0 to ((dbits-1)/36) generate r : RAMB16_S36 port map ( do(((i+1)*36)-5 downto i*36),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -