2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.all;
4 use ieee.numeric_std.all;
6 use work.lx_rocon_pkg.all;
8 -- IRC bus interconnect
13 reset_i : in std_logic;
15 address_i : in std_logic_vector(4 downto 0);
16 next_ce_i : in std_logic;
17 data_i : in std_logic_vector(31 downto 0);
18 data_o : out std_logic_vector(31 downto 0);
20 bls_i : in std_logic_vector(3 downto 0)
24 architecture Behavioral of lx_fncapprox is
35 ack_o : out std_logic;
36 addr_i : in std_logic_vector (addr_width-1 downto 0);
38 data_o : out std_logic_vector (data_width-1 downto 0);
43 constant approx_tab_bits : natural := 8;
44 constant approx_frac_bits : natural := 18;
46 constant reci_tab_b_shift : natural := 9;
47 constant reci_tab_c_shift : natural := 25;
49 signal ce_s : std_logic;
51 signal approx_tab_idx_s : std_logic_vector(approx_tab_bits-1 downto 0);
52 signal approx_tab_idx_r : std_logic_vector(approx_tab_bits-1 downto 0);
53 signal approx_frac_s : std_logic_vector(approx_frac_bits-1 downto 0);
54 signal approx_frac_r : std_logic_vector(approx_frac_bits-1 downto 0);
55 signal reci_tab_a_data_s : std_logic_vector(35 downto 0);
56 signal reci_tab_a_data_r : std_logic_vector(35 downto 0);
57 signal reci_tab_bc_data_s : std_logic_vector(35 downto 0);
58 signal reci_tab_bc_data_r : std_logic_vector(35 downto 0);
60 signal reci_tab_b_shifted_r : std_logic_vector(47 downto 0);
61 signal reci_tab_a_shifted_r : std_logic_vector(47 downto 0);
62 signal frac_c_mult_s : std_logic_vector(47 downto 0);
63 signal frac2_bc_mult_s : std_logic_vector(47 downto 0);
65 signal approx_result_s : std_logic_vector(31 downto 0);
67 signal reci_tab_a_ack_s : std_logic;
68 signal reci_tab_a_ack_r : std_logic;
69 signal reci_tab_a_stb_s : std_logic;
71 signal reci_tab_bc_ack_s : std_logic;
72 signal reci_tab_bc_ack_r : std_logic;
73 signal reci_tab_bc_stb_s : std_logic;
76 reci_tab_a : rom_table
79 addr_width => approx_tab_bits,
80 init_file => "reci_tab_a.lut"
85 stb_i => reci_tab_a_stb_s,
86 addr_i => approx_tab_idx_s,
87 data_o => reci_tab_a_data_s,
88 ack_o => reci_tab_a_ack_s
91 reci_tab_bc : rom_table
94 addr_width => approx_tab_bits,
95 init_file => "reci_tab_bc.lut"
100 stb_i => reci_tab_bc_stb_s,
101 addr_i => approx_tab_idx_s,
102 data_o => reci_tab_bc_data_s,
103 ack_o => reci_tab_bc_ack_s
107 process(next_ce_i, ce_s, bls_i, address_i, data_i, approx_tab_idx_r, approx_frac_r)
110 reci_tab_a_stb_s <= '0';
111 reci_tab_bc_stb_s <= '0';
112 approx_tab_idx_s <= approx_tab_idx_r;
113 approx_frac_s <= approx_frac_r;
115 -- Incoming bus request
116 if next_ce_i = '1' then
117 if bls_i(0) = '1' then
118 reci_tab_a_stb_s <= '1';
119 reci_tab_bc_stb_s <= '1';
120 approx_tab_idx_s <= data_i(30 downto
121 30 - approx_tab_bits + 1);
122 approx_frac_s <= data_i(30 - approx_tab_bits downto
123 30 - approx_tab_bits - approx_frac_bits + 1);
129 process(ce_s, approx_result_s)
132 data_o <= (others => '0');
135 data_o <= approx_result_s;
142 wait until clk_i'event and clk_i= '1';
144 if reci_tab_a_ack_s = '1' then
145 reci_tab_a_data_r <= reci_tab_a_data_s;
147 if reci_tab_bc_ack_s = '1' then
148 reci_tab_bc_data_r <= reci_tab_bc_data_s;
151 -- yl = reci_tab_a[ti];
152 -- yl -= ((reci_tab_b[ti] - ((reci_tab_c[ti] * xd) >> RECI_TAB_C_SHIFT)) * xd) >> RECI_TAB_B_SHIFT;
154 reci_tab_b_shifted_r(reci_tab_c_shift - 1 downto 0) <= (others => '0');
155 reci_tab_b_shifted_r(reci_tab_c_shift + 17 downto reci_tab_c_shift) <= reci_tab_bc_data_r(35 downto 18);
156 reci_tab_b_shifted_r(47 downto reci_tab_c_shift + 18) <= (others => '0');
158 frac_c_mult_s <= std_logic_vector(unsigned(reci_tab_b_shifted_r) -
159 (unsigned(reci_tab_bc_data_r(17 downto 0)) * unsigned(approx_frac_r)));
161 reci_tab_a_shifted_r(reci_tab_b_shift - 1 downto 0) <= (others => '0');
162 reci_tab_a_shifted_r(reci_tab_b_shift + 35 downto reci_tab_b_shift) <= reci_tab_a_data_r;
163 reci_tab_a_shifted_r(47 downto reci_tab_b_shift + 36) <= (others => '0');
165 frac2_bc_mult_s <= std_logic_vector(unsigned(reci_tab_a_shifted_r) -
166 unsigned(frac_c_mult_s(reci_tab_c_shift + 17 downto reci_tab_c_shift)) *
167 unsigned(approx_frac_r));
169 approx_result_s <= frac2_bc_mult_s(reci_tab_b_shift + 35 downto reci_tab_b_shift + 4);
171 reci_tab_a_ack_r <= reci_tab_a_ack_s;
172 reci_tab_bc_ack_r <= reci_tab_bc_ack_s;
173 approx_tab_idx_r <= approx_tab_idx_s;
174 approx_frac_r <= approx_frac_s;