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
mark : std_logic;
end record;
--
- type IRC_OUTPUT_Type is 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;
- ab_error : std_logic;
- mark : std_logic;
end record;
--
- type IRC_SLIM_OUTPUT_Type is record
- qcount : std_logic_vector(7 downto 0);
- index : std_logic_vector(7 downto 0);
- index_event : std_logic;
+ 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
- irc1_i : in IRC_SLIM_OUTPUT_Type;
- irc2_i : in IRC_SLIM_OUTPUT_Type;
- irc3_i : in IRC_SLIM_OUTPUT_Type;
- irc4_i : in IRC_SLIM_OUTPUT_Type;
+ irc_i : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
-- Index resetting
- irc_index_reset_o : out std_logic_vector(3 downto 0);
- -- BRAM access (the other port)
+ 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(2 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)
);
-- IRC coprocessor INC
component irc_proc_inc
+ generic
+ (
+ num_irc_g : positive := 4
+ );
port
(
-- Clock
reset_i : in std_logic;
-- Output
op_o : out std_logic_vector(1 downto 0);
- axis_o : out std_logic_vector(1 downto 0)
+ axis_o : out std_logic_vector((ceil_log2(num_irc_g)-1) downto 0)
);
end component;
port
(
-- Inputs
- clk_i : in std_logic;
- reset_i : in std_logic;
- irc_i : in IRC_INPUT_Type;
+ 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_ab_error_i : in std_logic;
+ reset_index_event_i : in std_logic;
+ reset_index_event2_i : in std_logic;
+ reset_ab_error_i : in std_logic;
-- Outputs
- irc_o : out IRC_OUTPUT_Type
+ irc_o : out IRC_OUTPUT_Type
);
end component;
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_ab_error_i : in std_logic;
+ 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 (7 downto 0);
- qcount_index_o : out std_logic_vector (7 downto 0);
- index_event_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
+ 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
--------------------------------------------------------------------------------
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
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;
-- 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;
(
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);
- ce_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);
- -- Bus signals
- rd_i : in std_logic;
+ --
bls_i : in std_logic_vector(3 downto 0);
- ta_o : out std_logic;
-- Signals for IRC
- irc1_i : in IRC_INPUT_Type;
- irc2_i : in IRC_INPUT_Type;
- irc3_i : in IRC_INPUT_Type;
- irc4_i : in IRC_INPUT_Type;
- -- Secondary data bus (slave)
- address_2_i : in std_logic_vector(3 downto 0);
- ce_2_i : in std_logic;
- --
- rd_2_i : in std_logic;
- bls_2_i : in std_logic_vector(3 downto 0);
- ta_2_o : out std_logic
+ irc_i : in IRC_INPUT_Array_Type(7 downto 0)
);
end component;
- -- Calibration write register
- component calibration_write_register
- 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_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
- );
- end component;
-
- -- Calibration interconnect
- component bus_calibration
+ -- Measurement interconnect
+ component bus_measurement
port
(
-- Clock
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;
port
(
-- Clock
- clk_100m_i : in std_logic;
- clk_50m_i : in std_logic;
+ clk_i : in std_logic;
-- Chip enable
- ce_100m_i : in std_logic;
+ ce_i : in std_logic;
-- Global Reset
- reset_100m_i : in std_logic;
+ reset_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;
+ 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_100m_o : out std_logic;
- xmemb_100m_i : in DMEMB2CORE_Type;
- xmemb_100m_o : out CORE2DMEMB_Type
+ xmemb_sel_o : out std_logic;
+ xmemb_i : in DMEMB2CORE_Type;
+ xmemb_o : out CORE2DMEMB_Type
);
end component;
- --------------------------------------------------------------------------------
- -- BRAM
- --------------------------------------------------------------------------------
-
- component xilinx_dualport_bram_write_first
+ -- Register on the bus
+ component bus_register is
generic
(
- byte_width : positive := 8;
- address_width : positive := 8;
- we_width : positive := 4
+ -- 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
(
- clka : in std_logic;
- rsta : in std_logic;
- ena : in std_logic;
- wea : in std_logic_vector((we_width-1) downto 0);
- addra : in std_logic_vector((address_width-1) downto 0);
- dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
- douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
- clkb : in std_logic;
- rstb : in std_logic;
- enb : in std_logic;
- web : in std_logic_vector((we_width-1) downto 0);
- addrb : in std_logic_vector((address_width-1) downto 0);
- dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
- doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
+ -- 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_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
+ bls_i : in std_logic_vector(3 downto 0)
);
end component;
- component xilinx_dualport_bram_no_change
+ -- LX Master bus interconnect
+ component bus_lxmaster
+ port
+ (
+ 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
(