ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:21.15KB ,
资源ID:14530336      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14530336.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Verilog HDL语言的描述语句.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Verilog HDL语言的描述语句.docx

1、Verilog HDL语言的描述语句第4节 Verilog HDL语言的描述语句 Verilog HDL 描述语句 2.4.1 结构描述形式通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: and nand nor or xor xnor buf not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型 (输出,输入1

2、,输入2,,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; / 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T

3、1, T2, T3); endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。2.4.2 数据流描述形式数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控

4、,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a end_wave; /语句5,触发事件end_waveend 串行块的执行特点如下: 串行块内的各条语句是按它们在块内的语句逐次逐条顺序执行的,当前一条执行完之后,才能执行下一条。如上例中语句1至语句5是顺序执行的。 块内每一条语句中的延时控制都是相对于前一条语句结束时刻的延时控制。如上例中语句2的时延为2d

5、。 在进行仿真时,整个语句块总的执行时间等于所有语句执行时间之和。如上例中语句块中总的执行时间为5d。 (2)forkjoin,用来组合需要并行执行的语句,被称为并行块。例如: parameter d = 50; reg7:0 r; fork /由一系列延迟产生的波形 # d r = h35 ; /语句1 # 2d r = hE2 ; /语句2 # 3d r = h00 ; /语句3 # 4d r = hF7 ; /语句4 # 5d end_wave; /语句5,触发事件end_wave join 并行块的执行特点为: 并行语句块内各条语句是各自独立地同时开始执行的,各条语句的起始执行时间都等

6、于程序流程进入该语句块的时间。如上例中语句2并不需要等语句1执行完才开始执行,它与语句1是同时开始的。 块内每一条语句中的延时控制都是相对于程序流程进入该语句块的时间而言的。如上例中语句2的延时为2d。 在进行仿真时,整个语句块总的执行时间等于执行时间最长的那条语句所需要的执行时间,如上例中整个语句块的执行时间为5d。 (3)混合使用 在分别对串行块和并行块进行了介绍之后,还需要讨论一下二者的混合使用。混合使用可以分为下面两种情况。 串行块和并行块分别属于不同的过程块时,串行块和并行块是并行执行的。例如一个串行块和并行块分别存在于两个initial过程块中,由于这两个过程块是并行执行的,所以其

7、中所包含的串行语句和并行语句也是同时并行执行的。在串行块内部,其语句是串行执行的;在并行块内部,其语句是并行执行的。 当串行块和并行块嵌套在同一过程块中时,内层语句可以看作是外层语句块中的一条普通语句,内层语句块什么时候得到执行是由外层语句块的规则决定的;而在内层语句块开始执行时,其内部语句怎么执行就要遵守内层语句块的规则。 3时序控制 Verilog HDL提供了两种类型的显示时序控制,一种是延迟控制,在这种类型的时序控制中通过表达式定义开始遇到这一语句和真正执行这一语句之间的延迟时间。另外一种是事件控制,这种时序控制是通过表达式来完成的,只有当某一事件发生时才允许语句继续向下执行。(1)延

8、时控制 延时控制的语法如下: # 延时数 表达式; 延时控制表示在语句执行前的“等待时延”,下面给出一个例子: initial begin #5 clk = clk; end 延时控制只能在仿真中使用,是不可综合的。在综合时,所有的延时控制都会被忽略。(2)事件控制 事件控制分为两种:边沿触发事件控制和电平触发事件控制。 边沿触发事件是指指定信号的边沿信号跳变时发生指定的行为,分为信号的上升沿和下降沿控制。上升沿用posedge关键字来描述,下降沿用negedge关键字描述。边沿触发事件控制的语法格式为:第一种:() 行为语句; 第二种:( or or or ) 行为语句; 例2-10 边沿触

9、发事件计数器 reg 4:0 cnt; always (posedge clk) begin if (reset) cnt = 0;else cnt = cnt +1;end 上面这个例子表明:只要clk信号有上升沿,那么cnt信号就会加1,完成计数的功能。这种边沿计数器在同步分频电路中有着广泛的应用。 电平敏感事件是指指定信号的电平发生变化时发生指定的行为。下面是电平触发事件控制的语法和实例: 第一种:() 行为语句; 第二种:( or or or ) 行为语句; 例2-11 电平沿触发计数器 reg 4:0 cnt; always (a or b or c) begin if (reset

10、) cnt = 0;else cnt = cnt +1; end 其中,只要a,b,c信号的电平有变化,信号cnt的值就会加1,这可以用于记录a,b,c变化的次数。 4流控制 流控制语句包括3类,即跳转、分支和循环语句。(1)if语句 if语句的语法如下: if (条件1) 语句块1 else if (条件2)语句块2 else 语句块n 如果条件1的表达式为真(或非0值),那么语句块1被执行,否则语句块不被执行,然后依次判断条件2至条件n是否满足,如果满足就执行相应的语句块,最后跳出if语句,整个模块结束。如果所有的条件都不满足,则执行最后一个else分支。在应用中,else if分支的语句

11、数目由实际情况决定;else分支也可以缺省,但会产生一些不可预料的结果,生成本不期望的锁存器。 例2-12 下面给出一个if语句的例子,并说明省略else分支所产生的一些结果。 always (a1 or b1) begin if (a1) q= d; end if语句只能保证当a1=1时,q才取d的值,但程序没有给出a1=0时的结果。因此在缺少else语句的情况下,即使a1=0时,q的值会保持a1=1的原值,这就综合成了一个锁存器。 如果希望a1=0时,q的值为0或者其他值,那么else分支是必不可少的。下面给出a1=0,q=0的设计: always (a1 or b1) begin if

12、(a1) q = d; else q = 0; end (2)case语句 case语句是一个多路条件分支形式,其用法和C语言的csae语句是一样的。 下面给出一个case语句的例子: reg 2:0 cnt; case (cnt) 3b000: q = q + 1; 3b001: q = q + 2; 3b010: q = q + 3; 3b011: q = q + 4; 3b100: q = q + 5; 3b101: q = q + 6; 3b110: q = q + 7; 3b111: q = q + 8; default: q = q+ 1; endcase 需要指出的是,case语

13、句的default分支虽然可以缺省,但是一般不要缺省,否则会和if语句中缺少else分支一样,生成锁存器。 例2-13 给出case语句的Verilog实例 always (a11:0 or b1) begin case (a1) 2b00: q = b1; 2b01: q = b1 + 1; end 这样就会生成锁存器。一般为了使case语句可控,都需要加上default选项。always (a11:0 or b1) begin case (a1) 2b00: q = b1;2b01: q = b1 + 1;default: q = b1 + 2; end 在实际开发中,要避免生成锁存器的错

14、误。如果用if语句,最好写上else选项;如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增加了Verilog程序的可读性。 此外,还需要解释在硬件语言中使用if语句和case语句的区别。在实际中如果有分支情况,尽量选择case语句。这是因为case语句的分支是并行执行的,各个分支没有优先级的区别。而if语句的选择分支是串行执行的,是按照书写的顺序逐次判断的。如果设计没有这种优先级的考虑,if语句和case语句相比,需要占用额外的硬件资源。 (3)循环语句 Verilog HDL中提供了4种循环语句:for循环、while

15、循环、forever循环和repeat循环。其语法和用途与C语言很类似。 for循环照指定的次数重复执行过程赋值语句。for循环的语法为: for(表达式1; 表达式2; 表达式3) 语句 for循环语句最简单的应用形式是很容易理解的,其形式为: for(循环变量赋初值; 循环结束条件; 循环变量增值) 例:for语句的应用实例 for(bindex = 1; bindex = size; bindex = bindex + 1) result = resul + (a (bindex-1); while循环执行过程赋值语句直到指定的条件为假。如果表达式条件在开始不为真(包括假、x以及z),那

16、么过程语句将永远不会被执行。while循环的语法为: while (表达式) begin end 例:while语句的应用实例 while (temp) begin count = count + 1; end forever循环语句连续执行过程语句。为跳出这样的循环,中止语句可以与过程语句共同使用。同时,在过程语句中必须使用某种形式的时序控制,否则forever循环将永远循环下去。forever语句必须写在initial模块中,用于产生周期性波形。forever循环的语法为 forever begin end 例:forever语句的应用实例 initial forever begin if

17、(d) a = b + c; else a= 0; end repeat循环语句执行指定循环数,如果循环计数表达式的值不确定,即为x或z时,那么循环次数按0处理。repeat循环语句的语法为 repeat(表达式) begin end 例:repeat语句的应用实例 repeat (size) begin c = b 1; end 2.4.4 混合设计模式在模型中,结构描述、数据流描述和行为描述可以自由混合。也就是说,模块描述中可以包括实例化的门、模块实例化语句、连续赋值语句以及行为描述语句的混合,它们之间可以相互包含。使用always语句和initial语句(切记只有寄存器类型数据才可以在模

18、块中赋值)来驱动门和开关,而来自于门或连续赋值语句(只能驱动线网型)的输出能够反过来用于触发always语句和initial语句。 下面给出一个混合设计方式的实例。 例2-14 用结构和行为实体描述了一个4位全加器。 module adder4(in1, in2, sum, flag); input 3:0 in1; input 3:0 in2;output 4:0 sum; output flag;wire c0, c1, c2;fulladd u1 (in1 0, in2 0, 0, sum0, c0); fulladd u2 (in1 1, in2 1, c0, sum1, c1); fulladd u3 (in1 2, in2 2, c1, sum2, c2); fulladd u4 (in1 3, in2 3, c2, sum3, sum4); assign flag = sum ? 0 : 1; endmodule 在这个例子中,用结构化模块计数sum输出,用行为级模块输出标志位。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2