]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blobdiff - hw/lx_rocon_pkg.vhd
Tumbl - disable GPRF forward if finish_wrb_mem_s is clock cycle cause.
[fpga/lx-cpu1/lx-rocon.git] / hw / lx_rocon_pkg.vhd
index e256ad0b8ee41baaef04906379816e9c7d3ee9f1..59b79ebd04e0a8418f3c854025e3c2bee66e87ce 100644 (file)
@@ -3,30 +3,83 @@ use ieee.std_logic_1164.all;
 use ieee.std_logic_arith.all;
 use ieee.std_logic_unsigned.all;
 use ieee.numeric_std.all;
-use work.mbl_Pkg.all;
+use work.mbl_pkg.all;
+use work.util_pkg.all;
 
 -- Entities within lx_rocon
 
 package lx_rocon_pkg is
 
-       -- IRC register
-       component irc_register
+       -- Types
+       type IRC_INPUT_Type is record
+               a, b  : std_logic;
+               index : std_logic;
+               mark  : std_logic;
+       end record;
+       --
+       type IRC_COUNT_OUTPUT_Type is record
+               qcount      : std_logic_vector(7 downto 0);
+               index       : std_logic_vector(7 downto 0);
+               index_event : std_logic;
+       end record;
+       --
+       type IRC_STATE_OUTPUT_Type is record
+               ab_error     : std_logic;
+               index        : std_logic;
+               index_event  : std_logic;
+               mark         : std_logic;
+       end record;
+       --
+       type IRC_OUTPUT_Type is record
+               count       : IRC_COUNT_OUTPUT_Type;
+               state       : IRC_STATE_OUTPUT_Type;
+       end record;
+
+       -- Arrays
+       type IRC_INPUT_Array_Type         is array (natural range <>) of IRC_INPUT_Type;
+       type IRC_OUTPUT_Array_Type        is array (natural range <>) of IRC_OUTPUT_Type;
+       type IRC_COUNT_OUTPUT_Array_Type  is array (natural range <>) of IRC_COUNT_OUTPUT_Type;
+       type IRC_STATE_OUTPUT_Array_Type  is array (natural range <>) of IRC_STATE_OUTPUT_Type;
+
+       -- IRC coprocessor MAIN
+       component irc_proc_main
+       generic
+       (
+               num_irc_g  : positive := 4
+       );
+       port
+       (
+               -- Basic input
+               clk_i             : in std_logic;
+               reset_i           : in std_logic;
+               -- Signals from IRC
+               irc_i             : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
+               -- Index resetting
+               irc_index_reset_o : out std_logic_vector((num_irc_g-1) downto 0);
+               -- BRAM access
+               mem_clk_i         : in std_logic;
+    mem_en_i          : in std_logic;
+    mem_we_i          : in std_logic_vector(3 downto 0);
+    mem_addr_i        : in std_logic_vector(ceil_log2(num_irc_g) downto 0);
+    mem_data_i        : in std_logic_vector(31 downto 0);
+    mem_data_o        : out std_logic_vector(31 downto 0)
+       );
+       end component;
+
+       -- IRC coprocessor INC
+       component irc_proc_inc
+       generic
+       (
+               num_irc_g  : positive := 4
+       );
        port
        (
-               clk_i       : in std_logic;
-               reset_i     : in std_logic;
-               a0_i, b0_i  : in std_logic;
-               index0_i    : in std_logic;
-               mark0_i     : in std_logic;
-               -- Data bus for Master CPU
-               data_i      : in std_logic; -- 1 bit input
-               data_o      : out std_logic_vector(31 downto 0);
-               -- Chip Enable signal (two registers; one for IRC counter (readonly) other for status (R/W))
-               ce_i        : in std_logic_vector(1 downto 0);
-               -- Reading / writing signals (needs only one byte for writing)
-               rd_i        : in std_logic;
-               ta_o        : out std_logic;
-               wr_i        : in std_logic
+               -- Clock
+               clk_i   : in std_logic;
+               reset_i : in std_logic;
+               -- Output
+               op_o    : out std_logic_vector(1 downto 0);
+               axis_o  : out std_logic_vector((ceil_log2(num_irc_g)-1) downto 0)
        );
        end component;
 
@@ -35,16 +88,15 @@ package lx_rocon_pkg is
        port
        (
                -- Inputs
-    clk_i          : in std_logic;
-    reset_i        : in std_logic;
-    a0_i, b0_i     : in std_logic;
-               index0_i       : in std_logic;
-               mark0_i        : in std_logic;
+    clk_i                : in std_logic;
+    reset_i              : in std_logic;
+    irc_i                : in IRC_INPUT_Type;
+               -- State
+               reset_index_event_i  : in std_logic;
+               reset_index_event2_i : in std_logic;
+               reset_ab_error_i     : in std_logic;
                -- Outputs
-    qcount_o       : out std_logic_vector (31 downto 0);
-               qcount_index_o : out std_logic_vector (31 downto 0);
-    ab_error_o     : out std_logic;
-               mark_o         : out std_logic
+    irc_o                : out IRC_OUTPUT_Type
   );
        end component;
 
@@ -53,42 +105,173 @@ package lx_rocon_pkg is
        port
        (
                -- Inputs
-    clk_i              : in std_logic;
-    reset_i            : in std_logic;
-    a0_i, b0_i         : in std_logic;
-               index0_i           : in std_logic;
+    clk_i                : in std_logic;
+    reset_i              : in std_logic;
+    a0_i, b0_i           : in std_logic;
+               index0_i             : in std_logic;
+               -- State
+               reset_index_event_i  : in std_logic;
+               reset_index_event2_i : in std_logic;
+               reset_ab_error_i     : in std_logic;
                -- Outputs
-    qcount_o           : out std_logic_vector (31 downto 0);
-               qcount_index_o     : out std_logic_vector (31 downto 0);
-    a_rise_o, a_fall_o : out std_logic;
-               b_rise_o, b_fall_o : out std_logic;
-               ab_event_o         : out std_logic;
-    ab_error_o         : out std_logic
+    qcount_o             : out std_logic_vector(7 downto 0);
+               qcount_index_o       : out std_logic_vector(7 downto 0);
+               index_o              : out std_logic;
+               index_event_o        : out std_logic;
+               index_event2_o       : out std_logic;
+    a_rise_o, a_fall_o   : out std_logic;
+               b_rise_o, b_fall_o   : out std_logic;
+               ab_event_o           : out std_logic;
+    ab_error_o           : out std_logic
   );
        end component;
 
-       -- D sampler
-       component dff
+       -- D sampler (filtered, 2 cycles)
+       component dff2
        port
        (
     clk_i   : in std_logic;
-               reset_i : in std_logic;
     d_i     : in std_logic;
     q_o     : out std_logic
   );
   end component;
 
-       -- D sampler (filtered)
-       component dff2
+       -- D sampler (filtered, 3 cycles)
+       component dff3
        port
        (
     clk_i   : in std_logic;
-               reset_i : in std_logic;
     d_i     : in std_logic;
     q_o     : out std_logic
   );
   end component;
 
+       -- CRC8
+       component crc
+  port
+       (
+               clk_i   : in std_logic;
+    reset_i : in std_logic;
+    input_i : in std_logic;
+    crc_o   : out std_logic_vector(7 downto 0)
+  );
+       end component;
+
+       -- Counter - divider
+       component cnt_div
+       generic (
+               cnt_width_g : natural := 8
+       );
+       port
+       (
+               clk_i     : in std_logic;
+               en_i      : in std_logic;
+               reset_i   : in std_logic;
+               ratio_i   : in std_logic_vector(cnt_width_g-1 downto 0);
+               q_out_o   : out std_logic
+       );
+       end component;
+
+       -- LX Master transmitter
+       component lxmaster_transmitter
+       generic (
+               cycle_cnt_width_g : natural := 12
+       );
+       port
+       (
+               clk_i             : in std_logic;
+               reset_i           : in std_logic;
+               -- Transmision
+               clock_o           : out std_logic;
+               mosi_o            : out std_logic;
+               sync_o            : out std_logic;
+               -- Register
+               register_i        : in std_logic;
+               register_o        : out std_logic_vector(1 downto 0);
+               register_we_i     : in std_logic;
+               -- Cycle period
+               cycle_reg_i       : in std_logic_vector(cycle_cnt_width_g-1 downto 0);
+               cycle_reg_o       : out std_logic_vector(cycle_cnt_width_g-1 downto 0);
+               cycle_reg_we_i    : in std_logic;
+               -- Watchdog
+               wdog_i            : in std_logic;
+               wdog_we_i         : in std_logic;
+               -- BRAM access
+               mem_clk_i         : in std_logic;
+    mem_en_i          : in std_logic;
+    mem_we_i          : in std_logic_vector(1 downto 0);
+    mem_addr_i        : in std_logic_vector(8 downto 0);
+    mem_data_i        : in std_logic_vector(15 downto 0);
+    mem_data_o        : out std_logic_vector(15 downto 0)
+       );
+       end component;
+
+       -- LX Master receiver
+       component lxmaster_receiver
+       port
+       (
+               clk_i             : in std_logic;
+               reset_i           : in std_logic;
+               -- Transmision
+               clock_i           : in std_logic;
+               miso_i            : in std_logic;
+               sync_i            : in std_logic;
+               -- Receive done pulse
+               rx_done_o         : out std_logic;
+               -- Register
+               register_i        : in std_logic;
+               register_o        : out std_logic_vector(1 downto 0);
+               register_we_i     : in std_logic;
+               -- BRAM access
+               mem_clk_i         : in std_logic;
+               mem_en_i          : in std_logic;
+               mem_we_i          : in std_logic_vector(1 downto 0);
+               mem_addr_i        : in std_logic_vector(8 downto 0);
+               mem_data_i        : in std_logic_vector(15 downto 0);
+               mem_data_o        : out std_logic_vector(15 downto 0)
+       );
+       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
+       (
+               fifo_len_g   : positive := 8;
+               sync_adj_g   : integer := 0
+       );
+       port
+       (
+               -- Asynchronous clock domain interface
+               acd_clock_i  : in std_logic;
+               acd_miso_i   : in std_logic;
+               acd_sync_i   : in std_logic;
+               -- Clock
+               clk_i        : in std_logic;
+               reset_i      : in std_logic;
+               -- Output synchronous with clk_i
+               miso_o       : out std_logic;
+               sync_o       : out std_logic;
+               data_ready_o : out std_logic
+       );
+       end component;
+
        --------------------------------------------------------------------------------
        -- TUMBL
        --------------------------------------------------------------------------------
@@ -131,9 +314,9 @@ package lx_rocon_pkg is
     dmem_data_i  : in std_logic_vector(31 downto 0);
     dmem_data_o  : out std_logic_vector(31 downto 0);
                -- External memory bus
-               XMEMB_sel_o  : out std_logic;
-               XMEMB_i      : in DMEMB2CORE_Type;
-               XMEMB_o      : out CORE2DMEMB_Type
+               xmemb_sel_o  : out std_logic;
+               xmemb_i      : in DMEMB2CORE_Type;
+               xmemb_o      : out CORE2DMEMB_Type
        );
        end component;
 
@@ -162,8 +345,7 @@ package lx_rocon_pkg is
                clk_i  : in std_logic;
                ce_i   : in std_logic;
                adr_i  : in std_logic_vector(11 downto 2);
-               wre_i  : in std_logic;
-               bsel_i : in std_logic_vector(3 downto 0);
+               bls_i  : in std_logic_vector(3 downto 0);
                dat_i  : in std_logic_vector(31 downto 0);
                dat_o  : out std_logic_vector(31 downto 0);
                -- Memory wiring for Master CPU
@@ -182,6 +364,7 @@ package lx_rocon_pkg is
                clk_i        :  in std_logic;
                rst_i        :  in std_logic;
                clken_i      :  in std_logic;
+               gprf_finish_wrb_mem_i :  in std_logic;
                --
                ID2GPRF_i    :  in ID2GPRF_Type;
                MEM_WRB_i    :  in WRB_Type;
@@ -193,44 +376,50 @@ package lx_rocon_pkg is
        -- MEMORY BUS
        --------------------------------------------------------------------------------
 
-       -- Calibration read register
-       component calibration_read_register
+       -- Measurement register
+       component measurement_register
        generic
        (
                id_g   : std_logic_vector(31 downto 0) := (others => '0')
        );
        port
        (
-               -- Data bus (read only)
-               data_o : out std_logic_vector(31 downto 0);
+               -- Clock
+               clk_i    : in std_logic;
+               -- Reset
+               reset_i  : in std_logic;
+               -- Chip enable
+               ce_i     : in std_logic;
+               -- Switch
+               switch_i : in std_logic;
+               -- Data bus
+               data_i   : in std_logic_vector(31 downto 0);
+               data_o   : out std_logic_vector(31 downto 0);
                -- Bus signals
-               rd_i   : in std_logic;
-               ta_o   : out std_logic
+               bls_i    : in std_logic_vector(3 downto 0)
        );
        end component;
 
-       -- Calibration write register
-       component calibration_write_register
+       -- IRC interconnect
+       component bus_irc
        port
        (
-               -- Clock
-               clk_i   : in std_logic;
-               -- Reset
-               reset_i : in std_logic;
-               -- Chip enable
-               ce_i    : in std_logic;
+               clk_i        : in std_logic;
+               reset_i      : in std_logic;
                -- Data bus
-               data_i  : in std_logic_vector(31 downto 0);
-               data_o  : out std_logic_vector(31 downto 0);
-               -- Bus signals
-               rd_i    : in std_logic;
-               bls_i   : in std_logic_vector(3 downto 0);
-               ta_o    : out std_logic
+               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);
+               -- Signals for IRC
+               irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
        );
        end component;
 
-       -- Calibration interconnect
-       component bus_calibration
+       -- Measurement interconnect
+       component bus_measurement
        port
        (
                -- Clock
@@ -245,86 +434,99 @@ package lx_rocon_pkg is
                data_i    : in std_logic_vector(31 downto 0);
                data_o    : out std_logic_vector(31 downto 0);
                -- Bus signals
-               rd_i      : in std_logic;
-               bls_i     : in std_logic_vector(3 downto 0);
-               ta_o      : out std_logic
+               bls_i     : in std_logic_vector(3 downto 0)
        );
        end component;
 
-       -- IRC interconnect
-       component bus_irc
+       -- Tumbl interconnect
+       component bus_tumbl
        port
        (
+               -- Clock
                clk_i        : in std_logic;
-               reset_i      : in std_logic;
-               -- Address (needs just last 4 bits, rest is wired to CE)
-               address_i    : in std_logic_vector(3 downto 0);
+               -- Chip enable
                ce_i         : in std_logic;
+               -- Global Reset
+               reset_i      : in std_logic;
+               -- Master CPU bus for the memory
+    bls_i        : in std_logic_vector(3 downto 0);
+    address_i    : in std_logic_vector(11 downto 0);
+    data_i       : in std_logic_vector(31 downto 0);
+    data_o       : out std_logic_vector(31 downto 0);
+               -- Tumbl extrenal memory bus
+               xmemb_sel_o  : out std_logic;
+               xmemb_i      : in DMEMB2CORE_Type;
+               xmemb_o      : out CORE2DMEMB_Type
+  );
+       end component;
+
+       -- Register on the bus
+       component bus_register is
+       generic
+       (
+               -- Reset value
+               reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
+               -- Width
+               b0_g          : natural := 8;
+               b1_g          : natural := 8;
+               b2_g          : natural := 8;
+               b3_g          : natural := 8
+       );
+       port
+       (
+               -- Clock
+               clk_i         : in std_logic;
+               -- Reset
+               reset_i       : in std_logic;
+               -- Chip enable
+               ce_i          : in std_logic;
                -- Data bus
-               data_i       : in std_logic; -- 1 bit input
-               data_o       : out std_logic_vector(31 downto 0);
+               data_i        : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
+               data_o        : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
                -- Bus signals
-               rd_i         : in std_logic;
-               ta_o         : out std_logic;
-               wr_i         : in std_logic;
-               -- Signals for IRC
-               irc1_a_i     : in std_logic;
-               irc1_b_i     : in std_logic;
-               irc1_index_i : in std_logic;
-               irc1_mark_i  : in std_logic;
-               --
-               irc2_a_i     : in std_logic;
-               irc2_b_i     : in std_logic;
-               irc2_index_i : in std_logic;
-               irc2_mark_i  : in std_logic;
-               --
-               irc3_a_i     : in std_logic;
-               irc3_b_i     : in std_logic;
-               irc3_index_i : in std_logic;
-               irc3_mark_i  : in std_logic;
-               --
-               irc4_a_i     : in std_logic;
-               irc4_b_i     : in std_logic;
-               irc4_index_i : in std_logic;
-               irc4_mark_i  : in std_logic
+               bls_i         : in std_logic_vector(3 downto 0)
        );
        end component;
 
-       -- Tumbl interconnect
-       component bus_tumbl
+       -- LX Master bus interconnect
+       component bus_lxmaster
        port
        (
-               -- Clock
-               clk_100m_i      : in std_logic;
-               clk_50m_i       : in std_logic;
-               -- Chip enable
-               ce_100m_i       : in std_logic;
-               -- Global Reset
-               reset_100m_i    : in std_logic;
-               -- Master CPU bus for the memory
-    rd_100m_i       : in std_logic;
-    bls_100m_i      : in std_logic_vector(3 downto 0);
-    address_100m_i  : in std_logic_vector(11 downto 0);
-    data_100m_i     : in std_logic_vector(31 downto 0);
-    data_100m_o     : out std_logic_vector(31 downto 0);
-               ta_100m_o       : out std_logic;
-               -- Tumbl extrenal memory bus
-               XMEMB_sel_50m_o : out std_logic;
-               XMEMB_50m_i     : in DMEMB2CORE_Type;
-               XMEMB_50m_o     : out CORE2DMEMB_Type
-  );
+               clk_i        : in std_logic;
+               reset_i      : in std_logic;
+               -- Data bus
+               address_i    : in std_logic_vector(10 downto 0);
+               next_ce_i    : in std_logic;
+               data_i       : in std_logic_vector(15 downto 0);
+               data_o       : out std_logic_vector(15 downto 0);
+               --
+               bls_i        : in std_logic_vector(1 downto 0);
+               --
+               rx_done_o    : out std_logic;
+               -- Signals for LX Master
+               clock_i      : in std_logic;
+               miso_i       : in std_logic;
+               sync_i       : in std_logic;
+               --
+               clock_o      : out std_logic;
+               mosi_o       : out std_logic;
+               sync_o       : out std_logic
+       );
        end component;
 
        --------------------------------------------------------------------------------
        -- BRAM
        --------------------------------------------------------------------------------
+       type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
 
        component xilinx_dualport_bram
        generic
        (
                byte_width    : positive := 8;
                address_width : positive := 8;
-               we_width      : positive := 4
+               we_width      : positive := 4;
+               port_a_type   : BRAM_type := READ_FIRST;
+               port_b_type   : BRAM_type := READ_FIRST
        );
        port
        (