git-svn-id: http://moon:8086/svn/vhdl/trunk@170 cc03376c-175c-47c8-b038-4cd826a8556b
178 lines
4.4 KiB
VHDL
178 lines
4.4 KiB
VHDL
--------------------------------------------------------------------------------
|
|
-- Company:
|
|
-- Engineer:
|
|
--
|
|
-- Create Date: 12:16:14 10/02/05
|
|
-- Design Name:
|
|
-- Module Name: cordic_stage - Behavioral
|
|
-- Project Name:
|
|
-- Target Device:
|
|
-- Tool versions:
|
|
-- Description:
|
|
--
|
|
-- Dependencies:
|
|
--
|
|
-- Revision:
|
|
-- Revision 0.01 - File Created
|
|
-- Additional Comments:
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.MATH_REAL.ALL;
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
library ieee_proposed;
|
|
use ieee_proposed.math_utility_pkg.all;
|
|
use ieee_proposed.fixed_pkg.all;
|
|
|
|
library work;
|
|
use work.fixed_util_pkg.all;
|
|
use work.cordic_pkg.all;
|
|
|
|
---- Uncomment the following library declaration if instantiating
|
|
---- any Xilinx primitives in this code.
|
|
--library UNISIM;
|
|
--use UNISIM.VComponents.all;
|
|
|
|
entity mix is
|
|
Generic
|
|
(
|
|
nbits_din : integer := 18;
|
|
nbits_din_frac : integer := 16;
|
|
nbits_dout : integer := 18;
|
|
nbits_dout_frac : integer := 16;
|
|
nbits_phase : integer := 16;
|
|
nbits_freq : integer := 16
|
|
);
|
|
Port
|
|
(
|
|
rst : in std_logic;
|
|
clk : in std_logic;
|
|
nco_rst : in std_logic;
|
|
nco_en : in std_logic;
|
|
freq_in : in unsigned(nbits_freq-1 downto 0);
|
|
phase_in : in unsigned(nbits_phase-1 downto 0);
|
|
din_i : in sfixed;
|
|
din_q : in sfixed;
|
|
dout_i : out sfixed;
|
|
dout_q : out sfixed;
|
|
din_vld : in std_logic;
|
|
dout_vld : out std_logic
|
|
);
|
|
end mix;
|
|
|
|
architecture Behavioral of mix is
|
|
|
|
COMPONENT cordic_pipe_top
|
|
GENERIC
|
|
(
|
|
cordic_mode : cordic_mode_t;
|
|
z_range : real;
|
|
gain_corr_mode : gain_corr_mode_t;
|
|
nstages : integer;
|
|
nbits_x_in : integer;
|
|
nbits_y_in : integer;
|
|
nbits_z_in : integer;
|
|
nbits_frac_x_in : integer;
|
|
nbits_frac_y_in : integer;
|
|
nbits_frac_z_in : integer;
|
|
nbits_x_out : integer;
|
|
nbits_y_out : integer;
|
|
nbits_z_out : integer;
|
|
nbits_frac_x_out : integer;
|
|
nbits_frac_y_out : integer;
|
|
nbits_frac_z_out : integer
|
|
);
|
|
PORT
|
|
(
|
|
rst : in std_logic;
|
|
clk : in std_logic;
|
|
vld_in : in std_logic;
|
|
xin : in sfixed;
|
|
yin : in sfixed;
|
|
zin : in sfixed;
|
|
xout : out sfixed;
|
|
yout : out sfixed;
|
|
zout : out sfixed;
|
|
vld_out : out std_logic
|
|
);
|
|
END COMPONENT;
|
|
|
|
-------------------------------------------------------------------------------
|
|
constant nbits_phase_frac : integer := nbits_phase;
|
|
|
|
-------------------------------------------------------------------------------
|
|
signal phase : signed(nbits_phase-1 downto 0);
|
|
signal xin, yin : sfixed(shi(nbits_din, nbits_din_frac) downto slo(nbits_din, nbits_din_frac));
|
|
signal xout, yout : sfixed(shi(nbits_dout, nbits_dout_frac) downto slo(nbits_dout, nbits_dout_frac));
|
|
|
|
signal dout_valid : std_logic;
|
|
|
|
signal zin : sfixed(shi(nbits_phase, nbits_phase_frac) downto slo(nbits_phase, nbits_phase_frac));
|
|
signal zout : sfixed(shi(nbits_phase, nbits_phase_frac) downto slo(nbits_phase, nbits_phase_frac));
|
|
|
|
-------------------------------------------------------------------------------
|
|
begin
|
|
|
|
dout_i <= xout;
|
|
dout_q <= yout;
|
|
xin <= din_i;
|
|
yin <= din_q;
|
|
|
|
dout_vld <= dout_valid;
|
|
|
|
------------------------------------------------------------
|
|
proc_phase_accu: process(clk)
|
|
variable phase_accu : signed(nbits_phase-1 downto 0);
|
|
|
|
begin
|
|
if rising_edge(clk) then
|
|
if rst = '1' or nco_rst = '1' then
|
|
phase_accu := (others => '0');
|
|
elsif nco_en = '1' then
|
|
phase <= phase_accu + signed(phase_in);
|
|
phase_accu := phase_accu + signed(freq_in);
|
|
end if;
|
|
end if;
|
|
zin <= sfixed(phase);
|
|
end process;
|
|
|
|
------------------------------------------------------------
|
|
inst_cordic: cordic_pipe_top
|
|
GENERIC MAP
|
|
(
|
|
cordic_mode => cordic_mode_rotate,
|
|
z_range => 1.0,
|
|
gain_corr_mode => gain_mode_disabled,
|
|
nstages => nbits_phase,
|
|
nbits_x_in => nbits_din,
|
|
nbits_frac_x_in => nbits_din_frac,
|
|
nbits_y_in => nbits_din,
|
|
nbits_frac_y_in => nbits_din_frac,
|
|
nbits_z_in => nbits_phase,
|
|
nbits_frac_z_in => nbits_phase_frac,
|
|
nbits_x_out => nbits_dout,
|
|
nbits_frac_x_out => nbits_dout_frac,
|
|
nbits_y_out => nbits_dout,
|
|
nbits_frac_y_out => nbits_dout_frac,
|
|
nbits_z_out => nbits_phase,
|
|
nbits_frac_z_out => nbits_phase_frac
|
|
)
|
|
PORT MAP
|
|
(
|
|
rst => rst,
|
|
clk => clk,
|
|
vld_in => din_vld,
|
|
xin => xin,
|
|
yin => yin,
|
|
zin => zin,
|
|
xout => xout,
|
|
yout => yout,
|
|
zout => zout,
|
|
vld_out => dout_valid
|
|
);
|
|
|
|
------------------------------------------------------------
|
|
end Behavioral;
|