iqmix.vhd

    1  -- title:              I/Q Mixer
    2  -- author:             Sebastian Weiss
    3  -- last change:        22.10.13
    4 
    5 library IEEE;
    6 use IEEE.std_logic_1164.all;
    7 use IEEE.numeric_std.all;
    8 
    9 entity iqmix is
   10         generic
   11         (
   12                 NCO_A   : natural := 16;                        -- amplitude resolution
   13                 NCO_F   : natural := 24;                        -- frequency resolution
   14                 NCO_P   : natural := 24;                        -- phase resolution
   15                 NCO_N   : natural := 14;                        -- number of stages in nco
   16                 CIC_R   : natural := 256;                       -- decimation factor
   17                 CIC_N   : natural := 5;                         -- number of stages in CIC
   18                 CIC_W   : natural := 16                         -- CIC width
   19         );
   20 
   21         port
   22         (
   23                 clk     : in std_logic;
   24                 fcw     : in unsigned(NCO_F-1 downto 0);
   25 
   26                 rf      : in signed(7 downto 0);
   27                 i       : out signed(15 downto 0);
   28                 q       : out signed(15 downto 0);
   29                 rdy     : out std_logic
   30         );
   31 end entity;
   32 
   33 architecture behavioral of iqmix is
   34 signal mul_i    : signed(23 downto 0) := (others => '0');
   35 signal mul_q    : signed(23 downto 0) := (others => '0');
   36 signal nco_i    : signed(15 downto 0);
   37 signal nco_q    : signed(15 downto 0);
   38 signal cic_i_d  : signed(15 downto 0) := (others => '0');
   39 signal cic_q_d  : signed(15 downto 0) := (others => '0');
   40 signal cic_i_q  : signed(15 downto 0);
   41 signal cic_q_q  : signed(15 downto 0);
   42 begin
   43 
   44         cic_i : entity work.cic
   45                 generic map(
   46                 R       => CIC_R,
   47                 N       => CIC_N,
   48                 W       => CIC_W
   49                 )
   50 
   51                 port map(
   52                 clk     => clk,
   53                 d       => cic_i_d,
   54                 q       => cic_i_q,
   55                 rdy     => rdy
   56                 );
   57 
   58         cic_q : entity work.cic
   59                 generic map(
   60                 R       => CIC_R,
   61                 N       => CIC_N,
   62                 W       => CIC_W
   63                 )
   64 
   65                 port map(
   66                 clk     => clk,
   67                 d       => cic_q_d,
   68                 q       => cic_q_q,
   69                 rdy     => open
   70                 );
   71 
   72         nco :   entity work.nco
   73                 generic map(
   74                         A       => NCO_A,
   75                         P       => NCO_P,
   76                         F       => NCO_F,
   77                         N       => NCO_N
   78                 )
   79 
   80                 port map(
   81                         clk     => clk,
   82                         fcw     => fcw,
   83                         sin     => nco_i,
   84                         cos     => nco_q
   85                 );
   86 
   87         process
   88         begin
   89                 wait until rising_edge(clk);
   90                 mul_i   <= rf * nco_i;
   91                 mul_q   <= rf * nco_q;
   92         end process;
   93 
   94 
   95         cic_i_d <= mul_i(23 downto 8);
   96         cic_q_d <= mul_q(23 downto 8);
   97 
   98         i       <= cic_i_q;
   99         q       <= cic_q_q;
  100 
  101 end behavioral;
  102 

This page was generated using GHDL 0.29 (20100109) [Sokcho edition], a program written by Tristan Gingold