您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > (5)Verilog-HDL基础知识
可编程逻辑器件及其应用VerilogHDL基础知识第3章VerilogHDL基础知识3.1词法3.2数据类型3.3运算符3.4系统任务与系统函数3.5编译指令3.1词法VerilogHDL的源文本文件是由一串词法标识符构成的,一个词法标识符包含一个或若干个字符。源文件中这些标识符之间的间隔可以是任意的格式,也就是说,选择间隔符来分隔词法标识符,对编译器来说并不具有重要意义,只是提高描述的可读性。VerilogHDL中的词法类型包括:(1)间隔符与注释符。(2)数值。(3)字符串。(4)关键字。3.1.1间隔符与注释符VerilogHDL的间隔符包括空格(\b)、tab(\t)、换行符(\n)及换页符。如果间隔符并非出现在字符串中,则该间隔符被忽略。间隔符除起到分割的作用外,在必要的地方插入相应的空格或换行符,使文本错落有致,可方便用户阅读与修改。【例3-1】间隔符的例子。moduleaddbit(a,b,ci,sum,co);inputa,b,ci;outputsumco;wirea,b,ci,sum,co;……endmodule我们通常不会采用上面的书写形式,如果在适当的地方添加空格与换行符,写成下面的形式,则文本便于理解。moduleaddbit(a,b,ci,sum,co);inputa;inputb;inputci;outputsum;outputco;wirea;wireb;wireci;wiresum;wireco;……endmoduleVerilogHDL支持两种形式的注释符:/*……*/与//。其中,/*……*/为多行注释符,用于对多行语句注释;//为单行注释符,只对注释符所在的行有效。下面是一个使用注释符对1位加法器进行说明的例子。【例3-2】注释符的例子。/*该例利用一位加法器来说明单行注释符与多行注释符的用法(此处为多行注释)*/moduleaddbit(a,b,ci,sum,co);//输入端口(此处为单行注释)inputa;inputb;inputci;//输出端口outputsum;outputco;//数据类型wirea;wireb;wireci;wiresum;wireco;……endmodule3.1.2数值VerilogHDL中的数值可取下面的四类值:(1) 0:逻辑0或假状态。(2) 1:逻辑1或真状态。(3) x:未知状态。(4) z:高阻态。VerilogHDL中有两类数值常量:整型数和实型数。下划线符号“_”除了不能放于数值的首位以外,可以随意用在整型数与实型数中,它们对数值大小没有任何改变,只是为了提高可读性。1.整型数及其表示VerilogHDL中的整数可以是二进制(b或B)、十进制(d或D)、十六进制(h或H)与八进制(o或O),有下面三种书写形式。1)简单的十进制格式这种格式是直接由0~9的数字串组成的十进制数,可以用符号“+”或“-”来表示数的正负。2)缺省位宽的基数格式这种格式的表示形式为:'base_formatnumber符号“'”为基数格式表示的固有字符,该字符不能省略,否则为非法表示形式;参数base_format用于说明数值采用的进制格式;参数number为相应进制格式下的一串数字。这种格式未指定位宽,其缺省值至少为32位。3)指定位宽的基数格式这种格式的表示形式为:size'base_formatnumber参数size用来指定所表示数的位宽。当位宽小于数值的实际位数时,相应的高位部分被忽略;当位宽大于数值的实际位数,且数值的最高位是0或1时,相应的高位部分补0;而当位宽大于数值的实际位数,但数值的最高位是x或z时,相应的高位部分补x或z。二进制的一个x或z表示1位处于x或z,八进制的一个x或z表示3位二进制位都处于x或z,十六进制的一个x或z表示4位二进制位都处于x或z。另外,数值中的z可以用“?”来代替。【例3-3】三种格式的整数表示实例。659//简单的十进制格式'h837FF//缺省位宽的十六进制数'o7460//缺省位宽的八进制数4af//非法的整数表示(十六进制数表示需'h)b001//非法的整数表示,基数格式必须有字符“'”4'b1001//4位的二进制数5'D3//5位的十进制数12´hx//12位的未知数16'hz//16位的高阻态16'b0001_1010_1111_1000//使用下划线提高可读性8'b_0001_1010//非法格式,下划线不能用于首字符2.实型数及其表示VerilogHDL中的实数可以用十进制与科学计数法两种格式来表示,如果采用十进制格式,小数点两边必须都有数字,否则为非法的表示形式。【例3-4】实数表示实例。1.8//十进制计数法3.8e10//科学计数法2.1E-9//科学计数法可用e或E表示,其结果相同3_2387.3398_3047//使用下划线提高可读性3.//非法表示.2e6//非法表示3.1.3字符串字符串是用双引号括起来的字符序列,它必须包含在同一行中,不能分成多行书写。若字符串用作VerilogHDL表达式或赋值语句中的操作数,则字符串被看作8位的ASCII值序列,即一个字符对应8位的ASCII值。【例3-5】字符串实例。thisisastringprintoutamessage\n\tshowtheresultssimulationtime=%bbell!\0071.字符串变量的声明VerilogHDL中采用寄存器变量来存储字符串,寄存器变量的位数要大于字符串的最大长度。需要注意的是,VerilogHDL中并不需要特殊位来存储终止符。【例3-6】字符串变量的声明。reg[8*12:1]stringvar;initialbeginstringvar=Helloworld!;end2.字符串操作可采用VerilogHDL的标准操作符对字符串进行诸如连接类的操作。在操作过程中,如果声明的字符串变量位数大于字符串的实际长度,则字符串变量的高位补0。【例3-7】字符串操作。modulestring_test;reg[8*14:1]stringvar;initialbeginstringvar=Helloworld;$display(%sisstoredas%h,stringvar,stringvar);stringvar={stringvar,!!!};$display(%sisstoredas%h”,stringvar,stringvar);endendmodule3.特殊字符特殊字符又称转意符,用“\”来说明。表3.1给出了特殊字符的表示及其意义。表3.1特殊字符的表示及其意义特殊字符表示意义\n换行符\tTab键\\符号\\*符号*\ddd3位八进制数表示的ASCII值%%符号%3.1.4关键字关键字也称为保留词,它是VerilogHDL语言内部的专用词,所有的关键字都采用小写形式。表3.2给出了VerilogHDL中常用的关键字。表3.2VerilogHDL中常用的关键字alwaysandassignattributebeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefpramdisableedgeelseendendattributeendcaseendfunctionendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ifinitialinoutinputintegerjoinlargemacromodulemeduimmodulenandnegedgenmosnornotnotif0notif1oroutputparameterpmosposedgeprimitivepull0pull1pulldownpulluprcmosrealrealtimeregreleaserepeatrtranif1scalaredsignedsmallspecifyspecpramstrengthstrong0strong1supply0supply1tabletasktimetrantranif0tranif1tritri0tri1triandtriortriregunsignedvectoredwaitwandweak0weak1whilewireworxnorxor3.2数据类型VerilogHDL作为一种硬件描述语言,其数据类型集合用来表示硬件数字电路中数据进行存储和传输的要素。VerilogHDL不仅支持如整型、实型等抽象数据类型,同时也支持物理数据类型来表示真实的硬件。3.2.1物理数据类型连线型和寄存器型是VerilogHDL中最主要的两种物理数据类型,这两种类型的变量在定义时均要设置位宽,当缺省状态时,位宽默认值为1位。变量的每一位可以取0、1、x或z中的任意值。x表示一个未知初始状态的变量,或者由于多个驱动源试图将其设定为不同的值而引起的冲突型连线型变量,z代表高阻状态或浮空量。1.连线型数据连线型数据对应的是硬件电路中的物理信号连线,没有电荷保持作用(trireg除外)。连线型数据必须有驱动源驱动,有两种方式对它进行驱动:一是在结构描述中把它连接到一个门或模块的输出端;二是用连续赋值语句assign对其进行赋值。当没有驱动源对其驱动时,它将保持高阻态。1) VerilogHDL中的连线型数据为了能够精确地反映硬件电路中各种可能的物理信号连接特性,VerilogHDL提供了多种连线型数据。表3.3给出了类型的定义及其相应的功能描述。表3.3VerilogHDL中的连线型数据及其功能描述连线型数据功能描述wire,tri两种常见类型wor,trior多重驱动时,具有线或特性的连线型wand,triand多重驱动时,具有线与特性的连线型trireg具有电荷保持特性的连线型tri1上拉电阻tri0下拉电阻supply1电源线,逻辑1supply0电源线,逻辑02)连线型数据的真值表在被一个以上驱动源驱动时,不同的连线型数据有各自决定其最终值的分辨办法。为了更好地理解不同连线型数据的功能,表3.4给出了多个驱动源驱动时四种连线型数据的真值表,以便读者参考。表3.4多个驱动源驱动时四种连线型数据的真值表wire/tri01xz00xx01x1x1xxxxxz01xzwand/triand01xz00000101x1x0xxxz01xzwor/trior01xz001x011111xx1xxz01xztri0/tri101xz00xx01x1x1xxxxxz01x0/12.寄存器型数据寄存器型数据对应的是具有状态保持作用的硬件电路元件,如触发器、锁存器等。若寄存器型数据未初始化,它将为未知状态x。寄存器型数据的关键字为reg,缺省时为1位数。寄存器型数据与连线型数据的区别在于:寄存器型数据保持最后一次的赋值,而连线型数据需要有持续的驱动。寄存器型数据的驱动可以通过过程赋值语句实现,过程赋值语句只能出现在过程语句后面的过程块语句中。为了更好地理解这一点,我们下面通过例3-8进行说明。【例3-8】示例模块。moduleD_ff(q,data,enable,reset,clock);outputq;inputdata,enable,reset,clock;regq;always@(posedgeclock)//时钟上升沿有效if(reset==0)q=1'b0;elseif(enable==1)q=data;//隐含:elseq=q:endmodule在上面的例子中,寄存器q通过过程赋值语句进行赋值,且必须出现在过程语句中;其值一直保持到满足相应条件为止。3.物理数据类型的声明物理数据类型的声明格式如下:net_declaration::=NETTYPEexpandrange?delay?list_of_variables;||=triregcharge_st
本文标题:(5)Verilog-HDL基础知识
链接地址:https://www.777doc.com/doc-4941167 .html