--sample memory wrapper for a 4K memory with 1-bit words --Refer to the Xilinx Libraries Guide for other primitive memories --you can use in your design, OR, use the IP CoreGen to generate a --memory to your size needs library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity memory is Port ( WE : in std_logic; EN : in std_logic; SSR : in std_logic; CLK : in std_logic; ADDR: in std_logic_vector(13 downto 0); DI : in std_logic_vector(0 downto 0); DO : out std_logic_vector(0 downto 0) ); end memory; architecture arch of memory is ---------------------------------------------- ---------------------------------------------- --primitive memory component built into Spartan 3E component RAMB16_S1 is generic( INIT_00 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_01 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_02 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_03 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_04 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_05 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_06 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_07 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_08 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_09 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0A : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0B : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0C : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0D : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0E : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0F : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_10 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_11 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_12 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_13 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_14 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_15 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_16 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_17 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_18 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_19 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1A : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1B : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1C : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1D : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1E : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1F : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_20 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_21 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_22 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_23 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_24 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_25 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_26 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_27 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_28 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_29 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2A : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2B : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2C : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2D : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2E : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2F : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_30 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_31 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_32 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_33 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_34 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_35 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_36 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_37 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_38 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_39 : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3A : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3B : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3C : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3D : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3E : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3F : BIT_VECTOR := X"0000000000000000000000000000000000000000000000000000000000000000" ); port( WE : in std_logic; EN : in std_logic; SSR : in std_logic; CLK : in std_logic; ADDR: in std_logic_vector(13 downto 0); DI : in std_logic_vector(0 downto 0); DO : out std_logic_vector(0 downto 0) ); end component; ---------------------------------------------------------------------- ---------------------------------------------------------------------- ---------------------------------------------------------------------- begin --Memories are read from right to left, top to bottom. I have initialized my memory --with values using the below method. Notice each line here is 256 bits wide(64 Hex Values) --and that I have initialized 64 complete rows. The Data Out (DO) line would feed me --one bit at a time which I could then send to the screen. To generate the address into --the memory, a very useful technique might be to use the hcount and vcount signals from --the VGA component to find the desired spot in memory. --You can organize your data any way you want. In order to acheive three colors, you might --have 3 separate memories for R, G, B, OR, you might pack the colors into packs of 4 bits --(R,G,B, dummy), and use only one memory. Compose memories as you have learned in previous --classes my_bitmap: RAMB16_S1 generic map( INIT_00 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_01 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_02 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_03 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_04 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_05 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_06 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_07 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_08 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_09 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_0a => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_0b => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_0c => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_0d => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_0e => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_0f => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_10 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_11 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_12 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_13 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_14 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_15 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_16 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_17 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_18 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_19 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_1a => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_1b => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_1c => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_1d => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_1e => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_1f => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_20 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_21 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_22 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_23 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_24 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_25 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_26 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_27 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_28 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_29 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_2a => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_2b => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_2c => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_2d => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_2e => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_2f => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_30 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_31 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_32 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_33 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_34 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_35 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_36 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_37 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_38 => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_39 => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_3a => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_3b => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_3c => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_3d => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA", INIT_3e => X"0000000000000000000000000000000000000000000000005555555555555555", INIT_3f => X"000000000000000000000000000000000000000000000000AAAAAAAAAAAAAAAA") port map ( WE => WE, EN => EN, SSR => SSR, CLK => CLK, ADDR => ADDR, DI => DI, DO => DO ); end arch;