Files
vhdl/lib/radio/mix/src/undc_real.vhd
T
jens 70645de004 - uses common fixed_pkg
git-svn-id: http://moon:8086/svn/vhdl/trunk@239 cc03376c-175c-47c8-b038-4cd826a8556b
2009-01-14 09:36:50 +00:00

144 lines
3.9 KiB
VHDL

--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 12:16:14 10/02/05
-- Design Name:
-- Module Name: mix_cpx - 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;
use work.fixed_util_pkg.all;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity undc_real is
Generic
(
nbits_data : integer := 12;
nbits_data_frac : integer := 12;
nbits_k : integer := 12;
nbits_k_frac : integer := 12;
has_in_reg : boolean := false;
rounding : fixed_round_style_type := fixed_round;
saturating : fixed_overflow_style_type := fixed_saturate
);
Port
(
srst : in std_logic;
clk : in std_logic;
din_valid : in std_logic;
din : in sfixed;
kin_valid : in std_logic;
kin : in sfixed;
dout_valid : out std_logic;
dout : out sfixed;
dc_out : out sfixed
);
end undc_real;
architecture Behavioral of undc_real is
constant nbits_internal : integer := nbits_data + nbits_data;
constant nbits_internal_frac : integer := nbits_data_frac + nbits_data_frac;
signal x : sfixed(sproto(nbits_data, nbits_data_frac)'high downto sproto(nbits_data, nbits_data_frac)'low);
signal k : sfixed(sproto(nbits_k, nbits_k_frac)'high downto sproto(nbits_k, nbits_k_frac)'low);
signal dc : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
signal y : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
signal y1 : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
signal y2 : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
begin
dout <= resize(y, sproto(nbits_data, nbits_data_frac), saturating, rounding);
dc_out <= resize(dc, sproto(nbits_data, nbits_data_frac), fixed_wrap, fixed_truncate);
------------------------------------------------------------
proc_din_reg: process(clk, din_valid, din)
begin
if has_in_reg = true then
if rising_edge(clk) then
if srst = '1' then
x <= to_sfixed(0, x);
else
if din_valid = '1' then
x <= din;
end if;
end if;
end if;
else
x <= din;
end if;
end process;
------------------------------------------------------------
proc_valid_reg: process(clk, din_valid)
begin
if has_in_reg = true then
if rising_edge(clk) then
if srst = '1' then
dout_valid <= '0';
else
dout_valid <= din_valid;
end if;
end if;
else
dout_valid <= din_valid;
end if;
end process;
------------------------------------------------------------
proc_kin_reg: process(clk, kin_valid, kin)
begin
if rising_edge(clk) then
if srst = '1' then
k <= to_sfixed(0, k);
else
if kin_valid = '1' then
k <= kin;
end if;
end if;
end if;
end process;
------------------------------------------------------------
proc_pipe_y: process(clk, x, dc)
begin
y <= resize(x - dc, y, fixed_wrap, fixed_truncate);
if rising_edge(clk) then
if srst = '1' then
y1 <= to_sfixed(0, y1);
y2 <= to_sfixed(0, y2);
dc <= to_sfixed(0, dc);
else
y1 <= y;
y2 <= resize(y1 * k, y2, fixed_wrap, fixed_truncate);
dc <= resize(y2 + dc, dc, fixed_wrap, fixed_truncate);
end if;
end if;
end process;
------------------------------------------------------------
end Behavioral;