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.
65 lines
1.8 KiB
65 lines
1.8 KiB
7 months ago
|
//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
|