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

Subversion Repositories wb_3p_spram_wrapper

[/] [wb_3p_spram_wrapper/] [trunk/] [tb_wb_Np_ram.vhd] - Diff between revs 2 and 3

Show entire file | Details | Blame | View Log

Rev 2 Rev 3
Line 1... Line 1...
 
----------------------------------------------------------------------------------
 
-- Company:       VISENGI S.L. (www.visengi.com)
 
-- Engineer:      Victor Lopez Lorenzo (victor.lopez (at) visengi (dot) com)
 
-- 
 
-- Create Date:    23:44:13 22/August/2008 
 
-- Project Name:   Triple Port WISHBONE SPRAM Wrapper
 
-- Tool versions:  Xilinx ISE 9.2i
 
-- Description: 
 
--
 
-- Description: This is a wrapper for an inferred single port RAM, that converts it
 
--              into a Three-port RAM with one WISHBONE slave interface for each port. 
 
--
 
--
 
-- LICENSE TERMS: GNU LESSER GENERAL PUBLIC LICENSE Version 2.1
 
--     That is you may use it in ANY project (commercial or not) without paying a cent.
 
--     You are only required to include in the copyrights/about section of accompanying 
 
--     software and manuals of use that your system contains a "3P WB SPRAM Wrapper
 
--     (C) VISENGI S.L. under LGPL license"
 
--     This holds also in the case where you modify the core, as the resulting core
 
--     would be a derived work.
 
--     Also, we would like to know if you use this core in a project of yours, just an email will do.
 
--
 
--    Please take good note of the disclaimer section of the LPGL license, as we don't
 
--    take any responsability for anything that this core does.
 
----------------------------------------------------------------------------------
 
 
 
LIBRARY ieee;
 
USE ieee.std_logic_1164.ALL;
 
USE ieee.std_logic_unsigned.all;
 
USE ieee.numeric_std.ALL;
 
 
 
ENTITY tb_wb_Np_ram_vhd IS
 
END tb_wb_Np_ram_vhd;
 
 
 
ARCHITECTURE behavior OF tb_wb_Np_ram_vhd IS
 
 
 
        -- Component Declaration for the Unit Under Test (UUT)
 
        COMPONENT wb_Np_ram
 
        PORT(
 
                wb_clk_i : IN std_logic;
 
                wb_rst_i : IN std_logic;
 
                wb1_cyc_i : IN std_logic;
 
                wb1_stb_i : IN std_logic;
 
                wb1_we_i : IN std_logic;
 
                wb1_adr_i : IN std_logic_vector(7 downto 0);
 
                wb1_dat_i : IN std_logic_vector(31 downto 0);
 
                wb2_cyc_i : IN std_logic;
 
                wb2_stb_i : IN std_logic;
 
                wb2_we_i : IN std_logic;
 
                wb2_adr_i : IN std_logic_vector(7 downto 0);
 
                wb2_dat_i : IN std_logic_vector(31 downto 0);
 
                wb3_cyc_i : IN std_logic;
 
                wb3_stb_i : IN std_logic;
 
                wb3_we_i : IN std_logic;
 
                wb3_adr_i : IN std_logic_vector(7 downto 0);
 
                wb3_dat_i : IN std_logic_vector(31 downto 0);
 
                wb1_dat_o : OUT std_logic_vector(31 downto 0);
 
                wb1_ack_o : OUT std_logic;
 
                wb2_dat_o : OUT std_logic_vector(31 downto 0);
 
                wb2_ack_o : OUT std_logic;
 
                wb3_dat_o : OUT std_logic_vector(31 downto 0);
 
                wb3_ack_o : OUT std_logic
 
                );
 
        END COMPONENT;
 
 
 
        --Inputs
 
        SIGNAL wb_clk_i :  std_logic := '0';
 
        SIGNAL wb_rst_i :  std_logic := '0';
 
        SIGNAL wb1_cyc_i :  std_logic := '0';
 
        SIGNAL wb1_stb_i :  std_logic := '0';
 
        SIGNAL wb1_we_i :  std_logic := '0';
 
        SIGNAL wb2_cyc_i :  std_logic := '0';
 
        SIGNAL wb2_stb_i :  std_logic := '0';
 
        SIGNAL wb2_we_i :  std_logic := '0';
 
        SIGNAL wb3_cyc_i :  std_logic := '0';
 
        SIGNAL wb3_stb_i :  std_logic := '0';
 
        SIGNAL wb3_we_i :  std_logic := '0';
 
        SIGNAL wb1_adr_i :  std_logic_vector(7 downto 0) := (others=>'0');
 
        SIGNAL wb1_dat_i :  std_logic_vector(31 downto 0) := (others=>'0');
 
        SIGNAL wb2_adr_i :  std_logic_vector(7 downto 0) := (others=>'0');
 
        SIGNAL wb2_dat_i :  std_logic_vector(31 downto 0) := (others=>'0');
 
        SIGNAL wb3_adr_i :  std_logic_vector(7 downto 0) := (others=>'0');
 
        SIGNAL wb3_dat_i :  std_logic_vector(31 downto 0) := (others=>'0');
 
 
 
        --Outputs
 
        SIGNAL wb1_dat_o :  std_logic_vector(31 downto 0);
 
        SIGNAL wb1_ack_o :  std_logic;
 
        SIGNAL wb2_dat_o :  std_logic_vector(31 downto 0);
 
        SIGNAL wb2_ack_o :  std_logic;
 
        SIGNAL wb3_dat_o :  std_logic_vector(31 downto 0);
 
        SIGNAL wb3_ack_o :  std_logic;
 
 
 
BEGIN
 
 
 
        -- Instantiate the Unit Under Test (UUT)
 
        uut: wb_Np_ram PORT MAP(
 
                wb_clk_i => wb_clk_i,
 
                wb_rst_i => wb_rst_i,
 
                wb1_cyc_i => wb1_cyc_i,
 
                wb1_stb_i => wb1_stb_i,
 
                wb1_we_i => wb1_we_i,
 
                wb1_adr_i => wb1_adr_i,
 
                wb1_dat_i => wb1_dat_i,
 
                wb1_dat_o => wb1_dat_o,
 
                wb1_ack_o => wb1_ack_o,
 
                wb2_cyc_i => wb2_cyc_i,
 
                wb2_stb_i => wb2_stb_i,
 
                wb2_we_i => wb2_we_i,
 
                wb2_adr_i => wb2_adr_i,
 
                wb2_dat_i => wb2_dat_i,
 
                wb2_dat_o => wb2_dat_o,
 
                wb2_ack_o => wb2_ack_o,
 
                wb3_cyc_i => wb3_cyc_i,
 
                wb3_stb_i => wb3_stb_i,
 
                wb3_we_i => wb3_we_i,
 
                wb3_adr_i => wb3_adr_i,
 
                wb3_dat_i => wb3_dat_i,
 
                wb3_dat_o => wb3_dat_o,
 
                wb3_ack_o => wb3_ack_o
 
        );
 
 
 
 
 
 
 
 
 
 
 
 
 
   wb1_control : process (wb_rst_i, wb_clk_i)
 
      variable WaitACKWB : std_logic;
 
      variable data : std_logic_vector(31 downto 0);
 
      variable State : integer;
 
   begin
 
      if (wb_rst_i = '1') then
 
         wb1_dat_i <= (others => '0');
 
         wb1_adr_i <= (others => '0');
 
         wb1_we_i <= '0';
 
         wb1_stb_i <= '0';
 
         wb1_cyc_i <= '0';
 
 
 
         data := (others => '0');
 
         WaitACKWB := '0';
 
         State := 0;
 
      elsif (wb_clk_i = '1' and wb_clk_i'event) then
 
         if (WaitACKWB = '1') then
 
            if (wb1_ack_o = '1') then
 
               WaitACKWB := '0';
 
               wb1_we_i <= '0';
 
               wb1_stb_i <= '0';
 
               wb1_cyc_i <= '0';
 
               data := wb1_dat_o;
 
            end if;
 
         end if;
 
 
 
         if (WaitACKWB = '0') then
 
            case State is
 
               when 0 => --init
 
                                                wb1_adr_i <= X"00";
 
                                                wb1_dat_i <= x"00000001";
 
                                                wb1_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 1 =>
 
                                                wb1_adr_i <= X"01";
 
                                                wb1_dat_i <= x"00000002";
 
                                                wb1_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 2 =>
 
                  wb1_adr_i <= X"02";
 
                                                wb1_dat_i <= x"00000003";
 
                                                wb1_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 3 =>
 
                  State := State + 1;
 
               when 4 =>
 
                  wb1_adr_i <= X"00";
 
                                                wb1_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 5 =>
 
                  State := State + 1;
 
               when 6 =>
 
                  State := State + 1;
 
               when 7 =>
 
                  wb1_adr_i <= X"01";
 
                  wb1_dat_i <= data;
 
                                                wb1_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 8 =>
 
                  wb1_adr_i <= X"05";
 
                  wb1_dat_i <= x"00500FA0";
 
                                                wb1_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := 0;
 
               when 45 =>
 
                  report "-----------> Testbench Finished OK!" severity FAILURE; --everything went fine, it's just to stop the simulation
 
 
 
               when others =>
 
                  null;
 
            end case;
 
 
 
            if (WaitACKWB = '1') then
 
               wb1_stb_i <= '1';
 
               wb1_cyc_i <= '1';
 
            end if;
 
         end if;
 
      end if;
 
   end process wb1_control;
 
 
 
 
 
 
 
 
 
 
 
   wb2_control : process (wb_rst_i, wb_clk_i)
 
      variable WaitACKWB : std_logic;
 
      variable data : std_logic_vector(31 downto 0);
 
      variable State : integer;
 
   begin
 
      if (wb_rst_i = '1') then
 
         wb2_dat_i <= (others => '0');
 
         wb2_adr_i <= (others => '0');
 
         wb2_we_i <= '0';
 
         wb2_stb_i <= '0';
 
         wb2_cyc_i <= '0';
 
 
 
         data := (others => '0');
 
         WaitACKWB := '0';
 
         State := 0;
 
      elsif (wb_clk_i = '1' and wb_clk_i'event) then
 
         if (WaitACKWB = '1') then
 
            if (wb2_ack_o = '1') then
 
               WaitACKWB := '0';
 
               wb2_we_i <= '0';
 
               wb2_stb_i <= '0';
 
               wb2_cyc_i <= '0';
 
               data := wb2_dat_o;
 
            end if;
 
         end if;
 
 
 
         if (WaitACKWB = '0') then
 
            case State is
 
               when 0 => --init
 
                                                wb2_adr_i <= X"05";
 
                                                wb2_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 1 =>
 
                  State := State + 1;
 
               when 2 =>
 
                  State := State + 1;
 
               when 3 =>
 
                  State := State + 1;
 
               when 4 =>
 
                                                wb2_adr_i <= X"04";
 
                                                wb2_dat_i <= x"00000002";
 
                                                wb2_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 5 =>
 
                  State := State + 1;
 
               when 6 =>
 
                  State := State + 1;
 
               when 7 =>
 
                  State := State + 1;
 
               when 8 =>
 
                  wb2_adr_i <= X"03";
 
                                                wb2_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 9 =>
 
                  State := State + 1;
 
               when 10 =>
 
                  wb2_adr_i <= X"02";
 
                                                wb2_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 11 =>
 
                  State := State + 1;
 
               when 12 =>
 
                  State := State + 1;
 
               when 13 =>
 
                  State := State + 1;
 
               when 14 =>
 
                  wb2_adr_i <= X"01";
 
                                                wb2_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 15 =>
 
                  State := State + 1;
 
               when 16 =>
 
                  State := State + 1;
 
               when 17 =>
 
                  wb2_adr_i <= X"05";
 
                  wb2_dat_i <= data;
 
                                                wb2_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := 0;
 
               when others =>
 
                  null;
 
            end case;
 
 
 
            if (WaitACKWB = '1') then
 
               wb2_stb_i <= '1';
 
               wb2_cyc_i <= '1';
 
            end if;
 
         end if;
 
      end if;
 
   end process wb2_control;
 
 
 
 
 
 
 
   wb3_control : process (wb_rst_i, wb_clk_i)
 
      variable WaitACKWB : std_logic;
 
      variable data : std_logic_vector(31 downto 0);
 
      variable State : integer;
 
   begin
 
      if (wb_rst_i = '1') then
 
         wb3_dat_i <= (others => '0');
 
         wb3_adr_i <= (others => '0');
 
         wb3_we_i <= '0';
 
         wb3_stb_i <= '0';
 
         wb3_cyc_i <= '0';
 
 
 
         data := (others => '0');
 
         WaitACKWB := '0';
 
         State := 0;
 
      elsif (wb_clk_i = '1' and wb_clk_i'event) then
 
         if (WaitACKWB = '1') then
 
            if (wb3_ack_o = '1') then
 
               WaitACKWB := '0';
 
               wb3_we_i <= '0';
 
               wb3_stb_i <= '0';
 
               wb3_cyc_i <= '0';
 
               data := wb3_dat_o;
 
            end if;
 
         end if;
 
 
 
         if (WaitACKWB = '0') then
 
            case State is
 
               when 0 =>
 
                  State := State + 1;
 
               when 1 => --init
 
                                                wb3_adr_i <= X"05";
 
                                                wb3_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 2 =>
 
                                                wb3_adr_i <= X"02";
 
                                                wb3_dat_i <= x"00000002";
 
                                                wb3_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 3 =>
 
                  State := State + 1;
 
               when 4 =>
 
                  wb3_adr_i <= X"01";
 
                                                wb3_dat_i <= x"00000003";
 
                                                wb3_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 5 =>
 
                  wb3_adr_i <= X"05";
 
                                                wb3_we_i <= '0';
 
                  WaitACKWB := '1';
 
                  State := State + 1;
 
               when 6 =>
 
                  State := State + 1;
 
               when 7 =>
 
                  State := State + 1;
 
               when 8 =>
 
                  wb3_adr_i <= X"01";
 
                  wb3_dat_i <= data;
 
                                                wb3_we_i <= '1';
 
                  WaitACKWB := '1';
 
                  State := 0;
 
               when others =>
 
                  null;
 
            end case;
 
 
 
            if (WaitACKWB = '1') then
 
               wb3_stb_i <= '1';
 
               wb3_cyc_i <= '1';
 
            end if;
 
         end if;
 
      end if;
 
   end process wb3_control;
 
 
 
 
 
 
 
   wb_rst_i <= '1', '0' after 60 ns; --active high
 
 
 
        Clocking : process --50 MHz -> T = 20 ns 
 
        begin
 
                        wb_clk_i <= '1';
 
                        wait for 10 ns;
 
                        wb_clk_i <= '0';
 
                        wait for 10 ns;
 
        end process;
 
 
 
END;
 
 
 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.