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.

81 lines
3.3 KiB

7 months ago
//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