




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章VerilogHDL语法基础本章主要内容VerilogHDL语言的特点VerilogHDL语言的描述方式模块与端口注释常量,变量与逻辑值操作符操作数参数编译指令系统任务和函数3.1VerilogHDL的特点并行性:所谓的并行性就是说可以同时做几件事情。Verilog语言不会顾及代码顺序问题,几个代码块可以同时执行;而软件语言必须按顺序执行,上一句执行不成功,就不能执行下一句。时序性:Verilog语言可以用来描述过去的时间和相应发生的事件;而软件语言则做不到。互连:互连是硬件系统中的一个基本概念,Verilog语言中的wire变量可以很好地表达这样的功能;而软件语言并没有这样的描述。3.2VerilogHDL的描述方式VerilogHDL采用三种描述方式来进行设计:数据流描述:采用assign语句,连续赋值,数据实时变化,赋值对象一般定义为wire型。行为级描述:使用always或者initial语句,过程赋值,赋值对象一般定义为reg型,不一定会形成寄存器。结构化模型:通过实例化已有的功能模块来建模。在一个设计中我们往往会混合使用这三种描述方式。VerilogHDL是对大小写敏感的语言,同样的词汇,大写和小写是不同的符号。图3–1典型的Verilog设计描述示意图3.3模块和端口模块是Verilog的基本描述单元,可大可小,大到一个复杂的系统,小到一些基本的逻辑门单元,主要用来描述某个设计的功能或结构及其与其他功能模块通信的外部端口。对于模块而言,需要有一个模块名称来标示模块,在端口列表的括号后面一定要以
“;”结束。模块一般都有端口列表,端口与端口之间用
“,”隔开。但是仿真语言没有端口列表,因为仿真是一个封闭的系统,端口已经实例化在内部。端口声明部分需要声明端口的方向和位宽。module模块名称(端口列表);//端口定义声明;input,
output,
inout
//内部变量及参数声明wire,
reg,
functioion,
task,
parameter,
define,
etc
//模块功能实现
数据流描述:assign
行为级描述:initial,
always
结构化描述:module例化
其他用户原语endmodule例3–1端口声明//PortDeclarationinput[4:0]a;//信号名为a的5输入信号inoutb;//双向信号boutput[6:0]c;//信号名为c的7输出总线信号有些设计会把端口的声明部分和端口列表写在一起,在端口中可以对每个信号进行注释。例3–2VerilogHDL2001端口声明modulecounter(inputclk,//全局时钟信号inputreset_l,//全局复位信号output[7:0]cnt//八位数据总线);模块内部变量声明中,wire型的线网是不具备数据存取功能的,一般而言,input的缺省定义就是wire型,output信号可以是wire型,也可以reg型。定义为wire型的线网是不能够在always语句中被赋值的,只能被连续赋值。而reg型的则可以存取最后一次赋给它的值,定义为reg型的线网只能在always和initial语句中被赋值,不能被连续赋值。注意:所有的关键字都必须小写。定义为reg型的线网不一定会生成寄存器。尽管信号和内部变量定义声明只要出现在被调用的语句之前就行,可是代码风格一般要求在执行语句之前就定义好,这样可以提高代码的可读性。在声明后,便是功能执行语句,功能执行语句包括always语句、initial语句、assign语句、task、function、模块例化等等。可以混合描述,没有先后顺序,但是要注意的是initial语句只能用于仿真程序中,不能生成实际的电路。任何一个模块都要以
“endmodule”结束。3.4注释VerilogHDL提供了两种注释的方式:一种以“//”开始,注释的是一行中的余下部分。例3–3以“//”开始的注释
assigna=b?c:d;//输出为a的两输入的选择器例3–4以/*……*/表示的注释
assigna=b?c:d;//注释下面的功能语句/*always@(*)beginif(b)a=c;elsea=d;end*/3.5常量、变量与逻辑值常量就是不变的数值,比如说4’d8,表示的是一个4位宽的十进制整数8。在Verilog中,有三种不同类型的常量:整数型、实数型以及字符串型。整数型常量可以直接使用十进制的数字表示。基数表示法的格式如下:
长度’+数制简写+数字当设定的位宽比实际数字的位宽少,则自动截去左边超出的位数,反之则在左边不够的位置补足0。如果长度不显示,那么数字的位宽则取决于本身的长度。如果遇到的是x或者z时,如4’hx,位宽大于实际数字的位宽,这个时候在左边不是补0,而是补x变量分为线网型和寄存器型两种。线网型表示电路之间的互连,没有存取功能。它有许多子类型:wire、tri、tri0、tri1、wor、wand、trireg、supply1、supply0等等。wire可用于可综合的逻辑设计中,而其他的一般用于仿真程序中。另外除了trireg型的变量在未初始化的状态为x态,其它时候都是z态。寄存器型表示数据的存取,在仿真器中会占据一个内存空间。寄存器型也有许多子类型,包括reg、integer、time、real、realtime等等。用reg可以表示一位或者多位的寄存器,也可以表示存取器。例3–5采用reg表示的寄存器和存取器rega;//1位寄存器areg[4:0]b;//5位寄存器breg[7:0]c[10:1];//10*8的存取器寄存器可以按位来存取,可是存取器必须按地址来存取。一般采用for语句来给存取器来赋值。定义为reg型的变量可以生成寄存器,也可以生成MUX,所以需要视具体的功能执行而定。x状态是一种未定的状态,描述信号未被初始化的情形,在casex和casez语句中表示不关心。z状态表示高阻状况,用来表示三态建模。在真实的电子世界中以及在综合软件中,都不会出现x状态,只有亚稳态的状况。3.6操作符VerilogHDL语言和C语言相似,有着丰富的操作符,包括算术操作符,按位操作符,归约操作符,逻辑操作符,相等操作符,关系操作符,逻辑移位操作符,条件操作符以及连接复制操作符等等。绝大多数操作符的使用方式和C语言一样VerilogHDL语言相关规格书,如:IEEE-SAStandardsBoardIEEEStandardVerilog®HardwareDescriptioionLanguage17Match2001按位操作符是对操作数中的每一比特分别进行操作,得出一个新的操作数,其具体的操作符如下所示。表3–1按位操作符操作符表达式描述~~B将B中的每一位取反&A&B将A中的每个比特与B中对应的比特相与|A|B将A中的每个比特与B中对应的比特相活^A^B将A中的每个比特与B中对应的比特异或~^A~^B将A中的每个比特与B中对应的比特相异或非^~A^~B例3–6按位操作符示例A=4’b1011B=4’b1101C=4’b10x1~A=4'b0100A&B=4'b1001A|B=4'b1111A^B=4'b0110A^~B=A~^B=4'b1001A&C=4'b10x1归约操作符是一元操作符,它的表现方式与按位操作符相似或者相同,但是它的操作数只有一个,并且是对操作数中的每一比特分别进行操作,得出一个新的一位宽的操作数表3–2归约操作符操作符表达式描述&&B将B中的每一位相与得出一比特的结果~&~&B将B中的每个比特相与非得出一比特的结果||B将B中的每一位相或得出一比特的结果~|~|B将B中的每个比特相或非得出一比特的结果~^~^B将B中的每一位相异或非得出一比特的结果^~^~B^^B将B中的每一位相异或得出一比特的结果例3–7归约操作符示例B=4’b1101&B=1&1&0&1=1'b0|B=1|1|0|1=1'b1^B=1^1^0^1=1'b1逻辑操作符是二元操作符,它类似于按位操作符和归约操作符,但是又不同于它们两者,它是对表达式中的操作数整体进行操作,得出一个新的一位宽的操作数。逻辑操作符用于条件判断语句中,而按位操作符,归约操作符用于赋值语句中表3–3逻辑操作符操作符表达式描述&&A&&BA,B是否都为真?||A||BA,B任意一个是否为真?!!BB是否为假例3–8逻辑操作符示例A=3;//参数AB=0;//参数BC=2'b0x;//参数CD=2'b10;//参数D
A&&B=0A||B=1!A=0C&&D=X连接复制操作符是一类特殊的操作符,它是将两组或者两组以上的操作数连接成一个操作数,所得结果的位宽将是所有操作数位宽之和表3–4连接复制操作符操作符表达式描述{}{A,B}将A和B连接起来,产生更大的向量{{}}{B{A}}将A重复B次例3–9连接复制操作符示例A=2'b00;//参数AB=2'b10;//参数B
{A,B}=4'b0010{2{A},3{B}}=10'b00_0010_1010不同操作符之间的地位不一样,数值运算必须遵循优先级由高到低的顺序,为了避免这样的混淆和错误,增加代码的可读性,最好用“()”来区分表3–5优先级别表操作符级别+,-,
!,~(一元)最高级*,/,%二元的加减+,-<<,
>><,
<=,
>,
>===,
===,
!=,
!==&,
~&,
^,
^~,
~^,
|,
~|&&,
||?:最低级例3–10简单的操作符运算a=4'b1000b=4'b0111(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&&FALSE=FALSE3.7操作数操作数有许多种,包括常数、参数、线网变量、寄存器变量、向量、存取器单元以及函数的返回值等等。采用操作数进行运算时需要考虑操作数的极性。线网和一般寄存器类型是无符号的,而十进制整数变量则有符号。当无符号数和有符号数一起进行运算时需要考虑极性。3.8参数指令参数指令(parameter)在Verilog中是一个很重要的概念,通常出现在module里面。有时候在一个系统设计中,把所有的全局参数定义在一个文本文件中,通过`include来调用。常用于定义状态机的状态、数据位宽、延时大小等等。全局定义变量`define,它是用来进行全局定义的,一旦定义就不能改变例3–11参数定义示例parameterCURRENT_STATE=4'B1001;3.9编译指令Verilog语言采用了一些编译指令来实现某些特定的编译。它们主要有:定义宏(`define、
`undef)、条件编译指令(`ifdef、`else、`endif)、文件包含(`include)、时间单位和精度定义(`timescale)等等。在每个模块前面加一个`timescale编译指令,可以确保在仿真时候延时信息按照timescale所制定的时间单位和精度进行编译,直到遇到下一个`timescale或者`resetall指令为止。`timescale的格式:
`timescale1ns/100ps表示时延单位为1ns,精度为100ps。`define表示定义宏。是一个全局变量,可以被多个文件采用,直到运到`undef为止。例3–12采用`define定义一个总线宽度为8的总线条件编译指令的格式一般如下:
`ifdefNORMALparameterA=B;`elseparameterA=C;`endif如果宏NORMAL事先已经被定义好,则编译器会执行parameterA=B;语句,否则执行parameterA=C;语句。3.10系统任务和系统函数显示任务(
displaytask)显示任务用于信息的显示和输出,它将特定信息输出到标准输出设备,其基本语法结构如下:task_name(format_specification,argument_list1);表3–6显示任务编译指令基本信息表编译指令类型编译指令显示任务编译指令$display$displayb$displayh$displayo写入任务编译指令$write$writeb$writeh$writeo探测任务编译指令$strobe$strobeb$strobeh$strobeo监视任务编译指令$monitor$monitorb$monitorh$monitoro$display用来显示变量值、字符串等信息,常用于VerilogHDL断言,其基本格式如下:$display(“Attime=%t,SystemisOK/n”,$time);当系统运行到这个语句时,会显示当时的实时时间如下(假设为50.002ns):Attime=50.002ns,SystemisOK文件输入/输出任务(FileI/Otask)文件的输入输出任务主要分为三部分:文件的打开和关闭,文件的数据读取以及文件的输出。文件的打开和关闭常采用$fopen和$fclose两个关键字来表示。$fopen和$fclose是一起配合使用的,表示打开一个文件和关闭一个文件,其基本格式如下://打开一个文件integerfile_point=$fopen(file_name);//关闭一个文件$fclose(file_point);打开一个文件,就需要对文件进行操作,一般有两种方式:一种是把监视探测到的信息写入文件,另外一种是从文件中读取数据,数据一般从文本文件中读取并将数据保存到存取器中。第一种方式与显示任务相似,它也分为显示、写入、探测和监控系统任务,只是这些任务最终会把数据显示到文件中去,因此需要一个文件指针表3–7文件输入指令基本信息表系统任务编译指令类型系统任务编译指令文件显示任务$fdisplay$fdisplayb$fdisplayh$fdisplayo文件写入任务$fwrite$fwriteb$fwriteh$fwriteo文件探测任务$fstrobe$fstrobeb$fstrobeh$sfstrobeo文件监控任务$fmonitor$fmonitorb$fmonitorh$fmonitoro$readmemb和$readmemh用来从文件中读取数据。文本文件包含空白空间、注释和二进制或十六进制数字。数字与数字之间用空白空间隔离。开始地址对应于存取器最左边的索引。例3–13文件的输入输出任务操作示例integerData_OUT;Data_OUT=$fopen(“Data_OUT.txt”);$fdisplay(Data_OUT,”Attime%t,Systemisoff/n”,$time);$fclose(Data_out);时间标度任务(timescaletask)时间标度任务$printtimescale用来给出指定模块的时间单位和时间精度,基本格式如下。$printtimescale(模块路径);$printtimescale(模块路径);时间标度任务$timeformat则用来指明%t格式定义如何报告时间信息,其基本格式如下。$timeformat(unit_number,perision,suffix,numeric_field_width);模拟控制任务(simulationcontroltask)模拟控制任务主要有两个系统任务:$finish和$stop。它们之间主要的不同在于$finish是强迫模拟器退出,并将控制权返回给操作系统,而$stop仅仅是模拟被挂起,模拟器不会被强迫退出,交互命令可以被送往模拟器。时序验证任务(timingchecktask)时序验证任务主要用来检测并报告信号的各种时序是否满足系统要求,包括建立时间、保持时间、时钟周期等。表3–8时序验证任务基本信息表任务类型系统任务实例建立时间$setup$setup(D,posedgeclk,1,0);保持时间$hold$hold(posedgeclk,D,0.1);建立保持时间$setuphold$setuphold(posedgeclk,D,1,0,0.1);脉宽限制$width$width(negedgeclk,0.0,0);周期检查$period$period(negedgeclk,1.2);偏斜$skew$skew(negedgeclk,D,0.1);时钟与置、复位信号之间的时序约束$recovery$recovery(posedgeclk,reset,0.1);基准事件区间数据变化检测$nochange$nochange(negedgerst,dat,0,0);实数变换函数(conversionfunctionsforreal)表3–9实数变换函数基本信息表实数变换函数说明$rtoi截断小数值将实数变换为整数$itor将整数变换为实数$realtobits将实数变为64位的实数向量表示法$bitstoreal将位模式变为实数概率分布函数(probabilisticdistributionfunction)概率分布函数一般用来产生一系列随机数来验证系统的功能是否正确。概率分布函数一般采用$random(seed)。根据种子变量seed的取值按32位的有符号整数形式返回一个随机数。3.11实例1:串并转换程序设计本例将把16位宽的并行数据转换成串行数据输出,而把输入的串行数据转换成16位宽输出。//模块定义与声明moduleSer_Par#(parameterPARALLEL_WIDTH=16)(CLK,load_n,parallel_in,parallel_out,serial_in,serial_out,reset_n);//模块端口声明与注释inputCLK;//输入时钟信号inputload_n;//异步并行的load信号input[PARALLEL_WIDTH-1:0]parallel_in;//并行输入信号,//位宽为PARALLEL_WIDTHinputserial_in;//数据右移到最高位inputreset_n;//全局复位信号outputreg[PARALLEL_WIDTH-1:0]parallel_out;outputserial_out;//数据右移,从最低位输出//内部寄存器声明
reg[PARALLEL_WIDTH-1:0]P_to_S;//并行转串行移位寄存器reg[PARALLEL_WIDTH-1:0]S_to_P;//串行转并行移位寄存器//16位并行信号转换为1位串行数据输出的代码
////////////////////////////////////////////////////////////////////////////并行转串行功能实现
////////////////////////////////////////////////////////////////////////////
always@(posedgeCLK)begin if(!load_n)begin//载入并行数据 P_to_S<=parallel_in; end elsebegin//数据右移 P_to_S<={serial_in,P_to_S[PARALLEL_WIDTH:1]}; endend
assignserial_out=P_to_S[0];//数据从最低位输出//1位数据信号转换为16位宽的并行信号的代码表述////////////////////////////////////////////////////////////////////////////串行信号转并行功能实现
/////////
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 针对于小样本数据的换热器污垢预测方法进行研究
- 2024年碳排放监测设备安装调试合规考核试卷
- 购买热镀锌合同(标准版)
- 简易道路施工合同(标准版)
- 2024年贵州电网招聘真题
- 厦门市湖里区产业投资集团有限公司人员招聘考试真题2024
- 城南旧事感想200个字
- 2025年电大房地产开发与管理专业《房地产估价》真题汇编及答案解析
- 考点解析-人教版八年级物理上册第5章透镜及其应用-透镜专项攻克练习题(含答案详解)
- 考点攻克人教版八年级物理上册第5章透镜及其应用-透镜专项训练试卷(含答案详解版)
- 冷库施工进度报告范文
- 2025云南省高中学考会考英语词汇单词表(复习必背)
- 《无人驾驶车辆理论与设计》教学大纲
- 儿童儿童矮身材临床诊治矮身材临床诊治
- 招标文件范本三篇
- 心衰病例分享演讲比赛课件
- JT-T-1344-2020纯电动汽车维护、检测、诊断技术规范
- 临床技术操作规范重症医学分册资料
- ISO 15609-1 2019 金属材料焊接工艺规程和评定-焊接工艺规程-电弧焊(中文版)
- 2024年山西省职业院校技能大赛(中职组)护理技能赛项考试题库含答
- 《劳动》五年级下册教学课件 9 学做刺绣
评论
0/150
提交评论