AIDA GELINA BRIKEN nToF CRIB ISOLDE CIRCE nTOFCapture DESPEC DTAS EDI_PSA 179Ta CARME StellarModelling DCF K40
  DESPEC  ELOG logo
Message ID: 517     Entry time: Wed Jan 18 13:40:33 2023
Author: PJCS TD 
Subject: MACB settings with either Emulator or VITAR 

When using the VETAR connected to the HDMI port of the root MACB the settings for all the MACB in the system 0x3.

This setting takes the Clock and Data line from the input HDMI and outputs it via teh HDMI output ports.

When using the Emulator connected via the SMA connectors on the back of the root MACB then the setting for the root MACB should be 0xD and all others should be 0x3.

Attached is the .jed file for programming the MACB and the .vhd source file to help with understanding of the settings.

Attachment 1: macb_apr20.jed  70 kB
Attachment 2: macb_apr20.vhd  20 kB  | Hide | Hide all
----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    17:03:27 03/16/2011 
-- Design Name: 
-- Module Name:    macb_top - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
library UNISIM;
use UNISIM.VComponents.all;
-- NOTE all in/out notations are relative to this unit
entity macb_apr20 is
    Port ( 
			  port1_sp : inout  STD_LOGIC_VECTOR (3 downto 0);
			  port2_sp : inout  STD_LOGIC_VECTOR (3 downto 0);
			  port3_sp : inout  STD_LOGIC_VECTOR (3 downto 0);
			  port4_sp : inout  STD_LOGIC_VECTOR (3 downto 0);
			  layer_sp : inout  STD_LOGIC_VECTOR (3 downto 0);
			  layer_trigger : out std_logic ;
           sync_return : in  STD_LOGIC_VECTOR (3 downto 1);
           selector : in  STD_LOGIC_VECTOR (3 downto 0);
           sync_select : out  STD_LOGIC_vector(1 downto 0 );
           clock200_select : out  STD_LOGIC_vector( 1 downto 0 ) ;
			  butis_divide_reset : out std_logic ;
			  butis_divide_s : out std_logic_vector( 2 downto 0 ) ;
			  clock_5 : in std_logic ;
			  sync_5 : in std_logic ;
			  trigger : in std_logic_vector( 3 downto 0 ) ;
           MBS_in : in  STD_LOGIC_VECTOR (3 downto 0);
           MBS_out : out  STD_LOGIC_VECTOR (3 downto 0));
end macb_apr20;

architecture Behavioral of macb_apr20 is
signal port1_spi :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port1_spo :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port1_t :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '1' );
signal port2_spi :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port2_spo :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port2_t :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '1' );
signal port3_spi :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port3_spo :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port3_t :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '1' );
signal port4_spi :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port4_spo :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal port4_t :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '1' );
signal layer_spi :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal layer_spo :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '0' );
signal layer_t :  STD_LOGIC_VECTOR (3 downto 0) := ( others => '1' );
signal seli : integer range 0 to 15 := 0  ;
-- well really
signal MBS_in_n : std_logic_vector( 3 downto 0 ) := "0000" ;
begin
MBS_in_n <= ( not MBS_in);
seli <= conv_integer(not selector) ;
-- MBS signal allocations to sp lines and HDMI pin. This maps to NIM connections
-- 0 :	MBS_clock10 	SP0	13
-- 1 :	MBS_reset		SP1	14
-- 2 :	MBS_reset_rq	SP2	15
-- 3 :	MBS_Trigger		SP3	16
layer_trigger <= trigger(0) or trigger(1) or trigger(2) or trigger(3) ;

-- divider controls set for pass-through
butis_divide_reset <= '1' ; -- for now don't reset ;

process ( seli , MBS_in_n, port1_spi, port2_spi, port3_spi, port4_spi, layer_spi, sync_return ,sync_5  )
-- note : & => concatenate
begin
	case seli is 
	when 0 => --- Master/ Root / MBS / Internal clock
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "00" ; -- select sync from port 1 
		clock200_select <= "00" ; -- select internal 200 MHz oscillator
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,
		
	when 1 => --- Master/ Root / MBS / BuTiS clock and SYNC
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "01" ; -- select sync from external using SMA input 
		clock200_select <= "01" ; -- select external 200 MHz oscillator using SMA input
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,

	when 2 => --- Master/ Branch / MBS / Next layer clock next layer SYNC
		port1_spo <= layer_spi(3) & layer_spi(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= layer_spi(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= layer_spi(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= layer_spi(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <=  '0' & '0' & port1_spi(1) & port1_spi(0) ; -- drive the clock and reset down a layer
		layer_t <= "1100" ; -- just drive the bottom two bits to the "next" port
		sync_select <= "10" ; -- select sync from next_layer 
		clock200_select <= "10" ; -- select clock from next layer
		MBS_out <=  layer_spi(3) & layer_spi(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,

	when 3 => --- Slave / Branch / MBS / Next layer clock and sync
		port1_spo <= layer_spi(3) & '0'  & layer_spi(1) & layer_spi(0);
		port1_t <= "0100" ; -- drive clock, reset, trigger only 
		port2_spo <= layer_spi(3) & '0' & layer_spi(1) & layer_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= layer_spi(3) & '0' & layer_spi(1) & layer_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= layer_spi(3) & '0' & layer_spi(1) & layer_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <=  '0' & '0' & '0' & '0' ; -- drive nothing
		layer_t <= "1111" ; -- just drive nothing down
		sync_select <= "10" ; -- select sync from next layer 
		clock200_select <= "10" ; -- select clock from next layer
		MBS_out <=  layer_spi ; -- map all the signals for monitoring ?
		butis_divide_s <= "000" ; -- s2 is 0 for pass,
		
	when 4 => --- Master/ Root / MBS / BuTiS clock / Internal SYNC / External timestamp reset
		port1_spo <= MBS_in_n(3) & '0' & MBS_in_n(1)  & '0' ;
		port1_t <= "0100" ; -- drive clock, reset, trigger only
		port2_spo <= MBS_in_n(3) & '0' & MBS_in_n(1)  & '0' ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & MBS_in_n(1)  & '0' ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & MBS_in_n(1)  & '0' ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "00" ; -- select sync from port 1 
		clock200_select <= "01" ; -- select external 50 MHz oscillator using SMA input
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & MBS_in_n(1) & sync_5 ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,

	when 5 => --- Master/ Root / MBS / External 50Mhz clock / Internal Sync
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "00" ; -- select sync from port 1 
		clock200_select <= "01" ; -- select external SMA input 
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass through.
			
	when 6 => --- Master/ Root / MBS / External 100Mhz clock / Internal Sync
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "00" ; -- select sync from port 1 
		clock200_select <= "01" ; -- select external SMA input 
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "100" ; -- s2 is 1 for external, 00 for /2.
		
	when 7 => --- Fast NIM input for each FEE / Next layer clock next layer SYNC
		port1_spo <= MBS_in_n(0) & layer_spi(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(1) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(2) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <=  '0' & '0' & port1_spi(1) & port1_spi(0) ; -- drive the clock and reset down a layer
		layer_t <= "1100" ; -- just drive the bottom two bits to the "next" port
		sync_select <= "10" ; -- select sync from next_layer 
		clock200_select <= "10" ; -- select clock from next layer
		MBS_out <=  layer_spi(3) & layer_spi(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,

	when 8 => --- Fast NIM input from Input 3 for each FEE / Next layer clock next layer SYNC
		port1_spo <= MBS_in_n(3) & layer_spi(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <=  '0' & '0' & port1_spi(1) & port1_spi(0) ; -- drive the clock and reset down a layer
		layer_t <= "1100" ; -- just drive the bottom two bits to the "next" port
		sync_select <= "10" ; -- select sync from next_layer 
		clock200_select <= "10" ; -- select clock from next layer
		MBS_out <=  layer_spi(3) & layer_spi(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,
	
	when 9 => --- Master/ Root / Internal clock / sync_returns to NIM
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "00" ; -- select sync from port 1 
		clock200_select <= "00" ; -- select internal 200 MHz oscillator
		MBS_out <=  sync_return(3) & sync_return(2) & sync_return(1) & '0' ;
		butis_divide_s <= "000" ; -- s2 is 0 for pass,

	when 10 => --- Master/ Root / MBS / BuTiS clock /2 and SYNC
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= "0000" ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "01" ; -- select sync from external using SMA input 
		clock200_select <= "01" ; -- select external 200 MHz oscillator using SMA input
		MBS_out <=  MBS_in_n ; -- for testing NIM I/O
		butis_divide_s <= "100" ; --  s2 = 1 and s1,s0 decode to 00=>/2 , 01=>/4, /8 , /16

	when 12 => --- Master/ Root / MBS / BuTiS clock /2 and SYNC
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "01" ; -- select sync from external using SMA input 
		clock200_select <= "01" ; -- select external 200 MHz oscillator using SMA input
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "100" ; --  s2 = 1 and s1,s0 decode to 00=>/2 , 01=>/4, /8 , /16

	when 13 => --- Master/ Root / MBS / BuTiS clock /4 and SYNC
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port3_t <= "0100" ; -- drive clock, reset, trigger only
		port4_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port4_t <= "0100" ; -- drive clock, reset, trigger only
		layer_spo <= ( others => '0' ) ;
		layer_t <= ( others => '1' ) ; -- disable the drive to the "next" port
		sync_select <= "01" ; -- select sync from external using SMA input 
		clock200_select <= "01" ; -- select external 200 MHz oscillator using SMA input
		MBS_out <=  MBS_in_n(3) & MBS_in_n(2) & port1_spi(1) & port1_spi(0) ;
		butis_divide_s <= "101" ; --  s2 = 1 and s1,s0 decode to  01=>/4
		
	when 14 => --- Master/ Root / MBS / BuTiS clock /8 and SYNC
		port1_spo <= MBS_in_n(3) & MBS_in_n(2) & '0' & '0' ;
		port1_t <= "0011" ; -- drive trigger and reset request only
		port2_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
		port2_t <= "0100" ; -- drive clock, reset, trigger only 
		port3_spo <= MBS_in_n(3) & '0' & port1_spi(1) & port1_spi(0) ;
... 161 more lines ...
Attachment 3: zybo.jpg  309 kB  Uploaded Mon Jan 29 09:30:10 2024  | Hide | Hide all
zybo.jpg
Attachment 4: MACB.jpg  245 kB  Uploaded Mon Jan 29 09:30:24 2024  | Hide | Hide all
MACB.jpg
ELOG V3.1.4-unknown