library ieee; 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; -- Entities within lx_rocon package lx_rocon_pkg is -- Types type IRC_INPUT_Type is record a, b : std_logic; index : std_logic; mark : std_logic; end record; -- type IRC_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; end record; -- IRC coprocessor MAIN component irc_proc_main 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; -- Index resetting irc_index_reset_o : out std_logic_vector(3 downto 0); -- BRAM access (the other port) 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_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 port ( -- 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(1 downto 0) ); end component; -- IRC reader component irc_reader port ( -- Inputs 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; -- Outputs irc_o : out IRC_OUTPUT_Type ); end component; -- Quadcount component qcounter port ( -- Inputs 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; -- 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 ); end component; -- D sampler component dff 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 port ( clk_i : in std_logic; reset_i : in std_logic; d_i : in std_logic; q_o : out std_logic ); end component; -------------------------------------------------------------------------------- -- TUMBL -------------------------------------------------------------------------------- component lx_rocon_tumbl generic ( IMEM_ABITS_g : positive := 11; DMEM_ABITS_g : positive := 12; -- USE_HW_MUL_g : boolean := true; USE_BARREL_g : boolean := true; COMPATIBILITY_MODE_g : boolean := false ); port ( clk_i : in std_logic; rst_i : in std_logic; halt_i : in std_logic; int_i : in std_logic; trace_i : in std_logic; trace_kick_i : in std_logic; -- Program counter pc_o : out std_logic_vector(31 downto 0); -- Internal halt (remove with trace kick) halted_o : out std_logic; halt_code_o : out std_logic_vector(4 downto 0); -- Internal memory (instruction) imem_clk_i : in std_logic; imem_en_i : in std_logic; imem_we_i : in std_logic_vector(3 downto 0); imem_addr_i : in std_logic_vector(8 downto 0); imem_data_i : in std_logic_vector(31 downto 0); imem_data_o : out std_logic_vector(31 downto 0); -- Internal memory (data) dmem_clk_i : in std_logic; dmem_en_i : in std_logic; dmem_we_i : in std_logic_vector(3 downto 0); dmem_addr_i : in std_logic_vector(9 downto 0); 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 ); end component; component lx_rocon_imem port ( -- Memory wiring for Tumbl clk_i : in std_logic; cs_i : in std_logic; adr_i : in std_logic_vector(10 downto 2); dat_o : out std_logic_vector(31 downto 0); -- Memory wiring for Master CPU clk_m : in std_logic; en_m : in std_logic; we_m : in std_logic_vector(3 downto 0); addr_m : in std_logic_vector(8 downto 0); din_m : in std_logic_vector(31 downto 0); dout_m : out std_logic_vector(31 downto 0) ); end component; component lx_rocon_dmem port ( -- Memory wiring for 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); dat_i : in std_logic_vector(31 downto 0); dat_o : out std_logic_vector(31 downto 0); -- Memory wiring for Master CPU clk_m : in std_logic; en_m : in std_logic; we_m : in std_logic_vector(3 downto 0); addr_m : in std_logic_vector(9 downto 0); din_m : in std_logic_vector(31 downto 0); dout_m : out std_logic_vector(31 downto 0) ); end component; component lx_rocon_gprf_abd port ( clk_i : in std_logic; rst_i : in std_logic; clken_i : in std_logic; -- ID2GPRF_i : in ID2GPRF_Type; MEM_WRB_i : in WRB_Type; GPRF2EX_o : out GPRF2EX_Type ); end component; -------------------------------------------------------------------------------- -- MEMORY BUS -------------------------------------------------------------------------------- -- Calibration read register component calibration_read_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); -- Bus signals rd_i : in std_logic; ta_o : out std_logic ); end component; -- IRC interconnect component bus_irc port ( 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 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 ); 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 port ( -- Clock clk_i : in std_logic; -- Reset reset_i : in std_logic; -- Chip enable ce_i : in std_logic; -- Address address_i : in std_logic_vector(1 downto 0); -- 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; -- Tumbl interconnect component bus_tumbl 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_100m_o : out std_logic; xmemb_100m_i : in DMEMB2CORE_Type; xmemb_100m_o : out CORE2DMEMB_Type ); end component; -------------------------------------------------------------------------------- -- BRAM -------------------------------------------------------------------------------- component xilinx_dualport_bram_write_first generic ( byte_width : positive := 8; address_width : positive := 8; we_width : positive := 4 ); 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) ); end component; component xilinx_dualport_bram_no_change generic ( byte_width : positive := 8; address_width : positive := 8; we_width : positive := 4 ); 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) ); end component; end lx_rocon_pkg; package body lx_rocon_pkg is end lx_rocon_pkg;