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

Subversion Repositories cfft

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 9 to Rev 10
    Reverse comparison

Rev 9 → Rev 10

/trunk/sim/tb_cfft1024x12.vhd
0,0 → 1,165
---------------------------------------------------------------------------------------------------
--
-- Title : test bench
-- Design : cfft
-- Author : henning larsen
-- email :
--
---------------------------------------------------------------------------------------------------
--
-- File : tb_cfft1024x12.vhd
--
---------------------------------------------------------------------------------------------------
--
-- Description :
--
-- Simple "testbench" for cfft1024x12. It is realy just an excitation of inputs
-- The output has to be evaluated manually. run for 125 us with current settings.
-- Input is a dual sinsoid with constant amplitudes, and a DC value.
-- Input is real valued only. A calculation of the power spectrum, and a frequency bin
-- counter is included, but no reordering of output sequence is performed.
-- Frequencies are easy to select such that a minimum of spill into side bins is obtained.
-- Beware of the posibilty of saturation in the output. For single sinsoide,the saturation limit
-- is 2^14/29.4=557 units of input amplitude.
--
-- henning larsen
--
---------------------------------------------------------------------------------------------------
--
-- Revisions : 0
-- Revision Number : 1
-- Version : 1.1.0
-- Date : Nov 21 2002
-- Modifier : ZHAO Ming
-- Desccription : init release
-- compare output position
--
---------------------------------------------------------------------------------------------------
 
 
 
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.math_real.all;
USE ieee.std_logic_signed.all;
 
ENTITY cfft1024x12_tester1 IS
END cfft1024x12_tester1 ;
ARCHITECTURE tester OF cfft1024x12_tester1 IS
-- Component Declarations
COMPONENT cfft1024X12
PORT (
clk : IN STD_LOGIC ;
rst : IN STD_LOGIC ;
start : IN STD_LOGIC ;
inv : IN std_logic ;
Iin : IN STD_LOGIC_VECTOR (11 DOWNTO 0);
Qin : IN STD_LOGIC_VECTOR (11 DOWNTO 0);
inputbusy : OUT STD_LOGIC ;
outdataen : OUT STD_LOGIC ;
Iout : OUT STD_LOGIC_VECTOR (13 DOWNTO 0);
Qout : OUT STD_LOGIC_VECTOR (13 DOWNTO 0);
OutPosition : out STD_LOGIC_VECTOR( 9 downto 0 )
);
END COMPONENT;
 
constant Tck_half : time:=10 ns;
constant Tckhalf : real:=10.0e-9;-- real value eqv of time, there is some conversion function
-- for this but could not find/remember.
constant ampl1 : real:=100.0;-- max amplitude is roughly 550=2^14/29.4 to avoid sturation in output
constant ampl2 : real:=200.0; -- .. but see intro comments
constant f1 : real := 100.0/TckHalf/2.0/1024.0;-- bin number =100
constant f2 : real := 33.0/TckHalf/2.0/1024.0;-- bin number =33
constant dc : real:=100.0;--bin number=0
 
signal c1,c2,cout: real;
signal clock : std_logic:='0';
signal reset : std_logic:='0';
signal start : std_logic:='0';
signal inv : std_logic ;
signal Iin : STD_LOGIC_VECTOR (11 DOWNTO 0);
signal Qin : STD_LOGIC_VECTOR (11 DOWNTO 0);
signal inputbusy : STD_LOGIC:='0' ;
signal outdataen : STD_LOGIC:='0' ;
signal Iout : STD_LOGIC_VECTOR (13 DOWNTO 0);
signal Qout : STD_LOGIC_VECTOR (13 DOWNTO 0);
signal amp : real; -- power spectrum
signal bitRev : STD_LOGIC_VECTOR (9 DOWNTO 0);-- bin counter
signal OutPosition : STD_LOGIC_VECTOR( 9 downto 0 );
 
BEGIN
-- Instance port mappings.
I0 : cfft1024X12
PORT MAP (
clk => clock,
rst => reset,
start => start,
inv => inv,
Iin => Iin,
Qin => Qin,
inputbusy => inputbusy,
outdataen => outdataen,
Iout => Iout,
Qout => Qout,
OutPosition => OutPosition
);
 
----------------------------------------------------------------------------
--
-- control signals ,setup
clock <= not clock after Tck_half;
reset <= '1', '0' after 2*Tck_half;
start <= '0', '1' after 3*Tck_half, '0' after 5*Tck_half;-- only one FFT is done
inv <= '0';-- FFT
 
----------------------------------------------------------------------------
--
sin_gen: process(clock, reset)
variable tid : real;
variable TM : real :=0.0 ;
begin
if Reset = '1' then
c1 <= 0.0;
c2 <= 0.0;
Iin<="000000000000" ;
Qin<="000000000000" ;
TM := 0.0;
tid := TM;
else
if clock'event and clock = '1' then
TM := TM + Tckhalf*2.0;
tid := TM;
c1 <= (ampl1 * sin(2.0*math_pi*f1*tid));
c2 <= (ampl2 * sin(2.0*math_pi*f2*tid));
cout <= c1+c2+dc;
Iin <= conv_std_logic_vector(integer(cout),Iin'length);
Qin <="000000000000" ;
end if;
end if;
end process sin_gen;
----------------------------------------------------------------------------
--
--Output power spectrum, normalized with the gain of 29.4
amp <= sqrt(real(CONV_integer(Iout)) * real(CONV_integer(Iout))
+ real(CONV_integer(Qout)) * real(CONV_integer(Qout)))/29.4;
----------------------------------------------------------------------------
--
-- radix 4 bit reversed counter
radix4cnt: process (clock)
variable cntr: std_logic_vector ( 9 downto 0);
begin
if rising_edge(clock) then
if outdataen='1' then
cntr:=unsigned(cntr)+1;
else
cntr:=(others => '0');
end if;
for k in 1 to ((10) / 2) loop
bitRev(2*k-2)<= cntr(10-2*k);
bitRev(2*k-1)<= cntr(10-(-1+2*k));
end loop;
end if;
end process radix4cnt;
 
END tester;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.