Files
vhdl/lib/radio/ddc/src/tb_syn_ddc.vhd
T
jens 47e7daee7d - fixed renamed package inclusion
- fixed problems after fixed_pkg update: explicit set round and saturation mode in Cordic and CIC

git-svn-id: http://moon:8086/svn/vhdl/trunk@1325 cc03376c-175c-47c8-b038-4cd826a8556b
2015-10-24 16:14:54 +00:00

484 lines
13 KiB
VHDL

--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 17:16:42 13.05.2007
-- Design Name: tb_nco
-- Module Name: tb_nco.vhd
-- Project Name: nco
-- Target Device:
-- Tool versions:
-- Description:
--
--------------------------------------------------------------------------------
LIBRARY ieee;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.MATH_REAL.ALL;
USE ieee.numeric_std.ALL;
use std.textio.all; -- Imports the standard textio package.
library ieee_proposed;
use ieee_proposed.fixed_float_types.all;
use ieee_proposed.fixed_pkg.all;
library work;
use work.fixed_util_pkg.all;
use work.cordic_pkg.all;
--use work.PCK_FIO.all;
ENTITY tb_syn_ddc IS
Generic
(
nbits_in : integer := 16;
nbits_in_frac : integer := 14;
nbits_out : integer := 32;
nbits_out_frac : integer := 30;
lo_nbits_phase : integer := 24;
lo_nbits_freq : integer := 24;
cic_nstages : integer := 5;
cic_ratio : integer := 25;
cic_scale_nbits : integer := 22;
rfgen_nbits_phase : integer := 32;
rfgen_nbits_freq : integer := 32
);
END tb_syn_ddc;
ARCHITECTURE behavior OF tb_syn_ddc IS
--Constants
constant fa : REAL := 2.0**27;
constant frf1 : REAL := 33.99E6;
constant frf2 : REAL := 2.1E6;
constant frf3 : REAL := 19.01E6;
constant flo : REAL := 2.00E6;
constant PERIOD_ADCCLK : time := 10 ns;
constant PERIOD_USBCLK : time := 20 ns;
constant PERIOD_IFCLK : time := 20 ns;
SIGNAL rfgen1_freq_word : integer := integer(frf1/fa*2.0**rfgen_nbits_freq);
SIGNAL rfgen2_freq_word : integer := integer(frf2/fa*2.0**rfgen_nbits_freq);
SIGNAL rfgen3_freq_word : integer := integer(frf3/fa*2.0**rfgen_nbits_freq);
SIGNAL lo_freq_word : integer := integer(flo/fa*2.0**lo_nbits_freq);
SIGNAL ddc_freq_in : unsigned(lo_nbits_freq-1 downto 0) := (others => '0');
SIGNAL ddc_phase_in : unsigned(lo_nbits_phase-1 downto 0) := (others => '0');
--Inputs
SIGNAL rst : std_logic := '1';
SIGNAL adc_clk : std_logic := '0';
SIGNAL adc_ofa : std_logic := '0';
SIGNAL adc_rand : std_logic;
SIGNAL adc_pga : std_logic;
SIGNAL adc_dith : std_logic;
SIGNAL adc_shdn : std_logic;
SIGNAL adc_da : signed (15 downto 0);
SIGNAL adc_da_vld : std_logic;
SIGNAL usb_usbclk : std_logic := '0';
SIGNAL usb_ifclk : std_logic := '0';
SIGNAL usb_fd : signed (15 downto 0);
SIGNAL usb_fifoadr : unsigned (1 downto 0);
SIGNAL usb_pktend : std_logic;
SIGNAL usb_slcs_n : std_logic;
SIGNAL usb_slwr_n : std_logic;
SIGNAL usb_slrd_n : std_logic;
SIGNAL usb_sloe : std_logic;
SIGNAL usb_flaga : std_logic := '0';
SIGNAL usb_flagb : std_logic := '0';
SIGNAL usb_flagc : std_logic := '0';
SIGNAL cl_dout : unsigned (20 downto 0);
SIGNAL cl_clk_out : std_logic;
SIGNAL cl_pd_n : std_logic;
SIGNAL reg_dio : unsigned (7 downto 0) := (others => 'Z');
SIGNAL reg_aen : std_logic := '1';
SIGNAL reg_oe : std_logic := '0';
SIGNAL reg_we : std_logic := '0';
SIGNAL rfgen_nco_rst : std_logic := '0';
SIGNAL rfgen_nco_en : std_logic := '0';
SIGNAL rfgen1_freq_in : unsigned(rfgen_nbits_freq-1 downto 0) := (others => '0');
SIGNAL rfgen1_phase_in : unsigned(rfgen_nbits_phase-1 downto 0) := (others => '0');
SIGNAL rfgen2_freq_in : unsigned(rfgen_nbits_freq-1 downto 0) := (others => '0');
SIGNAL rfgen2_phase_in : unsigned(rfgen_nbits_phase-1 downto 0) := (others => '0');
SIGNAL rfgen3_freq_in : unsigned(rfgen_nbits_freq-1 downto 0) := (others => '0');
SIGNAL rfgen3_phase_in : unsigned(rfgen_nbits_phase-1 downto 0) := (others => '0');
--Outputs
signal rfgen_din_i : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac)) := to_sfixed(0.0, shi(nbits_in, nbits_in_frac), slo(nbits_in, nbits_in_frac));
signal rfgen_din_q : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac)) := to_sfixed(1.0, shi(nbits_in, nbits_in_frac), slo(nbits_in, nbits_in_frac));
SIGNAL rfgen_dout_i : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen_dout_q : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen1_dout_i : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen1_dout_q : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen1_dout_vld : std_logic;
SIGNAL rfgen2_dout_i : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen2_dout_q : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen2_dout_vld : std_logic;
SIGNAL rfgen3_dout_i : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen3_dout_q : sfixed(shi(nbits_in, nbits_in_frac) downto slo(nbits_in, nbits_in_frac));
SIGNAL rfgen3_dout_vld : std_logic;
SIGNAL fileout_enable : std_logic := '0';
BEGIN
inst_syn_ddc : entity work.syn_ddc
GENERIC MAP
(
nbits_in => nbits_in,
nbits_in_frac => nbits_in_frac,
nbits_out => nbits_out,
nbits_out_frac => nbits_out_frac,
lo_nbits_phase => lo_nbits_phase,
lo_nbits_freq => lo_nbits_freq,
cic_nstages => cic_nstages,
cic_ratio => cic_ratio,
cic_scale_nbits => cic_scale_nbits
)
PORT MAP
(
rst => rst,
adc_clk => adc_clk,
adc_da => adc_da,
adc_ofa => adc_ofa,
adc_rand => adc_rand,
adc_pga => adc_pga,
adc_dith => adc_dith,
adc_shdn => adc_shdn,
usb_usbclk => usb_usbclk,
usb_ifclk => usb_ifclk,
usb_fd => usb_fd,
usb_pktend => usb_pktend,
usb_fifoadr => usb_fifoadr,
usb_slcs_n => usb_slcs_n,
usb_slwr_n => usb_slwr_n,
usb_slrd_n => usb_slrd_n,
usb_sloe => usb_sloe,
usb_flaga => usb_flaga,
usb_flagb => usb_flagb,
usb_flagc => usb_flagc,
cl_clk_out => cl_clk_out,
cl_dout => cl_dout,
cl_pd_n => cl_pd_n,
reg_aen => reg_aen,
reg_dio => reg_dio,
reg_oe => reg_oe,
reg_we => reg_we
);
rfgen1: entity work.mix
GENERIC MAP
(
nbits_din => nbits_in,
nbits_din_frac => nbits_in_frac,
nbits_dout => nbits_in,
nbits_dout_frac => nbits_in_frac,
nbits_phase => rfgen_nbits_phase,
nbits_freq => rfgen_nbits_freq
)
PORT MAP
(
rst => rst,
clk => adc_clk,
nco_rst => rfgen_nco_rst,
nco_en => rfgen_nco_en,
freq_in => rfgen1_freq_in,
phase_in => rfgen1_phase_in,
din_i => rfgen_din_i,
din_q => rfgen_din_q,
dout_i => rfgen1_dout_i,
dout_q => rfgen1_dout_q,
din_vld => '1',
dout_vld => rfgen1_dout_vld
);
rfgen2: entity work.mix
GENERIC MAP
(
nbits_din => nbits_in,
nbits_din_frac => nbits_in_frac,
nbits_dout => nbits_in,
nbits_dout_frac => nbits_in_frac,
nbits_phase => rfgen_nbits_phase,
nbits_freq => rfgen_nbits_freq
)
PORT MAP
(
rst => rst,
clk => adc_clk,
nco_rst => rfgen_nco_rst,
nco_en => rfgen_nco_en,
freq_in => rfgen2_freq_in,
phase_in => rfgen2_phase_in,
din_i => rfgen_din_i,
din_q => rfgen_din_q,
dout_i => rfgen2_dout_i,
dout_q => rfgen2_dout_q,
din_vld => '1',
dout_vld => rfgen2_dout_vld
);
rfgen3: entity work.mix
GENERIC MAP
(
nbits_din => nbits_in,
nbits_din_frac => nbits_in_frac,
nbits_dout => nbits_in,
nbits_dout_frac => nbits_in_frac,
nbits_phase => rfgen_nbits_phase,
nbits_freq => rfgen_nbits_freq
)
PORT MAP
(
rst => rst,
clk => adc_clk,
nco_rst => rfgen_nco_rst,
nco_en => rfgen_nco_en,
freq_in => rfgen3_freq_in,
phase_in => rfgen3_phase_in,
din_i => rfgen_din_i,
din_q => rfgen_din_q,
dout_i => rfgen3_dout_i,
dout_q => rfgen3_dout_q,
din_vld => '1',
dout_vld => rfgen3_dout_vld
);
tb_adcclk : PROCESS
BEGIN
adc_clk <= not adc_clk;
wait for PERIOD_ADCCLK/2;
END PROCESS;
tb_usbclk : PROCESS
BEGIN
usb_usbclk <= not usb_usbclk;
wait for PERIOD_USBCLK/2;
END PROCESS;
tb_ifclk : PROCESS
BEGIN
usb_ifclk <= not usb_ifclk;
wait for PERIOD_IFCLK/2;
END PROCESS;
rfgen_dout_i <= resize(0.333*rfgen1_dout_i + 0.333*rfgen2_dout_i + 0.333*rfgen3_dout_i, rfgen_dout_i);
rfgen_dout_q <= resize(0.333*rfgen1_dout_q + 0.333*rfgen2_dout_q + 0.333*rfgen3_dout_q, rfgen_dout_q);
adc_da <= to_signed(rfgen_dout_i);
adc_da_vld <= rfgen1_dout_vld and rfgen2_dout_vld and rfgen3_dout_vld;
tb : PROCESS
BEGIN
-- Wait 100 ns for global reset to finish
wait for 400*PERIOD_USBCLK;
rst <= '0';
wait for 200*PERIOD_USBCLK;
-------------------------------------------
-- Program gains
wait for 2*PERIOD_USBCLK;
ddc_phase_in <= to_unsigned(0,lo_nbits_phase);
ddc_freq_in <= to_unsigned(lo_freq_word,lo_nbits_freq);
wait until rising_edge(usb_usbclk);
reg_dio <= X"10";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_freq_in(7 downto 0);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"11";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_freq_in(15 downto 8);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"12";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_freq_in(23 downto 16);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"13";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"00";
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"20";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_phase_in(7 downto 0);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"21";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_phase_in(15 downto 8);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"22";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= ddc_phase_in(23 downto 16);
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"23";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"00";
reg_aen <= '0';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait for 200*PERIOD_USBCLK;
fileout_enable <= '1';
wait until rising_edge(usb_usbclk);
reg_dio <= X"00";
reg_aen <= '1';
reg_we <= '1';
wait until rising_edge(usb_usbclk);
reg_aen <= '0';
reg_we <= '0';
wait until rising_edge(usb_usbclk);
reg_dio <= X"02";
reg_aen <= '0';
reg_we <= '1';
wait;
END PROCESS;
rfgen_ctrl : PROCESS
BEGIN
wait until rising_edge(adc_clk) and rst = '0';
rfgen1_freq_in <= to_unsigned(rfgen1_freq_word,rfgen_nbits_freq);
rfgen1_phase_in <= to_unsigned(0,rfgen_nbits_phase);
rfgen2_freq_in <= to_unsigned(rfgen2_freq_word,rfgen_nbits_freq);
rfgen2_phase_in <= to_unsigned(0,rfgen_nbits_phase);
rfgen3_freq_in <= to_unsigned(rfgen3_freq_word,rfgen_nbits_freq);
rfgen3_phase_in <= to_unsigned(0,rfgen_nbits_phase);
wait until rising_edge(adc_clk);
rfgen_nco_en <= '1';
wait;
END PROCESS;
END;