Verilog-A release version.
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.

135 lines
5.2 KiB

7 months ago
//VerilogA for passive,jointerbasic,veriloga
`include "constants.vams"
`include "disciplines.vams"
module jointerbasic(Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,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 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 Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2;
output Opow,Ophase,Olam;
electrical Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow,Ophase,Olam;
real freq,iph1,iph2;
real eeir1,eeii1,emir1,emii1,eeir2,eeii2,emir2,emii2;
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,t13r,t13i,t14r,t14i,t23r,t23i,t24r,t24i;
real oer,oei,omr,omi;
analog begin
freq=`P_C/V(Ilam1);
iph1=V(Iphase1)/360.0*2*`M_PI;
iph2=V(Iphase2)/360.0*2*`M_PI;
if (modespec == 1) begin
eeir1=sqrt(V(Ipow1))*cos(iph1);
eeii1=sqrt(V(Ipow1))*sin(iph1);
emir1=0;
emii1=0;
eeir2=sqrt(V(Ipow2))*cos(iph2);
eeii2=sqrt(V(Ipow2))*sin(iph2);
emir2=0;
emii2=0;
end
else if (modespec == 2) begin
eeir1=0;
eeii1=0;
emir1=sqrt(V(Ipow1))*cos(iph1);
emii1=sqrt(V(Ipow1))*sin(iph1);
eeir2=0;
eeii2=0;
emir2=sqrt(V(Ipow2))*cos(iph2);
emii2=sqrt(V(Ipow2))*sin(iph2);
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));
t13r=pow(10,-scat_loss_te/10)*sqrt(1-s_te)*exp(-beta_tei*(l_str+l_down))*cos(-beta_ter*(l_str+l_down));
t13i=pow(10,-scat_loss_te/10)*sqrt(1-s_te)*exp(-beta_tei*(l_str+l_down))*sin(-beta_ter*(l_str+l_down));
t14r=0;
t14i=0;
t23r=0;
t23i=0;
t24r=pow(10,-scat_loss_tm/10)*sqrt(1-s_tm)*exp(-beta_tmi*(l_str+l_down))*cos(-beta_tmr*(l_str+l_down));
t24i=pow(10,-scat_loss_tm/10)*sqrt(1-s_tm)*exp(-beta_tmi*(l_str+l_down))*sin(-beta_tmr*(l_str+l_down));
oer=t11r*eeir1+t12r*emir1+t13r*eeir2+t14r*emir2-t11i*eeii1-t12i*emii1-t13i*eeii2-t14i*emii2;
oei=t11r*eeii1+t12r*emii1+t13r*eeii2+t14r*emii2+t11i*eeir1+t12i*emir1+t13i*eeir2+t14i*emir2;
omr=t21r*eeir1+t22r*emir1+t23r*eeir2+t24r*emir2-t21i*eeii1-t22i*emii1-t23i*eeii2-t24i*emii2;
omi=t21r*eeii1+t22r*emii1+t23r*eeii2+t24r*emii2+t21i*eeir1+t22i*emir1+t23i*eeir2+t24i*emir2;
V(Olam) <+ V(Ilam1);
if (modespec == 1) begin
V(Opow) <+ pow(oer,2)+pow(oei,2);
V(Ophase) <+ atan2(oei,oer)*360.0/(2*`M_PI);
end
else if (modespec == 2) begin
V(Opow) <+ pow(omr,2)+pow(omi,2);
V(Ophase) <+ atan2(omi,omr)*360.0/(2*`M_PI);
end
end
endmodule