•概述•VerilogHDL的基本结构•运算符•语句•VerilogHDL模型级别•数据类型及常量、变量•语句的顺序执行与并行执行第0章VerilogHDL第2页一、什么是VerilogHDL?VerilogHDL是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化(EDA)工具之间的界面。其主要目的是用来编写设计文件,建立电子系统行为级的仿真模型。即利用计算机的巨大能力对用VerilogHDL或VHDL建模的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路,然后生成该工艺条件下这种具体电路的延时模型。仿真验证无误后用于制造ASIC芯片或写入EPLD和FPGA器件中。§0.1概述第3页二、VerilogHDL语言的主要特征1、语法结构上,VerilogHDL语言与C语言有许多相似之处,并借鉴C语言的多种操作符和语法结构。2、VerilogHDL语言既包含一些高层次程序设计语言的结构形式,同时也兼顾描述硬件电路具体的线路连接。3、通过使用结构级或行为级描述可以在不同的抽象层次描述设计。包括三个领域和五个抽象层次,如下表0.1所示。第4页行为领域结构领域物理领域系统级性能描述部件及它们之间的逻辑连接方式芯片模块电路板和物理划分的子系统算法级(芯片级)I/O应答算法级硬件模块数据结构部件之间的物理连接电路板底盘等寄存器传输级并行操作,寄存器传输,状态表ALU、多路选择器、寄存器、总线微定序器、微存储器之间的物理连接方式芯片、宏单元逻辑级布尔方程门电路、触发器、锁存器标准单元布图电路级微分方程晶体管、电阻、电容等晶体管布图三个领域五个抽象层次第5页4、VerilogHDL语言是并行的,即具有在同一时刻执行多任务的能力,因为在实际硬件中许多操作都是在同一时刻发生的。一般来讲,计算机编程语言是非并行的。5、VerilogHDL语言有时序的概念,因为在硬件电路中从输入到输出总是有延迟存在的。这两点显示:VerilogHDL语言与C语言的昀大区别。注意第6页三、为什么要用VerilogHDL?•电子设计规模越来越大(普通设计已达几百万门的数量级),复杂度越来越高。有必要用高级语言来表达其功能,隐藏其具体的细节实现。•提高逻辑设计的效率,降低设计成本,更重要的是缩短设计同期。•可读性强,易修改。HDL追求对硬件的全面描述,而将HDL描述在目标器件上实现是由EDA工具软件的综合器完成。受限于目标器件,并不是所有VerilogHDL语句均可被综合。注意第7页例0.1数据选择器输入信号:•in0、in1均为8位二进制数•sel为地址信号(1位)输出信号:•out为8位二进制数输出、输入关系:•当sel=0时:out=in0;而当sel=1时:out=in1;0.2VerilogHDL的基本结构0.2.1简单的VerilogHDL的例子MUX1、功能描述:888selin0in1out01第8页2、数据选择器的VerilogHDL源代码moduleMUX(out,in0,in1,sel);parameterN=8;output[N:1]out;input[N:1]in0,in1;inputsel;assignout=sel?in1:in0;endmodule程序为模块结构,包含在module与endmodule之间输入、输出端口列表输入、输出端口描述--描述外部特性逻辑功能描述--描述内部特性模块名参数:表示数据位数888selin0in1out01第9页例0.24位二进制加法计数器(带同步清0)1、功能描述:8resetclkqcoutcin输入resetcinclkq*功能1×q*=0清000q*=q保持1q*=q+1计数进位输出:当q为昀大值(q==15)且cin=1时,cout=1;否则,cout=0。第10页2、4位二进制计数器的VerilogHDL源代码modulecounter(q,cout,reset,cin,clk);parameterN=4;output[N:1]q;outputcout;inputreset,cin,clk;reg[N:1]q;//逻辑功能描述always@(posedgeclk)beginif(reset)q=0;//清0elseq=q+cin;//计数或保持endassigncout=&q&&cin;//进位endmodule][]2[]1[&NqqqqK•=输入、输出端口描述参数:表示计数器的位数语句块时钟上升沿执行下面语句块:描述时序数据类型定义:寄存器型(有保持功能)缺省:wire导线型并行语句8resetclkqcoutcin描述组合电路第11页3.在ModelSim中仿真清0保持`timescale1ns/1psmodulecount4_tb_v;//Inputsregreset,cin,clk;//Outputswire[4:1]q;wirecout;//InstantiatetheUnitUnderTest(UUT)counteruut(.q(q),.cout(cout),.reset(reset),.cin(cin),.clk(clk));initialbegin//InitializeInputsreset=0;cin=0;clk=0;#100reset=1;#100cin=1;#100reset=0;#(100*20)cin=0;#100cin=1;#(100*5)$stop;endalways#50clk=~clk;endmodule附:测试代码常用词法:•VerilogHDL区分大小写。•VerilogHDL的关键字(如:always、and、input等)都采用小写。•VerilogHDL的注释符为:单行注释符://多行注释符:/*……*/0.3数据类型及常量、变量一、数字•语法:位宽'进制数值0.3.1常量对应二进制的宽度十进制可缺省进制说明:•二进制(b或B)•八进制(o或O)•十六进制(h或H)•十进制(d或D)•4种进制表示方式:数制进制符号值例二进制b或B0,1,x(不定),z(高阻)8'b11000101,8'b1010zzzz,8'b0101xxxx,7'b1010zzz八进制o或O0~7,x,z8'o305,7'o12z十进制d或D0~94'd61,45十六进制h或H0~f,x,z8'hc5,8'haz,8‘hcx位宽小于相应数值的实际位数时,相应的高位部分被忽略,4'd61与4‘b1101相同。61=(111101)2不允许用x和z注意第17页二、常量语法:parameter参数名1=表达式,参数名2=表达式,……;例:parametercount_bits=8;parametersel=8,code=8’ha3;parameterdatawidth=8;addrwidth=datawidth*2;使用常量的目的:(1)便于阅读,(2)便于修改。(3)模块的通用性第18页一、分类:网络型(netstype):寄存器型(registertype):0.3.2变量•指硬件电路中的各种连接,•输出始终根据输入的变化而更新其值的变化常指硬件电路中具有状态保持作用的器件,如触发器、寄存器等第19页(一)nets型类型功能wire,tri连线类型wor,trior多重驱动时,具有线或功能的连线型wand,triand多重驱动时,具有线与功能的连线型tri1/tri0上拉电阻/下拉电阻supply1/supply0电源(逻辑1)/地(逻辑0)以下只介绍wire型变量。昀主要类型第20页1、wire型变量:•最常用的nets型变量。•常用来表示用assign语句赋值的组合逻辑信号。•取值为:0,1,x(不定值),z(高阻)。•VerilogHDL模块中的输入/输出信号类型缺省时,自动定义为wire型变量。注意第21页2、wire型变量的定义•语法:wire数据1,数据2,……数据n;•例子:wirea,b,cwire[20:1]addrbuswire[7:0]databus//定义了三个wire型变量a,b,c//定义了八位宽wire型向量数据总线//定义了20位宽wire型向量地址总线第22页(二)register型:类型功能说明reg常用的寄存器型变量如触发器、寄存器等integer32位带符号整数型变量纯数学的抽象描述,不对应任何硬件电路。real64位带符号实数型变量time无符号时间变量第23页•语法:reg数据1,数据2,……数据n;•例子:rega,breg[7:0]mymem[1023:0]reg[8:1]data//定义了两个reg型变量a,b//定义了八位宽reg型向量//定义1k字节的存储器reg型变量的定义二维向量称为存储器变量注意0.4运算符若A=5'b11001,B=5'b10101~A=5'b00110A&B=5'b10001A^B=5'b0110017/3=5(舍去小数部分)9%4=1单目双目~(按位非)&(按位与)|(按位或)^(按位异或)^~,~^(按位同或)位运算符双目/单目&&(与),!(非)||(或)逻辑运算符双目+,-,*,/,%(求模)算术运算符例子或说明操作数个数运算符类别注意某一操作数有不确定值,则结果也是不定值。操作数中的某一位为不定值x或高阻z,则结果为不定值x将x或z看作是一种逻辑状态参与比较,结果只有0或1两种。==与===区别:例:a=5'b11x01,b=5'b11x01则:(a==b)=x;(a===b)=1双目==(相等)!=(不等)===(全等)!==(非全等)等式运算符双目,=,,=关系运算符例子或说明操作数个数运算符类别运算符(续1)第26页类别运算符操作数个数例子或说明缩减运算符&(缩减与)|(缩减或)~&(缩减与非)~|(缩减或非)^(缩减异或)^~,~^(缩减同或)单目若:reg[3:0]a;则:&a=a[0]&&[1]&&a[2]&&a[3]移位运算符(右移)(左移)单目语法:An或An;其中n为移位的位数,用0填补空位。若A=5'b11001,则A2为5'b00110条件运算符?:三目语法:signal=condition?true_expression:false_expression;例,2选1的MUX:out=sel?in1:in0连接运算符{}{cout,sum}{a,b,c,d,e,f,g}运算符(续2)第27页二、运算符的优先级:&,|,~&,~|,^,^~,~^(缩减)?:||&&|,^,^~,~^按位&,==,!=,===,!==,=,,=,+,-*,/,%高优先级低优先级!,~优先级运算符逻辑算术分类:赋值语句连续赋值语句过程赋值语句条件语句if-else语句case语句循环语句forever语句repeat语句while语句for语句结构说明语句initial语句always语句task语句function语句编译预处理语句`define语句`include语句`timescale语句0.5语句initialalways过程块:1、always过程块(1)always块语句模板:always@(敏感信号表达式)begin//过程赋值//if语句//case语句//while,repert,for语句//task,functiony调用end当表达式的值改变时,就执行一遍块内语句always过程块是不能嵌套使用。注意0.5.1过程块第30页(2)posedge与negedge关键字例:同步时序电路的时钟为信号为clk,clear为异步清0信号。敏感信号可写为:always@(posedgeclkorposedgeclear)//上升沿触发,高电平清0有效always@(posedgeclkornegedgeclear)//上升沿触发,低电平清0有效上升沿下降沿第31页异步控制时,块内逻辑描述要与敏感