#ifndef _TTM_BackplaneH_
#define _TTM_BackplaneH_
#include "vme_connectors.h"
#include "rod_connectors.h"
#include "ttm_clocking.h"
#include "ttm_asmlink.h"
#include "ttm_terminators.h"
#include "sn74lvth162245.h"
#include "headers.h"
class CB_PWR_Back : public TBundle {
public:
port VPOS3_3;
port VCC_EN;
virtual void Register() {
reg( VPOS3_3 );
reg( VCC_EN );
}
};
clone ( CP_VME64_P2R, CP_VME64_RP2R );
class CM_Backplane : public TModule {
public:
CB_Asm_Back Asm[ 4 ];
CB_PWR_Back Power;
CB_Back_CK CK;
port VCC;
port GND;
port RAW_TX;
CP_VME64_RP2R BAP2;
CP_ROD_J5P5 BAP5;
CP_ROD_J6P6 BAP6;
CP_SN74LVTH162245 TX_Buffer;
CP_SN74LVTH162245 VarBuffer;
CP_EXB2HV222JV PullVarL;
CP_EXB2HV222JV PullVarH;
CM_Term56x2x8 PTermTX_L;
CM_Term56x2x8 PTermTX_H;
CM_Term56x2x8 PTermVarL;
CM_Term56x2x8 PTermVarH;
CP_HEADER10X2 TestHeaderTX_L;
CP_HEADER10X2 TestHeaderTX_H;
CP_HEADER10X2 TestHeaderVarL;
CP_HEADER10X2 TestHeaderVarH;
CP_HEADER10X2 TestHeaderRX_L;
CP_HEADER10X2 TestHeaderRX_H;
CP_HEADER2 TestHeaderCLK;
CP_HEADER2 TestHeaderVCC;
enum {
v3_cdc_count = +2
+2,
v3_tdc_count = 1 };
CP_CDC_POS V3_CDC[ v3_cdc_count ];
CP_TDC_POS V3_TDC[ v3_tdc_count ];
enum { vc_cdc_count = 8
+ 4,
vc_tdc_count = 2
+ 1 };
CP_CDC_POS VC_CDC[ vc_cdc_count ];
CP_TDC_POS VC_TDC[ vc_tdc_count ];
virtual void Register() {
rega( Asm, 4 );
reg( Power );
reg( CK );
reg( VCC );
reg( GND );
regb( RAW_TX, 15, 0 );
reg( BAP2 );
BAP2.SetPackage( "DIN160P_RT_INV" );
reg( BAP5 );
BAP5.SetPackage( "CONN_2MM_6X22_INV" );
reg( BAP6 );
BAP6.SetPackage( "CONN_2MM_6X25_INV" );
reg( TX_Buffer );
reg( VarBuffer );
reg( PullVarL );
reg( PullVarH );
reg( PTermTX_L );
reg( PTermTX_H );
reg( PTermVarL );
reg( PTermVarH );
reg( TestHeaderTX_L );
reg( TestHeaderTX_H );
reg( TestHeaderVarL );
reg( TestHeaderVarH );
reg( TestHeaderRX_L );
reg( TestHeaderRX_H );
reg( TestHeaderCLK );
reg( TestHeaderVCC );
rega( V3_CDC, v3_cdc_count );
rega( V3_TDC, v3_tdc_count );
rega( VC_CDC, vc_cdc_count );
rega( VC_TDC, vc_tdc_count );
}
virtual void Connect() {
wire( Power, BAP5 );
wire( Power, BAP6 );
wireall( GND );
wireall( VCC );
for ( int i = 0; i < v3_cdc_count; ++ i ) Power.VPOS3_3 << V3_CDC[ i ].POS;
for ( int i = 0; i < v3_tdc_count; ++ i ) Power.VPOS3_3 << V3_TDC[ i ].POS;
for ( int i = 0; i < vc_cdc_count; ++ i ) VCC << VC_CDC[ i ].POS;
for ( int i = 0; i < vc_tdc_count; ++ i ) VCC << VC_TDC[ i ].POS;
GND << BAP2.TMP_N;
wire( CK, BAP5 );
"B0_RX" << Asm[ 0 ].RxB.PtToPt.RX << BAP2.BG_B0;
"A0_RX" << Asm[ 0 ].RxA.PtToPt.RX << BAP2.BG_A0;
"B1_RX" << Asm[ 1 ].RxB.PtToPt.RX << BAP5.BG_B2;
"A1_RX" << Asm[ 1 ].RxA.PtToPt.RX << BAP5.BG_A2;
"B2_RX" << Asm[ 2 ].RxB.PtToPt.RX << BAP5.BG_B3;
"A2_RX" << Asm[ 2 ].RxA.PtToPt.RX << BAP6.BG_A3;
"B3_RX" << Asm[ 3 ].RxB.PtToPt.RX << BAP6.BG_B5;
"A3_RX" << Asm[ 3 ].RxA.PtToPt.RX << BAP6.BG_A5;
int i = 0;
"A0_RXFLAG" << Asm[ 0 ].RxA.PtToPt.RXFLAG << BAP5.BG_A1( i ); i++;
"A0_RXDATA" << Asm[ 0 ].RxA.PtToPt.RXDATA << BAP5.BG_A1( i ); i++;
"A0_RXERROR" << Asm[ 0 ].RxA.PtToPt.RXERROR << BAP5.BG_A1( i ); i++;
"A0_RXREADY" << Asm[ 0 ].RxA.PtToPt.RXREADY << BAP5.BG_A1( i ); i++;
"B0_RXFLAG" << Asm[ 0 ].RxB.PtToPt.RXFLAG << BAP5.BG_A1( i ); i++;
"B0_RXDATA" << Asm[ 0 ].RxB.PtToPt.RXDATA << BAP5.BG_A1( i ); i++;
"B0_RXERROR" << Asm[ 0 ].RxB.PtToPt.RXERROR << BAP5.BG_A1( i ); i++;
"B0_RXREADY" << Asm[ 0 ].RxB.PtToPt.RXREADY << BAP5.BG_A1( i ); i++;
i = 0;
"A1_RXFLAG" << Asm[ 1 ].RxA.PtToPt.RXFLAG << BAP5.BG_B1( i ); i++;
"A1_RXDATA" << Asm[ 1 ].RxA.PtToPt.RXDATA << BAP5.BG_B1( i ); i++;
"A1_RXERROR" << Asm[ 1 ].RxA.PtToPt.RXERROR << BAP5.BG_B1( i ); i++;
"A1_RXREADY" << Asm[ 1 ].RxA.PtToPt.RXREADY << BAP5.BG_B1( i ); i++;
"B1_RXFLAG" << Asm[ 1 ].RxB.PtToPt.RXFLAG << BAP5.BG_B1( i ); i++;
"B1_RXDATA" << Asm[ 1 ].RxB.PtToPt.RXDATA << BAP5.BG_B1( i ); i++;
"B1_RXERROR" << Asm[ 1 ].RxB.PtToPt.RXERROR << BAP5.BG_B1( i ); i++;
"B1_RXREADY" << Asm[ 1 ].RxB.PtToPt.RXREADY << BAP5.BG_B1( i ); i++;
i = 0;
"A2_RXFLAG" << Asm[ 2 ].RxA.PtToPt.RXFLAG << BAP6.BG_A4( i ); i++;
"A2_RXDATA" << Asm[ 2 ].RxA.PtToPt.RXDATA << BAP6.BG_A4( i ); i++;
"A2_RXERROR" << Asm[ 2 ].RxA.PtToPt.RXERROR << BAP6.BG_A4( i ); i++;
"A2_RXREADY" << Asm[ 2 ].RxA.PtToPt.RXREADY << BAP6.BG_A4( i ); i++;
"B2_RXFLAG" << Asm[ 2 ].RxB.PtToPt.RXFLAG << BAP6.BG_A4( i ); i++;
"B2_RXDATA" << Asm[ 2 ].RxB.PtToPt.RXDATA << BAP6.BG_A4( i ); i++;
"B2_RXERROR" << Asm[ 2 ].RxB.PtToPt.RXERROR << BAP6.BG_A4( i ); i++;
"B2_RXREADY" << Asm[ 2 ].RxB.PtToPt.RXREADY << BAP6.BG_A4( i ); i++;
i = 0;
"A3_RXFLAG" << Asm[ 3 ].RxA.PtToPt.RXFLAG << BAP6.BG_B4( i ); i++;
"A3_RXDATA" << Asm[ 3 ].RxA.PtToPt.RXDATA << BAP6.BG_B4( i ); i++;
"A3_RXERROR" << Asm[ 3 ].RxA.PtToPt.RXERROR << BAP6.BG_B4( i ); i++;
"A3_RXREADY" << Asm[ 3 ].RxA.PtToPt.RXREADY << BAP6.BG_B4( i ); i++;
"B3_RXFLAG" << Asm[ 3 ].RxB.PtToPt.RXFLAG << BAP6.BG_B4( i ); i++;
"B3_RXDATA" << Asm[ 3 ].RxB.PtToPt.RXDATA << BAP6.BG_B4( i ); i++;
"B3_RXERROR" << Asm[ 3 ].RxB.PtToPt.RXERROR << BAP6.BG_B4( i ); i++;
"B3_RXREADY" << Asm[ 3 ].RxB.PtToPt.RXREADY << BAP6.BG_B4( i ); i++;
i = 8;
"A0_SD" << Asm[ 0 ].SD_A << BAP6.TG( i ); i++;
"B0_SD" << Asm[ 0 ].SD_B << BAP6.TG( i ); i++;
"A1_SD" << Asm[ 1 ].SD_A << BAP6.TG( i ); i++;
"B1_SD" << Asm[ 1 ].SD_B << BAP6.TG( i ); i++;
"A2_SD" << Asm[ 2 ].SD_A << BAP6.TG( i ); i++;
"B2_SD" << Asm[ 2 ].SD_B << BAP6.TG( i ); i++;
"A3_SD" << Asm[ 3 ].SD_A << BAP6.TG( i ); i++;
"B3_SD" << Asm[ 3 ].SD_B << BAP6.TG( i ); i++;
for ( int i = 0; i < 4; ++ i ) {
"" << Asm[ i ].RxA.Bussed;
"" << Asm[ i ].RxB.Bussed;
"" << Asm[ i ].Tx.Bussed;
"/NC" << Asm[ i ].Tx.PtToPt.TXLOCKED;
}
Asm[ 0 ].Tx.Bussed.TX( 7, 0 ) << TX_Buffer.B( 15, 8 );
Asm[ 0 ].Tx.Bussed.TX( 15, 8 ) << TX_Buffer.B( 7, 0 );
RAW_TX( 7, 0 ) << TX_Buffer.A( 15, 8 );
RAW_TX( 15, 8 ) << TX_Buffer.A( 7, 0 );
i = 8;
Asm[ 0 ].Tx.Bussed.TXDIV0 << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXDIV0"; PullVarL.B( i - 8 ) << VCC; i++;
Asm[ 0 ].Tx.Bussed.TXDIV1 << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXDIV1"; PullVarL.B( i - 8 ) << GND; i++;
Asm[ 0 ].Tx.Bussed.TXFLGENB << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXFLGENB"; PullVarL.B( i - 8 ) << GND; i++;
Asm[ 0 ].Tx.Bussed.TXESMPXENB << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXESMPXENB"; PullVarL.B( i - 8 ) << GND; i++;
Asm[ 0 ].Tx.Bussed.TXFLAG << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXFLAG"; PullVarL.B( i - 8 ) << GND; i++;
Asm[ 0 ].Tx.Bussed.TXDATA << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXDATA"; PullVarL.B( i - 8 ) << VCC; i++;
Asm[ 0 ].Tx.Bussed.TXCNTL << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_TXCNTL"; PullVarL.B( i - 8 ) << GND; i++;
"UNUSED15" << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_UNUSED15"; PullVarL.B( i - 8 ) << VCC; i++;
i = 0;
Asm[ 0 ].RxA.Bussed.RXDIV0 << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_RXDIV0"; PullVarH.B( i ) << VCC; i++;
Asm[ 0 ].RxA.Bussed.RXDIV1 << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_RXDIV1"; PullVarH.B( i ) << GND; i++;
Asm[ 0 ].RxA.Bussed.RXFLGENB << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_RXFLGENB"; PullVarH.B( i ) << GND; i++;
Asm[ 0 ].RxA.Bussed.RXESMPXENB << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_RXESMPXENB"; PullVarH.B( i ) << GND; i++;
"BUF_VCC_EN" << VarBuffer.B( i ); VarBuffer.A( i ) << "VCC_EN"; PullVarH.B( i ) << GND; i++;
"OSC_EN" << CK.OSC_EN << VarBuffer.B( i ); VarBuffer.A( i ) << "RAW_OSC_EN"; PullVarH.B( i ) << VCC; i++;
"UNUSED" << VarBuffer.B( 7, i ); VarBuffer.A( 7, i ) << "RAW_UNUSED";
"VCC_EN" << Power.VCC_EN;
merge( VCC, PullVarH.B( 7, i ) );
VarBuffer.A( 15, 8 ) << PullVarL.A;
VarBuffer.A( 7, 0 ) << PullVarH.A;
RAW_TX( 7, 0 ) << BAP5.BG_A1( 15, 8 );
RAW_TX( 15, 8 ) << BAP6.BG_A4( 15, 8 );
VarBuffer.A( 15, 8 ) << BAP2.BG_B1( 15, 8 );
VarBuffer.A( 7, 0 ) << BAP6.BG_B4( 15, 8 );
VCC << TX_Buffer.DIR;
VCC << VarBuffer.DIR;
GND << TX_Buffer.OE_N;
GND << VarBuffer.OE_N;
TX_Buffer.B( 15, 8 ) << PTermTX_L.A;
TX_Buffer.B( 7, 0 ) << PTermTX_H.A;
VarBuffer.B( 15, 8 ) << PTermVarL.A;
VarBuffer.B( 7, 0 ) << PTermVarH.A;
merge( VCC, PTermTX_L.B );
merge( VCC, PTermTX_H.B );
merge( VCC, PTermVarL.B );
merge( VCC, PTermVarH.B );
int odd = 1, even = 2;
for ( int i = 0; i < 8; ++ i ) {
GND << TestHeaderTX_L.P( even );
GND << TestHeaderTX_H.P( even );
GND << TestHeaderVarL.P( even );
GND << TestHeaderVarH.P( even );
GND << TestHeaderRX_L.P( even );
GND << TestHeaderRX_H.P( even );
RAW_TX( i ) << TestHeaderTX_L.P( odd );
RAW_TX( i + 8 ) << TestHeaderTX_H.P( odd );
VarBuffer.A( i + 8 ) << TestHeaderVarL.P( odd );
VarBuffer.A( i ) << TestHeaderVarH.P( odd );
Asm[ 0 ].RxA.PtToPt.RX( i ) << TestHeaderRX_L.P( odd );
Asm[ 0 ].RxA.PtToPt.RX( i + 8 ) << TestHeaderRX_H.P( odd );
even += 2;
odd += 2;
}
VCC << TestHeaderVCC.P( 1 );
CK.TEST_CLK << TestHeaderCLK.P( 1 );
GND << TestHeaderVCC.P( 2 );
GND << TestHeaderCLK.P( 2 );
for ( int i = 0; i < 2; ++ i ) {
GND << TestHeaderTX_L.P( even );
GND << TestHeaderTX_H.P( even );
GND << TestHeaderVarL.P( even );
GND << TestHeaderVarH.P( even );
GND << TestHeaderRX_L.P( even );
GND << TestHeaderRX_H.P( even );
"/NC" << TestHeaderTX_L.P( odd );
"/NC" << TestHeaderTX_H.P( odd );
"/NC" << TestHeaderVarL.P( odd );
"/NC" << TestHeaderVarH.P( odd );
even += 2;
odd += 2;
}
"A0_RXFLAG" << TestHeaderRX_L.P( 17 );
"A0_RXDATA" << TestHeaderRX_L.P( 19 );
"A0_RXERROR" << TestHeaderRX_H.P( 17 );
"A0_RXREADY" << TestHeaderRX_H.P( 19 );
"/NC" << BAP2.NC;
wireall( "/NC", "VPOS5" );
"/NC" << BAP2.VPC;
merge( "/NC", BAP2.D );
merge( "/NC", BAP2.A );
"/NC" << BAP2.RETRY_N;
"/NC" << BAP2.TMS;
"/NC" << BAP2.TDI;
"/NC" << BAP2.TDO;
"/NC" << BAP2.TCK;
"/NC" << BAP2.CCLK;
"/NC" << BAP2.DIN;
"/NC" << BAP2.PROGRAM0_N;
"/NC" << BAP2.PROGRAM1_N;
"/NC" << BAP2.RESET_N;
"/NC" << BAP5.RCLKIP;
"/NC" << BAP5.RCLKIN;
"/NC" << BAP5.SCLKOP;
"/NC" << BAP5.SCLKON;
"/NC" << BAP5.TCLKOP;
"/NC" << BAP5.TCLKON;
"/NC" << BAP5.BUSY_N;
"/NC" << BAP6.TCLKIP;
"/NC" << BAP6.TCLKIN;
merge( "/NC", BAP6.TG( 7, 0 ) );
}
};
#endif