VerilogHDL基础语法.ppt

上传人:公**** 文档编号:573430078 上传时间:2024-08-14 格式:PPT 页数:51 大小:266KB
返回 下载 相关 举报
VerilogHDL基础语法.ppt_第1页
第1页 / 共51页
VerilogHDL基础语法.ppt_第2页
第2页 / 共51页
VerilogHDL基础语法.ppt_第3页
第3页 / 共51页
VerilogHDL基础语法.ppt_第4页
第4页 / 共51页
VerilogHDL基础语法.ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《VerilogHDL基础语法.ppt》由会员分享,可在线阅读,更多相关《VerilogHDL基础语法.ppt(51页珍藏版)》请在金锄头文库上搜索。

1、 Verilog HDL基础基础语法语法本章主要内容本章主要内容nVerilogHDL语言的特点nVerilogHDL语言的描述方式n模块与端口n注释n常量,变量与逻辑值n操作符n操作数n参数n编译指令n系统任务和函数n程序实例3.1VerilogHDL的特点n并行性:所谓的并行性就是说可以同时做几件事情。Verilog语言不会顾及代码顺序问题,几个代码块可以同时执行;而软件语言必须按顺序执行,上一句执行不成功,就不能执行下一句。n时序性:Verilog语言可以用来描述过去的时间和相应发生的事件;而软件语言则做不到。n互连:互连是硬件系统中的一个基本概念,Verilog语言中的wire变量可以

2、很好地表达这样的功能;而软件语言并没有这样的描述。3.2VerilogHDL的描述方式nVerilogHDL采用三种描述方式来进行设计:n数据流描述:采用assign语句,连续赋值,数据实时变化,赋值对象一般定义为wire型。n行为级描述:使用always或者initial语句,过程赋值,赋值对象一般定义为reg型,不一定会形成寄存器。n结构化模型:通过实例化已有的功能模块来建模。n在一个设计中我们往往会混合使用这三种描述方式。nVerilogHDL是对大小写敏感的语言,同样的词汇,大写和小写是不同的符号。n图31典型的Verilog设计描述示意图3.3模块和端口n模块是Verilog的基本描

3、述单元,可大可小,大到一个复杂的系统,小到一些基本的逻辑门单元,主要用来描述某个设计的功能或结构及其与其他功能模块通信的外部端口。n对于模块而言,需要有一个模块名称来标示模块,在端口列表的括号后面一定要以“;”结束。n模块一般都有端口列表,端口与端口之间用“,”隔开。但是仿真语言没有端口列表,因为仿真是一个封闭的系统,端口已经实例化在内部。n端口声明部分需要声明端口的方向和位宽。nmodule模块名称(端口列表);n/端口定义声明;ninput,output,inoutnn/内部变量及参数声明nwire,reg,functioion,task,parameter,define,etcnn/模块

4、功能实现n数据流描述:assignn行为级描述:initial,alwaysn结构化描述:module例化n其他用户原语nendmodulen例31端口声明n/PortDeclarationninput4:0a;/信号名为a的5输入信号ninoutb;/双向信号bnoutput6:0c;/信号名为c的7输出总线信号n有些设计会把端口的声明部分和端口列表写在一起,在端口中可以对每个信号进行注释。n例32VerilogHDL2001端口声明nmodulecounter(ninputclk,/全局时钟信号ninputreset_l,/全局复位信号noutput7:0cnt/八位数据总线n);n模块内

5、部变量声明中,wire型的线网是不具备数据存取功能的,一般而言,input的缺省定义就是wire型,output信号可以是wire型,也可以reg型。定义为wire型的线网是不能够在always语句中被赋值的,只能被连续赋值。而reg型的则可以存取最后一次赋给它的值,定义为reg型的线网只能在always和initial语句中被赋值,不能被连续赋值。n注意:n所有的关键字都必须小写。n定义为reg型的线网不一定会生成寄存器。n尽管信号和内部变量定义声明只要出现在被调用的语句之前就行,可是代码风格一般要求在执行语句之前就定义好,这样可以提高代码的可读性。n在声明后,便是功能执行语句,功能执行语句

6、包括always语句、initial语句、assign语句、task、function、模块例化等等。可以混合描述,没有先后顺序,但是要注意的是initial语句只能用于仿真程序中,不能生成实际的电路。n任何一个模块都要以“endmodule”结束。3.4注释注释nVerilogHDL提供了两种注释的方式:一种以“/”开始,注释的是一行中的余下部分。n例33以“/”开始的注释nassigna=b?c:d;/输出为a的两输入的选择器n例34以/*/表示的注释nassigna=b?c:d;n/注释下面的功能语句n/*always(*)nbeginnif(b)na=c;nelsena=d;nendn

7、*/3.5常量、变量与逻辑值常量、变量与逻辑值n常量就是不变的数值,比如说4d8,表示的是一个4位宽的十进制整数8。n在Verilog中,有三种不同类型的常量:整数型、实数型以及字符串型。n整数型常量可以直接使用十进制的数字表示。n基数表示法的格式如下:n长度+数制简写+数字n当设定的位宽比实际数字的位宽少,则自动截去左边超出的位数,反之则在左边不够的位置补足0。如果长度不显示,那么数字的位宽则取决于本身的长度。n如果遇到的是如果遇到的是x或者或者z时,如时,如4hx,位宽大于实际数字的位宽,这,位宽大于实际数字的位宽,这个时候在左边不是补个时候在左边不是补0,而是补,而是补xn变量分为线网型

8、和寄存器型两种。n线网型表示电路之间的互连,没有存取功能。它有许多子类型:wire、tri、tri0、tri1、wor、wand、trireg、supply1、supply0等等。wire可用于可综合的逻辑设计中,而其他的一般用于仿真程序中。另外除了trireg型的变量在未初始化的状态为x态,其它时候都是z态。n寄存器型表示数据的存取,在仿真器中会占据一个内存空间。寄存器型也有许多子类型,包括reg、integer、time、real、realtime等等。用reg可以表示一位或者多位的寄存器,也可以表示存取器。n例35采用reg表示的寄存器和存取器nrega;/1位寄存器anreg4:0b;

9、/5位寄存器bnreg7:0c10:1;/10*8的存取器n寄存器可以按位来存取,可是存取器必须按地址来存取。一般采用for语句来给存取器来赋值。n定义为reg型的变量可以生成寄存器,也可以生成MUX,所以需要视具体的功能执行而定。nx状态是一种未定的状态,描述信号未被初始化的情形,在casex和casez语句中表示不关心。nz状态表示高阻状况,用来表示三态建模。n在真实的电子世界中以及在综合软件中,都不会出现x状态,只有亚稳态的状况。Verilog 的的四种逻辑值四种逻辑值0 0、低、伪、逻辑低、地、低、伪、逻辑低、地、VSS、负插入负插入01XZ0bufbufbufbufif11 1、高高

10、、真真、逻逻辑辑高高、电电源源、VDD、正正插入插入X X、不确定:逻辑冲突无法确定其逻辑值不确定:逻辑冲突无法确定其逻辑值HiZHiZ、高阻抗、三态、无驱动源高阻抗、三态、无驱动源 3.6操作符n按位操作符是对操作数中的每一位分别进行操作,得出一个新的操作数,其具体的操作符如下所示。n表31按位操作符操作符表达式描述B将B中的每一位取反&A & B将A中的每位与B中对应的位相与|A | B将A中的每位与B中对应的位相或A B将A中的每位与B中对应的位异或A B将A中的每位与B中对应的位相异或非ABn例36按位操作符示例nA=4b1011B=4b1101C=4b10x1nA=4b0100nA&

11、B=4b1001nA|B=4b1111nAB=4b0110nAB=AB=4b1001nA&C=4b10x1n归约操作符是一元操作符,它的表现方式与按位操作符相似或者相同,但是它的操作数只有一个,并且是对操作数中的每一比特分别进行操作,得出一个新的一位宽的操作数n表32归约操作符操作符表达式描述&B将B中的每一位相与得出一位的结果& B将B中的每个比特相与非得出一比特的结果| B将B中的每一位相或得出一比特的结果| B将B中的每个比特相或非得出一比特的结果B将B中的每一位相异或非得出一比特的结果BB将B中的每一位相异或得出一比特的结果n例37归约操作符示例nB=4b1101n&B=1&1&0&1

12、=1b0n|B=1|1|0|1=1b1nB=1101=1b1n逻辑操作符是二元操作符,它类似于按位操作符和归约操作符,但是又不同于它们两者,它是对表达式中的操作数整体进行操作,得出一个新的一位宽的操作数。逻辑操作符用于条件判断语句中,而按位操作符,归约操作符用于赋值语句中n表33逻辑操作符操作符表达式描述&A&BA,B是否都为真?|A | BA,B任意一个是否为真?! B是否为假n例38逻辑操作符示例nA=3;/参数AnB=0;/参数BnC=2b0x;/参数CnD=2b10;/参数DnnA&B=0nA|B=1n!A=0nC&D=Xn连接复制操作符是一类特殊的操作符,它是将两组或者两组以上的操作

13、数连接成一个操作数,所得结果的位宽将是所有操作数位宽之和n表34连接复制操作符操作符表达式描述A,B将和连接起来,产生更大的向量BA将重复次n例39连接复制操作符示例nA=2b00;/参数AnB=2b10;/参数BnnA,B=4b0010n2A,3B=10b00_0010_1010n不同操作符之间的地位不一样,数值运算必须遵循优先级由高到低的顺序,为了避免这样的混淆和错误,增加代码的可读性,最好用“()”来区分n表35优先级别表操作符级别+,-, !,(一元)最高级*,/,%二元的加减+,-, , =, =, !=, !=&, &, , , , |, |&, |?:最低级n例310简单的操作符

14、运算na=4b1000b=4b0111n(1)!(ab)=!(TRUE)=FALSEn(ab)|(a=b)=TRUE|FALSE=TRUEn(2)a|b=(1|0|0|0)|(0|1|1|1)=TRUE|TRUE=TRUEn(3)a&b=(1|0|0|0)&(0|1|1|1)=TRUE&TRUE=TRUEn(4)!a|b=!(1|0|0|0)|(0|1|1|1)=FALSE|FALSE=FALSEn(5)!a&b=!(1|0|0|0)&(0|1|1|1)=FALSE&FALSE=FALSE3.7 操作数操作数n操作数有许多种,包括常数、参数、线网变量、寄存器变量、向量、存取器单元以及函数的返回

15、值等等。n采用操作数进行运算时需要考虑操作数的极性。线网和一般寄存器类型是无符号的,而十进制整数变量则有符号。当无符号数和有符号数一起进行运算时需要考虑极性。3.8 参数指令参数指令n参数指令(parameter)在Verilog中是一个很重要的概念,通常出现在module里面。有时候在一个系统设计中,把所有的全局参数定义在一个文本文件中,通过include来调用。常用于定义状态机的状态、数据位宽、延时大小等等。n全局定义变量define,它是用来进行全局定义的,一旦定义就不能改变n例311参数定义示例nparameterCURRENT_STATE=4b1001;3.9编译指令编译指令nVer

16、ilog语言采用了一些编译指令来实现某些特定的编译。它们主要有:定义宏(define、undef)、条件编译指令(ifdef、else、endif)、文件包含(include)、时间单位和精度定义(timescale)等等。n在每个模块前面加一个timescale编译指令,可以确保在仿真时候延时信息按照timescale所制定的时间单位和精度进行编译,直到遇到下一个timescale或者resetall指令为止。ntimescale的格式:timescale1ns/100ps表示时延单位为1ns,精度为100ps。ndefine表示定义宏。是一个全局变量,可以被多个文件采用,直到运到undef

17、为止。n例312采用define定义一个总线宽度为8的总线n条件编译指令的格式一般如下:nifdefNORMALnparameterA=B;nelsenparameterA=C;nendifn如果宏NORMAL事先已经被定义好,则编译器会执行parameterA=B;语句,否则执行parameterA=C;语句。3.10系统任务和系统函数n显示任务(displaytask)n显示任务用于信息的显示和输出,它将特定信息输出到标准输出设备,其基本语法结构如下:ntask_name(format_specification,argument_list1);n表36显示任务编译指令基本信息表编译指令类

18、型编译指令显示任务编译指令$display $displayb $displayh $displayo写入任务编译指令$write $writeb $writeh $writeo探测任务编译指令$strobe $strobeb $strobeh $strobeo监视任务编译指令$monitor $monitorb $monitorh $monitoron$display用来显示变量值、字符串等信息,常用于VerilogHDL断言,其基本格式如下:n$display(“Attime=%t,SystemisOK/n”,$time);n当系统运行到这个语句时,会显示当时的实时时间如下(假设为50.0

19、02ns):nAttime=50.002ns,SystemisOKn文件输入/输出任务(FileI/Otask)n文件的输入输出任务主要分为三部分:文件的打开和关闭,文件的数据读取以及文件的输出。n文件的打开和关闭常采用$fopen和$fclose两个关键字来表示。$fopen和$fclose是一起配合使用的,表示打开一个文件和关闭一个文件,其基本格式如下:n/打开一个文件nintegerfile_point=$fopen(file_name);n/关闭一个文件n$fclose(file_point);n打开一个文件,就需要对文件进行操作,一般有两种方式:一种是把监视探测到的信息写入文件,另外

20、一种是从文件中读取数据,数据一般从文本文件中读取并将数据保存到存取器中。n第一种方式与显示任务相似,它也分为显示、写入、探测和监控系统任务,只是这些任务最终会把数据显示到文件中去,因此需要一个文件指针n表37文件输入指令基本信息表系统任务编译指令类型系统任务编译指令文件显示任务$fdisplay $fdisplayb $fdisplayh $fdisplayo文件写入任务$fwrite $fwriteb $fwriteh $fwriteo文件探测任务$fstrobe $fstrobeb $fstrobeh $sfstrobeo文件监控任务$fmonitor $fmonitorb $fmonit

21、orh $fmonitoron$readmemb和$readmemh用来从文件中读取数据。文本文件包含空白空间、注释和二进制或十六进制数字。数字与数字之间用空白空间隔离。开始地址对应于存取器最左边的索引。n例313文件的输入输出任务操作示例nintegerData_OUT;nData_OUT=$fopen(“Data_OUT.txt”);n$fdisplay(Data_OUT,”Attime%t,Systemisoff/n”,$time);n$fclose(Data_out);n时间标度任务(timescaletask)n时间标度任务$printtimescale用来给出指定模块的时间单位和时

22、间精度,基本格式如下。n$printtimescale(模块路径);n$printtimescale(模块路径);n时间标度任务$timeformat则用来指明%t格式定义如何报告时间信息,其基本格式如下。n$timeformat(unit_number,perision,suffix,numeric_field_width);n模拟控制任务(simulationcontroltask)n模拟控制任务主要有两个系统任务:$finish和$stop。它们之间主要的不同在于$finish是强迫模拟器退出,并将控制权返回给操作系统,而$stop仅仅是模拟被挂起,模拟器不会被强迫退出,交互命令可以被送

23、往模拟器。n时序验证任务(timingchecktask)n时序验证任务主要用来检测并报告信号的各种时序是否满足系统要求,包括建立时间、保持时间、时钟周期等。n表38时序验证任务基本信息表任务类型系统任务实例建立时间$setup$setup(D, posedge clk, 1,0);保持时间$hold$hold(posedge clk, D , 0.1);建立保持时间$setuphold$setuphold(posedge clk,D,1,0,0.1);脉宽限制$width$width(negedge clk, 0.0, 0);周期检查$period$period(negedge clk, 1

24、.2);偏斜$skew$skew(negedge clk, D, 0.1);时钟与置、复位信号之间的时序约束$recovery$recovery(posedge clk,reset, 0.1);基准事件区间数据变化检测$nochange$nochange(negedge rst, dat,0,0);n实数变换函数(conversionfunctionsforreal)n表39实数变换函数基本信息表实数变换函数说明$rtoi截断小数值将实数变换为整数$itor将整数变换为实数$realtobits将实数变为64位的实数向量表示法$bitstoreal将位模式变为实数n概率分布函数(probabi

25、listicdistributionfunction)n概率分布函数一般用来产生一系列随机数来验证系统的功能是否正确。概率分布函数一般采用$random(seed)。根据种子变量seed的取值按32位的有符号整数形式返回一个随机数。3.11实例:数据选择器n数据选择器的功能是:根据选择信号,决定哪路输入信号送到输出信号.输出信号不仅与输入信号有关,还与选择信号有关,数据选择器的VerilogHDL语言代码如下:nmoduledataselector(/模块的开始na,/输入nb,/输入nc,/输入nd,/输入sel,/输入en,/输入y/输出);inputa;inputb;inputc;inp

26、utd;input1:0sel;/两位的数据选择信号,总共有四个状态inputen;/选择器使能信号,outputy;/输出结果信号,regy;/输出信号寄存器,always(aorborcordorseloren)/always过程块begin/begin-end为顺序块,语句是顺序执行的if(1b1=en)/if-else条件分支语句begincase(sel)/case分支控制语句2b00:y=a;/=为赋值语句,这里是把a赋给y2b01:y=b;2b10:y=c;2b11:y=d;default:y=1bz;endcaseendelsey=1bz;endendmodule/整个模块结束

27、3.12数据分配器moduledatadistributor(datain,sel,en,a,b,c,d);inputdatain;input1:0sel;inputen;outputa;outputb;outputc;outputd;rega,b,c,d;always(datainorenorsel)beginif(1b1=en)begincase(sel)2b00:a=datain;2b01:b=datain;2b10:c=datain;2b11:d=datain;default:a=datain;endcaseendelsebegina=1bz;b=1bz;c=1bz;d=1bz;endendendmodule3.12 小结小结n本章主要介绍了VerilogHDL语言的基本语法、基本结构、常量与变量、系统任务与系统函数等等。需要指出来的是,本章主要说明的是一些常用的指令,并不是VerilogHDL中的所有语法的集合,有兴趣的同学可到网上搜索相应的资料下载学习。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号