]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/commitdiff
Include initial stub of function generator to LX HW design.
authorPavel Pisa <ppisa@pikron.com>
Sun, 30 Nov 2014 16:31:50 +0000 (17:31 +0100)
committerPavel Pisa <ppisa@pikron.com>
Sun, 30 Nov 2014 16:31:50 +0000 (17:31 +0100)
Signed-off-by: Pavel Pisa <ppisa@pikron.com>
hw/lx-fncapprox/lx_fncapprox.vhd [new file with mode: 0644]
hw/lx-fncapprox/reci_tab_a.lut [new file with mode: 0644]
hw/lx-fncapprox/reci_tab_bc.lut [new file with mode: 0644]
hw/lx-fncapprox/rom_table.vhd [new file with mode: 0644]
hw/lx_rocon_pkg.vhd
hw/lx_rocon_top.prj
hw/lx_rocon_top.vhd

diff --git a/hw/lx-fncapprox/lx_fncapprox.vhd b/hw/lx-fncapprox/lx_fncapprox.vhd
new file mode 100644 (file)
index 0000000..d8ed833
--- /dev/null
@@ -0,0 +1,110 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+use ieee.numeric_std.all;
+use work.mbl_pkg.all;
+use work.lx_rocon_pkg.all;
+
+-- IRC bus interconnect
+entity lx_fncapprox is
+       port
+       (
+               clk_i        : in std_logic;
+               reset_i      : in std_logic;
+               -- Data bus
+               address_i    : in std_logic_vector(4 downto 0);
+               next_ce_i    : in std_logic;
+               data_i       : in std_logic_vector(31 downto 0);
+               data_o       : out std_logic_vector(31 downto 0);
+               --
+               bls_i        : in std_logic_vector(3 downto 0)
+       );
+end lx_fncapprox;
+
+architecture Behavioral of lx_fncapprox is
+
+       component rom_table
+       generic
+       (
+               data_width : integer;
+               addr_width : integer;
+               init_file  : string
+       );
+       port
+       (
+               ack_o  : out std_logic;
+               addr_i : in  std_logic_vector (addr_width-1 downto 0);
+               clk_i  : in  std_logic;
+               data_o : out std_logic_vector (data_width-1 downto 0);
+               stb_i  : in  std_logic
+       );
+       end component;
+
+       signal ce_s                 : std_logic;
+
+       signal reci_tab_idx_s       : std_logic_vector(7 downto 0);
+       signal reci_tab_idx_r       : std_logic_vector(7 downto 0);
+       signal reci_tab_a_data_s    : std_logic_vector(35 downto 0);
+       signal reci_tab_a_data_r    : std_logic_vector(35 downto 0);
+
+       signal reci_tab_a_ack_s     : std_logic;
+       signal reci_tab_a_stb_s     : std_logic;
+begin
+
+reci_tab_a : rom_table
+       generic map (
+               data_width => 36,
+               addr_width => 8,
+               init_file  => "reci_tab_a.lut"
+       )
+       port map
+       (
+               clk_i  => clk_i,
+               stb_i  => reci_tab_a_stb_s,
+               addr_i => reci_tab_idx_s,
+               data_o => reci_tab_a_data_s,
+               ack_o  => reci_tab_a_ack_s
+       );
+
+
+wire_in:
+       process(next_ce_i, ce_s, bls_i, address_i, data_i, reci_tab_idx_r)
+       begin
+               -- init values
+               reci_tab_a_stb_s     <= '0';
+               reci_tab_idx_s <= reci_tab_idx_r;
+
+               -- Incoming bus request
+               if next_ce_i = '1' then
+                       if bls_i(0) = '1' then
+                               reci_tab_a_stb_s <= '1';
+                               reci_tab_idx_s <= data_i(7 downto 0);
+                       end if;
+               end if;
+       end process;
+
+wire_out:
+       process(ce_s, reci_tab_a_data_r)
+       begin
+
+               data_o <= (others => '0');
+
+               if ce_s = '1' then
+                       data_o <= reci_tab_a_data_r(35 downto 4);
+               end if;
+       end process;
+
+update:
+       process
+       begin
+               wait until clk_i'event and clk_i= '1';
+               ce_s      <= next_ce_i;
+               if reci_tab_a_ack_s = '1' then
+                       reci_tab_a_data_r <= reci_tab_a_data_s;
+               end if;
+
+               reci_tab_idx_r <= reci_tab_idx_s;
+       end process;
+
+end Behavioral;
+
diff --git a/hw/lx-fncapprox/reci_tab_a.lut b/hw/lx-fncapprox/reci_tab_a.lut
new file mode 100644 (file)
index 0000000..0a80905
--- /dev/null
@@ -0,0 +1,256 @@
+100000000000000000000000000000000000
+011111111000000001111111100000001000
+011111110000000111111100000001111111
+011111101000010001110010101010000000
+011111100000011111100000011111100000
+011111011000110001000010101100101000
+011111010001000110010110011110010011
+011111001001011111011001000100001001
+011111000001111100000111110000011111
+011110111010011100011111111000010001
+011110110011000000011110110011000000
+011110101011101000000001111010101111
+011110100100010011000110101011111100
+011110011101000001101010100101100110
+011110010101110011101011001001000000
+011110001110101001000101111001110111
+011110000111100001111000011110001000
+011110000000011110000000011110000000
+011101111001011101011011100011111110
+011101110010100000000111011100101000
+011101101011100110000001110110101110
+011101100100101111001000100011001000
+011101011101111011011001010100101110
+011101010111001010110010000000011101
+011101010000011101010000011101010000
+011101001001110010110010100011111111
+011101000011001011010110001111011100
+011100111100100110111001011100010001
+011100110110000101011010001001000001
+011100101111100110110110010110000000
+011100101001001011001100000101011000
+011100100010110010011001011010111111
+011100011100011100011100011100011100
+011100010110001001010011010001000011
+011100001111111000111100000001110001
+011100001001101011010100111001001100
+011100000011100000011100000011100000
+011011111101011000001111101110100010
+011011110111010010101110001001100101
+011011110001001111110101100101100010
+011011101011001111100100010100110000
+011011100101010001111000101011000110
+011011011111010110110000111101110111
+011011011001011110001011100011110000
+011011010011101000000110110100111010
+011011001101110100100001001010110110
+011011001000000011011001000000011011
+011011000010010100101100110001110110
+011010111100101000011010111100101000
+011010110110111110100001111111100101
+011010110001010111000000011010110001
+011010101011110001110100101111100010
+011010100110001110111101100000011011
+011010100000101110011001010001001100
+011010011011010000000110100110110100
+011010010101110100000100000111011010
+011010010000011010010000011010010000
+011010001011000010101010000111110001
+011010000101101101001111111001011111
+011010000000011010000000011010000000
+011001111011001000111010010101000100
+011001110101111001111100010111011011
+011001110000101101000101001110111001
+011001101011100010010011101010010101
+011001100110011001100110011001100110
+011001100001010010111100001101100100
+011001011100001110010011111000000011
+011001010111001011101100001011111001
+011001010010001011000011111100110110
+011001001101001100011001111111100111
+011001001000001111101101001001110100
+011001000011010100111100010010000000
+011000111110011100000110001111100111
+011000111001100101001001111010111100
+011000110100110000000110001101001100
+011000101111111100111010000000011001
+011000101011001011100100001111011011
+011000100110011100000011110110000000
+011000100001101110010111110000101011
+011000011101000010011110111100110000
+011000011000011000011000011000011000
+011000010011110000000011000010011110
+011000001111001001011101111010101101
+011000001010100100101000000001100001
+011000000110000001100000011000000110
+011000000001100000000110000000011000
+010111111101000000010111111101000000
+010111111000100010010101010001010111
+010111110100000101111101000001011111
+010111101111101011001110010010001100
+010111101011010010001000001000111000
+010111100110111010101001101011101110
+010111100010100100110010000001011110
+010111011110010000100000010001100111
+010111011001111101110011100100001101
+010111010101101100101011000010000000
+010111010001011101000101110100010111
+010111001101001111000011000101010000
+010111001001000010100001111111010010
+010111000100110111100001101101100111
+010111000000101110000001011100000011
+010110111100100110000000010110111101
+010110111000011111011101101011010001
+010110110100011010011000100110100000
+010110110000010110110000010110110000
+010110101100010100100100001010101001
+010110101000010011110011010001010101
+010110100100010100011100111010100010
+010110100000010110100000010110100000
+010110011100011001111100110110000000
+010110011000011110110001101010010100
+010110010100100100111110000101001111
+010110010000101100100001011001000011
+010110001100110101011010111000100011
+010110001000111111101001110111000000
+010110000101001011001101101000001100
+010110000001011000000101100000010110
+010101111101100110010000110100001010
+010101111001110101101110111000110100
+010101110110000110011111000011111011
+010101110010011000100000101011100101
+010101101110101011110011000110010010
+010101101011000000010101101011000000
+010101100111010110000111110001001001
+010101100011101101001000110000100000
+010101100000000101011000000001010110
+010101011100011110110100111100010100
+010101011000111001011110111010011111
+010101010101010101010101010101010101
+010101010001110010010111100110101111
+010101001110010000100101001000111101
+010101001010101111111101010110101010
+010101000111010000011111101010111001
+010101000011110010001011100001000100
+010101000000010101000000010101000000
+010100111100111000111101100010110111
+010100111001011110000010100111001100
+010100110110000100001110111110110111
+010100110010101011100010000111001001
+010100101111010011111011011101101010
+010100101011111101011010100000010101
+010100101000100111111110101101011110
+010100100101010011100111100011101101
+010100100010000000010100100010000000
+010100011110101110000101000111101100
+010100011011011100111000110100010110
+010100011000001100101111000111111101
+010100010100111101100111100010110010
+010100010001101111100001100101011001
+010100001110100010011100110000101011
+010100001011010110011000100101110101
+010100001000001011010100100110011000
+010100000101000001010000010100000101
+010100000001111000001011010001000100
+010011111110110000000100111111101100
+010011111011101000111101000010101001
+010011111000100010110010111100111001
+010011110101011101100110010001101011
+010011110010011001010110100100011111
+010011101111010110000011011001001001
+010011101100010011101100010011101100
+010011101001010010010000111000011111
+010011100110010001110000101100000110
+010011100011010010001011010011011010
+010011100000010011100000010011100000
+010011011101010101101111010001110010
+010011011010011000110111110011111000
+010011010111011100111001011111101000
+010011010100100001110011111011001011
+010011010001100111100110101100111000
+010011001110101110010001011011010110
+010011001011110101110011101101011011
+010011001000111110001101001010001011
+010011000110000111011101011000111010
+010011000011010001100100000001001100
+010011000000011100100000101010110001
+010010111101101000010010111101101000
+010010111010110100111010100010000000
+010010111000000010010111000000010011
+010010110101010000101000000001001011
+010010110010011111101101001101100000
+010010101111101111100110001110010111
+010010101101000000010010101101000000
+010010101010010001110010010010111101
+010010100111100100000100101001111001
+010010100100110111001001011011101110
+010010100010001011000000010010100010
+010010011111011111101000111000101000
+010010011100110101000010111000100000
+010010011010001011001101111100110110
+010010010111100010001001110000100000
+010010010100111001110101111110100100
+010010010010010010010010010010010010
+010010001111101011011110010111000110
+010010001101000101011001111000100111
+010010001010100000000100100010101000
+010010000111111011011110000001001000
+010010000101010111100110000000010010
+010010000010110100011100001100011010
+010010000000010010000000010010000000
+010001111101110000010001111101110000
+010001111011001111010000111100100000
+010001111000101110111100111011010000
+010001110110001111010101100111001100
+010001110011110000011010101101101001
+010001110001010010001011111100000111
+010001101110110100101001000000010010
+010001101100010111110001100111111101
+010001101001111011100101100001000111
+010001100111100000000100011001111000
+010001100101000101001110000000100011
+010001100010101011000010000011100100
+010001100000010001100000010001100000
+010001011101111000101000011001000111
+010001011011100000011010001001010001
+010001011001001000110101010000111111
+010001010110110001111001011111011101
+010001010100011011100110100011111111
+010001010010000101111100001110000011
+010001001111110000111010001101001101
+010001001101011100100000010001001101
+010001001011001000101110001001111011
+010001001000110101100011100111010111
+010001000110100011000000011001101010
+010001000100010001000100010001000100
+010001000001111111101110111110000000
+010000111111101111000000010001000000
+010000111101011110110111111010101101
+010000111011001111010101101011111010
+010000111001000000011001010101100001
+010000110110110010000010101000100100
+010000110100100100010001010110001101
+010000110010010111000101001111101111
+010000110000001010011110000110100011
+010000101101111110011011101100001001
+010000101011110010111101110010001100
+010000101001101000000100001010011010
+010000100111011101101110100110101100
+010000100101010011111100111001000000
+010000100011001010101110110011011101
+010000100001000010000100001000010001
+010000011110111001111100101001101110
+010000011100110010011000001010010010
+010000011010101011010110011100011110
+010000011000100100110111010010111100
+010000010110011110111010100000011101
+010000010100011001011111110111110110
+010000010010010100100111001100000110
+010000010000010000010000010000010000
+010000001110001100011010110111100001
+010000001100001001000110110101001000
+010000001010000110010011111100011110
+010000001000000100000010000001000001
+010000000110000010010000110110010100
+010000000100000001000000010000000100
+010000000010000000010000000010000000
diff --git a/hw/lx-fncapprox/reci_tab_bc.lut b/hw/lx-fncapprox/reci_tab_bc.lut
new file mode 100644 (file)
index 0000000..d74a2ef
--- /dev/null
@@ -0,0 +1,256 @@
+111111111111111110111111101000000111
+111111100000001010111110111000110110
+111111000000101101111110001010010101
+111110100001101000111101011100100000
+111110000010111001111100101111011001
+111101100100100010111100000010111110
+111101000110100000111011010111001110
+111100101000110101111010101100001000
+111100001011011111111010000001101011
+111011101110011110111001010111111000
+111011010001110010111000101110101100
+111010110101011011111000000110001000
+111010011001011000110111011110001011
+111001111101101001110110110110110011
+111001100010001110110110010000000000
+111001000111000101110101101001110010
+111000101100010001110101000100000111
+111000010001101110110100011111000000
+110111110111011111110011111010011011
+110111011101100010110011010110011000
+110111000011110110110010110010110110
+110110101010011101110010001111110101
+110110010001010110110001101101010100
+110101111000011110110001001011010010
+110101011111111001110000101001101111
+110101000111100101110000001000101011
+110100101111100000101111101000000101
+110100010111101011101111000111111100
+110100000000001000101110101000010000
+110011101000110100101110001001000000
+110011010001101111101101101010001100
+110010111010111010101101001011110011
+110010100100010100101100101101110101
+110010001101111110101100010000010010
+110001110111110101101011110011001000
+110001100001111100101011010110011000
+110001001100010001101010111010000001
+110000110110110100101010011110000011
+110000100001100101101010000010011101
+110000001100100011101001100111001111
+101111110111110000101001001100011000
+101111100011001010101000110001111000
+101111001110110000101000010111101111
+101110111010100101100111111101111100
+101110100110100110100111100100011111
+101110010010110011100111001011011000
+101101111111001110100110110010100110
+101101101011110101100110011010001000
+101101011000101000100110000001111111
+101101000101100111100101101010001011
+101100110010110001100101010010101010
+101100100000001000100100111011011101
+101100001101101011100100100100100010
+101011111011011000100100001101111011
+101011101001010001100011110111100110
+101011010111010110100011100001100100
+101011000101100100100011001011110100
+101010110011111111100010110110010101
+101010100010100100100010100001001000
+101010010001010100100010001100001011
+101010000000001101100001110111100000
+101001101111010001100001100011000110
+101001011110100000100001001110111011
+101001001101111000100000111011000001
+101000111101011011100000100111010111
+101000101101000111100000010011111100
+101000011100111110100000000000110001
+101000001100111101011111101101110101
+100111111101000110011111011011000111
+100111101101011001011111001000101001
+100111011101110100011110110110011000
+100111001110011001011110100100010111
+100110111111000111011110010010100011
+100110101111111110011110000000111100
+100110100000111101011101101111100100
+100110010010000101011101011110011001
+100110000011010110011101001101011011
+100101110100110000011100111100101010
+100101100110010001011100101100000101
+100101010111111011011100011011101110
+100101001001101101011100001011100011
+100100111011100111011011111011100100
+100100101101101001011011101011110001
+100100011111110100011011011100001010
+100100010010000110011011001100101110
+100100000100011111011010111101011110
+100011110111000000011010101110011010
+100011101001101001011010011111100001
+100011011100011010011010010000110010
+100011001111010001011010000010001111
+100011000010010000011001110011110111
+100010110101010110011001100101101000
+100010101000100011011001010111100101
+100010011011111000011001001001101011
+100010001111010010011000111011111100
+100010000010110101011000101110010111
+100001110110011110011000100000111011
+100001101010001101011000010011101010
+100001011110000011011000000110100010
+100001010010000000010111111001100011
+100001000110000100010111101100101101
+100000111010001101010111100000000001
+100000101110011101010111010011011110
+100000100010110011010111000111000011
+100000010111010000010110111010110010
+100000001011110010010110101110101001
+100000000000011011010110100010101001
+011111110101001010010110010110110001
+011111101001111110010110001011000001
+011111011110111000010101111111011010
+011111010011111001010101110011111011
+011111001001000000010101101000100011
+011110111110001011010101011101010100
+011110110011011100010101010010001100
+011110101000110011010101000111001100
+011110011110010000010100111100010100
+011110010011110010010100110001100011
+011110001001011000010100100110111001
+011101111111000110010100011100010111
+011101110100110111010100010001111011
+011101101010101110010100000111100111
+011101100000101010010011111101011010
+011101010110101011010011110011010100
+011101001100110010010011101001010100
+011101000010111101010011011111011100
+011100111001001110010011010101101001
+011100101111100010010011001011111110
+011100100101111101010011000010011001
+011100011100011100010010111000111010
+011100010010111111010010101111100001
+011100001001100111010010100110001111
+011100000000010100010010011101000011
+011011110111000101010010010011111101
+011011101101111100010010001010111100
+011011100100110110010010000010000010
+011011011011110101010001111001001101
+011011010010111001010001110000011111
+011011001010000000010001100111110110
+011011000001001100010001011111010010
+011010111000011101010001010110110100
+011010101111110001010001001110011100
+011010100111001010010001000110001000
+011010011110100111010000111101111011
+011010010110001000010000110101110010
+011010001101101101010000101101101111
+011010000101010111010000100101110000
+011001111101000100010000011101110111
+011001110100110101010000010110000011
+011001101100101010010000001110010100
+011001100100100010010000000110101001
+011001011100011111001111111111000100
+011001010100011111001111110111100011
+011001001100100100001111110000000111
+011001000100101100001111101000101111
+011000111100111000001111100001011100
+011000110101000111001111011010001110
+011000101101011001001111010011000100
+011000100101110000001111001011111110
+011000011110001010001111000100111101
+011000010110101000001110111110000000
+011000001111001000001110110111001000
+011000000111101110001110110000010011
+011000000000010101001110101001100011
+010111111001000000001110100010110111
+010111110001101111001110011100001111
+010111101010100001001110010101101011
+010111100011010110001110001111001011
+010111011100001111001110001000101111
+010111010101001010001110000010010111
+010111001110001001001101111100000010
+010111000111001011001101110101110010
+010111000000001111001101101111100101
+010110111001011000001101101001011100
+010110110010100011001101100011010110
+010110101011110010001101011101010100
+010110100101000011001101010111010110
+010110011110010111001101010001011011
+010110010111101110001101001011100011
+010110010001001001001101000101110000
+010110001010100101001100111111111111
+010110000100000110001100111010010010
+010101111101101001001100110100101000
+010101110111001110001100101111000010
+010101110000110111001100101001011110
+010101101010100010001100100011111110
+010101100100010000001100011110100010
+010101011110000001001100011001001000
+010101010111110100001100010011110001
+010101010001101010001100001110011110
+010101001011100100001100001001001101
+010101000101011111001100000100000000
+010100111111011101001011111110110101
+010100111001011101001011111001101110
+010100110011100001001011110100101001
+010100101101100110001011101111100111
+010100100111101110001011101010101001
+010100100001111001001011100101101100
+010100011100000110001011100000110011
+010100010110010101001011011011111101
+010100010000101000001011010111001001
+010100001010111100001011010010011000
+010100000101010011001011001101101001
+010011111111101101001011001000111101
+010011111010001000001011000100010100
+010011110100100101001010111111101101
+010011101111000101001010111011001001
+010011101001101000001010110110100111
+010011100100001101001010110010001000
+010011011110110100001010101101101100
+010011011001011101001010101001010001
+010011010100001001001010100100111010
+010011001110110110001010100000100100
+010011001001100110001010011100010001
+010011000100011000001010011000000001
+010010111111001011001010010011110010
+010010111010000001001010001111100110
+010010110100111001001010001011011100
+010010101111110100001010000111010101
+010010101010110000001010000011001111
+010010100101101110001001111111001100
+010010100000101111001001111011001011
+010010011011110001001001110111001100
+010010010110110110001001110011001111
+010010010001111100001001101111010101
+010010001101000100001001101011011100
+010010001000001111001001100111100110
+010010000011011011001001100011110001
+010001111110101001001001011111111111
+010001111001111010001001011100001110
+010001110101001100001001011000100000
+010001110000011111001001010100110011
+010001101011110101001001010001001001
+010001100111001100001001001101100000
+010001100010100101001001001001111001
+010001011110000000001001000110010101
+010001011001011101001001000010110010
+010001010100111011001000111111010000
+010001010000011100001000111011110001
+010001001011111111001000111000010100
+010001000111100010001000110100111000
+010001000011001000001000110001011110
+010000111110101111001000101110000101
+010000111010011000001000101010101111
+010000110110000010001000100111011010
+010000110001101111001000100100000111
+010000101101011101001000100000110110
+010000101001001100001000011101100110
+010000100100111101001000011010011000
+010000100000110000001000010111001011
+010000011100100101001000010100000000
+010000011000011011001000010000110111
+010000010100010010001000001101101111
+010000010000001011001000001010101001
+010000001100000110001000000111100101
+010000001000000011001000000100100010
+010000000100000000001000000001100000
diff --git a/hw/lx-fncapprox/rom_table.vhd b/hw/lx-fncapprox/rom_table.vhd
new file mode 100644 (file)
index 0000000..02c6f7c
--- /dev/null
@@ -0,0 +1,91 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+library std;
+use std.textio.all;
+
+--------------------------------------------------------------------------------
+-- ROM based Up Table
+--
+-- It's based on behavioral description of full synchronous RAM, so it should be
+-- mapped into FPGA BRAM. Interface is Wishbone like. Data and address bus width
+-- is configurable.
+--
+-- Table is initialized from file specified by 'init_file' parameter. This is a
+-- text file which contains one value per line. Values are typed in binary
+-- format.  Sample file 'sin.lut' together with Matlab generation function
+-- 'gen_lut_sin.m' is enclosed.
+--------------------------------------------------------------------------------
+
+entity rom_table is
+       generic (
+               data_width : integer := 10;
+               addr_width : integer := 9;
+               init_file  : string  := "reci_tab_a.lut");
+       port (
+               ack_o  : out std_logic;
+               addr_i : in  std_logic_vector (addr_width-1 downto 0);
+               clk_i  : in  std_logic;
+               data_o : out std_logic_vector (data_width-1 downto 0);
+               stb_i  : in  std_logic
+       );
+end entity rom_table;
+
+--------------------------------------------------------------------------------
+
+architecture behavioral of rom_table is
+
+       constant table_size : integer := 2**addr_width;
+
+       type rom_table_t is array (0 to table_size-1) of bit_vector (data_width-1 downto 0);
+
+       impure function init_table_from_file (file_name : string) return rom_table_t is
+               file table_file    : text open read_mode is file_name;
+               variable file_line : line;
+               variable table     : rom_table_t;
+       begin
+               for i in rom_table_t'range loop
+                       loop
+                               if (endfile(table_file)) and (i /= 0) then
+                                       -- Repeat file data when not enough data to fill
+                                       file_close(table_file);
+                                       file_open(table_file, file_name, read_mode);
+                               end if;
+                               readline(table_file, file_line);
+                               exit when file_line'length /= 0;
+                       end loop;
+
+                       read(file_line, table(i));
+
+               end loop;
+
+               return table;
+       end function init_table_from_file;
+
+       signal ram : rom_table_t := init_table_from_file(init_file);
+
+       signal stb_delayed : std_logic;
+
+--------------------------------------------------------------------------------
+
+begin
+
+mem_context : process (clk_i, addr_i) is
+       variable address : integer;
+       begin
+               address := conv_integer(addr_i);
+
+               if rising_edge(clk_i) then
+                       stb_delayed <= stb_i;
+
+                       if stb_i = '1' then
+                               data_o <= to_stdLogicVector(ram(address));
+                       end if;
+               end if;
+       end process;
+
+       ack_o <= stb_delayed;
+
+end architecture behavioral;
index 3251cd66baf1495ff52e0c3d1e582273d0860596..85bec18e83dd2ac094e809215dad9a5abd843e9b 100644 (file)
@@ -232,6 +232,23 @@ package lx_rocon_pkg is
        );
        end component;
 
+       -- LX math functions approximation
+
+       component lx_fncapprox
+       port
+       (
+               clk_i        : in std_logic;
+               reset_i      : in std_logic;
+               -- Data bus
+               address_i    : in std_logic_vector(4 downto 0);
+               next_ce_i    : in std_logic;
+               data_i       : in std_logic_vector(31 downto 0);
+               data_o       : out std_logic_vector(31 downto 0);
+               --
+               bls_i        : in std_logic_vector(3 downto 0)
+       );
+       end component;
+
        -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
        component lx_crosdom_ser_fifo
        generic
index 3ae7f9dba8ca701fb973a8a651ea8acae0b8ffa3..503996e73bbcafc7dc1ec9a1a6810bceb199751a 100644 (file)
@@ -8,6 +8,8 @@ vhdl work "tumbl/fetch.vhd"
 vhdl work "tumbl/exeq.vhd"
 vhdl work "tumbl/decode.vhd"
 vhdl work "tumbl/core_ctrl.vhd"
+vhdl work "lx-fncapprox/lx_fncapprox.vhd"
+vhdl work "lx-fncapprox/rom_table.vhd"
 vhdl work "qcounter.vhd"
 vhdl work "lx-rocon_tumbl/lx_rocon_imem.vhd"
 vhdl work "lx-rocon_tumbl/lx_rocon_gprf_abd.vhd"
index 74cf8452a8692d43716643950a829913f4de3d3f..48ebe35f4fb3b8484097a0a9c2b4d5a647c9f0b8 100644 (file)
@@ -115,6 +115,10 @@ architecture Behavioral of lx_rocon_top is
        signal lxmaster_out_s           : std_logic_vector(15 downto 0);
        signal lxmaster_ce_s            : std_logic;
        signal lxmaster_next_ce_s       : std_logic;
+       -- LX function approximation
+       signal lxfncapprox_out_s        : std_logic_vector(31 downto 0);
+       signal lxfncapprox_ce_s         : std_logic;
+       signal lxfncapprox_next_ce_s    : std_logic;
        -- Signals for external bus transmission
        signal data_i_s                 : std_logic_vector(31 downto 0);
        signal data_o_s                 : std_logic_vector(31 downto 0);
@@ -310,6 +314,19 @@ memory_bus_lxmaster: bus_lxmaster
        -- s1_sync_out     <= s2;
 
 
+function_approx: component lx_fncapprox
+       port map
+       (
+               reset_i      => reset_s,
+               clk_i        => clk_50m,
+               -- Data bus
+               address_i      => tumbl_address_s(4 downto 0),
+               next_ce_i      => lxfncapprox_next_ce_s,
+               data_i         => tumbl_data_i_s,
+               data_o         => lxfncapprox_out_s,
+               bls_i          => tumbl_bls_s
+       );
+
 -- Reset
 dff_reset: dff2
        port map
@@ -465,6 +482,7 @@ memory_bus_update:
                -- Just copy these to their desired next state
                irc_proc_ce_s <= irc_proc_next_ce_s;
                lxmaster_ce_s <= lxmaster_next_ce_s;
+               lxfncapprox_ce_s <= lxfncapprox_next_ce_s;
 
        end process;
 
@@ -535,6 +553,7 @@ tumbl_bus_o:
                -- Defaults
                irc_proc_next_ce_s        <= '0';
                lxmaster_next_ce_s        <= '0';
+               lxfncapprox_next_ce_s     <= '0';
                master_tumbl_xmem_lock_s  <= '0';
                --
                addr_v                    := (others => '0');
@@ -556,6 +575,8 @@ tumbl_bus_o:
                        -- LX MASTER: 0x1000 - 0x17FF (32-bit address)
                        if addr_v(14 downto 5) = "0001000000" then
                                irc_proc_next_ce_s     <= '1';
+                       elsif addr_v(14 downto 5) = "0001000001" then
+                               lxfncapprox_next_ce_s  <= '1';
                        elsif addr_v(14 downto 11) = "0010" then
                                lxmaster_next_ce_s     <= '1';
                        end if;
@@ -565,7 +586,8 @@ tumbl_bus_o:
 
 -- Inputs to Tumbl (enabling and address muxing)
 tumbl_bus_i:
-       process(irc_proc_ce_s, irc_proc_out_s, lxmaster_ce_s, lxmaster_out_s, tumbl_xmemb_i_s)
+       process(irc_proc_ce_s, irc_proc_out_s, lxmaster_ce_s, lxmaster_out_s,
+               lxfncapprox_ce_s, lxfncapprox_out_s, tumbl_xmemb_i_s)
        begin
 
                tumbl_xmemb_i_s.data  <= (others => 'X');
@@ -578,6 +600,8 @@ tumbl_bus_i:
                elsif lxmaster_ce_s = '1' then
                        tumbl_xmemb_i_s.data(15 downto 0)  <= lxmaster_out_s;
                        tumbl_xmemb_i_s.data(31 downto 16) <= (others => '0');
+               elsif lxfncapprox_ce_s = '1' then
+                       tumbl_xmemb_i_s.data <= lxfncapprox_out_s;
                end if;
 
                master_tumbl_xmem_out_s <= tumbl_xmemb_i_s.data;