VerilogHDL基础语法.ppt

上传人:sccc 文档编号:5306890 上传时间:2023-06-24 格式:PPT 页数:51 大小:266.01KB
返回 下载 相关 举报
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基础语法,本章主要内容,Verilog HDL语言的特点Verilog HDL语言的描述方式模块与端口注释常量,变量与逻辑值操作符操作数参数编译指令系统任务和函数程序实例,3.1 Verilog HDL的特点,并行性:所谓的并行性就是说可以同时做几件事情。Verilog语言不会顾及代码顺序问题,几个代码块可以同时执行;而软件语言必须按顺序执行,上一句执行不成功,就不能执行下一句。时序性:Verilog语言可以用来描述过去的时间和相应发生的事件;而软件语言则做不到。互连:互连是硬件系统中的一个基本概念,Verilog语言中的wire变量可以很好地表达这样的功能;而软件语言并

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

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

4、述:initial,always 结构化描述:module例化 其他用户原语endmodule,例 31 端口声明/Port Declaration input 4:0 a;/信号名为a的5输入信号 inout b;/双向信号b output 6:0 c;/信号名为c的7输出总线信号,有些设计会把端口的声明部分和端口列表写在一起,在端口中可以对每个信号进行注释。例 32 Verilog HDL 2001端口声明module counter(input clk,/全局时钟信号 input reset_l,/全局复位信号 output 7:0 cnt/八位数据总线);,模块内部变量声明中,wire

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

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

7、量就是不变的数值,比如说4d8,表示的是一个4位宽的十进制整数8。在Verilog中,有三种不同类型的常量:整数型、实数型以及字符串型。整数型常量可以直接使用十进制的数字表示。基数表示法的格式如下:长度+数制简写+数字当设定的位宽比实际数字的位宽少,则自动截去左边超出的位数,反之则在左边不够的位置补足0。如果长度不显示,那么数字的位宽则取决于本身的长度。如果遇到的是x或者z时,如4hx,位宽大于实际数字的位宽,这个时候在左边不是补0,而是补x,变量分为线网型和寄存器型两种。线网型表示电路之间的互连,没有存取功能。它有许多子类型:wire、tri、tri0、tri1、wor、wand、trire

8、g、supply1、supply0等等。wire可用于可综合的逻辑设计中,而其他的一般用于仿真程序中。另外除了trireg型的变量在未初始化的状态为x态,其它时候都是z态。寄存器型表示数据的存取,在仿真器中会占据一个内存空间。寄存器型也有许多子类型,包括reg、integer、time、real、realtime等等。用reg可以表示一位或者多位的寄存器,也可以表示存取器。,例 35 采用reg表示的寄存器和存取器reg a;/1位寄存器a reg 4:0 b;/5位寄存器b reg 7:0 c 10:1;/10*8的存取器寄存器可以按位来存取,可是存取器必须按地址来存取。一般采用for语句来

9、给存取器来赋值。定义为reg型的变量可以生成寄存器,也可以生成MUX,所以需要视具体的功能执行而定。x状态是一种未定的状态,描述信号未被初始化的情形,在casex和casez语句中表示不关心。z状态表示高阻状况,用来表示三态建模。在真实的电子世界中以及在综合软件中,都不会出现x状态,只有亚稳态的状况。,Verilog 的四种逻辑值,0、低、伪、逻辑低、地、VSS、负插入,1、高、真、逻辑高、电源、VDD、正插入,X、不确定:逻辑冲突无法确定其逻辑值,HiZ、高阻抗、三态、无驱动源,3.6 操作符,按位操作符是对操作数中的每一位分别进行操作,得出一个新的操作数,其具体的操作符如下所示。表 31

10、按位操作符,例 36 按位操作符示例A=4b1011 B=4b1101 C=4b10 x1A=4b0100 A&B=4b1001A|B=4b1111AB=4b0110AB=AB=4b1001A&C=4b10 x1,归约操作符是一元操作符,它的表现方式与按位操作符相似或者相同,但是它的操作数只有一个,并且是对操作数中的每一比特分别进行操作,得出一个新的一位宽的操作数表 32 归约操作符,例 37 归约操作符示例B=4b1101&B=1&1&0&1=1b0|B=1|1|0|1=1b1B=1101=1b1,逻辑操作符是二元操作符,它类似于按位操作符和归约操作符,但是又不同于它们两者,它是对表达式中的

11、操作数整体进行操作,得出一个新的一位宽的操作数。逻辑操作符用于条件判断语句中,而按位操作符,归约操作符用于赋值语句中表 33 逻辑操作符,例 38 逻辑操作符示例A=3;/参数AB=0;/参数BC=2b0 x;/参数CD=2b10;/参数D A&B=0A|B=1!A=0C&D=X,连接复制操作符是一类特殊的操作符,它是将两组或者两组以上的操作数连接成一个操作数,所得结果的位宽将是所有操作数位宽之和表 34 连接复制操作符,例 39 连接复制操作符示例A=2b00;/参数AB=2b10;/参数BA,B=4b00102A,3B=10b00_0010_1010,不同操作符之间的地位不一样,数值运算必

12、须遵循优先级由高到低的顺序,为了避免这样的混淆和错误,增加代码的可读性,最好用“()”来区分表 35 优先级别表,例 310 简单的操作符运算a=4b1000 b=4b0111(1)!(a b)=!(TRUE)=FALSE(a b)|(a=b)=TRUE|FALSE=TRUE(2)a|b=(1|0|0|0)|(0|1|1|1)=TRUE|TRUE=TRUE(3)a&b=(1|0|0|0)&(0|1|1|1)=TRUE&TRUE=TRUE(4)!a|b=!(1|0|0|0)|(0|1|1|1)=FALSE|FALSE=FALSE(5)!a&b=!(1|0|0|0)&(0|1|1|1)=FALSE

13、&FALSE=FALSE,3.7 操作数,操作数有许多种,包括常数、参数、线网变量、寄存器变量、向量、存取器单元以及函数的返回值等等。采用操作数进行运算时需要考虑操作数的极性。线网和一般寄存器类型是无符号的,而十进制整数变量则有符号。当无符号数和有符号数一起进行运算时需要考虑极性。,3.8 参数指令,参数指令(parameter)在Verilog中是一个很重要的概念,通常出现在module里面。有时候在一个系统设计中,把所有的全局参数定义在一个文本文件中,通过include来调用。常用于定义状态机的状态、数据位宽、延时大小等等。全局定义变量define,它是用来进行全局定义的,一旦定义就不能改

14、变例 311 参数定义示例parameter CURRENT_STATE=4b1001;,3.9编译指令,Verilog语言采用了一些编译指令来实现某些特定的编译。它们主要有:定义宏(define、undef)、条件编译指令(ifdef、else、endif)、文件包含(include)、时间单位和精度定义(timescale)等等。在每个模块前面加一个timescale编译指令,可以确保在仿真时候延时信息按照timescale所制定的时间单位和精度进行编译,直到遇到下一个timescale或者resetall指令为止。timescale的格式:timescale 1ns/100ps 表示时延

15、单位为1ns,精度为100ps。,define表示定义宏。是一个全局变量,可以被多个文件采用,直到运到undef为止。例 312 采用define定义一个总线宽度为8的总线,条件编译指令的格式一般如下:ifdef NORMAL parameter A=B;else parameter A=C;endif如果宏NORMAL事先已经被定义好,则编译器会执行parameter A=B;语句,否则执行parameter A=C;语句。,3.10 系统任务和系统函数,显示任务(display task)显示任务用于信息的显示和输出,它将特定信息输出到标准输出设备,其基本语法结构如下:task_name(

16、format_specification,argument_list1);表 36 显示任务编译指令基本信息表,$display用来显示变量值、字符串等信息,常用于Verilog HDL断言,其基本格式如下:$display(“At time=%t,System is OK/n”,$time);当系统运行到这个语句时,会显示当时的实时时间如下(假设为50.002ns):At time=50.002ns,System is OK,文件输入/输出任务(File I/O task)文件的输入输出任务主要分为三部分:文件的打开和关闭,文件的数据读取以及文件的输出。文件的打开和关闭常采用$fopen和$

17、fclose两个关键字来表示。$fopen和$fclose是一起配合使用的,表示打开一个文件和关闭一个文件,其基本格式如下:/打开一个文件integer file_point=$fopen(file_name);/关闭一个文件$fclose(file_point);,打开一个文件,就需要对文件进行操作,一般有两种方式:一种是把监视探测到的信息写入文件,另外一种是从文件中读取数据,数据一般从文本文件中读取并将数据保存到存取器中。第一种方式与显示任务相似,它也分为显示、写入、探测和监控系统任务,只是这些任务最终会把数据显示到文件中去,因此需要一个文件指针表 37 文件输入指令基本信息表,$read

18、memb和$readmemh用来从文件中读取数据。文本文件包含空白空间、注释和二进制或十六进制数字。数字与数字之间用空白空间隔离。开始地址对应于存取器最左边的索引。例 313 文件的输入输出任务操作示例integer Data_OUT;Data_OUT=$fopen(“Data_OUT.txt”);$fdisplay(Data_OUT,”At time%t,System is off/n”,$time);$fclose(Data_out);,时间标度任务(timescale task)时间标度任务$printtimescale用来给出指定模块的时间单位和时间精度,基本格式如下。$printti

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

20、eck task)时序验证任务主要用来检测并报告信号的各种时序是否满足系统要求,包括建立时间、保持时间、时钟周期等。表 38 时序验证任务基本信息表,实数变换函数(conversion functions for real)表 39 实数变换函数基本信息表,概率分布函数(probabilistic distribution function)概率分布函数一般用来产生一系列随机数来验证系统的功能是否正确。概率分布函数一般采用$random(seed)。根据种子变量seed的取值按32位的有符号整数形式返回一个随机数。,3.11实例:数据选择器,数据选择器的功能是:根据选择信号,决定哪路输入信号送

21、到输出信号.输出信号不仅与输入信号有关,还与选择信号有关,数据选择器的Verilog HDL语言代码如下:module dataselector(/模块的开始 a,/输入 b,/输入 c,/输入 d,/输入,sel,/输入 en,/输入 y/输出);input a;input b;input c;input d;input1:0 sel;/两位的数据选择信号,总共有四个状态input en;/选择器使能信号,output y;/输出结果信号,reg y;/输出信号寄存器,always(a or b or c or d or sel or en)/always过程块begin/begin-end

22、 为顺序块,语句是顺序执行的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/整个模块结束,3.12 数据分配器,module datadistributor(datain,sel,en,a,b,c,d);input datain;input 1:0 sel;input en;output a;output b;output c;output d;r

23、eg a,b,c,d;,always(datain or en or sel)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;endendendmodule,3.12 小结,本章主要介绍了Verilog HDL语言的基本语法、基本结构、常量与变量、系统任务与系统函数等等。需要指出来的是,本章主要说明的是一些常用的指令,并不是Verilog HDL中的所有语法的集合,有兴趣的同学可到网上搜索相应的资料下载学习。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号