diff --git a/boards/uniboard2/designs/unb2_minimal/src/vhdl/unb2_minimal.vhd b/boards/uniboard2/designs/unb2_minimal/src/vhdl/unb2_minimal.vhd index 58b475f24bdb53728f064bad47966fcf0b89806a..879c30d8f8b6727020208e38f6fe5331c94809d8 100644 --- a/boards/uniboard2/designs/unb2_minimal/src/vhdl/unb2_minimal.vhd +++ b/boards/uniboard2/designs/unb2_minimal/src/vhdl/unb2_minimal.vhd @@ -330,12 +330,11 @@ BEGIN u_front_io : ENTITY unb2_board_lib.unb2_board_front_io GENERIC MAP ( - g_nof_qsfp => c_unb2_board_tr_qsfp.nof_bus + g_nof_qsfp_bus => c_unb2_board_tr_qsfp.nof_bus ) PORT MAP ( green_led_arr => qsfp_green_led_arr, red_led_arr => qsfp_red_led_arr, - QSFP_LED => QSFP_LED ); diff --git a/boards/uniboard2/designs/unb2_test/hdllib.cfg b/boards/uniboard2/designs/unb2_test/hdllib.cfg index 8c70cfcd1934e45a338704718a092c00e18622cb..86dae878650fcc30515769e711843719de1f1429 100644 --- a/boards/uniboard2/designs/unb2_test/hdllib.cfg +++ b/boards/uniboard2/designs/unb2_test/hdllib.cfg @@ -1,6 +1,5 @@ hdl_lib_name = unb2_test hdl_library_clause_name = unb2_test_lib -#hdl_lib_uses = common mm unb2_board hdl_lib_uses = common technology mm unb2_board dp eth tech_tse tr_10GbE diagnostics diag hdl_lib_technology = ip_arria10 diff --git a/boards/uniboard2/libraries/unb2_board/src/vhdl/ctrl_unb2_board.vhd b/boards/uniboard2/libraries/unb2_board/src/vhdl/ctrl_unb2_board.vhd index e6615152b45705fd8c2b32c900f2fc4d88e58326..e54990ce65e8e72f025e511d7a6f1e6db7cbfb0c 100644 --- a/boards/uniboard2/libraries/unb2_board/src/vhdl/ctrl_unb2_board.vhd +++ b/boards/uniboard2/libraries/unb2_board/src/vhdl/ctrl_unb2_board.vhd @@ -131,8 +131,8 @@ ENTITY ctrl_unb2_board IS this_chip_id : OUT STD_LOGIC_VECTOR(c_unb2_board_nof_chip_w-1 DOWNTO 0); -- [1:0], so range 0-3 for PN this_bck_id : OUT STD_LOGIC_VECTOR(c_unb2_board_nof_uniboard_w-1 DOWNTO 0); -- [1:0] used out of ID[7:2] to index boards 3..0 in subrack - app_led_red : IN STD_LOGIC := '0'; - app_led_green : IN STD_LOGIC := '1'; + app_led_red : IN STD_LOGIC := '0'; + app_led_green : IN STD_LOGIC := '1'; -- PIOs pout_wdi : IN STD_LOGIC; -- Toggled by unb_osy; can be overriden by reg_wdi. @@ -227,10 +227,11 @@ ARCHITECTURE str OF ctrl_unb2_board IS SIGNAL i_mm_rst : STD_LOGIC; SIGNAL i_mm_clk : STD_LOGIC; SIGNAL i_mm_locked : STD_LOGIC; - SIGNAL i_epcs_clk : STD_LOGIC; - SIGNAL i_clk125 : STD_LOGIC; - SIGNAL i_clk100 : STD_LOGIC; - SIGNAL i_clk50 : STD_LOGIC; + SIGNAL i_epcs_clk : STD_LOGIC := '1'; + SIGNAL i_clk125 : STD_LOGIC := '1'; + SIGNAL i_clk100 : STD_LOGIC := '1'; + SIGNAL i_clk50 : STD_LOGIC := '1'; + SIGNAL i_dp_clk : STD_LOGIC := '1'; SIGNAL mm_wdi : STD_LOGIC; SIGNAL eth1g_st_clk : STD_LOGIC; @@ -288,27 +289,39 @@ BEGIN TESTIO <= (OTHERS=>'Z'); -- Leave unused INOUT tri-state -- Clock and reset - i_xo_ethclk <= ETH_CLK; -- use the ETH_CLK pin as xo_clk - ext_clk200 <= CLK; -- use the external 200 MHz CLK as ext_clk - ext_pps <= PPS; -- use more special name for PPS pin signal to ease searching for it in editor + i_xo_ethclk <= ETH_CLK; -- use the ETH_CLK pin as xo_clk + ext_clk200 <= CLK; -- use the external 200 MHz CLK as ext_clk + ext_pps <= PPS; -- use more special name for PPS pin signal to ease searching for it in editor dp_dis <= i_mm_rst; -- could use software control for this instead - gen_pll: IF g_dp_clk_use_pll = TRUE GENERATE - u_unb2_board_clk200_pll : ENTITY work.unb2_board_clk200_pll - GENERIC MAP ( - g_technology => g_technology, - g_clk200_phase_shift => g_dp_clk_phase - ) - PORT MAP ( - arst => dp_dis, - clk200 => ext_clk200, - st_clk200 => dp_clk, -- = c0 - st_rst200 => dp_rst - ); + + + gen_pll_dp_clk: IF g_dp_clk_use_pll = TRUE GENERATE + gen_pll_dp_clk_sim: IF g_sim = TRUE GENERATE + dp_clk <= i_dp_clk; + dp_rst <= '1', '0' AFTER 10 ns; + i_dp_clk <= NOT i_dp_clk AFTER 2.5 ns; -- 200MHz , 5ns/2 + END GENERATE; + + gen_pll_dp_clk_pll: IF g_sim = FALSE GENERATE + u_unb2_board_clk200_pll : ENTITY work.unb2_board_clk200_pll + GENERIC MAP ( + g_technology => g_technology, + g_clk200_phase_shift => g_dp_clk_phase + ) + PORT MAP ( + arst => dp_dis, + clk200 => ext_clk200, + st_clk200 => dp_clk, -- = c0 + st_rst200 => dp_rst + ); + END GENERATE; END GENERATE; - no_pll: IF g_dp_clk_use_pll = FALSE GENERATE + + + no_pll_dp_clk: IF g_dp_clk_use_pll = FALSE GENERATE dp_rst <= node_ctrl_dp_rst_out; node_ctrl_dp_clk_in <= dp_clk_in; END GENERATE; @@ -329,20 +342,29 @@ BEGIN - u_unb2_board_clk125_pll : ENTITY work.unb2_board_clk125_pll - GENERIC MAP ( - g_technology => g_technology - ) - PORT MAP ( - arst => i_xo_rst, - clk125 => i_xo_ethclk, - c0_clk20 => i_epcs_clk, - c1_clk50 => i_clk50, - c2_clk100 => i_clk100, - c3_clk125 => i_clk125, - pll_locked => i_mm_locked - ); + gen_pll_mm_clk_sim: IF g_sim = TRUE GENERATE + i_mm_locked <= '0', '1' AFTER 70 ns; + i_epcs_clk <= NOT i_epcs_clk AFTER 25 ns; -- 20 MHz, 50ns/2 + i_clk50 <= NOT i_clk50 AFTER 10 ns; -- 50 MHz, 20ns/2 + i_clk100 <= NOT i_clk100 AFTER 5 ns; -- 100 MHz, 10ns/2 + i_clk125 <= NOT i_clk125 AFTER 4 ns; -- 125 MHz, 8ns/2 + END GENERATE; + gen_pll_mm_clk_pll: IF g_sim = FALSE GENERATE + u_unb2_board_clk125_pll : ENTITY work.unb2_board_clk125_pll + GENERIC MAP ( + g_technology => g_technology + ) + PORT MAP ( + arst => i_xo_rst, + clk125 => i_xo_ethclk, + c0_clk20 => i_epcs_clk, + c1_clk50 => i_clk50, + c2_clk100 => i_clk100, + c3_clk125 => i_clk125, + pll_locked => i_mm_locked + ); + END GENERATE; i_tse_clk <= i_xo_ethclk; @@ -469,6 +491,7 @@ BEGIN -- Every design instantiates an mms_remu instance + MM status & control ports. -- So there is full control over the memory mapped registers to set start address of the flash -- and reconfigure from that address. + --gen_mms_remu: IF g_sim = FALSE GENERATE u_mms_remu: ENTITY remu_lib.mms_remu GENERIC MAP ( g_technology => g_technology @@ -482,10 +505,12 @@ BEGIN remu_mosi => reg_remu_mosi, remu_miso => reg_remu_miso ); + --END GENERATE; ----------------------------------------------------------------------------- -- EPCS ----------------------------------------------------------------------------- + --gen_mms_epcs: IF g_sim = FALSE GENERATE u_mms_epcs: ENTITY epcs_lib.mms_epcs GENERIC MAP ( g_technology => g_technology @@ -511,6 +536,7 @@ BEGIN mmdp_data_mosi => reg_mmdp_data_mosi, mmdp_data_miso => reg_mmdp_data_miso ); + --END GENERATE; ------------------------------------------------------------------------------ -- PPS input @@ -592,6 +618,8 @@ BEGIN eth1g_st_rst <= i_mm_rst; END GENERATE; + + gen_mac: IF g_sim = FALSE GENERATE u_mac : ENTITY eth_lib.eth GENERIC MAP ( g_technology => g_technology, @@ -628,5 +656,6 @@ BEGIN -- LED interface tse_led => eth1g_led ); + END GENERATE; END str; diff --git a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_back_io.vhd b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_back_io.vhd index 37d5c14ced31b82bce63111c5ca8972d585ee9ac..8142ed4527a9840b4b19c806788f9fb1da0b1737 100644 --- a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_back_io.vhd +++ b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_back_io.vhd @@ -25,37 +25,44 @@ USE work.unb2_board_pkg.ALL; ENTITY unb2_board_back_io IS + GENERIC ( + g_nof_back_bus : NATURAL := c_unb2_board_tr_back.nof_bus + ); PORT ( - serial_tx_arr : IN STD_LOGIC_VECTOR(c_unb2_board_tr_back_hw_nof_lines-1 DOWNTO 0); - serial_rx_arr : OUT STD_LOGIC_VECTOR(c_unb2_board_tr_back_hw_nof_lines-1 DOWNTO 0); + serial_tx_arr : IN STD_LOGIC_VECTOR(g_nof_back_bus * c_unb2_board_tr_back.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + serial_rx_arr : OUT STD_LOGIC_VECTOR(g_nof_back_bus * c_unb2_board_tr_back.bus_w-1 DOWNTO 0); -- back transceivers - BCK_RX : IN STD_LOGIC_VECTOR(c_unb2_board_tr_back.bus_w-1 downto 0); - BCK_TX : OUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.bus_w-1 downto 0); + BCK_RX : IN t_unb2_board_back_bus_2arr(g_nof_back_bus-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + BCK_TX : OUT t_unb2_board_back_bus_2arr(g_nof_back_bus-1 DOWNTO 0); - BCK_SDA : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 downto 0); - BCK_SCL : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 downto 0); - BCK_ERR : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 downto 0) + BCK_SDA : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 DOWNTO 0); + BCK_SCL : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 DOWNTO 0); + BCK_ERR : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_back.i2c_w-1 DOWNTO 0) ); END unb2_board_back_io; ARCHITECTURE str OF unb2_board_back_io IS -- help signals so we can iterate through buses - SIGNAL si_tx_arr : STD_LOGIC_VECTOR(c_unb2_board_tr_back_hw_nof_lines-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL si_rx_arr : STD_LOGIC_VECTOR(c_unb2_board_tr_back_hw_nof_lines-1 DOWNTO 0); + SIGNAL si_tx_2arr : t_unb2_board_back_bus_2arr(g_nof_back_bus-1 DOWNTO 0); + SIGNAL si_rx_2arr : t_unb2_board_back_bus_2arr(g_nof_back_bus-1 DOWNTO 0); BEGIN - connect_back : FOR i IN 0 TO c_unb2_board_tr_back_hw_nof_lines-1 GENERATE - BCK_TX(i) <= si_tx_arr(i); - si_rx_arr(i) <= BCK_RX(i); + gen_buses : FOR i IN 0 TO g_nof_back_bus-1 GENERATE + BCK_TX(i) <= si_tx_2arr(i); + si_rx_2arr(i) <= BCK_RX(i); END GENERATE; - wire_signals : FOR i IN 0 TO c_unb2_board_tr_back_hw_nof_lines-1 GENERATE - si_tx_arr(i) <= serial_tx_arr(i); - serial_rx_arr(i) <= si_rx_arr(i); + gen_wire_bus : FOR i IN 0 TO g_nof_back_bus-1 GENERATE + gen_wire_signals : FOR j IN 0 TO c_unb2_board_tr_back.bus_w-1 GENERATE + + si_tx_2arr(i)(j) <= serial_tx_arr(i*c_unb2_board_tr_back.bus_w + j); + serial_rx_arr(i*c_unb2_board_tr_back.bus_w + j) <= si_rx_2arr(i)(j); + + END GENERATE; END GENERATE; END; diff --git a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_front_io.vhd b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_front_io.vhd index a20c7dff0c20264cf75cd47b395321ba95c95968..f79e563dbf3d53363895cd1fc616a02fd9f4db09 100644 --- a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_front_io.vhd +++ b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_front_io.vhd @@ -26,17 +26,17 @@ USE work.unb2_board_pkg.ALL; ENTITY unb2_board_front_io IS GENERIC ( - g_nof_qsfp : NATURAL := c_unb2_board_tr_qsfp.nof_bus + g_nof_qsfp_bus : NATURAL := c_unb2_board_tr_qsfp.nof_bus ); PORT ( - serial_tx_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp * c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); - serial_rx_arr : OUT STD_LOGIC_VECTOR(g_nof_qsfp * c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0); + serial_tx_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp_bus * c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + serial_rx_arr : OUT STD_LOGIC_VECTOR(g_nof_qsfp_bus * c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0); - green_led_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp-1 DOWNTO 0) := (OTHERS=>'0'); - red_led_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp-1 DOWNTO 0) := (OTHERS=>'0'); + green_led_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp_bus-1 DOWNTO 0) := (OTHERS=>'0'); + red_led_arr : IN STD_LOGIC_VECTOR(g_nof_qsfp_bus-1 DOWNTO 0) := (OTHERS=>'0'); - QSFP_RX : IN t_unb2_board_qsfp_bus_2arr(g_nof_qsfp-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); - QSFP_TX : OUT t_unb2_board_qsfp_bus_2arr(g_nof_qsfp-1 DOWNTO 0); + QSFP_RX : IN t_unb2_board_qsfp_bus_2arr(g_nof_qsfp_bus-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + QSFP_TX : OUT t_unb2_board_qsfp_bus_2arr(g_nof_qsfp_bus-1 DOWNTO 0); QSFP_SDA : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0); QSFP_SCL : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0); @@ -49,24 +49,24 @@ END unb2_board_front_io; ARCHITECTURE str OF unb2_board_front_io IS -- help signals so we can iterate through buses - SIGNAL si_tx_2arr : t_unb2_board_qsfp_bus_2arr(g_nof_qsfp-1 DOWNTO 0); - SIGNAL si_rx_2arr : t_unb2_board_qsfp_bus_2arr(g_nof_qsfp-1 DOWNTO 0); + SIGNAL si_tx_2arr : t_unb2_board_qsfp_bus_2arr(g_nof_qsfp_bus-1 DOWNTO 0); + SIGNAL si_rx_2arr : t_unb2_board_qsfp_bus_2arr(g_nof_qsfp_bus-1 DOWNTO 0); BEGIN - gen_leds : FOR i IN 0 TO g_nof_qsfp-1 GENERATE + gen_leds : FOR i IN 0 TO g_nof_qsfp_bus-1 GENERATE QSFP_LED(i*2) <= green_led_arr(i); QSFP_LED(i*2+1) <= red_led_arr(i); END GENERATE; - gen_buses : FOR i IN 0 TO g_nof_qsfp-1 GENERATE + gen_buses : FOR i IN 0 TO g_nof_qsfp_bus-1 GENERATE QSFP_TX(i) <= si_tx_2arr(i); si_rx_2arr(i) <= QSFP_RX(i); END GENERATE; - gen_wire_bus : FOR i IN 0 TO g_nof_qsfp-1 GENERATE + gen_wire_bus : FOR i IN 0 TO g_nof_qsfp_bus-1 GENERATE gen_wire_signals : FOR j IN 0 TO c_unb2_board_tr_qsfp.bus_w-1 GENERATE si_tx_2arr(i)(j) <= serial_tx_arr(i*c_unb2_board_tr_qsfp.bus_w + j); diff --git a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_ring_io.vhd b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_ring_io.vhd index 107618feaadd8e1c9cc126a1d31bd598448d3980..2c924997a546d3de8092e6107b80f868482b3617 100644 --- a/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_ring_io.vhd +++ b/boards/uniboard2/libraries/unb2_board/src/vhdl/unb2_board_ring_io.vhd @@ -26,33 +26,32 @@ USE work.unb2_board_pkg.ALL; ENTITY unb2_board_ring_io IS GENERIC ( - g_nof_ring_io : NATURAL := c_unb2_board_tr_ring.nof_bus + g_nof_ring_bus : NATURAL := c_unb2_board_tr_ring.nof_bus ); PORT ( - serial_tx_arr : IN STD_LOGIC_VECTOR(g_nof_ring_io * c_unb2_board_tr_ring.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); - serial_rx_arr : OUT STD_LOGIC_VECTOR(g_nof_ring_io * c_unb2_board_tr_ring.bus_w-1 DOWNTO 0); + serial_tx_arr : IN STD_LOGIC_VECTOR(g_nof_ring_bus * c_unb2_board_tr_ring.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + serial_rx_arr : OUT STD_LOGIC_VECTOR(g_nof_ring_bus * c_unb2_board_tr_ring.bus_w-1 DOWNTO 0); - -- ring transceivers - RING_RX : IN t_unb2_board_ring_bus_2arr(g_nof_ring_io-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); - RING_TX : OUT t_unb2_board_ring_bus_2arr(g_nof_ring_io-1 DOWNTO 0) + RING_RX : IN t_unb2_board_ring_bus_2arr(g_nof_ring_bus-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + RING_TX : OUT t_unb2_board_ring_bus_2arr(g_nof_ring_bus-1 DOWNTO 0) ); END unb2_board_ring_io; ARCHITECTURE str OF unb2_board_ring_io IS -- help signals so we can iterate through buses - SIGNAL si_tx_2arr : t_unb2_board_ring_bus_2arr(g_nof_ring_io-1 DOWNTO 0); - SIGNAL si_rx_2arr : t_unb2_board_ring_bus_2arr(g_nof_ring_io-1 DOWNTO 0); + SIGNAL si_tx_2arr : t_unb2_board_ring_bus_2arr(g_nof_ring_bus-1 DOWNTO 0); + SIGNAL si_rx_2arr : t_unb2_board_ring_bus_2arr(g_nof_ring_bus-1 DOWNTO 0); BEGIN - gen_buses : FOR i IN 0 TO g_nof_ring_io-1 GENERATE + gen_buses : FOR i IN 0 TO g_nof_ring_bus-1 GENERATE RING_TX(i) <= si_tx_2arr(i); si_rx_2arr(i) <= RING_RX(i); END GENERATE; - gen_wire_bus : FOR i IN 0 TO g_nof_ring_io-1 GENERATE + gen_wire_bus : FOR i IN 0 TO g_nof_ring_bus-1 GENERATE gen_wire_signals : FOR j IN 0 TO c_unb2_board_tr_ring.bus_w-1 GENERATE si_tx_2arr(i)(j) <= serial_tx_arr(i*c_unb2_board_tr_ring.bus_w + j);