您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > VerilogA语法简介
VerilogA语法简介2010年06月25日星期五10:101、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out)+V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。2、下面讲Verilog-A的语法:beginend//相当于C语言的一对大括号,与Verilog同if(expression)true_statement;[elsefalse_statement;]//与Verilog同case(expression)case_item{case_item}endcasefor(procedural_assignment;expression;procedural_assignment)statement//case与for语句都跟Verilog、C语言类似cross(expr[,dir[,time_tol[,expr_tol]]]);//cross用来产生一个event,如:@(cross(V(sample)-2.0,+1.0))//指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反ddt(expr)//求导,如:I(n1,n2)+C*ddt(V(n1,n2));//表示了一个电容idt(expr,[ic[,assert[,abstol]]])//积分,如:V(out)+gain*idt(V(in),0)+gain*V(in);//比例积分,式中的0表示积分的初值transition(expr[,time_delay[,rise_time[,fall_time[,time_tol]]]])//将expr的值delay一下并指定上升下降沿时间,相当于一个传输门laplace_zp(expr,ζ,ρ)将expr进行拉普拉斯变换,具体表达式参看相关文献,还有laplace_zd()等数据类型:integer、real,另外就是discipline,不知道怎么翻译比较好,比如说它将电压电流这两个nature类型作为一个discipline,这些都在disciplines.vams这个头文件里建好了,编程时要`includedisciplines.vams。如果要定义一个电路节点,electricalnode_name就好了parameter{real|integer}list_of_assignments;//定义参数,如parameterR=50from(0:inf];在一个模块中调另一个模块和Verilog差不多,如:blk_aa1(Input1,a_b1);blk_aa2(Input2,a_b2);运算符号:+-*/==&|&&||^?:等,跟Verilog一样另外,新加的一个符号+,这个专门给模拟信号赋值用,注意这个赋值符号是可以累加的,就是说赋两次值的话,它会加起来,而不是覆盖,如://modelinputadmittance(导纳)I(in)+V(in)/Rin;I(in)+Cin*ddt(V(in));预处理&宏:`define`else`ifdef`include`resetall`undef跟Verilog差不多3、Verilog-A程序基本结构:`includedisciplines.vams//预处理moduleload(p);//定义模块,p是端口electricalp,gnd;//定义节点groundgnd;//定义gnd为ground节点,电位为0parameterrealR=50.0;//定义R这个参数并赋初值analog//模拟语句从这开始V(p)+R*I(p,gnd);//在这里表示一个电阻,表示了输出电压与输出电流的关系endmodule//模块定义结束4、上面这些基本上是最常用的了,了解之后,你就能看懂一般的Verilog-A程序了,下面是我写的PLL仿真程序,把它看完并看懂(当然第一次并不需要看得很仔细):提示:振荡频率4~6G,分频器为50分频,Fref为100M,鉴相器为电荷泵型。`includedisciplines.vams`includeconstants.vams//VCOmodulemy_vco(in,out);inputin;outputout;electricalin,out;parameterrealgain=2.0e9,fc=4.0e9;analogV(out)+sin(2*`M_PI*(fc*$realtime+idt(gain*V(in))));endmodule//phasedetectormodulemy_pd(ref,rf,outP,outN);inputref,rf;outputoutP,outN;electricalref,rf,outP,outN;realclr,up,down;parameterrealRo=1e6,Ro2=1;analogbegin@(cross(V(ref)-0.5,+1))up=1;@(cross(V(rf)-0.5,+1))down=1;clr=absdelay(up&&down,1e-9);//clr=transition(up&&down,1e-9);//这两条语句都可以if(clr0.5)beginup=0;down=0;endif(up)beginif(V(outP)=3)V(outP)+3-I(outP)*Ro2;elseI(outP)+-up*0.01;endelsebeginI(outP)+0;endif(down)beginif(V(outN)=0)V(outN)+0-I(outN)*Ro2;elseI(outN)+down*0.01;endelsebeginI(outN)+0;endendendmodule//Ndividermodulemy_divider(in,out);inputin;outputout;electricalin,out;integercnt;parameterintegerK=50;analogbegin@(cross(V(in),+1))cnt=cnt+1;if(cnt=K)cnt=0;if(cnt*2-K=0)V(out)+1;elseV(out)+0;endendmodule
本文标题:VerilogA语法简介
链接地址:https://www.777doc.com/doc-4409104 .html