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.
114 lines
3.9 KiB
114 lines
3.9 KiB
//VerilogA for passive,xcouplerideal,veriloga
|
|
|
|
`include "constants.vams"
|
|
`include "disciplines.vams"
|
|
|
|
module xcouplerideal(Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2);
|
|
parameter integer modespec = 1 from [1:2];
|
|
parameter real kappa_te = 0.5 from [0:1];
|
|
parameter real kappa_tm = 0.5 from [0:1];
|
|
parameter integer p = 1 from [-1:1] exclude 0;
|
|
|
|
input Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2;
|
|
output Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2;
|
|
electrical Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2;
|
|
|
|
real eeir1,eeii1,emir1,emii1;
|
|
real eeir2,eeii2,emir2,emii2;
|
|
real eeor1,eeoi1,emor1,emoi1;
|
|
real eeor2,eeoi2,emor2,emoi2;
|
|
|
|
real t11r,t11i,t12r,t12i,t13r,t13i,t14r,t14i,t21r,t21i,t22r,t22i,t23r,t23i,t24r,t24i;
|
|
real t31r,t31i,t32r,t32i,t33r,t33i,t34r,t34i,t41r,t41i,t42r,t42i,t43r,t43i,t44r,t44i;
|
|
real iph_upper,iph_lower;
|
|
|
|
analog begin
|
|
iph_upper=V(Iphase1)/360.0*2*`M_PI;
|
|
iph_lower=V(Iphase2)/360.0*2*`M_PI;
|
|
if (modespec ==1) begin
|
|
eeir1=sqrt(V(Ipow1))*cos(iph_upper);
|
|
eeii1=sqrt(V(Ipow1))*sin(iph_upper);
|
|
emir1=0;
|
|
emii1=0;
|
|
eeir2=sqrt(V(Ipow2))*cos(iph_lower);
|
|
eeii2=sqrt(V(Ipow2))*sin(iph_lower);
|
|
emir2=0;
|
|
emii2=0;
|
|
end
|
|
else if (modespec ==2) begin
|
|
eeir1=0;
|
|
eeii1=0;
|
|
emir1=sqrt(V(Ipow1))*cos(iph_upper);
|
|
emii1=sqrt(V(Ipow1))*sin(iph_upper);
|
|
eeir2=0;
|
|
eeii2=0;
|
|
emir2=sqrt(V(Ipow2))*cos(iph_lower);
|
|
emii2=sqrt(V(Ipow2))*sin(iph_lower);
|
|
end
|
|
|
|
t11r=sqrt(1-kappa_te);
|
|
t11i=0;
|
|
t12r=0;
|
|
t12i=0;
|
|
t13r=0;
|
|
t13i=p*sqrt(kappa_te);
|
|
t14r=0;
|
|
t14i=0;
|
|
t21r=0;
|
|
t21i=0;
|
|
t22r=sqrt(1-kappa_tm);
|
|
t22i=0;
|
|
t23r=0;
|
|
t23i=0;
|
|
t24r=0;
|
|
t24i=p*sqrt(kappa_tm);
|
|
t31r=0;
|
|
t31i=p*sqrt(kappa_te);
|
|
t32r=0;
|
|
t32i=0;
|
|
t33r=sqrt(1-kappa_te);
|
|
t33i=0;
|
|
t34r=0;
|
|
t34i=0;
|
|
t41r=0;
|
|
t41i=0;
|
|
t42r=0;
|
|
t42i=p*sqrt(kappa_tm);
|
|
t43r=0;
|
|
t43i=0;
|
|
t44r=sqrt(1-kappa_tm);
|
|
t44i=0;
|
|
|
|
eeor1=t11r*eeir1-t11i*eeii1+t12r*emir1-t12i*emii1+t13r*eeir2-t13i*eeii2+t14r*emir2-t14i*emii2;
|
|
eeoi1=t11r*eeii1+t11i*eeir1+t12r*emii1+t12i*emir1+t13r*eeii2+t13i*eeir2+t14r*emii2+t14i*emir2;
|
|
emor1=t21r*eeir1-t21i*eeii1+t22r*emir1-t22i*emii1+t23r*eeir2-t23i*eeii2+t24r*emir2-t24i*emii2;
|
|
emoi1=t21r*eeii1+t21i*eeir1+t22r*emii1+t22i*emir1+t23r*eeii2+t23i*eeir2+t24r*emii2+t24i*emir2;
|
|
eeor2=t31r*eeir1-t31i*eeii1+t32r*emir1-t32i*emii1+t33r*eeir2-t33i*eeii2+t34r*emir2-t34i*emii2;
|
|
eeoi2=t31r*eeii1+t31i*eeir1+t32r*emii1+t32i*emir1+t33r*eeii2+t33i*eeir2+t34r*emii2+t34i*emir2;
|
|
emor2=t41r*eeir1-t41i*eeii1+t42r*emir1-t42i*emii1+t43r*eeir2-t43i*eeii2+t44r*emir2-t44i*emii2;
|
|
emoi2=t41r*eeii1+t41i*eeir1+t42r*emii1+t42i*emir1+t43r*eeii2+t43i*eeir2+t44r*emii2+t44i*emir2;
|
|
|
|
if (V(Ilam1)==0)
|
|
V(Olam1) <+ V(Ilam2);
|
|
else
|
|
V(Olam1) <+ V(Ilam1);
|
|
if (V(Ilam2)==0)
|
|
V(Olam2) <+ V(Ilam1);
|
|
else
|
|
V(Olam2) <+ V(Ilam2);
|
|
if (modespec == 1) begin
|
|
V(Opow1) <+ pow(eeor1,2)+pow(eeoi1,2);
|
|
V(Ophase1) <+ atan2(eeoi1,eeor1)*360.0/(2*`M_PI);
|
|
V(Opow2) <+ pow(eeor2,2)+pow(eeoi2,2);
|
|
V(Ophase2) <+ atan2(eeoi2,eeor2)*360.0/(2*`M_PI);
|
|
end
|
|
else if (modespec == 2) begin
|
|
V(Opow1) <+ pow(emor1,2)+pow(emoi1,2);
|
|
V(Ophase1) <+ atan2(emoi1,emor1)*360.0/(2*`M_PI);
|
|
V(Opow2) <+ pow(emor2,2)+pow(emoi2,2);
|
|
V(Ophase2) <+ atan2(emoi2,emor2)*360.0/(2*`M_PI);
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|