- 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
211 lines
5.4 KiB
VHDL
211 lines
5.4 KiB
VHDL
--------------------------------------------------------------------------------
|
|
-- Company:
|
|
-- Engineer:
|
|
--
|
|
-- Create Date: 17:16:42 13.05.2007
|
|
-- Design Name: tb_mix_cpx
|
|
-- Module Name: tb_mix_cpx.vhd
|
|
-- Project Name: mix_cpx
|
|
-- Target Device:
|
|
-- Tool versions:
|
|
-- Description:
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
LIBRARY ieee;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.MATH_REAL.ALL;
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
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.utils_pkg.all;
|
|
|
|
ENTITY cic_decim_pipe IS
|
|
Generic
|
|
(
|
|
nstages : integer := 3;
|
|
max_diff_delay : integer := 2;
|
|
ratio_max : integer := 64;
|
|
scale_nbits_min : integer := 9;
|
|
scale_nbits_max : integer := 24;
|
|
in_width : integer := 32;
|
|
in_width_frac : integer := 20;
|
|
out_width : integer := 32;
|
|
out_width_frac : integer := 20
|
|
);
|
|
Port
|
|
(
|
|
clk : in std_logic;
|
|
rst : in std_logic;
|
|
vld_in : in std_logic;
|
|
ratio : in natural range 1 to ratio_max;
|
|
diff_delay : in natural range 1 to max_diff_delay;
|
|
shift_in : in natural range 0 to scale_nbits_max;
|
|
din : in sfixed;
|
|
dout : out sfixed;
|
|
vld_out : out std_logic
|
|
);
|
|
END cic_decim_pipe;
|
|
|
|
ARCHITECTURE behavior OF cic_decim_pipe IS
|
|
|
|
COMPONENT cic_i_pipe
|
|
GENERIC
|
|
(
|
|
max_width : integer;
|
|
max_width_frac : integer
|
|
);
|
|
PORT
|
|
(
|
|
clk : in std_logic;
|
|
rst : in std_logic;
|
|
vld_in : in std_logic;
|
|
din : in sfixed;
|
|
dout : out sfixed;
|
|
vld_out : out std_logic
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT cic_c_pipe
|
|
GENERIC
|
|
(
|
|
max_diff_delay : integer;
|
|
max_width : integer;
|
|
max_width_frac : integer
|
|
);
|
|
PORT
|
|
(
|
|
clk : in std_logic;
|
|
rst : in std_logic;
|
|
vld_in : in std_logic;
|
|
diff_delay : in natural range 1 to max_diff_delay;
|
|
din : in sfixed;
|
|
dout : out sfixed;
|
|
vld_out : out std_logic
|
|
);
|
|
END COMPONENT;
|
|
|
|
constant min_gain_bits : natural := scale_nbits_min;
|
|
constant max_gain_bits : natural := natural(NextExpBaseTwo(real(ratio_max)**real(nstages)));
|
|
|
|
constant integ_nbits : natural := in_width + max_gain_bits;
|
|
constant integ_nbits_frac : natural := integ_nbits - (in_width - in_width_frac);
|
|
|
|
constant comb_nbits : natural := out_width + 1;
|
|
constant comb_nbits_frac : natural := out_width_frac + 1;
|
|
|
|
subtype word_i_t is sfixed(shi(integ_nbits, integ_nbits_frac) downto slo(integ_nbits, integ_nbits_frac));
|
|
type word_i_pipe_t is array (0 to nstages) of word_i_t;
|
|
|
|
signal word_i_pipe : word_i_pipe_t;
|
|
signal vld_i_pipe : unsigned (0 to nstages);
|
|
signal vld_i : std_logic;
|
|
|
|
subtype word_c_t is sfixed(shi(comb_nbits, comb_nbits_frac) downto slo(comb_nbits, comb_nbits_frac));
|
|
type word_c_pipe_t is array (0 to nstages) of word_c_t;
|
|
|
|
signal word_c_pipe : word_c_pipe_t;
|
|
signal vld_c_pipe : unsigned (0 to nstages);
|
|
signal vld_c : std_logic;
|
|
|
|
signal resample_cnt : natural range 1 to ratio_max;
|
|
signal resample_vld : std_logic;
|
|
|
|
BEGIN
|
|
|
|
assert false report "min_gain_bits = " & natural'image(min_gain_bits) & "." severity note;
|
|
assert false report "max_gain_bits = " & natural'image(max_gain_bits) & "." severity note;
|
|
assert false report "integ. prec. = " & natural'image(integ_nbits) & ":" & natural'image(integ_nbits_frac) & "." severity note;
|
|
assert false report "comb prec. = " & natural'image(comb_nbits) & ":" & natural'image(comb_nbits_frac) & "." severity note;
|
|
|
|
vld_i <= vld_i_pipe(nstages);
|
|
|
|
input_scale:
|
|
process(clk)
|
|
variable x : sfixed(shi(integ_nbits, integ_nbits_frac) downto slo(integ_nbits, integ_nbits_frac));
|
|
variable xs : sfixed(shi(integ_nbits, integ_nbits_frac) downto slo(integ_nbits, integ_nbits_frac));
|
|
variable xsi : sfixed(shi(integ_nbits, integ_nbits_frac) downto slo(integ_nbits, integ_nbits_frac));
|
|
begin
|
|
if rising_edge(clk) then
|
|
x := resize(din, x, fixed_wrap, fixed_truncate);
|
|
xs := x sra min_gain_bits;
|
|
-- xsi := xs sra shift_in;
|
|
word_i_pipe(0) <= xs;
|
|
vld_i_pipe(0) <= vld_in;
|
|
end if;
|
|
end process;
|
|
|
|
gen_i_stages:
|
|
for i in 1 to nstages generate
|
|
begin
|
|
inst_cic_i_pipe: cic_i_pipe
|
|
GENERIC MAP
|
|
(
|
|
max_width => integ_nbits,
|
|
max_width_frac => integ_nbits_frac
|
|
)
|
|
PORT MAP
|
|
(
|
|
clk => clk,
|
|
rst => rst,
|
|
vld_in => vld_i_pipe(i-1),
|
|
din => word_i_pipe(i-1),
|
|
dout => word_i_pipe(i),
|
|
vld_out => vld_i_pipe(i)
|
|
);
|
|
end generate;
|
|
|
|
word_c_pipe(0) <= resize(word_i_pipe(nstages), word_c_pipe(0), fixed_wrap, fixed_truncate);
|
|
vld_c_pipe(0) <= resample_vld;
|
|
vld_c <= vld_c_pipe(nstages);
|
|
|
|
vld_out <= vld_c;
|
|
|
|
gen_c_stages:
|
|
for i in 1 to nstages generate
|
|
begin
|
|
inst_cic_c_pipe: cic_c_pipe
|
|
GENERIC MAP
|
|
(
|
|
max_diff_delay => max_diff_delay,
|
|
max_width => comb_nbits,
|
|
max_width_frac => comb_nbits_frac
|
|
)
|
|
PORT MAP
|
|
(
|
|
clk => clk,
|
|
rst => rst,
|
|
vld_in => vld_c_pipe(i-1),
|
|
diff_delay => diff_delay,
|
|
din => word_c_pipe(i-1),
|
|
dout => word_c_pipe(i),
|
|
vld_out => vld_c_pipe(i)
|
|
);
|
|
end generate;
|
|
|
|
resampler_proc:
|
|
process(clk)
|
|
begin
|
|
if rising_edge(clk) then
|
|
resample_vld <= '0';
|
|
if rst = '1' then
|
|
resample_cnt <= 1;
|
|
elsif vld_i = '1' then
|
|
if resample_cnt = ratio then
|
|
resample_vld <= '1';
|
|
resample_cnt <= 1;
|
|
else
|
|
resample_cnt <= resample_cnt + 1;
|
|
end if ;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
dout <= resize(word_c_pipe(nstages), shi(out_width, out_width_frac), slo(out_width, out_width_frac), fixed_wrap, fixed_truncate);
|
|
|
|
END;
|