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.
80 lines
3.3 KiB
80 lines
3.3 KiB
//VerilogA for ring,idealfilter,veriloga
|
|
|
|
`include "constants.vams"
|
|
`include "disciplines.vams"
|
|
|
|
module idealfilter(Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2);
|
|
parameter real r = 10u from (0:inf);
|
|
parameter real alpha = 7.1029e3 from (0:inf);
|
|
parameter real t1_abs = 0.8 from [0:1];
|
|
parameter real t1_theta = 0 from (-360:360);
|
|
parameter real t2_abs = 0.8 from [0:1];
|
|
parameter real t2_theta = 0 from (-360:360);
|
|
parameter real neff = 3.42 from (0:inf);
|
|
|
|
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 omega,L;
|
|
real a,theta;
|
|
real T1,T2;
|
|
real t1r,t1i,t2r,t2i;
|
|
real k1r,k1i,k2r,k2i;
|
|
real dr,di,u1r,u1i,u2r,u2i,u3r,u3i,u4r,u4i;
|
|
real ein1r,ein1i,ein2r,ein2i,eout1r,eout1i,eout2r,eout2i;
|
|
real c1r,c1i,c2r,c2i,c3r,c3i,c4r,c4i;
|
|
|
|
analog begin
|
|
omega=2*`M_PI*`P_C/V(Ilam1);
|
|
L=2*`M_PI*r;
|
|
a=exp(-alpha*L/2);
|
|
theta=omega*neff*L/`P_C;
|
|
t1r=t1_abs*cos(t1_theta*`M_PI/180);
|
|
t1i=t1_abs*sin(t1_theta*`M_PI/180);
|
|
t2r=t2_abs*cos(t2_theta*`M_PI/180);
|
|
t2i=t2_abs*sin(t2_theta*`M_PI/180);
|
|
k1r=sqrt(1-pow(t1r,2)-pow(t1i,2));
|
|
k2r=sqrt(1-pow(t2r,2)-pow(t2i,2));
|
|
k1i=0;
|
|
k2i=0;
|
|
|
|
dr=1-a*cos(theta)*t1r*t2r+a*cos(theta)*t1i*t2i-a*sin(theta)*t1r*t2i-a*sin(theta)*t1i*t2r;
|
|
di=a*cos(theta)*t1r*t2i+a*cos(theta)*t1i*t2r-a*sin(theta)*t1r*t2r+a*sin(theta)*t1i*t2i;
|
|
u1r=t1r-a*cos(theta)*t2r+a*sin(theta)*t2i;
|
|
u1i=t1i-a*cos(theta)*t2i-a*sin(theta)*t2r;
|
|
u2r=-sqrt(a)*(cos(theta/2)*k1r*k2r+cos(theta/2)*k1i*k2i+sin(theta/2)*k1r*k2i-sin(theta/2)*k1i*k2r);
|
|
u2i=-sqrt(a)*(sin(theta/2)*k1r*k2r+sin(theta/2)*k1i*k2i-cos(theta/2)*k1r*k2i+cos(theta/2)*k1i*k2r);
|
|
u3r=t2r-a*cos(theta)*t1r+a*sin(theta)*t1i;
|
|
u3i=t2i-a*cos(theta)*t1i-a*sin(theta)*t1r;
|
|
u4r=-sqrt(a)*(cos(theta/2)*k2r*k1r+cos(theta/2)*k2i*k1i+sin(theta/2)*k2r*k1i-sin(theta/2)*k2i*k1r);
|
|
u4i=-sqrt(a)*(sin(theta/2)*k2r*k1r+sin(theta/2)*k2i*k1i-cos(theta/2)*k2r*k1i+cos(theta/2)*k2i*k1r);
|
|
|
|
c1r=(dr*u1r+di*u1i)/(pow(dr,2)+pow(di,2));
|
|
c1i=(dr*u1i-di*u1r)/(pow(dr,2)+pow(di,2));
|
|
c2r=(dr*u2r+di*u2i)/(pow(dr,2)+pow(di,2));
|
|
c2i=(dr*u2i-di*u2r)/(pow(dr,2)+pow(di,2));
|
|
c3r=(dr*u3r+di*u3i)/(pow(dr,2)+pow(di,2));
|
|
c3i=(dr*u3i-di*u3r)/(pow(dr,2)+pow(di,2));
|
|
c4r=(dr*u4r+di*u4i)/(pow(dr,2)+pow(di,2));
|
|
c4i=(dr*u4i-di*u4r)/(pow(dr,2)+pow(di,2));
|
|
|
|
ein1r=V(Ipow1)*cos(V(Iphase1)/180.0*`M_PI);
|
|
ein1i=V(Ipow1)*sin(V(Iphase1)/180.0*`M_PI);
|
|
ein2r=V(Ipow2)*cos(V(Iphase2)/180.0*`M_PI);
|
|
ein2i=V(Ipow2)*sin(V(Iphase2)/180.0*`M_PI);
|
|
eout1r=c1r*ein1r-c1i*ein1i+c2r*ein2r-c2i*ein2i;
|
|
eout1i=c1i*ein1r+c1r*ein1i+c2i*ein2r+c2r*ein2i;
|
|
eout2r=c3r*ein2r-c3i*ein2i+c4r*ein1r-c4i*ein1i;
|
|
eout2i=c3i*ein2r+c3r*ein2i+c4i*ein1r+c4r*ein1i;
|
|
|
|
V(Opow1) <+ eout1r*eout1r+eout1i*eout1i;
|
|
V(Ophase1) <+ atan2(eout1i,eout1r)/`M_PI*180.0;
|
|
V(Olam1) <+ V(Ilam1);
|
|
|
|
V(Opow2) <+ eout2r*eout2r+eout2i*eout2i;
|
|
V(Ophase2) <+ atan2(eout2i,eout2r)/`M_PI*180.0;
|
|
V(Olam2) <+ V(Ilam2);
|
|
end
|
|
|
|
endmodule
|
|
|