You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.3 KiB
151 lines
5.3 KiB
7 months ago
|
//VerilogA for passive,wgarc,veriloga
|
||
|
|
||
|
`include "constants.vams"
|
||
|
`include "disciplines.vams"
|
||
|
|
||
|
module wgarc(Ipow,Iphase,Ilam,Opow,Ophase,Olam);
|
||
|
parameter integer modespec = 1 from [1:2];
|
||
|
parameter integer alpha_use_dBm = 1 from [0:1];
|
||
|
parameter real reffreq = 193.1e12 from (0:inf);
|
||
|
parameter real neff_te_0 = 2.6 from (0:inf);
|
||
|
parameter real neff_tm_0 = 2.6 from (0:inf);
|
||
|
parameter real n_gv_te = 4.2 from (0:inf);
|
||
|
parameter real n_gv_tm = 4.2 from (0:inf);
|
||
|
parameter real disper_te = 0;
|
||
|
parameter real disper_tm = 0;
|
||
|
parameter real attenu_te = 0 from [0:inf);
|
||
|
parameter real attenu_tm = 0 from [0:inf);
|
||
|
parameter real phasedelay_te = 0;
|
||
|
parameter real phasedelay_tm = 0;
|
||
|
parameter real coupling_tem = 0;
|
||
|
parameter real redius = 1e-3 from (0:inf);
|
||
|
parameter real angle = 90 from (0:inf);
|
||
|
parameter real kn_te = 0;
|
||
|
parameter real kn_tm = 0;
|
||
|
parameter real A_te = 0 from [0:inf);
|
||
|
parameter real A_tm = 0 from [0:inf);
|
||
|
parameter real B_te = 0 from [0:inf);
|
||
|
parameter real B_tm = 0 from [0:inf);
|
||
|
|
||
|
input Ipow,Iphase,Ilam;
|
||
|
output Opow,Ophase,Olam;
|
||
|
electrical Ipow,Iphase,Ilam,Opow,Ophase,Olam;
|
||
|
|
||
|
real eeir,eeii,emir,emii;
|
||
|
real eeor,eeoi,emor,emoi;
|
||
|
real t11r,t11i,t12r,t12i,t21r,t21i,t22r,t22i;
|
||
|
real beta_ter,beta_tei,beta_tmr,beta_tmi,beta_avr,beta_avi,beta_dvr,beta_dvi;
|
||
|
real delta,trandelta,cdd,bddr,bddi;
|
||
|
real rfront,ifrontch,t11r1,t1r2,t11i1,t1i2,t22r1,t2r2,t22i1,t2i2;
|
||
|
real alpha_te0,alpha_tm0;
|
||
|
real dn_te,dn_tm,dalpha_te,dalpha_tm;
|
||
|
real alpha_te,alpha_tm,neff_te,neff_tm;
|
||
|
real length=redius*angle/180*`M_PI;
|
||
|
real phasedelay_te_u=phasedelay_te/360.0*2*`M_PI;
|
||
|
real phasedelay_tm_u=phasedelay_tm/360.0*2*`M_PI;
|
||
|
real freq;
|
||
|
real iph;
|
||
|
|
||
|
analog begin
|
||
|
freq=`P_C/V(Ilam);
|
||
|
iph=V(Iphase)/360.0*2*`M_PI;
|
||
|
if (modespec == 1) begin
|
||
|
eeir=sqrt(V(Ipow))*cos(iph);
|
||
|
eeii=sqrt(V(Ipow))*sin(iph);
|
||
|
emir=0;
|
||
|
emii=0;
|
||
|
end
|
||
|
else if (modespec == 2) begin
|
||
|
eeir=0;
|
||
|
eeii=0;
|
||
|
emir=sqrt(V(Ipow))*cos(iph);
|
||
|
emii=sqrt(V(Ipow))*sin(iph);
|
||
|
end
|
||
|
|
||
|
alpha_te0=0.1*ln(10)*attenu_te;
|
||
|
alpha_tm0=0.1*ln(10)*attenu_tm;
|
||
|
dn_te=kn_te/pow(redius,2);
|
||
|
dn_tm=kn_tm/pow(redius,2);
|
||
|
dalpha_te=A_te/sqrt(redius)*exp(-B_te*redius);
|
||
|
dalpha_tm=A_tm/sqrt(redius)*exp(-B_tm*redius);
|
||
|
|
||
|
neff_te=neff_te_0+dn_te;
|
||
|
neff_tm=neff_tm_0+dn_tm;
|
||
|
alpha_te=alpha_te0+dalpha_te;
|
||
|
alpha_tm=alpha_tm0+dalpha_tm;
|
||
|
|
||
|
if (alpha_use_dBm == 1) begin
|
||
|
alpha_te=0.1*ln(10)*alpha_te;
|
||
|
alpha_tm=0.1*ln(10)*alpha_tm;
|
||
|
end
|
||
|
|
||
|
beta_ter=2*`M_PI*reffreq/`P_C*neff_te+2*`M_PI/`P_C*n_gv_te*(freq-reffreq)-`M_PI*`P_C*disper_te/pow(reffreq,2)*pow(freq-reffreq,2);
|
||
|
beta_tei=-alpha_te/2;
|
||
|
beta_tmr=2*`M_PI*reffreq/`P_C*neff_tm+2*`M_PI/`P_C*n_gv_tm*(freq-reffreq)-`M_PI*`P_C*disper_tm/pow(reffreq,2)*pow(freq-reffreq,2);
|
||
|
beta_tmi=-alpha_tm/2;
|
||
|
if (coupling_tem == 0) begin
|
||
|
rfront=exp(beta_tei*length);
|
||
|
t11r1=cos(phasedelay_te_u-beta_ter*length);
|
||
|
t11i1=sin(phasedelay_te_u-beta_ter*length);
|
||
|
t22r1=cos(phasedelay_tm_u-beta_tmr*length);
|
||
|
t22i1=sin(phasedelay_tm_u-beta_tmr*length);
|
||
|
|
||
|
t11r=rfront*t11r1;
|
||
|
t11i=rfront*t11i1;
|
||
|
t12r=0;
|
||
|
t12i=0;
|
||
|
t21r=0;
|
||
|
t21i=0;
|
||
|
t22r=rfront*t22r1;
|
||
|
t22i=rfront*t22i1;
|
||
|
end
|
||
|
else begin
|
||
|
beta_avr=(beta_ter+beta_tmr)/2;
|
||
|
beta_avi=(beta_tmi+beta_tmi)/2;
|
||
|
beta_dvr=(beta_ter-beta_tmr)/2;
|
||
|
beta_dvi=(beta_tmi-beta_tmi)/2;
|
||
|
delta=sqrt(beta_dvr*beta_dvr+beta_dvi*beta_dvi+coupling_tem*coupling_tem);
|
||
|
trandelta=delta*length;
|
||
|
cdd=coupling_tem/delta;
|
||
|
bddr=beta_dvr/delta;
|
||
|
bddi=beta_dvi/delta;
|
||
|
|
||
|
rfront=exp(beta_avi*length);
|
||
|
t11r1=cos(trandelta)+bddi*sin(trandelta);
|
||
|
t11i1=-bddr*sin(trandelta);
|
||
|
t1r2=cos(phasedelay_te_u-beta_avr*length);
|
||
|
t1i2=sin(phasedelay_te_u-beta_avr*length);
|
||
|
ifrontch=-cdd*sin(trandelta);
|
||
|
t2r2=cos(phasedelay_tm_u-beta_avr*length);
|
||
|
t2i2=sin(phasedelay_tm_u-beta_avr*length);
|
||
|
t22r1=cos(trandelta)-bddi*sin(trandelta);
|
||
|
t22i1=bddr*sin(trandelta);
|
||
|
|
||
|
t11r=rfront*(t11r1*t1r2-t11i1*t1i2);
|
||
|
t11i=rfront*(t11r1*t1i2+t11i1*t1r2);
|
||
|
t12r=rfront*ifrontch*t1i2;
|
||
|
t12i=rfront*ifrontch*t1r2;
|
||
|
t21r=rfront*ifrontch*t2i2;
|
||
|
t21i=rfront*ifrontch*t2r2;
|
||
|
t22r=rfront*(t22r1*t2r2-t22i1*t2i2);
|
||
|
t22i=rfront*(t22r1*t2i2+t22i1*t2r2);
|
||
|
end
|
||
|
|
||
|
eeor=t11r*eeir-t11i*eeii+t12r*emir-t12i*emii;
|
||
|
eeoi=t11r*eeii+t11i*eeir+t12r*emii+t12i*emir;
|
||
|
emor=t21r*eeir-t21i*eeii+t22r*emir-t22i*emii;
|
||
|
emoi=t21r*eeii+t21i*eeir+t22r*emii+t22i*emir;
|
||
|
|
||
|
V(Olam) <+ V(Ilam);
|
||
|
if (modespec == 1) begin
|
||
|
V(Opow) <+ eeor*eeor+eeoi*eeoi;
|
||
|
V(Ophase) <+ atan2(eeoi,eeor)*360.0/(2*`M_PI);
|
||
|
end
|
||
|
else if (modespec == 2) begin
|
||
|
V(Opow) <+ emor*emor+emoi*emoi;
|
||
|
V(Ophase) <+ atan2(emoi,emor)*360.0/(2*`M_PI);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|