VerilogHDL基本语法.ppt
《VerilogHDL基本语法.ppt》由会员分享,可在线阅读,更多相关《VerilogHDL基本语法.ppt(133页珍藏版)》请在三一办公上搜索。
1、Verilog HDL 基本语法,语汇代码的编写标准 常量、变量及数据类型 关键字和标示符 运算符 语句 综合代码的编写标准,规定了文本布局、命名和注释的约定,以提高源代码的可读性和可维护性。每个Verilog HDL源文件中只准编写一个顶层模块,也不能把一个顶层模块分成几部分写在几个源文件中。源文件名字应与文件内容有关,最好与顶层模块同名!源文件名字的第一个字符必须是字母或下划线,不能是数字或$符号!每行只写一个声明语句或说明。源代码用层层缩进的格式来写。,语汇代码的编写标准,2,定义变量名的大小写应自始至终保持一致(如变量名第一个字母均大写)。变量名应该有意义,而且含有一定的有关信息。局部
2、变量名(如循环变量)应简单扼要。通过注释对源代码做必要的说明,尤其对接口(如模块参数、端口、任务、函数变量)做必要的注释很重要。,语汇代码的编写标准,3,常量尽可能多地使用参数定义和宏定义,而不要在语句中直接使用字母、数字和字符串。参数定义(用一个标识符来代表一个常量)的格式:parameter 参数名1=表达式,参数名2=表达式,;宏定义(用一个简单的宏名来代替一个复杂的表达式)的格式:define 标志符(即宏名)字符串(即宏内容),语汇代码的编写标准,4,常量,整型数:,5,注:这里位宽指对应二进制数的宽度。,常量,x表示不定值,z表示高阻值;“?”是z的另一种表示符号,建议在case语
3、句中使用?表示高阻态z为提高可读性,在较长的数字之间可用下划线_隔开!但不可以用在和之间。当常量未指明位宽时,默认为32位。,6,17/位宽,基数符号不写会采用default值(32bit十进制)8d32/8-bit十进制值为32 8h1A 8o37 8b0001_1100 32bx/”x”表unknown 4b0?/”?”表示高阻,常量,7,常量,实数十进制计数法,科学计数法7.2 1.8e-4/1.8*10-4 9.5E6字符串与字符变量字符串为两个双引号“”之间的字符,不许跨行“This is a string!”;/共17个字符,8,常量,参数(符号常量)参数是一个常量,经常用于定义时
4、延和变量的宽度。parameter byte_size=8;/定义一个常数参数parameter,byte_msb=byte_size-1;/用数表达式赋值parameter average_delay=(r+f)/2;/用常数表达式赋值,9,变量,变量即在程序运行过程中其值可以改变的量Verilog HDL中共有19种数据类型;其中3个最基本的数据类型为:网络型(nets type)寄存器型(register type)数组型(memory type),10,变量,线网类型:nets type表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定;如果没有驱动元件连接到线网,线网
5、的缺省值为z。寄存器类型:register type表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。,11,wire型变量它是最常用的nets型变量,常用来表示以assign语句赋值的组合逻辑信号。模块中的输入/输出信号类型缺省为wire型。可用做任何方程式的输入,或“assign”语句和实例元件的输出。,变量,12,wire 数据名1,数据名2,数据名n;,wiren-1:0 数据名1,数据名2,数据名m;或 wiren:1 数据名1,数据名2,数据名m;,每条总线位宽为n,共有m条
6、总线,wire型向量(总线),格式,变量,13,变量,14,register类型:在程序块中作变量用,对信号赋值需要用该数据类型,赋值时用关键字initial或always开始。常用register变量reg:是最常见的数据类型,常代表触发器.integer:32位带符号整数型变量,可以作为普通寄存器 使用,典型应用为高层次行为建模。time类型:无符号时间变量。real和realtime类型:实数寄存器(或实数时间寄存器),变量,register型变量与nets型变量的根本区别是:register型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。register型变量必须通过过程赋值语
7、句赋值!不能通过assign语句赋值!在过程块内被赋值的每个信号必须定义成register型!,15,reg型变量定义在过程块中被赋值的信号,往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号)!,reg 数据名1,数据名2,数据名n;,格式,变量,16,regn-1:0 数据名1,数据名2,数据名m;或 regn:1 数据名1,数据名2,数据名m;,每个向量位宽为n,共有m个reg型向量,例 reg4:1 regc,regd;/regc,regd为4位宽的reg型向量,reg型向量(总线),变量,17,用reg型变量生成组合逻辑举例:module rw1(a,b,out1,out2);
8、input a,b;output out1,out2;reg out1;wire out2;assign out2=a;always(b)out1=b;endmodule,过程赋值语句,连续赋值语句,电平触发,Verilog中reg与wire的区别,reg型变量既可生成触发器,也可生成组合逻辑;wire型变量只能生成组合逻辑。,变量,18,用reg型变量生成触发器举例:module rw2(clk,d,out1,out2);input clk,d;output out1,out2;reg out1;wire out2;assign out2=d endendmodule,过程赋值语句,连续赋值
9、语句,上沿触发,变量,19,变量,Memory类型 Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。memory型数据是通过扩展reg型数据的地址范围来生成的。,20,变量,格式:reg n-1:0 存储器名m-1:0;regn-1:0定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的m-1:0或m:1则定义了该存储器中有多少个这样的寄存器。最后用分号结束定义语句。,21,变量,例:reg 7:0 mema255:0
10、;这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。注意:对存储器进行地址索引的表达式必须是常数表达式。,22,变量,Verilog的变量的四种逻辑状态:0:逻辑零、逻辑非、低电平1:逻辑1、逻辑真、高电平x或X:不定态z或Z:高阻态,23,关键字,关键字事先定义好的确认符,用来组织语言结构;或者用于定义Verilog HDL提供的门元件(如and,not,or,buf)。用小写字母定义!如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,
11、table,time,while,wire,24,用户程序中的变量、节点等名称不能与关键字同名!,关键词,25,edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverfork,function highz0highz1 ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenand,negedgenor notnotif0notif1nmosoroutputparameterpmospo
12、sedgeprimitivepulldownpulluppull0pull1,andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable,关键词,26,tri0tri1 vectoredwaitwandweak0weak1whilewireworxnorxor,rcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparam,strengthstrong0 stron
13、g1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg,特殊字符,$:以$开头的标识符代表系统命令$time:返回目前的仿真时间$display:显示出信号的值$stop:停止仿真#时延控制not#3 not1(sel_,sel);/instance delay#5 a=0;b=0;cin=1;/procedural statement delay,27,标示符,28,任何用Verilog HDL语言描述的“东西”都通过其名字来识别,这个名字被称为标识符。如源文件名、模块名、端口名、变量名、常量名、实例名等。标识符
14、可由字母、数字、下划线和$符号构成;但第一个字符必须是字母或下划线,不能是数字或$符号!在Verilog HDL中变量名是区分大小写的!,标识符不能与关键字同名!,标示符,标识符必须是由a-z,A-Z,0-9,_,$这些字符組成,最長只能到1024个字符开头必须由a-z,A-Z或下划线_开头可以在标识符所取的非法名称前加上反斜杠“”,并在名称结尾加上空白键,这样就可以用任何可印出的ASCII字符来当作标识符的名称了;而反斜杠和空白键不会被视为标识符的一部分,29,标示符,30,合法的名字:A_99_ZReset_54MHz_Clock$Module,不合法的名字:123a$datamodule
15、7seg.v,运算符,31,进行整数除法运算时,结果值略去小数部分,只取整数部分!%称为求模(或求余)运算符,要求%两侧均为整型数据;求模运算结果值的符号位取第一个操作数的符号位!例-11%3 结果为-2进行算术运算时,若某操作数为不定值x,则整个结果也为x。,运算符,32,运算符,位运算符:按位进行运算,结果的位数不变两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐 例 若A=5b11001,B=3b101,则A&B=(5b11001)&(5b00101)=5b00001,33,运算符,关系运算结果为1位的逻辑值1或0或x。关系运算时,若关系为真,则返回值为
16、1;若声明的关系为假,则返回值为0;若某操作数为不定值x,则返回值为x。等式运算符运算结果为1位的逻辑值1或0或x。等于运算符(=)和全等运算符(=)的区别:使用等于运算符时,两个操作数必须逐位相等,结果才为1;若某些位为x或z,则结果为x。使用全等运算符时,若两个操作数的相应位完全一致(如同是1,或同是0,或同是x,或同是z),则结果为1;否则为0。,34,“=”的真值表,“=”的真值表,等于运算的结果可能为1或0或x,全等于运算的结果只有1或0,运算符,35,左移会扩充位数!,将操作数右移或左移n位,相当于将操作数除以或乘以2n。,右移位数不变,但右移的数据会丢失!,运算符,移位运算符:将
17、操作数右移或左移n位,同时用n个0填补移出的空位。例 4b10013=4b0001;4b10014=4b0000 4b10011=5b10010;4b10012=6b100100;16=32b1000000,36,运算符,条件运算符?:EX:tri_data=en?data_out:32bz;/三态,37,运算符的优先级,为提高程序的可读性,建议使用括号来控制运算的优先级!例(ab)&(bc)(a=b)|(x=y)(!a)|(ab),运算符,38,语句,39,语句,40,赋值语句分为两类:连续赋值语句assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一 例 assign
18、c=a/a、b、c均为wire型变量过程赋值语句用于对reg型变量赋值,有两种方式:非阻塞(non-blocking)赋值方式:赋值符号为=,如 b=a;阻塞(blocking)赋值方式:赋值符号为=,如 b=a;,非阻塞赋值方式 always(posedge clk)begin b=a;c=b;end,非阻塞赋值在块结束时才完成赋值操作!,注:c的值比b的值落后一个时钟周期!,语句,41,阻塞赋值方式 always(posedge clk)begin b=a;c=b;end,阻塞赋值在该语句结束时就完成赋值操作!,注:在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面
19、的语句就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。这里c的值与b的值一样!,语句,42,非阻塞(non-blocking)赋值方式(b=a):b的值被赋成新值a的操作,并不是立刻完成的,而是在块结束时才完成;块内的多条赋值语句在块结束时同时赋值;硬件有对应的电路。阻塞(blocking)赋值方式(b=a):b的值立刻被赋成新值a;完成该赋值语句后才能执行下一句的操作;硬件没有对应的电路,因而综合结果未知。,建议在初学时只使用一种方式,不要混用!建议在可综合风格的模块中使用非阻塞赋值!,语句,43,块语句用来将两条或多条语句组合在一起,使其在格式上更像一条语句,以增加程序的可读性。块语
20、句有两种:begin_end语句标识顺序执行的语句fork_join语句标识并行执行的语句,语句,44,顺序块块内的语句是顺序执行的;每条语句的延迟时间是相对于前一条语句的仿真时间而言的;直到最后一条语句执行完,程序流程控制才跳出该顺序块。,语句,45,begin 语句1;语句2;语句n;end,begin:块名 块内声明语句;语句1;语句2;语句n;end,注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句。,或,顺序块的格式,语句,46,例 begin b=a;c=b;/c的值为a的值 end 例 begin b=a;#10 c=b;/在两条
21、赋值语句间延迟10个时间单位 end,注:这里标识符“#”表示延迟;在模块调用中“#”表示参数的传递,语句,47,例用顺序块和延迟控制组合产生一个时序波形。parameter d=50;reg7:0 r;begin/由一系列延迟产生的波形#d r=h35;#d r=hE2;#d r=h00;#d r=hF7;#d end_wave;/触发事件end_wave end,注:每条语句的延迟时间d是相对于前一条语句的仿真时间而言的!,语句,48,用fork_join标识的块,语句,并行块块内的语句是同时执行的;块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间而言的;延迟时间用于给赋值
22、语句提供时序;当按时间排序在最后的语句执行完或一个disable语句执行时,程序流程控制跳出该并行块。,49,fork 语句1;语句2;语句n;join,fork:块名 块内声明语句;语句1;语句2;语句n;join,或,注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句、time型变量声明语句和事件(event)说明语句。,并行块的格式,语句,50,例4用并行块和延迟控制组合产生一个时序波形。reg7:0 r;fork/由一系列延迟产生的波形#50 r=h35;#100 r=hE2;#150 r=h00;#200 r=hF7;#250 end_
23、wave;/触发事件end_wave join,波形同例3,注:在fork_join块内,各条语句不必按顺序给出!但为增加可读性,最好按被执行的顺序书写!,语句,51,语句,if-else 条件语句case 语句for循环语句,52,if(条件表达式)块语句1else if(条件表达式2)块语句2else if(条件表达式n)块语句nelse 块语句n+1,case(敏感表达式)值1:块语句1 值2:块语句2 值n:块语句n default:块语句n+1endcase,for(表达式1;表达式2;表达式3)块语句,若if与else的数目不一样,注意用“begin_end”语句来确定if与els
24、e的配对关系!,if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;,if(表达式1)begin if(表达式2)语句1;endelse 语句2;,当if与else的数目不一样时,最好用“begin_end”语句将单独的if语句括起来:,if语句的嵌套:,语句,53,语句,case语句与if-else语句区别if-else语句适于对不同的条件,执行不同的语句;对于每个判定只有两个分支。case语句适于对同一个控制信号取不同的值时,输出取不同的值!它是多分支语句。当控制信号只有一个时,最好采用case语句,比较简洁!,54,是case语句
25、的两种变体,语句,case casez casex的区别在case语句中,分支表达式每一位的值都是确定的(或者为0,或者为1);在casez语句中,若分支表达式某些位的值为高阻值z,则不考虑对这些位的比较;在casex语句中,若分支表达式某些位的值为z或不定值x,则不考虑对这些位的比较。在分支表达式中,可用“?”来标识x或z,55,module mux_z(out,a,b,c,d,select);output out;input a,b,c,d;input3:0 select;reg out;/必须声明 always(select3:0 or a or b or c or d)begin ca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VerilogHDL 基本 语法
链接地址:https://www.31ppt.com/p-5452049.html