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.
137 lines
5.2 KiB
137 lines
5.2 KiB
7 months ago
|
//VerilogA for passive,spliterbasic,veriloga
|
||
|
|
||
|
`include "constants.vams"
|
||
|
`include "disciplines.vams"
|
||
|
|
||
|
module spliterbasic(Ipow,Iphase,Ilam,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2);
|
||
|
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 l_str = 500e-6 from [0:inf);
|
||
|
parameter real l_up = 500e-6 from [0:inf);
|
||
|
parameter real l_down = 500e-6 from [0:inf);
|
||
|
parameter real neff_te = 2.6 from (0:inf);
|
||
|
parameter real neff_tm = 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);//attenuation in dB/m
|
||
|
parameter real attenu_tm = 0 from [0:inf);//attenuation in dB/m
|
||
|
parameter real design_freq = 193.1e12 from (0:inf);
|
||
|
parameter real s0_te = 0.5 from [0:1];
|
||
|
parameter real s0_tm = 0.5 from [0:1];
|
||
|
parameter real dfreq_te = 100e12 from [0:inf);
|
||
|
parameter real dfreq_tm = 100e12 from [0:inf);
|
||
|
parameter real ds_te = 0;
|
||
|
parameter real ds_tm = 0;
|
||
|
parameter real scat_loss_te = 0 from [0:inf);
|
||
|
parameter real scat_loss_tm = 0 from [0:inf);
|
||
|
|
||
|
|
||
|
input Ipow,Iphase,Ilam;
|
||
|
output Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2;
|
||
|
electrical Ipow,Iphase,Ilam,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2;
|
||
|
|
||
|
real freq,iph;
|
||
|
real eeir,eeii,emir,emii;
|
||
|
real alpha_te,alpha_tm;
|
||
|
real beta_ter,beta_tei,beta_tmr,beta_tmi;
|
||
|
real s_te,s_tm;
|
||
|
real t11r,t11i,t12r,t12i,t21r,t21i,t22r,t22i,t31r,t31i,t32r,t32i,t41r,t41i,t42r,t42i;
|
||
|
real o1er,o1ei,o1mr,o1mi,o2er,o2ei,o2mr,o2mi;
|
||
|
|
||
|
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
|
||
|
|
||
|
if (alpha_use_dBm == 1) begin
|
||
|
alpha_te=0.1*ln(10)*attenu_te;
|
||
|
alpha_tm=0.1*ln(10)*attenu_tm;
|
||
|
end
|
||
|
else begin
|
||
|
alpha_te=attenu_te;
|
||
|
alpha_tm=attenu_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 (freq < design_freq-dfreq_te/2) begin
|
||
|
s_te=s0_te-dfreq_te/2.0*ds_te;
|
||
|
end
|
||
|
else if (freq > design_freq+dfreq_te/2) begin
|
||
|
s_te=s0_te+dfreq_te/2.0*ds_te;
|
||
|
end
|
||
|
else begin
|
||
|
s_te=s0_te+(freq-design_freq)*ds_te;
|
||
|
end
|
||
|
if (freq < design_freq-dfreq_tm/2) begin
|
||
|
s_tm=s0_tm-dfreq_tm/2.0*ds_tm;
|
||
|
end
|
||
|
else if (freq > design_freq+dfreq_tm/2) begin
|
||
|
s_tm=s0_tm+dfreq_tm/2.0*ds_tm;
|
||
|
end
|
||
|
else begin
|
||
|
s_tm=s0_tm+(freq-design_freq)*ds_tm;
|
||
|
end
|
||
|
|
||
|
t11r=pow(10,-scat_loss_te/10)*sqrt(s_te)*exp(-beta_tei*(l_str+l_up))*cos(-beta_ter*(l_str+l_up));
|
||
|
t11i=pow(10,-scat_loss_te/10)*sqrt(s_te)*exp(-beta_tei*(l_str+l_up))*sin(-beta_ter*(l_str+l_up));
|
||
|
t12r=0;
|
||
|
t12i=0;
|
||
|
t21r=0;
|
||
|
t21i=0;
|
||
|
t22r=pow(10,-scat_loss_tm/10)*sqrt(s_tm)*exp(-beta_tmi*(l_str+l_up))*cos(-beta_tmr*(l_str+l_up));
|
||
|
t22i=pow(10,-scat_loss_tm/10)*sqrt(s_tm)*exp(-beta_tmi*(l_str+l_up))*sin(-beta_tmr*(l_str+l_up));
|
||
|
t31r=pow(10,-scat_loss_te/10)*sqrt(1-s_te)*exp(-beta_tei*(l_str+l_down))*cos(-beta_ter*(l_str+l_down));
|
||
|
t31i=pow(10,-scat_loss_te/10)*sqrt(1-s_te)*exp(-beta_tei*(l_str+l_down))*sin(-beta_ter*(l_str+l_down));
|
||
|
t32r=0;
|
||
|
t32i=0;
|
||
|
t41r=0;
|
||
|
t41i=0;
|
||
|
t42r=pow(10,-scat_loss_tm/10)*sqrt(1-s_tm)*exp(-beta_tmi*(l_str+l_down))*cos(-beta_tmr*(l_str+l_down));
|
||
|
t42i=pow(10,-scat_loss_tm/10)*sqrt(1-s_tm)*exp(-beta_tmi*(l_str+l_down))*sin(-beta_tmr*(l_str+l_down));
|
||
|
|
||
|
o1er=t11r*eeir-t11i*eeii+t12r*emir-t12i*emii;
|
||
|
o1ei=t11r*eeii+t11i*eeir+t12r*emii+t12i*emir;
|
||
|
o1mr=t21r*eeir-t21i*eeii+t22r*emir-t22i*emii;
|
||
|
o1mi=t21r*eeii+t21i*eeir+t22r*emii+t22i*emir;
|
||
|
o2er=t31r*eeir-t31i*eeii+t32r*emir-t32i*emii;
|
||
|
o2ei=t31r*eeii+t31i*eeir+t32r*emii+t32i*emir;
|
||
|
o2mr=t41r*eeir-t41i*eeii+t42r*emir-t42i*emii;
|
||
|
o2mi=t41r*eeii+t41i*eeir+t42r*emii+t42i*emir;
|
||
|
|
||
|
|
||
|
V(Olam1) <+ V(Ilam);
|
||
|
V(Olam2) <+ V(Ilam);
|
||
|
if (modespec == 1) begin
|
||
|
V(Opow1) <+ pow(o1er,2)+pow(o1ei,2);
|
||
|
V(Ophase1) <+ atan2(o1ei,o1er)*360.0/(2*`M_PI);
|
||
|
V(Opow2) <+ pow(o2er,2)+pow(o2ei,2);
|
||
|
V(Ophase2) <+ atan2(o2ei,o2er)*360.0/(2*`M_PI);
|
||
|
end
|
||
|
else if (modespec == 2) begin
|
||
|
V(Opow1) <+ pow(o1mr,2)+pow(o1mi,2);
|
||
|
V(Ophase1) <+ atan2(o1mi,o1mr)*360.0/(2*`M_PI);
|
||
|
V(Opow2) <+ pow(o2mr,2)+pow(o2mi,2);
|
||
|
V(Ophase2) <+ atan2(o2mi,o2mr)*360.0/(2*`M_PI);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|