veriloga求助
时间:10-02
整理:3721RD
点击:
`include "discipline.h"
`include "constants.h"
module diff_opamp(vout_p,vout_n,vref,vin_p,vin_n,vsupply_p,vsupply_n);
input vref,vsupply_p,vsupply_n;
inout vout_p,vout_n,vin_p,vin_n;
parameterfreq_unitygain=1e6;
parametergain=1000;
parameterr_in=10e6;
parameteri_bias=0;
parameterr_out=100;
parameter realiin_max=100e-6;
parameter realslew_rate=20e6;
parametervin_offset=0;
parametervsoft=0.5;
realgm_nom;
realvmax_in;
realvin_al,c1,r1;
electrical vout_p,vout_n,vref,vin_p,vin_n,vsupply_n,vsupply_p;
electrical cout_n,cout_p;
analog begin
@(initial_step or initial_step("dc"))begin
c1=iin_max/slew_rate;
gm_nom=2*3.14*freq_unitygain*c1;
r1=gain/gm_nom;
vmax_in=iin_max/gm_nom;
end
//
//input stage
//
V(vref)<+ V(vsupply_n)+0.5*V(vsupply_p,vsupply_n);
vin_al=V(vin_p,vin_n)/2+vin_offset;
I(vref,vin_n)<+i_bias;
I(vref,vin_p)<+i_bias;
I(vin_p,vin_n)<+V(vin_p,vin_n)/r_in+vin_offset/r_in;
//
//GM stage with slew rating
//
I(cout_n,vref)<+ V(cout_n,vref)/100e6;
I(cout_p,vref)<+ V(cout_p,vref)/100e6;
if(vin_al>vmax_in)begin
I(vref,cout_p)<+ iin_max;
I(vref,cout_n)<+ -iin_max;
end
else if(vin_al<-vmax_in)begin
I(vref,cout_p)<+ -iin_max;
I(vref,cout_n)<+iin_max;
end
else begin
I(vref,cout_p)<+0.5*gm_nom*vin_al;
I(vref,cout_n)<+ -0.5*gm_nom*vin_al;
end
//
//dominate pole
//
I(vref,cout_n)<+ c1*ddt(V(vref,cout_n));
I(vref,cout_p)<+ c1*ddt(V(vref,cout_p));
I(vref,cout_n)<+ V(vref,cout_n)/r1;
I(vref,cout_p)<+ V(vref,cout_p)/r1;
//
//output stage
//
I(vout_n,vref)<+ V(vref,cout_n)/r1;
I(vout_n,vref)<+ V(vout_n,vref)/r1;
I(vout_p,vref)<+ V(vref,cout_p)/r1;
I(vout_p,vref)<+ V(vout_p,vref)/r1;
//
//soft output limiting
//
if(V(vout_p)>(V(vsupply_p)-vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_p)+vsoft);
end
else if(V(vout_p)<(V(vsupply_n)+vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_n)-vsoft);
end
if(V(vout_n)>(V(vsupply_n)-vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_p)+vsoft);
end
else if(V(vout_n)<(V(vsupply_n)+vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_n)-vsoft);
end
end
endmodule
这是何乐年书上的差分运放的veriloga程序,可是当我在仿真时出现了这个错误:
vref上我接的是0.5V的电压,但是仿真时出错,错误提示:FATAL;The following branches form a loop of rigid branches(shorts)when added to the circuit,
怎么会短路呢?
`include "constants.h"
module diff_opamp(vout_p,vout_n,vref,vin_p,vin_n,vsupply_p,vsupply_n);
input vref,vsupply_p,vsupply_n;
inout vout_p,vout_n,vin_p,vin_n;
parameterfreq_unitygain=1e6;
parametergain=1000;
parameterr_in=10e6;
parameteri_bias=0;
parameterr_out=100;
parameter realiin_max=100e-6;
parameter realslew_rate=20e6;
parametervin_offset=0;
parametervsoft=0.5;
realgm_nom;
realvmax_in;
realvin_al,c1,r1;
electrical vout_p,vout_n,vref,vin_p,vin_n,vsupply_n,vsupply_p;
electrical cout_n,cout_p;
analog begin
@(initial_step or initial_step("dc"))begin
c1=iin_max/slew_rate;
gm_nom=2*3.14*freq_unitygain*c1;
r1=gain/gm_nom;
vmax_in=iin_max/gm_nom;
end
//
//input stage
//
V(vref)<+ V(vsupply_n)+0.5*V(vsupply_p,vsupply_n);
vin_al=V(vin_p,vin_n)/2+vin_offset;
I(vref,vin_n)<+i_bias;
I(vref,vin_p)<+i_bias;
I(vin_p,vin_n)<+V(vin_p,vin_n)/r_in+vin_offset/r_in;
//
//GM stage with slew rating
//
I(cout_n,vref)<+ V(cout_n,vref)/100e6;
I(cout_p,vref)<+ V(cout_p,vref)/100e6;
if(vin_al>vmax_in)begin
I(vref,cout_p)<+ iin_max;
I(vref,cout_n)<+ -iin_max;
end
else if(vin_al<-vmax_in)begin
I(vref,cout_p)<+ -iin_max;
I(vref,cout_n)<+iin_max;
end
else begin
I(vref,cout_p)<+0.5*gm_nom*vin_al;
I(vref,cout_n)<+ -0.5*gm_nom*vin_al;
end
//
//dominate pole
//
I(vref,cout_n)<+ c1*ddt(V(vref,cout_n));
I(vref,cout_p)<+ c1*ddt(V(vref,cout_p));
I(vref,cout_n)<+ V(vref,cout_n)/r1;
I(vref,cout_p)<+ V(vref,cout_p)/r1;
//
//output stage
//
I(vout_n,vref)<+ V(vref,cout_n)/r1;
I(vout_n,vref)<+ V(vout_n,vref)/r1;
I(vout_p,vref)<+ V(vref,cout_p)/r1;
I(vout_p,vref)<+ V(vout_p,vref)/r1;
//
//soft output limiting
//
if(V(vout_p)>(V(vsupply_p)-vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_p)+vsoft);
end
else if(V(vout_p)<(V(vsupply_n)+vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_n)-vsoft);
end
if(V(vout_n)>(V(vsupply_n)-vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_p)+vsoft);
end
else if(V(vout_n)<(V(vsupply_n)+vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_n)-vsoft);
end
end
endmodule
这是何乐年书上的差分运放的veriloga程序,可是当我在仿真时出现了这个错误:
vref上我接的是0.5V的电压,但是仿真时出错,错误提示:FATAL;The following branches form a loop of rigid branches(shorts)when added to the circuit,
怎么会短路呢?
“V(vref)<+ V(vsupply_n)+0.5*V(vsupply_p,vsupply_n);
”
vref是运放内部已经指定了,不需要再外接。
cout_n cout_p的类型没定义?
"electrical cout_n,cout_p;"
不是定义了吗?
input vref,vsupply_p,vsupply_n;
从这句可以看出vref被定义为输入Pin
V(vref)<+ V(vsupply_n)+0.5*V(vsupply_p,vsupply_n);
从这句可以看出vref是输出Pin
结论:这段代码是垃圾,哪怕是何乐年写的,也是垃圾。
何乐年书上不是这么写的,我最近也在研究这个,也看了那段程序
请问有谁用verilog-a语言建立过霍尔模型么
您好,我也是在用何乐年书上面全差分运放那段veriloga代码,语法倒是没提醒错误,只是交流仿真感觉有问题,但又无从下手怎么改,网上也没有别的全差分运放的veriloga代码,请问大神这里有资源吗?求助啊
你好,请问后来有研究过霍尔器件的建模吗?