Delay Line Phase Shifter

T050250-v1
November 10, 2005
Daniel Sigg

Theory of Operations

The delay line phase shifter uses a variable length stripline to delay the input signal by a selectable amount. Eighteen RF switches are used to route the signal either through fixed delay taps or short bypass paths (see schematics D050339). The fixed delay taps are (1/16)ns,  (1/8)ns, (1/4)ns, (1/2)ns, 1ns, 2 ns, 4 ns, 8 ns and 16 ns in length. Any delay between 0 ns and 31.9375 ns can bee added in steps of 0.0625 ns by using front-panel mounted toggle switches or through a digital interface such as EPICS. Since insertion loss is to be kept small, the RF switches have been specially selected and the stripline has been constructed with as large a copper cross-section as possible. The RF switches are PE4220 silicon-on-sapphire devices from Peregrine Semiconductor and have a nominal insertion loss of 0.1-0.2 dB between 10 MHz and 500 MHz. Their 1 dB compression point is at 22 dBm. The striplines are built on a 4 layer board with a total thickness of 0.125". This keeps the layer separation around 30 mils and requires 30 mil traces to yield 50 Ω transmission lines. With 3 oz. copper the cross-section becomes 0.87 (mm^2). A 16 ns delay will require a trace length around 2.2 m. With a conductivity of  59.6×(10^6) (1/(Ωm)) the resistance will be around 40 mΩ. It is clear that at RF frequencies skin effects will play a role as well. At 25 MHz the skin depth in copper is about 0.5 mils.

Specifications

({{ ,    Minimum   ,    Nominal   ,    Maximum  }, { ,  ,  ,  }, {Supply                                                                                                   , 9V,  ,  24V}, { ,  ,  ,  }, {Input power,  ,  , 20dBm}, {1dB compression point,  , 22.5dBm,  }, {
Intrinsic delay ,  ,  
3.7 ns,  }, {Steps, 0,  , 511}, {Delay per step (design),  , 0.0625 ns,  }, {Delay per step (at 50 MHz),  0.02ns, 0.0602 ns,  0.10ns}, {Differential non–linearity (at 50MHz), -0.06ns,  , +0.06ns}, { ,  ,  ,  }, {Fixed insertion loss (1MHz to 200 MHz),  , 2.7dB,  }, {Variable insertion loss (phase shift < 180°), -0.6dB,  , 1.2dB}, {Return loss, 14 dB,  ,  }, { ,  ,  ,  }})

Setup

Needs["BarCharts`"];Needs["Histograms`"];Needs["PieCharts`"]
Needs["ErrorBarPlots`"]
Needs["PlotLegends`"]
Needs["Controls`LinearControl`"]

$TextStyle={FontFamily->"Helvetica",FontSize->13};

plotopt=PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]},
			    {Thickness [0.007], RGBColor [0,0,1]},
			    {Thickness [0.007], RGBColor [0.1,0.7,0.2]},
			    {Thickness [0.007], RGBColor [0.5,0.5,0.2]}};

pathname="C:/User/Daniel/Protel/DelayLinePhaseShifter/Data/";
filename1=pathname<>"Delay_Xns.txt";
filename2=pathname<>"Power.txt";
filename3=pathname<>"DelayTaps.txt";

Import Data

Delay as function of frequency

data=Import[filename1,"Table"];
x=First/@data;
y[0]=(#[[2]]+I#[[3]])&/@data;
y[1/16]=(#[[4]]+I#[[5]])&/@data;
y[1/8]=(#[[6]]+I#[[7]])&/@data;
y[1/4]=(#[[8]]+I#[[9]])&/@data;
y[1/2]=(#[[10]]+I#[[11]])&/@data;
y[1]=(#[[12]]+I#[[13]])&/@data;
y[2]=(#[[14]]+I#[[15]])&/@data;
y[4]=(#[[16]]+I#[[17]])&/@data;
y[8]=(#[[18]]+I#[[19]])&/@data;
y[16]=(#[[20]]+I#[[21]])&/@data;

Power sweep at 50 MHz

pwrdata=Import[filename2,"Table"];
pwrx=First/@pwrdata;
pwry=Last/@pwrdata;

Delay steps at 50 MHz

dtapdata=Import[filename3,"Table"];
dtapx=First/@dtapdata;
dtaploss=(#[[2]])&/@dtapdata;
dtapphase=Last/@dtapdata;

Functions

smooth[l_List,n_:5]:=((Plus@@#)/n)&/@Partition[l,n,1];

unwrap[l_List]:=Block[{ret={l[[1]]},ofs=0},
For[i=2,i<=Length[l],++i,
ofs+=Which[l[[i]]-l[[i-1]]>180,-360,l[[i]]-l[[i-1]]<-180,360,True,0];
AppendTo[ret,l[[i]]+ofs]];
ret];

Plot of Insertion Loss Data

delays={(1/16),(1/8),(1/4),(1/2),1,2,4,8,16};
Clear[dbmag];
dbmag[0]:=Transpose[{x/1*^6,dB[y[0]]}];
dbmag[n_]:=Transpose[{x/1*^6,dB[y[n]/y[0]]}];
dbmagall=dbmag/@delays;

Clear[dbmagsmooth];
dbmagsmooth[n_]:=Interpolation[smooth[dbmag[n],5]]
dbmagsmoothall=dbmagsmooth/@delays;

Insertion Loss with No Delay

f=dbmagsmooth[0];
Plot[f[x],{x,6,194},
PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]}},
PlotLabel->"Zero Delay Insertion Loss",
FrameLabel->{"Frequency (MHz)","Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic]

Insertion Loss as Function of Delay

Plot[{dbmagsmoothall[[1]][x],dbmagsmoothall[[2]][x],dbmagsmoothall[[3]][x],dbmagsmoothall[[4]][x],dbmagsmoothall[[5]][x],dbmagsmoothall[[6]][x],dbmagsmoothall[[7]][x],dbmagsmoothall[[8]][x],dbmagsmoothall[[9]][x]},{x,6,194},
PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]},
			    {Thickness [0.007], RGBColor [0.9,0,0]},
			    {Thickness [0.007], RGBColor [0.8,0,0]},
			    {Thickness [0.007], RGBColor [0.7,0,0]},
		    {Thickness [0.007], RGBColor [0.6,0,0]},
		    {Thickness [0.007], RGBColor [0.5,0,0]},
		    {Thickness [0.007], RGBColor [0.4,0,0]},
		    {Thickness [0.007], RGBColor [0.3,0,0]},
		    {Thickness [0.007], RGBColor [0.2,0,0]}},
PlotLabel->"Insertion Loss relative to Zero Delay",
FrameLabel->{"Frequency (MHz)","Relative Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotLegend->{"1/16 ns","1/8 ns","1/4 ns","1/2 ns","1 ns","2 ns","4 ns","8 ns", "16 ns"},
LegendPosition->{1.05,-0.3},
LegendShadow->None]

Plot[{dbmagsmoothall[[1]][x],dbmagsmoothall[[2]][x],dbmagsmoothall[[3]][x],dbmagsmoothall[[4]][x],dbmagsmoothall[[5]][x],dbmagsmoothall[[6]][x],dbmagsmoothall[[7]][x]},{x,6,194},PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]},
			    {Thickness [0.007], RGBColor [0.85,0,0]},
			    {Thickness [0.007], RGBColor [0.7,0,0]},
			    {Thickness [0.007], RGBColor [0.55,0,0]},
		    {Thickness [0.007], RGBColor [0.4,0,0]},
		    {Thickness [0.007], RGBColor [0.25,0,0]},
		    {Thickness [0.007], RGBColor [0.1,0,0]}},
PlotLabel->"Insertion Loss relative to Zero Delay",
FrameLabel->{"Frequency (MHz)","Relative Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotLegend->{"1/16 ns","1/8 ns","1/4 ns","1/2 ns","1 ns","2 ns","4 ns"},
LegendPosition->{1.05,-0.3},
LegendShadow->None]

Projected Insertion Loss at 45°, 90°, 180°, 270° and 360°

seldel[freq_,phase_:180]:=IntegerDigits[Round[16*^9(phase/(360 freq))],2,9]

del45={((x[[#]])/(1.*^6)),seldel[x[[#]],45].Reverse[Last/@Transpose[dbmagall][[#]]]}&/@Range[16,Length[x]-2];
del90={((x[[#]])/(1.*^6)),seldel[x[[#]],90].Reverse[Last/@Transpose[dbmagall][[#]]]}&/@Range[16,Length[x]-2];
del180={((x[[#]])/(1.*^6)),seldel[x[[#]],180].Reverse[Last/@Transpose[dbmagall][[#]]]}&/@Range[16,Length[x]-2];
del270={((x[[#]])/(1.*^6)),seldel[x[[#]],270].Reverse[Last/@Transpose[dbmagall][[#]]]}&/@Range[24,Length[x]-2];
del360={((x[[#]])/(1.*^6)),seldel[x[[#]],360].Reverse[Last/@Transpose[dbmagall][[#]]]}&/@Range[32,Length[x]-2];

MultipleListPlot[{del45,del90,del180,del270,del360},
PlotLabel->"Insertion Loss at multiple phase shifts",
FrameLabel->{"Frequency (MHz)","Added Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotLegend->{"45°","90°", "180°", "270°", "360°"},
SymbolStyle->{{RGBColor [1,0,0]},{RGBColor [0,0,1]},{RGBColor [0,0.6,0]},{RGBColor [0.5,0.3,0]},{RGBColor [0.2,0.3,0.4]}},
LegendPosition->{0.9,-0.3},
LegendShadow->None]

Plot of Delay Data

delays={(1/16),(1/8),(1/4),(1/2),1,2,4,8,16};
Clear[delay];
delay[n_]:=Transpose[{x/1*^6,1*^9((unwrap[-Phase[y[n]/y[0]]])/(360 x ))}];
delayall=delay/@delays;

Clear[delaysmooth];
delaysmooth[n_]:=Interpolation[smooth[delay[n],5]]
delaysmoothall=delaysmooth/@delays;

1*^9((unwrap[-Phase[y[#]/y[0]]])/(360 x ))&/@delays;
d50=Reverse[Transpose[%][[100]]]
dseries50=d50.#&/@(IntegerDigits[#,2,9]&/@Range[0,511]);
ddiff50=Drop[dseries50,1]-Drop[dseries50,-1];
ListPlot[ddiff50,PlotRange->All]

16ns Delay as Function of Frequency

f=delaysmooth[16];
Plot[f[x],{x,10,194},
PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]}},
PlotLabel->"Delay",
FrameLabel->{"Frequency (MHz)","Delay (ns)"},
PlotRange->All,Frame->True,GridLines->Automatic]

Delay Taps as Function of Frequency

LogPlot[{delaysmoothall[[1]][fr],delaysmoothall[[2]][fr],delaysmoothall[[3]][fr],delaysmoothall[[4]][fr],delaysmoothall[[5]][fr],delaysmoothall[[6]][fr],delaysmoothall[[7]][fr],delaysmoothall[[8]][fr],delaysmoothall[[9]][fr]},{fr,10,194},
PlotStyle->{{Thickness [0.007], RGBColor [1,0,0]},
			    {Thickness [0.007], RGBColor [0.9,0,0]},
			    {Thickness [0.007], RGBColor [0.8,0,0]},
			    {Thickness [0.007], RGBColor [0.7,0,0]},
		    {Thickness [0.007], RGBColor [0.6,0,0]},
		    {Thickness [0.007], RGBColor [0.5,0,0]},
		    {Thickness [0.007], RGBColor [0.4,0,0]},
		    {Thickness [0.007], RGBColor [0.3,0,0]},
		    {Thickness [0.007], RGBColor [0.2,0,0]}},
PlotLabel->"Delay Taps",
FrameLabel->{"Frequency (MHz)","Delay (ns)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotLegend->{"1/16 ns","1/8 ns","1/4 ns","1/2 ns","1 ns","2 ns","4 ns","8 ns", "16 ns"},
LegendPosition->{1.05,-0.3},
LegendShadow->None]

Plot of Step Data (at 50 MHz)

taploss=Transpose[{dtapx,dtaploss}];
tapphase=Transpose[{dtapx,unwrap[dtapphase]-dtapphase[[1]]}];
dtapdelay=1*^9(1/(50*^6))((-unwrap[dtapphase]+dtapphase[[1]])/360);
tapdelay=Transpose[{dtapx,dtapdelay}];
difftapdelay=Drop[dtapdelay,1]-Drop[dtapdelay,-1];
tapslope=Fit[tapdelay,{ns},ns]/.ns->1
dnldelay=(Range[0, Length[dtapdelay]-1] tapslope)-dtapdelay;

Insertion Loss as Function of Steps

ListPlot[taploss,
Joined->True,
PlotLabel->"Insertion Loss as Function of Steps at 50 MHz",
FrameLabel->{"Steps","Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

Phase Shift as Function of Steps

ListPlot[tapphase,
Joined->True,
PlotLabel->"Phase as Function of Steps at 50 MHz",
FrameLabel->{"Steps","Phase (°)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

Delay as Function of Steps

ListPlot[tapdelay,
Joined->True,
PlotLabel->"Delay as Function of Steps at 50 MHz",
FrameLabel->{"Steps","Delay (ns)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

Differential Non-Linearity

ListPlot[difftapdelay,
Joined->True,
PlotLabel->"Delay Step as Function of Steps at 50 MHz",
FrameLabel->{"Steps","Δ Delay (ns)"},
PlotRange->{0,0.08},Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

ListPlot[dnldelay,
Joined->True,
PlotLabel->"Differential Non-Linearity at 50 MHz",
FrameLabel->{"Steps","Δ Delay (ns)"},
PlotRange->{-0.06,0.06},Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

Plot of Power Sweep

Insertion Loss as Function of Input Power

ListPlot[pwrdata,
Joined->True,
PlotLabel->"Insertion Loss as Function of Input Power",
FrameLabel->{"Input Power (dBm)","Insertion Loss (dB)"},
PlotRange->All,Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]

ListPlot[pwrdata,
Joined->True,
PlotLabel->"Insertion Loss as Function of Input Power",
FrameLabel->{"Input Power (dBm)","Insertion Loss (dB)"},
PlotRange->{-3.0,-2.6},Frame->True,GridLines->Automatic,
PlotStyle->{Thickness [0.007],RGBColor [1,0,0]}]