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.
108 lines
2.8 KiB
108 lines
2.8 KiB
//VerilogA for laser,dhld,veriloga
|
|
|
|
`include "constants.vams"
|
|
`include "disciplines.vams"
|
|
|
|
module dhld(Vin,Vlam,Gnd,OpowL,OphaseL,OlamL,OpowR,OphaseR,OlamR);
|
|
|
|
input Vin,Vlam;
|
|
output OpowL,OphaseL,OlamL,OpowR,OphaseR,OlamR;
|
|
inout Gnd;
|
|
electrical Vin,Vlam,Gnd,Nlight,Nv,OpowL,OphaseL,OlamL,OpowR,OphaseR,OlamR;
|
|
|
|
parameter real L = 250u from (0:inf);
|
|
parameter real W = 1u from (0:inf);
|
|
parameter real D = 0.15u from (0:inf);
|
|
parameter real An1 = 1.0E8 from [0:inf);
|
|
parameter real An2 = 1.1E-17 from [0:inf);
|
|
parameter real An3 = 2.0E-41 from [0:inf);
|
|
parameter real An4 = 0 from [0:inf);
|
|
parameter real A = 3.5 from (3:inf);
|
|
parameter real Ar1 = 4.2E8 from [0:inf);
|
|
parameter real Ar2 = 1.5E-16 from [0:inf);
|
|
parameter real GAM = 0.3 from (0:1];
|
|
parameter real G0 = 1.4E-12 from (0:inf);
|
|
parameter real Ntr = 1.5E24 from (0:inf);
|
|
parameter real EPS = 1E-25 from [0:inf);
|
|
parameter real B = 1 from [0:inf);
|
|
parameter real Bsp = 1E-3 from [0:1];
|
|
parameter real ALFA = 2000 from [0:inf);
|
|
parameter real Rl = 0.3 from [0:1);
|
|
parameter real Rr = 0.3 from [0:1);
|
|
parameter real Ne = 7.8E7 from (0:inf);
|
|
parameter real EIT = 2 from (0:inf);
|
|
parameter real Nr = 3.5 from (0:inf);
|
|
parameter real Vbi = 1.13 from (0:inf);
|
|
parameter real Csc0 = 10p from [0:inf);
|
|
parameter real Rs = 5 from [0:inf);
|
|
parameter real Cp = 1p from [0:inf);
|
|
parameter real Rd = 1E15 from [0:inf);
|
|
|
|
real VT=`P_K*$temperature/`P_Q;
|
|
real Vact;
|
|
real Tph;
|
|
real QV;
|
|
real Cph,Rph;
|
|
real CPL,CPR;
|
|
|
|
real N,N0,LMD;
|
|
real G;
|
|
real Cd;
|
|
real Csc;
|
|
real Rn;
|
|
real Rra;
|
|
real aca,acp;
|
|
|
|
branch (Nv,Gnd) R2,C1,C2,C3,B1,B2,B3;
|
|
branch (Gnd,Nlight) B4,B5,R3,C4;
|
|
|
|
analog begin
|
|
LMD=V(Vlam);
|
|
Vact=L*W*D;
|
|
Tph=Nr/(`P_C*(GAM*ALFA-ln(Rl*Rr)/2.0/L));
|
|
QV=`P_Q*Vact;
|
|
Cph=`P_Q/VT;
|
|
Rph=VT*Tph/`P_Q;
|
|
CPL=`P_H*`P_C*`P_C*(Rl-1.0)*ln(Rl*Rr)/(2.0*Nr*VT*L*LMD*(1-Rl+sqrt(Rl/Rr)*(1-Rr)));
|
|
CPR=`P_H*`P_C*`P_C*(Rr-1.0)*ln(Rl*Rr)/(2.0*Nr*VT*L*LMD*(1-Rr+sqrt(Rr/Rl)*(1-Rl)));
|
|
N=Ne*exp(V(Nv,Gnd)/EIT/VT)-1;
|
|
Cd=QV*Ne*exp(V(Nv,Gnd)/EIT/VT)/(EIT*VT);
|
|
if (V(Nv,Gnd)<Vbi) begin
|
|
Csc=Csc0/sqrt(1-V(Nv,Gnd)/Vbi);
|
|
end
|
|
else begin
|
|
Csc=Csc0/sqrt(0.1);
|
|
end
|
|
Rn=An1*N+An2*pow(N,2)+An3*pow(N,3)+An4*pow(N,A);
|
|
Rra=Ar1*N+Ar2*pow(N,2);
|
|
if (N<Ntr) begin
|
|
G=0;
|
|
end
|
|
else begin
|
|
G=QV*GAM*G0*(N-Ntr)/pow(1+EPS*abs(V(Gnd,Nlight)),B);
|
|
end
|
|
|
|
V(Vin,Nv) <+ I(Vin,Nv)*Rs;
|
|
|
|
V(R2) <+ I(R2)*Rd;
|
|
I(C1) <+ Cp*ddt(V(C1));
|
|
I(C2) <+ Cd*ddt(V(C2));
|
|
I(C3) <+ Csc*ddt(V(C3));
|
|
I(B1) <+ QV*Rn;
|
|
I(B2) <+ QV*Rra;
|
|
I(B3) <+ G*abs(V(Gnd,Nlight))/Vact/VT;
|
|
|
|
V(R3) <+ I(R3)*Rph;
|
|
I(C4) <+ Cph*ddt(V(C4));
|
|
I(B4) <+ Bsp*QV*Rra;
|
|
I(B5) <+ G*abs(V(Gnd,Nlight))/Vact/VT;
|
|
|
|
V(OpowL,Gnd) <+ CPL*V(Nlight,Gnd);
|
|
V(OpowR,Gnd) <+ CPR*V(Nlight,Gnd);
|
|
V(OphaseL) <+ 0;
|
|
V(OphaseR) <+ 0;
|
|
V(OlamL) <+ V(Vlam);
|
|
V(OlamR) <+ V(Vlam);
|
|
end
|
|
|
|
endmodule
|