您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Verilog高级语法
1电子电路设计训练--数字部分(VerilogHDL)--第三讲、VerilogHDL高级语法Verilog设计2第三讲、VerilogHDL高级语法3.1主要数据类型3.2赋值语句3.3运算符3.4块语句3.5条件语句3.6循环语句3.7always块3.8仿真与测试Verilog设计33Verilog共定义19种数据类型三种主要的数据类型:Net连接——其中最常见线网wire表示器件之间的物理连接,称为(线网)连接类型Register寄存器——表示抽象的储存单元,称为寄存器/变量类型Parameter表示运行时的常数,称为参数类型3.1主要“数据类型”Verilog设计443.1.1连接(Net)类型变量功能wire,tri对应于标准的互连线(缺省)supply1,supply2对应于电源线或接地线wor,trior对应于有多个驱动源的线或逻辑连接wand,triand对应于有多个驱动源的线与逻辑连接trireg对应于有电容存在能暂时存储电平的连接tri1,tri0对应于需要上拉或下拉的连接在为不同工艺的基本元件建立库模型的时候,常常需要用不同的连接类型来与之对应,使其行为与实际器件一致。如果不明确地说明连接是何种类型,应该是指wire类型tri类型可以用于描述多个驱动源驱动同一根线的线网类型Verilog设计55netsNet(线网连接):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。例如:右图上,selb信号的改变,会自动地立刻影响或门的输出。Verilog设计66wire型变量最常用的net型变量,常用来表示以assign关键字指定的组合逻辑信号模块中的输入/输出信号类型缺省为wire型。可用做任何方程式的输入,也可以用做“assign”语句或实例元件的输出。wire[n-1:0]数据名1,数据名2,……,数据名m;或wire[n:1]数据名1,数据名2,……,数据名m;每条总线位宽为n共有m条总线格式Verilog设计77常用”寄存器“型变量:3.1.2“寄存器”类型变量功能reg无符号整数变量,可以选择不同的位宽integer有符号整数变量,32位宽,算术运算可产生2的补码。real有符号的浮点数,双精度time无符号整数变量,64位宽(Verilog-XL仿真工具用64位的正数来记录仿真时刻)Verilog设计88reg型变量在过程块中被赋值的信号,往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号)!reg[n-1:0]数据名1,数据名2,……,数据名m;或reg[n:1]数据名1,数据名2,……,数据名m;每个向量位宽为n共有m个reg型向量例如:reg[4:1]regc,regd;//为4位宽的reg型比特矢量格式寄存器型是数据存储单元的抽象,但不能表示真正的硬件,相当于高级语言中的变量。always块中被赋值的每个信号必须声明为reg型。btw:与连续赋值相对的,在always过程块中的过程赋值。Verilog设计99小结:寄存器(register)类型变量register型变量能保持其值,直到它被赋于新的值;实现——reg型变量是锁存器/触发器的抽象测试(testbench)——用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。reg_areg_selreg_bVerilog设计1010register型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。register型变量必须通过过程赋值语句赋值!不能通过assign语句赋值!在过程块内被赋值的每个信号必须定义成reg型!进一步强调——register型变量与net型变量的根本区别:Verilog设计11113.1.3参数(parameter)类型参数型常量经常用于定义延迟时间和变量位宽。在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数。可用字符串表示的任何地方,都可以用定义的参数来代替。参数是本地的,其定义只在本模块内有效。(区别`define)参数型数据的确认符parameter参数名1=表达式,参数名2=表达式,……;赋值语句表格式用parameter来定义一个标识符,代表一个常量——称为符号常量Verilog设计12123.1.4阵列类型(数组类型)VerilogHDL语法允许声明reg,interger,time,realtime及向量类型的阵列,可以声明多维数组。阵列中的元素可以是标量或矢量,阵列可以是线网、变量、整数或表达式。reg[MSB:LSB]memory_name[first_addr:last_addr];Wire[7:0]w_array[4:0];//5个8bit线网组成的阵列用数组时一次只能对一个元素进行操作,而不能向向量那样同时对连续的几个位进行操作。表示数组某个元素时,允许使用变量来表示元素的索引,如numb[i]=12。Verilog通常用寄存器型变量建立的一维数组来描述存储器,可以是RAM、ROM存储器和寄存器数组。定义格式为:Verilog设计13需要注意,对存储器进行地址索引的表达式必须是常数表达式。Verilog-1995不支持多维数组,也就是说,只能对存储器字进行寻址,而不能对存储器中一个字的位寻址。Verilog-2001以后规则支持多维数组。尽管数组类型和寄存器型数据的定义都是寄存器,但二者还是有很大区别的。一个n位的寄存器可以在一条赋值语句中直接进行赋值,而一个存储器数组则不行。例:一个由n个1位寄存器构成的存储器是不同于一个n位寄存器的。reg[n-1:0]rega;//一个n位的寄存器型数据类型regmemb[n-1:0];//一个由n个1位寄存器成的存储器数组Verilog设计14143.1.5标量与矢量位宽是1bit的线网和寄存器类型数据被定义为标量,而位宽大于1bit的线网和寄存器类型数据被定义为矢量。wiren;//默认为1bit标量的线网变量类型regregn;//默认为1bit标量的寄存器变量类型wire[7:0]//8bit位宽的矢量线网变量reg[n-1:0]rega;//nbit矢量的寄存器型数据类型矢量通过关键字与变量名之间的方括号的高位/低位表示其变量的位宽[高位:低位],最左边的位定义为MSB,最右边的位定义为LSB。在矢量变量声明中可以通过关键字vectored和scalared进行扩展声明。Verilog设计1515赋值语句分为两类:(1)连续赋值语句——assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一。assignc=a&b;//a、b、c均为wire型变量(2)过程赋值语句——用于对reg型变量赋值,有两种方式:非阻塞(non-blocking)赋值方式:赋值符号为=,如b=a;阻塞(blocking)赋值方式:赋值符号为=,如b=a;3.2赋值语句过程赋值语句之阻塞赋值和非阻塞赋值。Verilog设计1616非阻塞赋值与阻塞赋值的区别1.非阻塞赋值方式always@(posedgeclk)beginb=a;c=b;end非阻塞赋值在块结束时才完成赋值操作!注:c的值比b的值落后一个时钟周期!Verilog设计1717阻塞赋值在该语句结束时就完成赋值操作!注:在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。这里c的值与b的值一样!非阻塞赋值与阻塞赋值的区别2.阻塞赋值方式always@(posedgeclk)beginb=a;c=b;endVerilog设计1818非阻塞(non-blocking)赋值方式(b=a):•b的值被赋成新值a的操作,并不是立刻完成的,而是在块结束时才完成;•块内的多条赋值语句在块结束时同时赋值;•可参考对应的同步数字电路。阻塞(blocking)赋值方式(b=a):•b的值立刻被赋成新值a;•完成该赋值语句后才能执行下一句的操作;•可能会由于疏忽,使综合结果未知。(可用但慎用)非阻塞赋值与阻塞赋值方式的主要区别Verilog设计193.3运算符算术运算符:+,−,×,/,%赋值运算符:=,=关系运算符:,,=,=等式运算符:==,!=,===,!==逻辑运算符:&&,||,!条件运算符:?:位运算符:~,|,^,&,^~移位运算符:,拼接运算符:{}缩减运算符其它&&与&,||与|区别?4’b1101&&4’b0101=?4’b1101&4’b0101=?4’b1101&&4’b0101=1‘b14’b1101&4’b0101=4b’0101Verilog设计20逻辑运算符:包括逻辑与&&,逻辑或||,逻辑非!其得到的结果为逻辑数值0,1,x。分别表示假,真,未定。对于非零操作数,等同于逻辑真,为零的操作数,等同于逻辑假。操作数中任意一位为x,z,其等同于逻辑不确定x。rega=4‘b0011;//逻辑值为“1”regb=4‘b10xz;//逻辑值为“1”regc=4‘b0z0x;//逻辑值为“x”ans=rega&&0;//ans=0ans=rega||0;//ans=1ans=regb&®a;//ans=1ans=regc||0;//ans=xans=!rega//ans=0逻辑反ans=~rega//ans=1100按位取反!3.3运算符Verilog设计213.3运算符拼接运算符:{}reg[3:0]A,B;reg[5:0]C;C={A[3:1],B[3:1]}位拼接运算符可以使用“重复法”例如:{4{w}}//等同于{w,w,w,w}{b,{3{a,b}}//等同于{b,a,b,a,b,a,b}Verilog设计223.3运算符全等运算符和非全等运算符区别:逻辑相等和逻辑全等运算例如:data=‘b11x0;data_expectd=‘b11x0data==data_expected//结果未知,为xdata===data_expected//结果为1Verilog设计23缩减运算符(reductionoperator)单目——把操作数中的所有的位进行位运算与、或、异或、与非、或非、异或非reg[3:0]B;regC;C=&B;相当于C=((B[0]&B[1])&B[2])&B[3];3.3运算符Verilog设计24参考书中的表格参考书:SamirPalnitkar--VerilogHDL:AGuidetoDigitalDesignandSynthesis(2ndEd).PearsonPress.Verilog设计253.4块语句顺序块:beginendbeginareg=breg;creg=areg;endcreg=?reg[2:0]A;reg[3:0]B;integerK,J;initialbeginK=0;A=0;K=K-1;J=K;A=A-1;B=A;J=J+1;B=B+1;endA=?,B=?,J=?,K=?Verilog设计263.4块语句顺序块:beginendbeginareg=breg;creg=areg;endcreg=bregreg[2:0]A;reg[3:0]B;integerK,J;initialbeginK=0;A=0;K=K-1;J=K;A=A-1;//虽然reg无符号B=A;J=J+1;B=B+1;endA=7,B=8,J=0,K=-1Verilog设计273.4块语句顺序块:beginend并行块:forkjoinfork#50r=‘h35;#100r=‘hE2;#150r=‘h00;#200r=‘hF7;#250r=‘h00;joinfork#250r=‘h00;#200r=‘hF7;#50r=‘h35;#100r=‘hE2;#150r=‘h00;joinVerilog设计283.4块语句顺序块:begi
本文标题:Verilog高级语法
链接地址:https://www.777doc.com/doc-4317171 .html