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.

64 lines
1.8 KiB

//VerilogA for amp,edfa,veriloga
//单模,单正向
//后续更新
`include "constants.vams"
`include "disciplines.vams"
`define NUM_INT 10000
module edfa(Ipow,Iphase,Ilam,Opow,Ophase,Olam);
parameter integer alpha_use_dBm = 1 from [0:1];
parameter real length = 6 from (0:inf);
parameter real sig_a = 3.86e-25 from (0:inf); //absorption, 1550nm
parameter real sig_e = 4.27e-25 from (0:inf); //emission, 1550nm
parameter real tau = 10.0e-3 from (0:inf);
parameter real gamma = 0.67 from (0:1);
parameter real nEr = 2.5e24 from (0:inf);
parameter real beff = 1.5e-6 from (0:inf);
parameter real bgloss = 0.03 from [0:inf);
parameter real bandwidth = 0.0 from [0:inf);
input Ipow, Iphase, Ilam;
output Opow, Ophase, Olam;
electrical Ipow, Iphase, Ilam, Opow, Ophase, Olam;
real Pk;
real Pase = 0;
real dz;
real dPk, dPase;
real lk;
real f2;
integer i;
real freq;
real df;
analog begin
freq = `P_C/V(Ilam);
dz = length/`NUM_INT;
Pk=V(Ipow);
if (alpha_use_dBm == 0) begin
lk=bgloss;
end
else if (alpha_use_dBm == 1) begin
lk=bgloss/10.0*ln(10);
end
for (i=0; i<`NUM_INT; i=i+1) begin
f2=tau*(Pk+Pase)/(`M_PI*beff*beff*`P_H*freq)*gamma*sig_a/(1+tau*(Pk+Pase)/(`M_PI*beff*beff*`P_H*freq)*gamma*(sig_a+sig_e));
// $display("f2=%e",f2);
dPk = (sig_e*f2-sig_a*(1-f2))*gamma*nEr*Pk-lk*Pk;
// $display("dPk=%e",dPk);
dPase = (sig_e*f2-sig_a*(1-f2))*gamma*nEr*Pase+sig_e*gamma*nEr*f2*2.0*`P_H*freq*bandwidth-lk*Pase;
// $display("dPase=%e",dPase);
Pk = Pk + dPk*dz;
Pase = Pase + dPase*dz;
end
V(Opow) <+ Pk + Pase;
V(Olam) <+ V(Ilam);
V(Ophase) <+ V(Iphase);
end
endmodule