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

Subversion Repositories fir_wishbone

[/] [fir_wishbone/] [trunk/] [tester/] [tb_fir.vhdl] - Diff between revs 2 and 5

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 5
Line 1... Line 1...
 
/* Synthesisable testbench/BiST for FIR Filter design.
 
 
 
        Copyright© 2012 Tauhop Solutions. All rights reserved.
 
        This core is free hardware design; you can redistribute it and/or
 
        modify it under the terms of the GNU Library General Public
 
        License as published by the Free Software Foundation; either
 
        version 2 of the License, or (at your option) any later version.
 
 
 
        This library is distributed in the hope that it will be useful,
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
        Library General Public License for more details.
 
 
 
        You should have received a copy of the GNU Library General Public
 
        License along with this library; if not, write to the
 
        Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
        Boston, MA 02111-1307, USA.
 
 
 
        License: LGPL.
 
 
 
        @dependencies:
 
        @designer(s):
 
                Daniel C.K. Kho [daniel.kho@gmail.com] | [daniel.kho@tauhop.com] | [daniel.kho@sophicdesign.com.my];
 
                Tan Hooi Jing [hooijingtan@gmail.com]
 
        @info:
 
        Revision History: @see Mercurial log for full list of changes.
 
 
 
        This notice and disclaimer must be retained as part of this text at all times.
 
*/
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.numeric_std.all;
 
 
entity tb_fir is end entity tb_fir;
entity tb_fir is generic(order:positive:=30; width:positive:=16);
 
        port(
 
--              clk:in std_ulogic:='0';
 
--              nRst:in std_ulogic:='0';
 
                --u:in signed(16-1 downto 0);
 
                y:out signed(16-1 downto 0)
 
        );
 
end entity tb_fir;
 
 
architecture sim of tb_fir is
architecture rtl of tb_fir is
        signal clk,reset:std_ulogic:='0';
        signal reset:std_ulogic:='0';
        signal u: unsigned(16-1 downto 0);
        signal u:signed(16-1 downto 0);
        signal y: unsigned(16*2-1 downto 0);
        signal trig:std_logic;
        signal count: unsigned(3 downto 0);
 
 
        /* synthesis translate_off */
 
        signal clk:std_ulogic:='0';
 
        signal nRst:std_ulogic:='1';
 
        /* synthesis translate_on */
 
 
 
        signal count:unsigned(8 downto 0);
        signal pwrUpCnt:unsigned(3 downto 0):=(others=>'0');
        signal pwrUpCnt:unsigned(3 downto 0):=(others=>'0');
 
 
 
        /* on-chip debugger */
 
        signal dbgSignals:std_ulogic_vector(127 downto 0):=(others=>'0');
 
 
 
 
 
        /* Explicitly define all multiplications with the "*" operator to use dedicated DSP hardware multipliers. */
 
        attribute multstyle:string; attribute multstyle of rtl:architecture is "dsp";   --altera:
 
--      attribute mult_style:string; attribute mult_style of fir:entity is "block";             --xilinx:
 
 
begin
begin
 
        /* synthesis translate_off*/
        clk<=not clk after 10 ns;
        clk<=not clk after 10 ns;
        process(clk) is begin
        /* synthesis translate_on*/
                if pwrUpCnt<10 then reset<='1';
 
 
        process(pwrUpCnt,nRst) is begin
 
                if pwrUpCnt<10 or nRst='0' then reset<='1';
                else reset<='0';
                else reset<='0';
                end if;
                end if;
        end process;
        end process;
 
 
        fir_test: entity work.fir(rtl)
        process(reset,clk) is begin
 
                if reset='1' then count<=(others =>'0');
 
                elsif rising_edge(clk) then
 
                        if count<300 then count<=count+1; end if;
 
                end if;
 
        end process;
 
 
 
        process(nRst,clk) is begin
 
                if nRst='0' then pwrUpCnt<=(others =>'0');
 
                elsif rising_edge(clk) then
 
                        if pwrUpCnt<10 then pwrUpCnt<=pwrUpCnt+1; end if;
 
                end if;
 
        end process;
 
 
 
        /* Impulse generator for impulse response measurement. */
 
        u <= (0=>'1', others=>'0') when count=1 else (others=>'0');
 
 
 
 
 
        filter: entity work.fir(rtl)
 
                generic map(order=>order, width=>width)
        port map (
        port map (
                reset =>        reset,
                reset =>        reset,
                clk => clk,
                clk => clk,
 
 
                /* Filter ports. */
                /* Filter ports. */
                u => u,
                u => u,
                y => y
                y => y
 
 
        );
        );
 
 
        process(reset,clk) is begin
 
                if reset = '1' then count <= (others =>'0');
 
                elsif rising_edge(clk) then
 
                        if count<10 then count<=count+1; end if;
 
                end if;
 
        end process;
 
 
 
        process(clk) is begin
        /* Simulation only. */
 
        /* synthesis translate_off */
 
        reporter: process(clk) is begin
                if rising_edge(clk) then
                if rising_edge(clk) then
                        if pwrUpCnt<10 then pwrUpCnt<=pwrUpCnt+1; end if;
                        /* (u,y) pairs will be exported to CSV and Matlab for plotting.
 
                                Results are then correlated to digital simulations and Matlab
 
                                simulations of the filter.
 
                        */
 
                        report ";" & integer'image(to_integer(u)) & ";"
 
                                & integer'image(to_integer(y));
                end if;
                end if;
 
        end process reporter;
 
 
 
        process is begin
 
                assert now<5 us report "simulation stopped." severity failure;
 
                wait;
        end process;
        end process;
 
        /* synthesis translate_on */
 
 
        u<= x"0001" when count=5 else x"0000";
 
 
 
end architecture sim;
        /* Hardware debugger (SignalTap II embedded logic analyser). */
 
 
 
        trig<='1' when count<300 else '0';               -- Stop SignalTap Triggering after 300 counts, Total data=280
 
 
 
        /* SignalTap debugger. */
 
        dbgSignals(width-1 downto 0)<=std_ulogic_vector(u);                                              -- u:16bits
 
        dbgSignals(width*2-1  downto width)<=std_ulogic_vector(y);                              -- y:32bits                                             
 
        dbgSignals(8+width*2 downto width*2)<=std_ulogic_vector(count);         --9bits (300<512)
 
 
 
/*      debugger: entity work.stp(syn) port map(
 
                acq_clk=>clk,
 
                acq_data_in=>std_logic_vector(dbgSignals),              -- Type conversion: std_ulogic_vector --> std_logic_vector
 
                acq_trigger_in=>"1",
 
                trigger_in=>trig
 
        );
 
*/
 
end architecture rtl;
 
 
 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.