




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章Verilog设计入门主要内容3.1组合电路的Verilog描述3.2时序模块及其Verilog表述3.3二进制计数器及其Verilog设计Verilog概述什么是VerilogHDL?VerilogHDL(HardwareDiscriptionLanguage)是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。Verilog的历史最初是于1983年由GatewayDesignAutomation公司(后被Cadence收购)为其模拟器产品开发的硬件建模语言1990年,Cadence公司成立OVI(OpenVerilogInternational)组织来负责推广Verilog1995年,IEEE制定了VerilogHDL标准,即IEEEStd1364-1995Verilog与VHDL目前,设计者使用Verilog和VHDL的情况美国:Verilog:60%,VHDL:40%台湾:Verilog:50%,VHDL:50%3.1组合电路的Verilog描述3.1.12选1多路选择器及其Verilog描述
3.1组合电路的Verilog描述3.1.12选1多路选择器及其Verilog描述absy3.1组合电路的Verilog描述3.1.12选1多路选择器及其Verilog描述
端口在模块名字后的括号中列出端口等价于硬件的引脚(pin)端口可以说明为input,output及inoutmodule是层次化设计的基本构件模块内部的逻辑功能和电路结构Assign关键字引导的赋值语句标示符module(模块)module能够表示:物理块,如IC或ASIC单元逻辑块,如一个CPU设计的ALU部分整个系统每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。module是层次化设计的基本构件逻辑描述放在module内部模块端口(moduleports)端口在模块名字后的括号中列出端口可以说明为input,output及inout端口等价于硬件的引脚(pin)注意模块的名称DFF,端口列表及说明模块通过端口与外部通信赋值语句条件操作符关键字赋值语句和条件操作符条件运算符三目运算符信号=条件?表达式1:表达式2条件运算符为?:用法:当条件为真,信号取表达式1的值;为假,则取表达式2的值。关键字关键字——事先定义好的确认符,用来组织语言结构;或者用于定义VerilogHDL提供的门元件(如and,not,or,buf)。用小写字母定义!——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire。用户程序中的变量、节点等名称不能与关键字同名!VerilogHDL关键字edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenornotnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisableVerilogHDL关键字(续)tri0tri1vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg标识符所谓标识别符就是用户为程序描述中的Verilog对象所起的名字。标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下横线符。标识符最长可以达到1023个字符。模块名、端口名和实例名都是标识符。Verilog语言是大小写敏感的,因此sel和SEL是两个不同的标识符。合法和非法标识符shift_reg_a
busa_index
bus26334neta*b_netn@263Verilog是大小写敏感的。所有的Verilog关键词都是小写的。非法的合法的1、不能用数字开头2、不能含有非字母符号*3、不能含有非字母符号@空格和注释Verilog是一种格式很自由的语言。空格在文本中起一个分离符的作用,别的没有其他用处。单行注释符用//*********与C语言一致多行注释符用/*-------------------*/与C语言一致规范的书写格式规定了文本布局、命名和注释的约定,以提高源代码的可读性和可维护性。最顶层的module_endmodule模块放在最左侧低一层次的语句向右靠一个TAB键的距离同一语句关键字对齐文件取名和存盘文件的扩展名为.v文件名与该程序的模块名一致文件取名大小写敏感文件名不应该用中文和数字文件存在英文名字的文件夹中,不要存在根目录或桌面上总结VerilogHDL程序是由模块构成的。每个模块嵌套在module和endmodule声明语句中。模块是可以进行层次嵌套的。每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后必须有分号。可用/*.....*/和//...对程序的任何部分作注释。加上必要的注释,以增强程序的可读性和可维护性。3.1组合电路的Verilog描述3.1.24选1多路选择器及其case语句表述方式3.1组合电路的Verilog描述主要的数据类型Verilog有几种主要的数据类型:Nets表示器件之间的物理连接,称为网络连接类型Register表示抽象的储存单元,称为寄存器变量类型Parameter表示运行时的常数,称为参数类型寄存器阵列主要的数据类型---Net型变量定义Nets(网络连线):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。如果不明确地说明连接是何种类型,应该是指wire类型。例如:右图上,selb的改变,会自动地立刻影响或门的输出。netsabslselbselansloutwire型变量最常用的nets型变量,常用来表示以assign语句赋值的组合逻辑信号。模块中的输入/输出信号类型缺省为wire型。可用做任何方程式的输入,或“assign”语句和实例元件的输出。wire数据名1,数据名2,……,数据名n;wire[n-1:0]数据名1,数据名2,……,数据名m;或wire[n:1]数据名1,数据名2,……,数据名m;每条总线位宽为n共有m条总线wire型向量(总线)格式主要的数据类型---reg型变量定义
寄存器(register)类型变量
register型变量能保持其值,直到它被赋于新的值。register型变量常用于行为建模,产生测试的激励信号常用行为语句结构来给寄存器类型的变量赋值。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量abslselbselansloutreg_areg_selreg_breg型变量定义——在过程块中被赋值的信号,往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号)!reg数据名1,数据名2,……,数据名n;reg[n-1:0]数据名1,数据名2,……,数据名m;或reg[n:1]数据名1,数据名2,……,数据名m;每个向量位宽为n共有m个reg型向量[例]reg[4:1]regc,regd;//regc,regd为4位宽的reg型向量reg型向量(总线)格式主要的数据类型---reg型变量定义用于行为建模两种语句:initial只能执行一次always循环执行一个模块内可包含任意多个initial和always语句,它们相互并行执行,即,它们的执行顺序与其在模块中的顺序无关过程语句结构——always语句过程语句结构——always语句always语句反复执行例:always#5Clock=~Clock;由事件控制的顺序过程的always语句例:moduleHalfAdder(A,B,Sum,Carry);inputA,B;outputSum,Carry;regSum,Carry;always@(AorB)beginSum=A^B;Carry=A&B;endendmodule电平敏感事件控制例:always@(AorB)边沿触发事件控制例:always@(negedgeClock)过程语句结构——always语句块语句begin_end块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块语句分为两类:顺序块:语句置于关键字begin和end之间,块中的语句以顺序方式执行。并行块:关键字fork和join之间的是并行块语句,块中的语句并行执行。Fork和join语句常用于testbench描述。这是因为可以一起给出矢量及其绝对时间,而不必描述所有先前事件的时间。在顺序块中,语句一条接一条地计算执行。在并行块中,所有语句在各自的延迟之后立即计算执行。begin#5a=3;#5a=5;#5a=4;endfork#5a=3;#15a=4;#10a=5;join上面的两个例子在功能上是等价的。Fork-join例子里的赋值故意打乱顺序是为了强调顺序是没有关系的。注意fork-join块是典型的不可综合语句,并且在一些仿真器时效率较差。块语句begin_end条件语句-case语句case语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件语句。Case语句进行逐位比较以求完全匹配(包括x和z)。Default语句可选,在没有任何条件成立时执行。此时如果未说明default,Verilog不执行任何动作。多个default语句是非法的。条件语句-case语句case<表达式><表达式>,<表达式>:赋值语句或空语句;<表达式>,<表达式>:赋值语句或空语句;default:赋值语句或空语句;endcase重要内容:1、使用default语句是一个很好的编程习惯,特别是用于检测x和z。2、Casez和casex为case语句的变体,允许比较无关(don‘t-care)值。case表达式或case项中的任何位为无关值时,在比较过程中该位不予考虑。在casez语句中,?和z被当作无关值。在casex语句中,?,z和x被当作无关值。数字表达(1)整数型常量(即整常数)的4种进制表示形式:二进制整数(b或B);十进制整数(d或D);十六进制整数(h或H);八进制整数(o或O)。数字表达注:这里位宽指对应二进制数的宽度。整常数的3种表达方式:数据表达(2)x和z值x表示不定值,z表示高阻值;8’b1001xxxx或8’h9x8’b1010zzzz或8’haz每个字符代表的二进制数的宽度取决于所用的进制;当用二进制表示时,已标明位宽的数若用x或z表示某些位,则只有在最左边的x或z具有扩展性!为清晰可见,最好直接写出每一位的值![例]8’bzx=8’bzzzz_zzzx[例]8’b1x=8’b0000_001x“?”是z的另一种表示符号,建议在case语句中使用?表示高阻态z[例]casez(select)4’b???1:out=a;4’b??1?:out=b;4’b?1??:out=c;4’b1???:out=d;endcase3.1组合电路的Verilog描述3.1.34选1多路选择器及其数据流描述方式按位逻辑操作符双目运算符单目运算符位运算其结果与操作数位数相同。位运算符中的双目运算符要求对两个操作数的相应位逐位进行运算。两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。[例]若A=5’b11001,B=3’b101,则A&B=(5’b11001)&(5’b00101)=5’b00001运算结果为1位的逻辑值1或0。等于运算符(==)和全等运算符(===)的区别:使用等于运算符时,两个操作数必须逐位相等,结果才为1;若某些位为x或z,则结果为0。使用全等运算符时,若两个操作数的相应位完全一致(如同是1,或同是0,或同是x,或同是z),则结果为1;否则为0。所有的等式运算符优先级别相同。===和!==运算符常用于case表达式的判别,又称为“case等式运算符”。等式运算符--双目运算符等式运算符--双目运算符[例]if(A
==
1’bx)$display(“AisX”);//当A为不定值时,式(A==1’bx)的运算结果为x,则该语句不执行if(A
===
1’bx)$display(“AisX”);//当A为不定值时,式(A===1’bx)的运算结果为1,该语句执行表3-1“==”的真值表表3-2“===”的真值表等于运算的结果可能为1或0全等于运算的结果只有1或0赋值语句
分为两类:连续赋值语句,过程赋值语句
(1)连续赋值语句——assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一。
[例]assignc=a&b;//a、b、c均为wire型变量描述的是组合逻辑,并行操作在过程块外部使用。用于net驱动。在等式左边可以有一个简单延时说明。只限于在表达式左边用#delay形式可以是显式或隐含的。语法:<assign>[#delay][strength]<net_name>=<expressions>;wireout;assignout=a&b;//显式wireinv=~in;//隐含赋值语句(2)过程赋值语句——用于对reg型变量赋值,有两种方式:非阻塞(non-blocking)赋值方式:
赋值符号为<=,如b<=a;阻塞(blocking)赋值方式:
赋值符号为=,如b=a;二、非阻塞赋值与阻塞赋值的区别1.非阻塞赋值方式
always@(posedgeclk)
begin
b<=a;
c<=b;
endclkDFFcDQDQabDFF非阻塞赋值在块结束时才完成赋值操作!注:c的值比b的值落后一个时钟周期!赋值语句2.阻塞赋值方式
always@(posedgeclk)
begin
b=a;
c=b;
end阻塞赋值在该语句结束时就完成赋值操作!clkDFFcDQab注:在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。这里c的值与b的值一样
!赋值语句非阻塞(non-blocking)赋值方式(b<=a):b的值被赋成新值a的操作,并不是立刻完成的,而是在块结束时才完成;块内的多条赋值语句在块结束时同时赋值;硬件有对应的电路。阻塞(blocking)赋值方式(b=a):b的值立刻被赋成新值a;完成该赋值语句后才能执行下一句的操作;硬件没有对应的电路,因而综合结果未知。非阻塞赋值与阻塞赋值方式的主要区别建议在初学时只使用一种方式,不要混用!建议在可综合风格的模块中使用非阻塞赋值!赋值语句3.1组合电路的Verilog描述3.1.5加法器及其Verilog描述
3.1组合电路的Verilog描述3.1组合电路的Verilog描述3.1.5加法器及其Verilog描述
顶层模块和例化语句模块是可以进行层次嵌套的。每个VerilogHDL源文件中只准有一个顶层模块,其他为子模块。源文件与顶层模块同名!应在顶层模块中对子模块进行例化。元件例化:引入一种连接关系,将预先设计好的模块定义为一个元件,用例化语句引入到上一层的设计中。可以将模块的实例通过端口连接起来构成一个大的系统或元件。自上而下层次化设计的一种重要途径。例化可以是一个设计模块(设计模块例化),也可以是FPGA元件库中的元件(门元件例化)例化是调用复制的含义门元件例化——程序通过调用一个在Verilog语言库中现存的实例门元件来实现某逻辑门功能。模块元件例化——顶层模块(trist1)调用由某子模块(mytri)定义的实例元件(tri_inst)来实现某功能。例化元件名门元件关键字
and
myand3(f,a,b,c);顶层模块和例化语句moduletrist1(out,in,enable);outputout;inputin,enable;mytri
tri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:’bz;/*如果enable为1,则out=in,否则为高阻态*/endmodule例化元件名子模块名顶层模块子模块顶层模块和例化语句3.1组合电路的Verilog描述例化语句格式:端口名关联法位置关联法3.1组合电路的Verilog描述3.1.5加法器及其Verilog描述可综合建模类型只有两种:组合逻辑: 任何时候,如果输出信号直接由当前的输入信号的组合决定,则此逻辑为组合逻辑。时序逻辑: 如果逻辑中具有记忆功能,则此逻辑为时序逻辑。在任何给定的时刻,如果输出不能完全由输入信号确定,则此逻辑具有记忆功能。3.2时序模块及其Verilog表述
3.2时序模块及其Verilog表述
3.2.1边沿触发型触发器及其Verilog表述
3.2时序模块及其Verilog表述
3.2.1边沿触发型触发器及其Verilog表述
边沿敏感时序时序控制@可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以用关键字posedge(上升沿)和negedge(下降沿)限定信号敏感边沿。敏感表中可以有多个信号,用关键字or连接。always@(negedgeClock)电平敏感事件控制always@(AorB)3.2时序模块及其Verilog表述
3.2.2电平触发型锁存器及其Verilog表述
注:锁存器的动作行为如下:当时钟信号为1时,输入数据的值直接传给输出。当时钟信号为0时,输出保持当前状态不变。用不完整的条件语句,产生时序电路复位控制信号是可综合风格有限状态机代码的重要组成部分,通常在有限状态机建模中有复位控制信号。带复位端的时序电路建模同步复位:moduleDFF2(q,clk,r,d);inputclk,d,r;outputq;regq;always@(posedgeclk)if(r)q=0;elseif(r==0)q=d;endmodule同步块中的异步复位:moduleasync(q,ck,r,d);inputclk,d,r;outputq;regq;always@(posedgeclkornegedger)if(!r)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新界东2025年数学四下期末复习检测试题含解析
- 邢台学院《有限元法原理与实践》2023-2024学年第一学期期末试卷
- 2025至2031年中国硬质合金球形齿行业投资前景及策略咨询研究报告
- 口腔颌面外科麻醉与镇痛
- 甘肃省兰州市联片2024年中考数学押题卷含解析
- 广东省东莞市中学堂星晨校2024届中考联考数学试卷含解析
- 2025公司主要负责人安全培训考试试题及参考答案【培优A卷】
- 2025工厂职工安全培训考试试题及参考答案【能力提升】
- 2025年承包商入厂安全培训考试试题带下载答案
- 2024-2025新职工入场安全培训考试试题及答案ab卷
- 空腔脏器手术解析
- 2024年五年级英语下册 Unit 3 Spring Begins from March第2课时说课稿 陕旅版(三起)
- 大班剪纸教育课件
- xx小学校服价格评估方案
- 房地产销售管理制度实施细则
- 体育协会赛事组织绩效考核方案
- 航空航天凝胶应用
- 陕西省2024年中考化学真题(含答案)
- 2024年度危废培训完整课件
- 2024秋期国家开放大学《可编程控制器应用实训》一平台在线形考(形成任务6)试题及答案
- 《PBR次世代游戏建模技术》(微课版)课件 2低模制作
评论
0/150
提交评论