📄 tb_cfft1024x12.vhd
字号:
------------------------------------------------------------------------------------------------------- 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 ISEND 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 ; invert : 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 invert : 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, invert => invert, Iin => Iin, Qin => Qin, inputbusy => inputbusy, outdataen => outdataen, Iout => Iout, Qout => Qout, OutPosition => OutPosition );-------------------------------------------------------------------------------- control signals ,setupclock <= 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 doneinvert <= '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.4amp <= sqrt(real(CONV_integer(Iout)) * real(CONV_integer(Iout)) + real(CONV_integer(Qout)) * real(CONV_integer(Qout)))/29.4;-------------------------------------------------------------------------------- radix 4 bit reversed counterradix4cnt: 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -