第十一讲 Verilog HDL基础知识.ppt_第1页
第十一讲 Verilog HDL基础知识.ppt_第2页
第十一讲 Verilog HDL基础知识.ppt_第3页
第十一讲 Verilog HDL基础知识.ppt_第4页
第十一讲 Verilog HDL基础知识.ppt_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA技术课程教学,讲授:伍宗富,31.05.2020,第十一讲VerilogHDL基础知识,教学目的:使学生会用VerilogDL语言进行数字系统设计的方法。教学重点:通过实例讲解VerilogDL语言的应用方法。教学难点:VerilogDL语言设计数字系统基础。教学方法:讲授法、计算机辅助法。课时计划:6学时使用教材:VerilogHDL入门教程主要参考文献:1刘洪涛ARM嵌入式体系结构与接口技术M北京:人民邮电出版社2田耘等无线通信FPGA设计M北京:电子工业出版社3孟宪元等FPGA嵌入式系统设计教程M北京:电子工业出版社4徐光辉等.基于FPGA的嵌入式开发与应用M.北京:电子工业出版社5沈文斌.嵌入式硬件系统设计与开发实例详解M.北京:电子工业出版社6周立功等SOPC嵌入式系统基础教程M北京:北京航空航天大学出版社7王彦等.基于FPGA的工程设计与应用M.西安:西安电子工业出版社8周润景等基于QuartusII的FPGA/CPLD数字系统设计实例M北京:电子工业出版社9,一、什么是VerilogHDL?,VerilogHDL是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化(EDA)工具之间的界面。其主要目的是用来编写设计文件,建立电子系统行为级的仿真模型。即利用计算机的巨大能力对用VerilogHDL或VHDL建模的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路,然后生成该工艺条件下这种具体电路的延时模型。仿真验证无误后用于制造ASIC芯片或写入EPLD和FPGA器件中。,11.1概述,二、VerilogHDL语言的主要特征,1、语法结构上,VerilogHDL语言与C语言有许多相似之处,并借鉴C语言的多种操作符和语法结构,2、VerilogHDL语言既包含一些高层程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体构件。,3、通过使用结构级或行为级描述可以在不同的抽象层次描述设计,包括三个领域和五个抽象层次,如下表7.1所示,三个领域,五个抽象层次,4、VerilogHDL语言是并发的,即具有在同一时刻执行多任务的能力,因为但在实际硬件中许多操作都是在同一时刻发生的。一般来讲,计算机编程语言是非并行的,,5、VerilogHDL语言有时序的概念,因为在硬件电路中从输入到输出总是有延迟存在的,三、为什么要用VerilogHDL?,电子设计规模越来越大(普通设计已达几百万门的数量级),复杂度越来越高。有必要用高级语言来表达其功能,隐藏其具体的细节实现。,提高逻辑设计的效率,降低设计成本,更重要的是缩短设计同期。,可读性强,易修改。,1、HDL追求对硬件的全面描述,而将HDL描述在目标器件上实现是由EDA工具软件的综合器完成。受限于目标器件,并不是所有VerilogHDL语句均可被综合。2、结合EDA实验,我们选用ALTERA公司MAXPLUSII为工作平台,对MAXPLUSII不支持的语句不作详细介绍。,注意:,例9.1八位加法器的VerilogHDL源代码,moduleadder8(cout,sum,ina,inb,cin);output7:0sum;outputcout;input7:0ina,inb;inputcin;assigncout,sum=ina+inb+cin;endmodule,准备实现的逻辑功能:,问题:若要设计16位加法器,怎样修改?,11.2VerilogHDL的基本结构,11.2.1简单的VerilogHDL的例子,端口列表,逻辑功能描述-描述内部特性,模块名,例11.28位二进制加法计数器,modulecounter8(out,cout,data,load,cin,clk);output7:0out;outputcout;inputload,cin,clk;input7:0data;reg7:0out;/逻辑功能描述always(posedgeclk)beginif(load)out=data;/置数elseout=out+cin;/计数或保持endassigncout=/进位endmodule,准备实现的逻辑功能:,数据类型定义:寄存器型缺省:wire导线型,单行注释符/,时钟上沿执行下面语句块:时序,描述组合,仿真:在MAX+PLUSII开发软件仿真,注意:在MAX+PLUSII系统,verilogHDL文件名的后缀必须为.v,且文件名必须与模块名相同。,置数,保持,一.模块的概念,模块是VerilogHDL语言的基本单元,数字系统是用模块集合的形式来描述。,模块是描述某个设计的功能、结构和与其它模块通信的外部端口。,VerilogHDL中各个模块是并行运行。,模块可以调用其它模块的实例。,11.2.2VerilogHDL模块的结构,类似编程语言调用函数或子程序,二.模块的结构,module(),endmodule,端口说明(input,output,inout),参数定义(可选),数据类型定义/wire、reg、task、function,连续赋值语句(assign)/组合逻辑,过程块(always和initial)-行为描述语句,低层模块实例/调用其它模块,任务和函数,延时说明块,双向端口,三、语句模块的描述方法,通过实例进行描述的方法,将预定义的基本元件实例嵌入到语言中,监控实例的输入,一旦其中任何一个发生变化便重新运算并输出。,(一)结构型描述,在VerilogHDL中可使用如下结构部件:用户自定义的模块。用户自定义元件UDP。内置门级元件。内置开关级元件,1、在VerilogHDL中可使用如下结构部件:,2、例1:数据选择器的结构型描述(这里为门级描述),这里讨论门级描述,(1)VerilogHDL常用门的关键字,bufif1,bufif0,notif1,notif0(三态门),多输入门,and(与门)nand(与非门)or(或门)nor(或非门)xor(异或门)xnor(同门),多输出门,not(非门)buf(缓冲门),三态门,(2)调用门原语的句法:,语法:门类型关键字(端口列表),其中端口列表为:,三态门:(输出,输入,使能输入),多输入门:(输出,输入1,输入2,),多输出门:(输出1,输出2,输入),可以只有一个输出,(3)数据选择器的结构型描述程序清单,modulemux2_1(A,B,select,OUT);inputA,B,select;/输入、输出列表outputOUT;wirey1,y2,y3;/变量定义notG1(y1,select);/结构描述andG2(y2,A,y1);andG3(y3,B,select);orG4(OUT,y2,y3);endmodule,中间变量,非门实例,实例名称,输出,输入,与门实例,或门实例,3、例2:边沿D触发器的结构型描述,moduleMS_DFF(D,CLK,Q,not_Q);inputD,CLK;outputQ,not_Q;notG9(not_D,D),G10(not_CLK,CLK),G11(not_Y3,Y3);nandG1(Y1,D,CLK),G2(Y2,not_D,CLK),G3(Y3,Y1,Y4),G4(Y4,Y2,Y3),G5(Y5,Y3,not_CLK),G6(Y6,not_Y3,not_CLK),G7(Q,Y5,not_Q),G8(not_Q,Y6,Q);endmodule,(二)数据流型描述,例为数据选择器的数据流型描述。,modulemux2x1_df(A,B,select,OUT);inputA,B,select;outputOUT;assignOUT=select?B:A;endmodule,数据流型描述,条件运算符,是一种描述组合逻辑功能的方法,用assign连续赋值语句来实现,连续赋值语句完成如下的组合功能:等式右边的所有变量受持续监控,每当这些变量中有任何一个发生变化,整个表达式被重新赋值并送给等式左端,(三)行为级描述,是通过描述行为特性来实现,它的关键词是always,其含义是一旦敏感变量发生变化,就重新一次进行赋值,有无限循环之意。这种描述方法常用来实现时序电路,也可用来描述组合功能。,例为数据选择器的行为型描述。,modulemux2x1_bh(A,B,select,OUT);inputA,B,select;outputOUT;regOUT;/行为型描述,select、A、B为敏感变量always(selectorAorB)if(select=0)OUT=A;elseOUT=B;endmodule,(四)混合型描述,用户可以混合使用上述三描述方法。但需特别说明:模块中的门的实例、模块实例语句、assign语句和always语句是并发执行的,即执行顺序跟书写次序无关。,例、双向三态端口的描述,moduletri_inout(tri_inout,out,data,en,clk);inputen,clk;input7:0data;output7:0out;inout7:0tri_inout;wire7:0tri_inout;reg7:0out;assigntri_inout=en?data:8bz;always(posedgeclk)out=tri_inout;endmodule,双向管脚在仿真图中拆分二个,管脚作输出用时,输入应设定为高阻,仿真注意事项:,常用词法:,VerilogHDL区分大小写。,VerilogHDL的关键字(如:always、and、input等)都采用小写。关键字见书后附录B。,VerilogHDL的注释符为:单行注释符:/多行注释符:/,11.3数据类型及常量、变量,一.数字,语法:.,11.3.1常量,对应二进制的宽度,进制说明,四种进制表示方式:二进制(b或B)八进制(o或O)十六进制(h或H)十进制(d或D),4种进制表示方式:,注意:位宽小于相应数值的实际位数时,相应的高位部分被忽略,4d61与4B1101相同。61=(111101)2,不允许用x和z,二.常量,语法:,parameter参数名1=表达式,参数名2=表达式,;,例:,parametercount_bits=8;,parametersel=8,code=8ha3;,parameterdatawidth=8;addrwidth=datawidth*2;,使用常量的目的:(1)便于阅读,(2)便于修改。,以n位计算器为例,modulecounter8(out,cout,data,load,cin,clk);parametercount_bits=8;outputcount_bits:1out;outputcout;inputload,cin,clk;inputcount_bits:1data;regcount_bits:1out;always(posedgeclk)beginif(load)out=data;elseout=out+cin;endassigncout=endmodule,常量:定义计数器的位数,修改常数值即可修改计数器的位数,n位计算器,一、分类:,11.3.2变量,指硬件电路中的各种连接,输出始终根据输入的变化而更新其值的变化,常指硬件电路中具有状态保持作用的器件,如触发器、寄存器等,(一)nets型,以下只介绍wire型变量,MAXPLUSII只支持数wire,tri,1、wire型变量:,最常用的nets型变量,常用来表示用assign语句赋值的组合逻辑信号,取值为:0,1,x(不定值),z(高阻),注意:VerilogHDL模块中的输入/输出信号类型缺省时,自动定义为wire型变量,2、wire型变量的定义,语法:,wire数据1,数据2,数据n;,例子:,wirea,b,c,wire20:1addrbus,wire7:0databus,/定义了三个wire型变量a,b,c,/定义了八位宽wire型向量数据总线,/定义了20位宽wire型向量地址总线,(二)register型:,MAXPLUSII支持REG,MAXPLUSII只在for语句支持integer,MAXPLUSII不支持数real、time,语法:,reg数据1,数据2,数据n;,例子:,rega,b,reg7:0mymem1023:0,reg8:1data,/定义了两个reg型变量a,b,/定义了八位宽reg型向量,/定义1k字节(8bits)的存储器,reg型变量的定义,二维向量称为存储器变量MAXPLUSII不支持存储器变量,11.4运算符,结果值要略去小数部分,某一操作数有不确定,则结果也是不定值。,操作数中的某一位为不定值x或高阻z,则结果为不定值x,将x或z看作是一种逻辑状态参与比较,结果只有0或1两种。,运算符(续),与数字电路定义不同。(右移、左移互换),二、运算符的优先级:,书中有错,一分类:,11.5语句,红色为:MAXPLUSII支持,一、always过程块,(1)always块语句模板:,always()begin/过程赋值/if语句/case语句/while,repert,for语句/task,functiony调用end,11.5.1过程块,当表达式的值改变时,就执行一遍块内语句,always过程块是不能嵌套使用。,(2)posedge与negedge关键字,例:同步时序电路的时钟为信号为clk,clear为异步清0信号。敏感信号可写为:,always(posedgeclkorposedgeclear),/上升沿触发,高电平清0有效,always(posedgeclkornegedgeclear),/上升沿触发,低电平清0有效,上升沿,下降沿,注意:异步控制时,块内逻辑描述要与敏感信号表达式一致,例:带异步清0的D触发器,always(posedgeclkornegedgeclear)beginif(clear)qout=0;elseqout=in;end,应改为:if(!clear),二initial过程块,(1)initial块语句模板:,initialbegin语句1;语句2;end,(2)例:对变量和存贮器初始化,initialbeginreg1=0;for(addr=0;addrsize;addr=addr+1)memoryaddr=0;end,(3)说明:,模拟0时刻开始执行,只执行一次。,同一模块内的多个initial过程块,模拟0时刻开始并行执行。,主要面向功能模拟,通常不具有可综合性。,initial过程块是不能嵌套使用。,11.6.1常用赋值语句,1.连续赋值语句(assign):常用于对wire型变量进行赋值,例:,inputa,b;outputcassignc=a,a,b信号的任何变化,都将随时反映到c上来,11.6赋值语句,2.过程赋值语句:常用于对reg型变量进行赋值,(1)两种方式:,非阻塞赋值语句在块结束时才完成赋值操作,在一块内非阻塞赋值语句并行执行。赋值符号=例:b=a,该语句结束时就完成赋值操作,前面的语句没有完成前,后面的语句是不能执行。在一块内非阻塞赋值语句顺序执行。赋值符号=例:b=a,一条非阻塞赋值语句的执行是不会阻塞下一条语句的执行,也就是说本条非阻塞赋值语句的执行完毕前,下一条语句也可开始执行。,(2)阻塞赋值和非阻塞赋值的区别:,modulenon_block(c,a,b,clk);outputc,b;inputa,clk;regc,b;always(posedgeclk)beginb=a;c=b;endendmodule,例9.4非阻塞赋值,b,c在clk上沿时同时进行状态变化,仿真:,同时执行,moduleblock(c,a,b,clk);outputc,b;inputa,clk;regc,b;always(posedgeclk)beginb=a;c=b;endendmodule,例11.5阻塞赋值,仿真:,注意:推荐初学者使用阻塞赋值,因为类似c语言的赋值方式。,顺序执行有c=b,11.7.1if-else语句,1.使用形式1,if()语句或语句块;,2.使用形式2,if()语句或语句块1;else语句或语句块2;,3.使用形式3:嵌套使用,if()语句或语句块1;elseif()语句或语句块2;elseif()语句或语句块n;else语句或语句块n+1;,条件表达式的值为1:按“真”处理,条件表达式的值为0:按“假”处理。,11.7条件语句,例11.6模为60的BCD码同步计数器,要求:,(1)输入、输出,(2)功能,(3)BCD码计数规则:,状态=59,下一状态为0,状态59,个位=9时,下一状态:个位为0,十位加1,状态59,个位9时,下一状态:个位加1,十位保持,进位:当状态qout=59且cin=1时,cout=1,否则cout=0.,(4)程序清单,modulecount60(qout,cout,data,load,cin,reset,clk);output7:0qout;outputcout;input7:0data;inputload,cin,reset,clk;reg7:0qout;assigncout=(qout=8h59)endendendmodule,(5)仿真:,(6)程序的改进:,通过定义常量,增加程序的通用性。,modulecount60(qout,cout,data,load,cin,reset,clk);parameterMODULUS=8h59;output7:0qout;outputcout;input7:0data;inputload,cin,reset,clk;reg7:0qout;assigncout=(qout=MODULUS)endendendmodule,改变MODULUS的值(=99),即可改变模,1.case语句,语法:,case()值1:语句或语句块1;/case分支项值2:语句或语句块2;值n:语句或语句块n;default:语句或语句块n+1;/可省略endcase,当敏感表达式的值为值1时,执行语句或语句块1;为值2时,执行语句或语句块2;依此类推。当敏感表达式的值与所列出的值都不相等时,条件表达式的值为0:按“假”处理。执行default后面的语句default语句可省略。,11.7.2case语句,例11.7:BCD码-七段译码器(共阴),moduledecode4_7(a,b,c,d,e,f,g,indec);outputa,b,c,d,e,f,g;input3:0indec;rega,b,c,d,e,f,g;always(indec)begincase(indec)4d0:a,b,c,d,e,f,g=7b1111110;4d1:a,b,c,d,e,f,g=7b0110000;4d2:a,b,c,d,e,f,g=7b1101101;4d3:a,b,c,d,e,f,g=7b1111001;4d4:a,b,c,d,e,f,g=7b0110011;4d5:a,b,c,d,e,f,g=7b1011011;4d6:a,b,c,d,e,f,g=7b1011111;4d7:a,b,c,d,e,f,g=7b1110000;4d8:a,b,c,d,e,f,g=7b1111111;4d9:a,b,c,d,e,f,g=7b1111011;default:a,b,c,d,e,f,g=7bx;endcaseendendmodule,类似真值表,所有输入中,任一变量变化,均执行:组合电路,在过程赋值,必须用reg,与是否组合无关,状态机通常可使用带有always语句的case语句建模。状态信息存储在寄存器中。case语句的多个分支包含每个状态的行为。,例、有限状态机的设计实例,例状态机的VerilogHDL的描述,moduleMoore_mdl(x,AB,CLK,RST);inputx,CLK,RST;output1:0AB;reg1:0state;parameterS0=2b00,S1=2b01,S2=2b10,S3=2b11;always(posedgeCLKornegedgeRST)if(!RST)state=S0;elsecase(state)S0:if(!x)state=S1;elsestate=S0;S1:if(x)state=S2;elsestate=S3;S2:if(!x)state=S3;elsestate=S2;S3:if(!x)state=S0;elsestate=S3;endcase图7.11状态机图assignAB=state;endmodule,类似表状态,2.casez与casex语句,(1)语法与case语句相同,(2)casez、casex与case语句差别,casez在语句:对分支项的值中的高阻z位不予考虑,只关心其它位的比较结果。,casex在语句:对分支项的值中的高阻位(z)、不定值(x)均不予考虑,只关心其它位的比较结果。,?:无关值,标识z、x另一种方法,例11.84线-2线高优先编码器,-要求:,输入高电平有效,输出二进制原码,moduledecode4_2(d,b);output1:0b;input3:0d;reg1:0b;always(d)begincasex(d)4b1zzx:b=2b11;4b01xx:b=2b10;4b001?:b=2b01;4b0001:b=2b00;endcaseendendmodule,-程序清单,书中:未定义输入0000情况,所以此程序有问题,default:b=2b00;,应改为:default:b=2b00;,注意:,时序电路可利用上述特性来保持状态。,组合电路必须列出所有条件分支,否则会产生隐含触发器。,若没有列出所有条件分支,编译器认为条件不满足时,会引进触发器保持原值。,11.7.3使用条件语句注意事项,例11.9隐含触发器举例:与门,moduleburied_ff(c,b,a);outputc;inputa,b;regc;always(aorb)beginif(b=1)endendmodule,只列出一种情况,隐含触发器,改正错误,加上elsec=0;,分类,连续执行语句或语句块n次,条件循环,执行语句或语句块,直到某个条件不满足,条件循环,条件满足时,执行语句或语句块,11.8循环语句,MAX+PLUSII只支持for语句,无限循环,连续执行语句,多用initial块中,以生成周期性波形,11.8.1for语句,1.语法:,for(;)循环体语句或语句块;,2.执行过程:,(1)执行“变量赋初值语句”,(3)执行“变量增值语句”,转到(2)继续执行。,3例子:,例11.107人投票表决器(多数表决),modulevoter7(pass,vote);outputpass;input6:0vote;reg2:0sum;integeri;regpass;always(vote)beginsum=0;for(i=0;i=4)=(sum2)elsepass=0;endendmodule,中间变量,循环变量,for语句,47时:sum2=1,用此语句代替,更易懂。,例11.118位二进制乘法器,modulemult_for(outcome,a,b);parametersize=8;output2*size:1outcome;inputsize:1a,b;/乘数reg2*size:1outcome;/积integeri;always(aorb)beginoutcome=0;for(i=1;i=size;i=i+1)if(bi)outcome=outcome+(a1;/endendendmodule,循环体语句块;,注意:MAX+PLUSII不支持repeat语句,11.8.2repeat语句,11.8.3while和forever语句,语法:,while()循环体语句或语句块;,一、while语句,二、forever语句,Forever循环体语句或语句块;,语法:,注意:MAX+PLUSII不支持while语句和forever语句,一、任务(task),1.定义格式:,task端口与类型说明;局部变量说明;语句或语句块;endtask,2.调用格式:,(端口1,端口2,),注意:MAX+PLUSII不支持task语句,11.9task和function语句,二、函数(function),1.定义格式:,function输入端口与类型说明;局部变量说明;语句或语句块;endfunction,2.调用格式:,(,),可选,定义函数名变量的类型和位宽。缺省默认为,1位reg型。,隐含与函数同名的内部变量,通过函数名变量传递函数值。,两者一一对应,排序、类型必须一致。,modulefunction_example(in,out);input7:0in;output2:0out;reg2:0out;function2:0gefun;input7:0x;reg2:0count;integeri;begincount=0;for(i=0;iinb);assignequal=(ina=inb);assignSmall=(inainb);endmodule,例:n位比较器,11.12.1.7、双向三态端口的描述,moduletri_inout(tri_inout,out,data,en,clk);inputen,clk;input7:0data;output7:0out;inout7:0tri_inout;wire7:0tri_inout;reg7:0out;assigntri_inout=en?data:8bz;always(posedgeclk)out=tri_inout;endmodule,11.12.2常用时序电路模块的设计,11.12.2.1D触发器,1.最简单的D触发器,moduleDFF(Q,D,CLK);outputQ;inputD,CLK;regQ;always(posedgeCLK)beginQ=D;endendmodule,不需要同步输入端D。与组合差别?,2.带异步清0、异步置1的D触发器,moduleDFF1(q,qn,d,clk,set,reset);inputd,clk,set,reset;outputq,qn;regq,qn;always(posedgeclkornegedgesetornegedgereset)beginif(!reset)beginq=0;qn=1;end/异步清0,低电平有效elseif(!set)beginq=1;qn=0;end/异步置1,低电平有效elsebeginq=d;qn=d;endendendmodule,注意:与数字电路中的D有差别?set、reset可同时有效,但reset信号有优权。,不需要同步输入端D。与组合差别?,3.带同步清0、同步置1的D触发器,moduleDFF2(q,qn,d,clk,set,reset);inputd,clk,set,reset;outputq,qn;regq,qn;always(posedgeclk)beginif(reset)beginq=0;qn=1;end/同步清0,高电平有效elseif(set)beginq=1;qn=0;end/同步置1,高电平有效elsebeginq=d;qn=d;endendendmodule,注意:清0和置1,同步与异步差别?,11.12.2.2数据锁存器(latch),1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论