VerilogHDL基本语法.ppt

上传人:tia****nde 文档编号:12707471 上传时间:2020-05-14 格式:PPT 页数:152 大小:1.36MB
返回 下载 相关 举报
VerilogHDL基本语法.ppt_第1页
第1页 / 共152页
VerilogHDL基本语法.ppt_第2页
第2页 / 共152页
VerilogHDL基本语法.ppt_第3页
第3页 / 共152页
点击查看更多>>
资源描述
第4章VerilogHDL基本语法,4.1Verilog简介硬件描述语言(HardwareDescriptionLanguage,HDL)是电子系统硬件(1)行为描述、(2)结构描述、(3)数据流描述的一种语言。,数字电路系统的设计者通过这种语言a可以从上层到下层,从抽象到具体,逐层次地描述自己的设计思想,b用一系列分层次的模块来表示极其复杂的数字系统,C然后利用模块组合经由自动综合工具转换到门级电路网表,d再用自动布局布线工具把网表转换为具体电路进行布局布线后,e下载到专用集成电路(ASIC)或现场可编程逻辑器件。,4.1.1VerilogHDL发展过程VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司为其模拟器产品开发的硬件建模语言。Verilog语言于1995年成为IEEE标准,称为IEEEStd13641995;2001年又发布了VerilogHDL1363-2001标准;随即在2005年又发布了SystemVerilog1800-2005标准,这一系列标准的制定使得Verilog语言在综合、仿真、验证及IP重用等方面有很大幅度的提高。VerilogHDL是SystemVerilog语言的基础。SystemVerilog结合了来自Verilog、VHDL、C+的概念,它将硬件描述语言(HDL)与现代的高层级验证语言结合了起来。SystemVerilog加入了一些C+的元素。近些年在国内Verilog的应用率显著增加,国内绝大多数IC设计公司都采用VerilogHDL。学习Verilog不仅可以对数字电路技术有更进一步的了解,而且可为以后学习高级的行为综合、物理综合、IP设计和复杂系统设计打下坚实的基础。,4.1.2VerilogHDL与C语言比较,C语言与VerilogHDL运算符基本相同。而C语言是一种在硬件上运行的语言,而Verilog是描述硬件的语言,要受到具体硬件电路的限制,它们的区别如下:在VerilogHDL中不能使用C语言中很多抽象的表示方法,如迭代表示法、指针(C语言最具特点的语法)、不确定的循环及动态声明等等。C语言是一行一行地执行,按顺序执行;而VerilogHDL描述的是硬件,可以在同一时间内有很多硬件电路一起并行执行,两者之间有区别。C语言的输入/输出函数丰富,而VerilogHDL能用的输入/输出函数很少。C语言无时间延迟的指定,而VerilogHDL可以指定时间延迟。C语言中函数的调用是唯一的,每一个都是相同的,可以无限制调用。而VerilogHDL对模块的每一次调用都必须赋予一个不同的别名,虽然调用的是同一模块实例,但不同的别名代表不同的模块,即生成了新的硬件电路模块。与C语言相比,VerilogHDL描述语法较死,限制较多,能用的判断叙述有限。VerilogHDL中的延时语句只能用于仿真,不能被综合工具所综合。,4.2VerilogHDL设计举例1、1位比较器的三种不同风格VerilogHDL程序设计【例4.2.1】1位比较器的VerilogHDL程序。通过对输入信号A,B的比较,把比较的结果反映到m,L,e端口。,2、测试模块例子VerilogHDL可以用来描述变化的测试信号,它给出模块的输入信号,通过观测被测试模块是否符合要求,可以调试和验证逻辑系统设计和结构的正确性,并能发现问题及时修改。,每一项工程是由大量功能各异的模块组合而成的。模块是由两部分组成的:(1)一部分是接口描述(该模块与其他外部模块进行通信的端口),(2)另一部分是逻辑功能描述(描述某个设计的功能或者结构),即定义输入是如何影响输出的。模块可以进行层次嵌套,将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。,4.3Verilog模块的结构,一个模块,由module1.模块名(module_name)2端口列表(port_list)3端口声明(input、output、inout)4变量声明(reg、wire、parameter)5行为描述语言(initial、always)6连续赋值语句(continuousassignment)7模块调用语句(moduleinstantiation)8任务及函数(task、function)endmodule在模块的所有组成部分中,只有module、模块名和endmodule必须出现,其它部分都是可选的,模块:verilog模块的部件,作用:端口是模块与外界交互的接口;于外部环境(使用者/连接者)来讲,模块内部不可见,对模块的调用只能通过其端口进行。,举例:modulesr_latch(q,qbar,sbar,rbar);说明:被处理信号(数据)从sbar,rbar进入模块,处理结果从q,qbar端口送出,这样它可被外界调用;,(2)实例引用,4.2I/O说明常见I/O口类型有1.输入口(input)2.输出口(output)3.双向口(inout),分别表示数据流的方向是输入,输出或双向的。,常用到的是assign语句和always块语句。1.assign语句-数据流描述风格的主要建模语句,通常用来描述组合逻辑。assign声明语句很简单,只需要写一个“assign”(赋值),后面再加一个方程式即可。例如:assignsa该语句描述了一个三输入的与门,这是一个组合逻辑。注意:s的数据类型只能是wire类型。,4.4、功能描述,2.always块-行为级建模的主要语句既可以用来描述组合逻辑,也可以用来描述时序逻辑。从字面上理解,always的意思是“总是,永远”。在VerilogHDL中,只要指定的事件发生,由always指定的内容将不断地重复运行,不论该事件已经发生了多少次。这恰恰反映了实际电路的特征,即在通电的情况下电路将不断运行。最常用的两种事件是电平触发和边沿触发。电平触发是指当某个信号的电平发生变化时,执行always指定的内容;边沿触发是指当某个信号的上升沿或下降沿到来时,执行always指定的内容。电平触发的写法是在“”后面直接写触发信号的名称;边沿触发的写法是在“”后面写“posedge信号名”或者“negedge信号名”,posedge代表信号的上升沿,negedge则代表信号的下降沿。,4.5模块调用-结构级建模的主要语句,4.4VerilogHDL语言要素与表达式介绍Verilog语法中的注释、常量、变量、操作符、字符串、关键字和标识符等基本语法要素。4.4.1注释在代码中插入注释可以有效地增加程序的可读性,也便于文档管理。VerilogHDL允许单行注释和多行注释。单行注释以“/”开始,直到行末结束;多行注释以“/*”开始,以“*/”结束。这两种注释的方法和C+的注释方式相同。,4.4.2常量1、数字(1)整数有以下4种进制表示形式:二进制整数(b或B)、十进制整数(d或D)、十六进制整数(h或H)、八进制整数(o或O)。数字表达方式主要有三个部分:位宽、进制和数字。位宽指数字常量的二进制宽度,进制表示数字的类型。,数字表达方式一共有三种:位宽进制数字,这种方式描述数字最为完整;进制数字,这种描述方式省略了位宽,在这种情况下,数字的位宽采用系统默认位宽(由系统决定,至少是32位)数字,这种描述方式省略了位宽和进制信息,采用默认的位宽和进制(十进制)。例如:8b00101000/位宽为8的二进制表示,b表示二进制,(2)负数数字同样也可以定义为负数,只需要在位宽表达式前面加一个减号。(3)x和z值Verilog语法中,有x和z两种特殊值。在数字电路中,x代表不定值,z代表高阻值。在不同进制中,x和z表示的不定值或高阻值的位数不同。例如:4bx1x0/位宽为4的二进制数从低位数起的第二位和第四位为不定值,(4)下画线为了提高程序的可读性,尤其在使用二进制表示较长的数字常量的时候,我们可以使用下划线将数字分隔开来。例如:16b0010_0100_1101_0001/合法格式,2、参数声明用parameter来定义常量,称为符号常量,即标识符形式常量,采用标识符代表一个常量可以提高程序的可读性和可维护性。参数的声明格式:parameter参数名1=常数表达式1,参数名2=常数表达式2,;例如:parameterALL_X=16bx;/定义参数ALL_X为常数16bxparameterstate0=2b00,/定义参数state0为常数2b00,4.4.3变量变量是在程序运行过程中其值可以改变的量。1、线网类型线网类型可以理解为实际电路中的导线,通常用于表示结构实体之间的物理连接。,2、寄存器变量类型寄存器变量类型主要有以下6种:reg,integer,time,real,realtime,memory型。(1)寄存器是数据储存单元的抽象,寄存器数据类型的关键字是reg。,reg型变量定义格式如下:regsigned最高位:最低位寄存器名1,寄存器名2,寄存器名N;其中,signed表示数值为有符号数(以二进制补码形式保存),默认情况下为无符号数。例如:reg3:0bus;/定义了一个4位的名为bus的reg型变量,总之,1.wire表示直通,即只要输入有变化,输出马上无条件地变化;reg一定要有触发,输出才会反映输入。2.wire只能被assign连续赋值,reg只能在initial和always中赋值。3.wire使用在连续赋值语句中,而reg使用在过程赋值语句中。,(2)使用integer、real、time关键字定义寄存器变量和使用reg进行定义并没有本质上的区别,仅仅是为了使程序的表述更加清晰明了。integer、real、time型变量的位宽是固定的,integer型变量的位宽为32,real型变量的位宽为64,timereal型变量的位宽为64,它们已经是矢量,因此在定义变量时不可以加入位宽。如integera1,b1;/定义a1、b1为32位整型变量,(3)memory型数据可以通过reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。memory型变量定义格式如下:reg最高位:最低位存储器名最高位:最低位;下面举例说明:reg7:0mema0:255;,4.4.4操作符,1、算术运算符,算术运算符有+(加法符号,正值符号)、(减法符号,负值符号)、*(乘);/(除)、%(取模)、*(指数幂)6种。例如:reg1reg2/“”为加法符号-num/“-”为负值符号9/4/9除以4结果为2-/-5模以2结果为-1,取第一个操作数的符号值2*4/2的4次方算术运算中任意一个操作符中含有一位或多位不确定值x或z,则整个运算结果为x。例如:4b10 x04b0001结果为4bxxxx;,2、位运算符Verilog作为一种硬件描述语言,是针对硬件电路而言的。硬件电路中信号有1,0,x,z。在硬件电路中信号进行与、或、非时,反映在Verilog中则是相应的操作数的位运算。Verilog位运算符有(取反)、reg7:0Data_byte;/连续赋值语句assignflag_tagc=b;end,4位阻塞赋值程序reg_bpa.vmodulereg4_bpa(qout,clk,reset,din);output3:0qout;inputclk,reset;inputdin;reg3:0qout;always(posedgeclkorposedgereset)/上升沿clk异步复位resetif(reset)qout=4b0000;elsebeginqout0=din;qout1=qout0;qout2=qout1;qout3=qout2;endendmodule,2、非阻塞赋值非阻塞赋值使用“=”为变量赋值,在执行到连续的非赋值语句时,仅仅对“=”右端表达式进行评估,但并不立即赋值给左端,然后继续执行后面的操作,当块结构结束后所有的非阻塞赋值同时进行赋值。这个过程好像没有阻断程序的运行,因而被称为非阻塞赋值。,非阻塞赋值语句,非阻塞赋值方式(“=”,在块结束时才完成赋值操作):所有语句的赋值都发生在当前仿真的最后一个时间步,赋值是并行执行的。执行步骤:(1)读取操作数,计算右侧表达式的值并保存在临时变量中;(2)对左侧的赋值由仿真器调度到相应的仿真时刻;(3)每个赋值操作在被调度的仿真时刻完成。典型应用:流水线建模互斥数据传输问题:仿真速度下降内存使用量增加,非阻塞过程性赋值所综合出来的电路为串接方式。,4位非阻塞赋值程序reg_nbp.vmodulereg4_nbp(qout,clk,reset,din);output3:0qout;inputclk,reset;inputdin;reg3:0qout;always(posedgeclkorposedgereset)/上升沿clk或异步复位resetif(reset)qout=4b0000;elsebeginqout0=din;qout1=qout0;qout2=qout1;qout3b)out=1;elseout=0;,4.7.2case语句当分支有很多时,选用Verilog中的case语句,定义如下:case(控制表达式)分支表达式1:操作1;分支表达式2:操作2;分支表达式n:操作n;default:操作n+1;endcase,【例4.7.3】case语句举例1。case(in)1b0:out=a;1b1:out=bdefault:out=1bz;/这里给一个默认值endcase,【例4.7.4】case语句举例2。always(posedgeclk)beginout=out;case(sel)/synopsysfull-case2b00:out=a;2b10:out=b;2b01:out=c;endcaseend,和case语句功能相似的还有casex和casez语句。这两条语句用于处理在条件表达式和分支项的比较过程中存在x或者z的情况,casez语句将忽略比较过程中的值为z的位,而casex语句将忽略比较过程中的值为x或z的位。表4.7.1、表4.7.2、表4.7.3所示是case、casez和casex语句的真值表。,4.7.3比较ifelse嵌套与case语句,4.8循环语句VerilogHDL中有for循环语句、forever循环语句、repeat循环语句、while循环语句4类循环语句,用来控制执行语句的执行次数。,4.8.1for循环语句VerilogHDL中for循环语句跟C语言中for循环语句的语法几乎一样,容易被学习过C语言的设计人员所接受。其格式如下:(1)for(循环变量赋初值;循环终止条件;更新循环变量)循环执行语句;(2)for(循环变量赋初值;循环终止条件;更新循环变量)begin语句;end,在使用for循环时,需要先定义一个用于控制循环次数的变量。for语句执行过程是:(1)先求解循环变量的初值。(2)再求解循环终止条件,若其值为真(非0),则执行for语句中循环执行语句,然后执行下面的第3步;若其值为假(0),转到第5步。(3)执行更新循环变量。(4)转回第(2)步继续执行。(5)执行for语句下面的语句。,【例4.8.1】用for语句,对变量a进行加4操作。for(i=0;i4;i=i+1)begina=a+1;end,4.8.2forever循环语句forever是永远执行的语句,也就是代表无穷的循环下去,不需要声明任何变量。如果想要退出循环,必须采用强制退出循环的方法。语法形式如下:(1)forever语句;(2)foreverbegin语句;end,4.8.3repeat循环语句repeat带有一个控制循环次数的常量或者变量,是最简单的循环语句,用于已知循环次数的情况。语法形式如下:repeat(循环次数)语句;repeat(循环次数)begin语句;end,【例4.8.3】利用repeat语句实现连续4次加1操作。repeat(4)begina=a+1;end,4.8.4while循环语句repeat语句只能用于固定循环次数的情况,而while语句则灵活得多,它可以通过控制某个变量的取值来控制循环次数。while循环语句的语法格式如下:while(条件表达式)语句;while(条件表达式)begin多条语句;end,4.9过程语句在这里我们介绍两种过程性语句always语句和initial语句。一个程序模块可以有多个initial和always过程块。每个initial和always语句在仿真的一开始就同时立即开始执行。initial语句只执行一次,而always语句则是不断地重复被运行着,直到仿真过程结束。但always语句后跟着的过程块是否运行,则要看它的触发条件是否满足,如满足则运行过程块一次,再次满足则再运行一次,直至仿真过程结束。,4.9.1initial语句initial过程块由initial语句和语句块组成,一条initial语句只执行一次,initial语句在仿真开始时开始执行,其语法格式如下:initial语句块语句块的格式:begin行为语句1;行为语句n;end,4.9.2always语句always语句在仿真过程中是不断重复执行的,但always语句后跟着的过程块是否执行,则要看它的触发条件是否满足,如满足则运行过程块一次;如不满足,则不执行语句块。其语法格式如下:always(敏感时间列表)begin行为语句1;行为语句n;end,针对上述格式做以下说明:(1)过程语句关键词always标明该过程块是一个always过程块;(2)(敏感时间列表)是一个可选项,带有敏感时间列表的语句块的执行要受到敏感时间的控制。敏感时间列表是由一个或者多个时间表达式组成的,当存在多个时间表达式的时候用or将他们组合起来。例如:always(negativeclkorpositiverst)敏感时间是clk信号的下降沿或rst信号的上升沿,此时才执行下面的语句块;(3)为可选项,用来指定延时时间。,4.10任务与函数,4.10.1任务VerilogHDL中的任务与高级语言的过程类似,它不带返回值,可以直接调用。尽管任务不带有返回值,但任务的参数可以定义为输出端口或者双向端口,因此实际上任务可以返回多个值。定义一个任务使用关键字taskendtask。,2、调用变量的传递任务调用语句给出传入任务的参数值和接收结果的变量值。任务调用语句是过程语句,可以在always语句或initial语句中使用。形式如下:任务名(端口1,端口2,端口3,端口N);,4.10.2函数函数类似于C语言中的函数。调用函数的目的是返回一个表达式的值。因此,函数至少需要一个输入参数,且参数必须都为输入端口,不可以包含输出或者双向端口。函数有一个返回值,返回值被赋给和函数名同名的变量,这也决定了函数只能存在一个返回值。定义函数使用functionendfunction关键字。,4.11预编译指令同C语言一样,VerilogHDL也可以对程序进行预编译处理。预编译处理的含义就是在程序被编译之前,将需要做处理的地方按照要求进行处理,然后再进行编译。在VerilogHDL中,预编译指令都有一个明显的标志,就是以符号“”开头(注意在键盘上“”通常位于数字1的左边),总的来说,预编译指令不是VerilogHDL语句,结尾不用加分号。,4.11.1宏定义语句(define、undef)宏定义语句define指令用于文本替换,很像C语言中的#define指令,它用一个指定的标识符来代替一个字符串。在编译之前,编译器先将程序中出现的标识符全部替换为它所表示的字符串,然后再进行编译。宏定义主要可以起到两个作用:一是用一个有意义的标识符取代程序中反复出现的含义不明显的字符型;二是用一个较短的标识符替代反复出现的较长的字符串。宏定义的一般形式为difine标识符(宏名)字符串(宏内容),例如:defineBUS_SIZE32/宏名为BUS_SIZE,宏内容为32.regBUS_SIZE-1:0AddReg;/BUS_SIZE在编译前被替代为32,4.11.2文件包含语句(include)VerilgoHDL中的文件包含指令include与语言中的预编译指令#include类似,在编译时,将其他文件中的源程序完整地插入当前的文件中。这样做的结果也就相当于将其他文件中的源程序内容复制到当前文件中出现指令include的地方。include编译指令可以将一些全局通用的定义或任务包含进文件中,而不用为每个文件编写一段重复的代码。文件包含语句include的一般形式如下:include“文件名”,4.11.3时间尺度(timescale)时间尺度指令用来定义模块的仿真时间单位和时间精度,其使用格式如下:timescale仿真时间单位时间精度,4.11.4条件编译指令(ifdef、else、endif)一般情况下,VerilogHDL源程序中所有的语句都将参加编译。但是有时希望对其中的一部分内容只有在满足条件时才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。,条件编译命令格式:ifdef宏名程序段1else程序段2endif,【例4.10.4】条件编译指令举例。ifdefWINDOWSparameterWORD_SIZE=16elseparameterWORD_SIZE=32endif,4.12本章小结本章首先介绍了VerilogHDL语言,并通过1位比较器实例展示了Verilog模块的结构和特征。其次,介绍了VerilogHDL语言的模块的结构,包括模块的端口定义、I/O说明、内部信号声明和功能定义。最后,介绍了VerilogHDL语言的基本要素,包括常量、数据类型、运算符、过程语句、块语句、赋值语句、条件语句、循环语句、任务与函数等内容。,注意:这些语句虽然在形式上和C语言很类似,语法等各方面比较容易理解,但要注意的是它们表示的不是一个直接的计算结果,而是逻辑电路硬件的行为,语句间细微的差别可能导致其对应的硬件有很大的变化。希望认真理解这些语句的本质,才能设计出符合要求的逻辑。,4.13习题模块由几部分组成,如何描述模块的端口?为什么端口要说明信号的位宽?最基本的Verilog变量有几种类型?比较reg型和wire型变量的区别?逻辑运算符与按位逻辑运算符有什么不同,它们各在什么场合使用?拼接符的作用是什么?拼接符表示的操作其物理意义是什么?阻塞和非阻塞赋值有什么不同?举例说明它们的不同点?在并行块中,如果有一条语句是无限循环,它下面的语句如何执行?使用条件语句设计一个四选一多路选择器。,10、使用while循环设计一个时钟信号发生器。其时钟信号的初值为0,周期为10个时间单位。11、怎样理解initial语句只执行一次的概念?12、怎样理解由always语句引导的过程块是不断活动的?13、简单叙述任务与函数的相同点和不同点?14、设计一个2位十进制循环计数器,从00计数到99,然后再回到00。输入信号为clk和reset(低电平复位),输出为out1和out0,位宽均为4,分别表示十进制数的高位和低位。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!