Your BRAM is configured as 36bits width. So the
5 LSBs bit address should be zeroes all the time.
Cfr ug070.pdf page 120.
Sylvain
Brad Smallridge wrote:
> Thanks for words of encouragement Ray.
>
> I went back to double check if all the simulation
> and libraries were downloaded and installed. It
> seems as if they are. All from the download page
> that Xilinx is advertising on the home page right
> now for the 8.i software. Three packages in all,
> the ISE, ModelSim III, and it's library.
>
> I am still not getting any output from the RAMB16
> primitive. Seems to get stuck on the 0th address.
> I have wiggled all the signals but I all I can see is
> is the init value and the 0th address value. Please
> take a look at my wrapper file and I also included
> the VHDL generated from the Waveform tool after
> the Generate Expected Value option. I know it is
> probably some silly mistake.
>
> Brad Smallridge aivision
>
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
>
> library UNISIM;
> use UNISIM.VComponents.all;
>
> entity bram9p is
> port (
> clkb : IN std_logic;
> enb : IN std_logic;
> ssrb : IN std_logic;
> regceb : IN std_logic;
> addrb : IN std_logic_VECTOR(14 downto 0);
> web : IN std_logic_VECTOR( 3 downto 0);
> doutb : OUT std_logic_VECTOR(31 downto 0) );
> end bram9p;
>
> architecture Behavioral of bram9p is
>
> begin
>
> -- RAMB16: Virtex-4 16k+2k Parity Paramatizable BlockRAM
> -- Xilinx HDL Language Template version 8.1i
> RAMB16_inst : RAMB16
> generic map (
> DOA_REG => 0, -- Optional output registers on the A port (0 or 1)
> DOB_REG => 0, -- Optional output registers on the B port (0 or 1)
> INIT_A => X"000000000", -- Initial values on A output port
> INIT_B => X"000000003", -- Initial values on B output port
> INVERT_CLK_DOA_REG => FALSE, -- Invert clock on A port output
> registers (TRUE or FALSE)
> INVERT_CLK_DOB_REG => FALSE, -- Invert clock on B port output
> registers (TRUE or FALSE)
> RAM_EXTENSION_A => "NONE", -- "UPPER", "LOWER" or "NONE" when cascaded
> RAM_EXTENSION_B => "NONE", -- "UPPER", "LOWER" or "NONE" when cascaded
> READ_WIDTH_A => 36, -- Valid values are 1,2,4,9,18 or 36
> READ_WIDTH_B => 36, -- Valid values are 1,2,4,9,18 or 36
> SIM_COLLISION_CHECK => "NONE", -- Collision check enable "ALL",
> "WARNING_ONLY", "GENERATE_X_ONLY
> -- or "NONE
> SRVAL_A => X"000000000", -- Port A ouput value upon SSR assertion
> SRVAL_B => X"CCCCCCABC", -- Port B ouput value upon SSR assertion
> WRITE_MODE_A => "READ_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE
> WRITE_MODE_B => "READ_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE
> WRITE_WIDTH_A => 36, -- Valid values are 1,2,4,9,18 or 36
> WRITE_WIDTH_B => 36, -- Valid values are 1,2,4,9,18 or 36
> -- The following INIT_xx declarations specify the initial contents of
> the RAM
> INIT_00 =>
> X"00D00A0100010B01000100010001000100010001000100010001DEAD00100112",
> INIT_01 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_02 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_03 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_04 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_05 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_06 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_07 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_08 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_09 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0A =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0B =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0C =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0D =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0E =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_0F =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_10 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_11 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_12 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_13 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_14 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_15 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_16 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_17 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_18 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_19 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1A =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1B =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1C =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1D =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1E =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_1F =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_20 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_21 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_22 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_23 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_24 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_25 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_26 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_27 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_28 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_29 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2A =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2B =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2C =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2D =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2E =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_2F =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_30 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_31 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_32 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_33 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_34 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_35 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_36 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_37 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_38 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_39 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3A =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3B =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3C =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3D =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3E =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INIT_3F =>
> X"00D00A0100010B01000100010001000100010001000100010001DEAD00100112",
> -- The next set of INITP_xx are for the parity bits
> INITP_00 =>
> X"00D00A0100010B01000100010001000100010001000100010001DEAD00100112",
> INITP_01 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_02 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_03 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_04 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_05 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_06 =>
> X"0000000000000000000000000000000000000000000000000000000000000000",
> INITP_07 =>
> X"00D00A0100010B01000100010001000100010001000100010001DEAD00100112")
> port map (
> CASCADEOUTA => open, -- 1-bit cascade output
> CASCADEOUTB => open, -- 1-bit cascade output
> DOA => open, -- 32-bit A port Data Output
> DOB => doutb(31 downto 0), -- 32-bit B port Data Output
> DOPA => open, -- 4-bit A port Parity Output
> DOPB => open, -- 4-bit B port Parity Output
> ADDRA => (others=>'0'), -- 15-bit A port Address Input
> ADDRB => addrb(14 downto 0), -- 15-bit B port Address Input
> CASCADEINA => '0', -- 1-bit cascade A input
> CASCADEINB => '0', -- 1-bit cascade B input
> CLKA => '0', -- Port A Clock
> CLKB => clkb, -- Port B Clock
> DIA => (others=>'0'), -- 32-bit A port Data Input
> DIB => (others=>'0'), -- 32-bit B port Data Input
> DIPA => (others=>'0'), -- 4-bit A port parity Input
> DIPB => (others=>'0'), -- 4-bit B port parity Input
> ENA => '0', -- 1-bit A port Enable Input
> ENB => enb, -- 1-bit B port Enable Input
> REGCEA => '0', -- 1-bit A port register enable
> input
> REGCEB => regceb, -- 1-bit B port register enable
> input
> SSRA => '0', -- 1-bit A port Synchronous
> Set/Reset Input
> SSRB => ssrb, -- 1-bit B port Synchronous
> Set/Reset Input
> WEA => "0000", -- 4-bit A port Write Enable
> Input
> WEB => web ); -- 4-bit B port Write Enable
> Input
>
> end Behavioral;
>
>
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> library UNISIM;
> use UNISIM.VComponents.all;
> USE IEEE.STD_LOGIC_TEXTIO.ALL;
> USE STD.TEXTIO.ALL;
>
> ENTITY waveform IS
> END waveform;
>
> ARCHITECTURE testbench_arch OF waveform IS
> FILE RESULTS: TEXT OPEN WRITE_MODE IS "results.txt";
>
> COMPONENT bram9p
> PORT (
> clkb : In std_logic;
> enb : In std_logic;
> ssrb : In std_logic;
> regceb : In std_logic;
> addrb : In std_logic_vector (14 DownTo 0);
> web : In std_logic_vector (3 DownTo 0);
> doutb : Out std_logic_vector (31 DownTo 0)
> );
> END COMPONENT;
>
> SIGNAL clkb : std_logic := '0';
> SIGNAL enb : std_logic := '0';
> SIGNAL ssrb : std_logic := '0';
> SIGNAL regceb : std_logic := '0';
> SIGNAL addrb : std_logic_vector (14 DownTo 0) := "000000000000000";
> SIGNAL web : std_logic_vector (3 DownTo 0) := "0000";
> SIGNAL doutb : std_logic_vector (31 DownTo 0) :=
> "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU";
>
> SHARED VARIABLE TX_ERROR : INTEGER := 0;
> SHARED VARIABLE TX_OUT : LINE;
>
> constant PERIOD : time := 200 ns;
> constant DUTY_CYCLE : real := 0.5;
> constant OFFSET : time := 0 ns;
>
> BEGIN
> UUT : bram9p
> PORT MAP (
> clkb => clkb,
> enb => enb,
> ssrb => ssrb,
> regceb => regceb,
> addrb => addrb,
> web => web,
> doutb => doutb
> );
>
> PROCESS -- clock process for clkb
> BEGIN
> WAIT for OFFSET;
> CLOCK_LOOP : LOOP
> clkb <= '0';
> WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
> clkb <= '1';
> WAIT FOR (PERIOD * DUTY_CYCLE);
> END LOOP CLOCK_LOOP;
> END PROCESS;
>
> PROCESS
> PROCEDURE CHECK_doutb(
> next_doutb : std_logic_vector (31 DownTo 0);
> TX_TIME : INTEGER
> ) IS
> VARIABLE TX_STR : String(1 to 4096);
> VARIABLE TX_LOC : LINE;
> BEGIN
> IF (doutb /= next_doutb) THEN
> STD.TEXTIO.write(TX_LOC, string'("Error at time="));
> STD.TEXTIO.write(TX_LOC, TX_TIME);
> STD.TEXTIO.write(TX_LOC, string'("ns doutb="));
> IEEE.STD_LOGIC_TEXTIO.write(TX_LOC, doutb);
> STD.TEXTIO.write(TX_LOC, string'(", Expected = "));
> IEEE.STD_LOGIC_TEXTIO.write(TX_LOC, next_doutb);
> STD.TEXTIO.write(TX_LOC, string'(" "));
> TX_STR(TX_LOC.all'range) := TX_LOC.all;
> STD.TEXTIO.writeline(RESULTS, TX_LOC);
> STD.TEXTIO.Deallocate(TX_LOC);
> ASSERT (FALSE) REPORT TX_STR SEVERITY ERROR;
> TX_ERROR := TX_ERROR + 1;
> END IF;
> END;
> BEGIN
> -- ------------- Current Time: 85ns
> WAIT FOR 85 ns;
> ssrb <= '1';
> addrb <= "000000000000001";
> -- -------------------------------------
> -- ------------- Current Time: 115ns
> WAIT FOR 30 ns;
> CHECK_doutb("00000000000000000000000000000011", 115);
> -- -------------------------------------
> -- ------------- Current Time: 285ns
> WAIT FOR 170 ns;
> ssrb <= '0';
> addrb <= "000000000000010";
> -- -------------------------------------
> -- ------------- Current Time: 485ns
> WAIT FOR 200 ns;
> enb <= '1';
> addrb <= "000000000000011";
> -- -------------------------------------
> -- ------------- Current Time: 515ns
> WAIT FOR 30 ns;
> CHECK_doutb("00000000000100000000000100010010", 515);
> -- -------------------------------------
> -- ------------- Current Time: 685ns
> WAIT FOR 170 ns;
> regceb <= '1';
> addrb <= "000000000000100";
> -- -------------------------------------
> -- ------------- Current Time: 885ns
> WAIT FOR 200 ns;
> addrb <= "000000000000101";
> -- -------------------------------------
> -- ------------- Current Time: 1085ns
> WAIT FOR 200 ns;
> regceb <= '0';
> addrb <= "000000000000110";
> -- -------------------------------------
> -- ------------- Current Time: 1285ns
> WAIT FOR 200 ns;
> enb <= '0';
> addrb <= "000000000000111";
> -- -------------------------------------
> -- ------------- Current Time: 1485ns
> WAIT FOR 200 ns;
> regceb <= '1';
> addrb <= "000000000001000";
> -- -------------------------------------
> -- ------------- Current Time: 1685ns
> WAIT FOR 200 ns;
> regceb <= '0';
> addrb <= "000000000001001";
> -- -------------------------------------
> -- ------------- Current Time: 1885ns
> WAIT FOR 200 ns;
> addrb <= "000000000001010";
> web <= "1111";
> -- -------------------------------------
> -- ------------- Current Time: 2085ns
> WAIT FOR 200 ns;
> enb <= '1';
> addrb <= "000000000001011";
> -- -------------------------------------
> -- ------------- Current Time: 2285ns
> WAIT FOR 200 ns;
> enb <= '0';
> regceb <= '1';
> addrb <= "000000000001100";
> -- -------------------------------------
> -- ------------- Current Time: 2485ns
> WAIT FOR 200 ns;
> regceb <= '0';
> addrb <= "000000000001101";
> -- -------------------------------------
> -- ------------- Current Time: 2685ns
> WAIT FOR 200 ns;
> addrb <= "000000000001110";
> web <= "0000";
> -- -------------------------------------
> -- ------------- Current Time: 2885ns
> WAIT FOR 200 ns;
> addrb <= "000000000001111";
> -- -------------------------------------
> -- ------------- Current Time: 3085ns
> WAIT FOR 200 ns;
> addrb <= "000000000010000";
> -- -------------------------------------
> -- ------------- Current Time: 3285ns
> WAIT FOR 200 ns;
> ssrb <= '1';
> addrb <= "000000000010001";
> -- -------------------------------------
> -- ------------- Current Time: 3485ns
> WAIT FOR 200 ns;
> ssrb <= '0';
> addrb <= "000000000010010";
> -- -------------------------------------
> -- ------------- Current Time: 3685ns
> WAIT FOR 200 ns;
> addrb <= "000000000010011";
> -- -------------------------------------
> -- ------------- Current Time: 3885ns
> WAIT FOR 200 ns;
> addrb <= "000000000010100";
> -- -------------------------------------
> -- ------------- Current Time: 4085ns
> WAIT FOR 200 ns;
> addrb <= "000000000010101";
> -- -------------------------------------
> -- ------------- Current Time: 4285ns
> WAIT FOR 200 ns;
> addrb <= "000000000010110";
> -- -------------------------------------
> -- ------------- Current Time: 4485ns
> WAIT FOR 200 ns;
> addrb <= "000000000010111";
> -- -------------------------------------
> -- ------------- Current Time: 4685ns
> WAIT FOR 200 ns;
> addrb <= "000000000011000";
> -- -------------------------------------
> -- ------------- Current Time: 4885ns
> WAIT FOR 200 ns;
> addrb <= "000000000011001";
> -- -------------------------------------
> WAIT FOR 315 ns;
>
> IF (TX_ERROR = 0) THEN
> STD.TEXTIO.write(TX_OUT, string'("No errors or
> warnings"));
> STD.TEXTIO.writeline(RESULTS, TX_OUT);
> ASSERT (FALSE) REPORT
> "Simulation successful (not a failure). No problems
> detected."
> SEVERITY FAILURE;
> ELSE
> STD.TEXTIO.write(TX_OUT, TX_ERROR);
> STD.TEXTIO.write(TX_OUT,
> string'(" errors found in simulation"));
> STD.TEXTIO.writeline(RESULTS, TX_OUT);
> ASSERT (FALSE) REPORT "Errors found during simulation"
> SEVERITY FAILURE;
> END IF;
> END PROCESS;
>
> END testbench_arch;
>
>
>
>
>