Verilog经典内容讲解.doc

上传人:hw****26 文档编号:3543794 上传时间:2019-06-03 格式:DOC 页数:24 大小:293.07KB
下载 相关 举报
Verilog经典内容讲解.doc_第1页
第1页 / 共24页
Verilog经典内容讲解.doc_第2页
第2页 / 共24页
Verilog经典内容讲解.doc_第3页
第3页 / 共24页
Verilog经典内容讲解.doc_第4页
第4页 / 共24页
Verilog经典内容讲解.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、1有关verilog 算法及建模1 有关 C、Veilog HDL、VHDL .11.1 C 与 Verilog.11.2 Verilog HDL 与 VHDL.32 有关 Verilog 中的一些语法 .52.1 运算符 .52.2 Wire、reg、tri、memory 型 .62.3 assign 和 always 语句 .62.4 阻塞赋值和非阻塞赋值 .82.5 Verilog 中使用的一些关键字 .92.6 其他 .133 有关 Verilog 建模 .153.1 软核、固核、硬核 .153.2 模块设计流程 .153.3 门级结构 .163.4 基本逻辑运算 .163.5 控制逻

2、辑 .163.6 同步和异步 .173.7 有限状态机 .183.8 综合的一般原则 .214 有关总线和时钟 .224.1 I2C 双向二线制串行总线协议 .224.2 时钟发生器的形成(分频的另外一种实现方式) .221 有关 C、Veilog HDL、VHDL1.1 C 与 VerilogC 语言配合Verilog HDL 来设计算法的硬件电路块时考虑的三个主要问题: 为什么选择C 语言与Verilog HDL 配合使用? C 语言与Verilog HDL 的使用有何限制? 如何利用C 来加速硬件的设计和故障检测?1) 为什么选择C 语言与Verilog 配合使用首先,C 语言很灵活,查

3、错功能强 ,还可以通过PLI(编程语言接口)编写自己的系任务直接与硬件仿真器(如Verilog-XL)结合使用。C 语言是目前世界上应用最为广泛的一种编程语言,因而C 程序的设计环境比 Verilog HDL 的完整。此外,C 语言可应用于许多领域,有可靠的编译环境,语法完备,缺陷较少。比较起来, Verilog 语言只是针对硬件描述的,在别处使用(如用于算法表达等)并不方便。而且Verilog 的仿真、综合、查错工具等大部分软件都是商业软件,与C 语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷。所以,只有在C 语言的配合使用下,Verilog 才能更好地发挥作用。2解决方法:面对上述问

4、题,最好的方法是C 语言与Verilog 语言相辅相成,互相配合使用。这就是既要利用C 语言的完整性,又要结合 Verilog 对硬件描述的精确性,来更快更好地设计出符合性能要求的硬件电路系统。利用C 语言完善的查错和编译环境,设计者可以先设计出一个功能正确的设计单元,以此作为设计比较的标准。然后,把C 程序一段一段地改写成用并型结构(类似于Verilog)描述的C 程序,此时还是在C 的环境里,使用的依然是C 语言。如果运行结果都正确,就将 C 语言关键字用 Verilog 相应的关键字替换,进入Verilog 的环境。将测试输入同时加到C 与Verilog 两个单元,将其输出做比较。这样很

5、容易发现问题的所在,然后更正,再做测试,直至正确无误。剩下的工作就交给后面的设计工程师继续做。2) C 语言与Verilog 语言互相转换中存在的问题这样的混合语言设计流程往往会在两种语言的转换中会遇到许多难题。例如, 怎样把C 程序转换成类似Verilog 结构的C 程序,来增加并行度,以保证用硬件实现时运行速度达到设计要求;又如怎样不使用C 中较抽象的语法:例如迭代,指针,不确定次数的循环等等,也能来表示算法(因为转换的目的是要用可综合的Verilog 语句来代替C程序中的语句,而可用于综合的Verilog 语法是相当有限的,往往找不到相应的关键字来替换)。C 程序是一行接一行依次执行的,

6、属于 顺序结构,而Verilog 描述的硬件是可以在同一时间同时运行的,属于并行结构。这两者之间有很大的冲突。而Verilog 的仿真软件也是顺序执行的,在时间关系上同实际的硬件是有差异的,可能会出现一些无法发现的问题。Verilog 可用的输出输入函数很少。C 语言的花样则很多,转换过程中会遇到一些困难。C 语言的函数调用与Verilog 中模块的调用也有区别。C 程序调用函数是没有延时特性的,一个函数是唯一确定的,对同一个函数的不同调用是一样的。而Verilog 中对模块的不同调用是不同的,即使调用的是同一个模块,必须用不同的名字来指定。Verilog的语法规则很死,限制很多,能用的判断语

7、句有限。仿真速度较慢,查错功能差,错误信息不完整。仿真软件通常也很昂贵,而且不一定可靠。C 语言没有时间关系,转换后的Verilog 程序必须要能做到没有任何外加的人工延时信号,也就是必须表达为有限状态机,即RTL 级的Verilog,否则将无法使用综合工具把Verilog 源代码转化为门级逻辑。3) 如何利用C 语言来加快硬件的设计和查错下表中列出了常用的C 与Verilog 相对应的关键字与控制结构下表中,列出了C 与Verilog 相对应的运算符3从上面的讨论我们可以总结如下: C 语言与Verilog 硬件描述语言可以配合使用,辅助设计硬件 C 语言与Verilog 硬件描述语言很象,

8、只要稍加限制, C 语言的程序很容易转成Verilog的程序1.2 Verilog HDL 与 VHDLVerilog HDL 和 VHDL 都是用于逻辑设计的硬件描述语言,并且都已成为 IEEE 标准。VHDL 是在 1987 年成为 IEEE 标准,Verilog HDL 则在 1995 年才正式成为 IEEE 标准。之所以 VHDL 比 Verilog HDL 早成为 IEEE 标准,这是因为 VHDL 是美国军方组织开发的,而 Verilog HDL 则是从一个普通的民间公司的私有财产转化而来 ,基于 Verilog HDL 的优越性,才成为的 IEEE 标准,因而有更强的生命力。VH

9、DL 其英文全名为 VHSIC Hardware Description Language,而 VHSIC 则是 Very High Speed Integerated Circuit 的缩写词,意为甚高速集成电路,故 VHDL 其准确的中文译名为甚高速集成电路的硬件描述语言。4Verilog HDL 和 VHDL 作为描述硬件电路设计的语言,其共同的特点在于:能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提

10、供的属性包括进去) 、便于文档管理、易于理解和设计重用。但是 Verilog HDL 和 VHDL 又各有其自己的特点。由于 Verilog HDL 早在 1983 年就已推出,至今已有十三年的应用历史,因而 Verilog HDL 拥有更广泛的设计群体,成熟的资源也远比 VHDL 丰富。与 VHDL 相比 VerilogHDL 的最大优点是:它是一种非常容易掌握的硬件描述语言,只要有 C 语言的编程基础,通过二十学时的学习,再加上一段实际操作,一般同学可在二至三个月内掌握这种设计技术。而掌握 VHDL 设计技术就比较困难。这是因为 VHDL 不很直观,需要有 Ada 编程基础,一般认为至少需

11、要半年以上的专业培训,才能掌握 VHDL 的基本设计技术。目前版本的 Verilog HDL 和 VHDL 在行为级抽象建模的覆盖范围方面也有所不同。一般认为 Verilog HDL 在系统级抽象方面比 VHDL 略差一些,而在门级开关电路描述方面比 VHDL 强得多。下面图 1-3 是 Verilog HDL 和 VHDL 建模能力的比较图示供读者参考:Verilog HDL 较为适合系统级(System)、算法级(Alogrithem)、寄存器传输级(RTL) 、逻辑级(Logic)、门级(Gate) 、电路开关级 (Switch)设计,而对于特大型(几百万门级以上)的系统级(System

12、)设计,则 VHDL 更为适合,由于这两种 HDL 语言还在不断地发展过程中,它们都会逐步地完善自己。美国和中国台湾地区逻辑电路设计和制造厂家大都以Verilog HDL 为主,中国大陆地区目前学习使用VHDL 的较多。到底选用VHDL 或是Verilog HDL 來配合C 一起用,就留給各位自行去決定。但从学习的角度来看,Verilog HDL 比較簡單,也與C 语言较接近,容易掌握。从使用的角度,支持Verilog 硬件描述语言的半导体厂家也较支持VHDL 的多。52 有关 Verilog 中的一些语法2.1 运算符位运算符1) /取反2) 4b10014 = 4b0000;位拼接运算符1

13、.a,b3:0,w,3b101也可以写成为 a,b3,b2,b1,b0,w,1b1,1b0,1b12.4w /这等同于w,w,w,w63.b,3a,b /这等同于b,a,b,a,b,a,b负数:一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:-8d5 /这个表达式代表5的补数(用八位二进制数表示)2.2 Wire、reg、tri、memory 型wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。如果wire型或t

14、ri型变量没有定义逻辑强度(logic strength),在多驱动源的情况下,逻辑值会发生冲突从而产生不确定值。wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型。寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg,通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的缺省初始值为不定值x。reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always ”块通过使用行为描述语句来表达逻辑关系。在“always”块内被赋值的每一个

15、信号都必须定义成reg, reg型只表示被定义的信号将用在“always”块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。 memory型数据是通过扩展reg型数据的地址范围来生成的。reg 7:0 mema255:0;这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0

16、到255。尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的。见下例:reg n-1:0 rega; /一个n位的寄存器reg mema n-1:0; /一个由n个1位寄存器构成的存储器组一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。见下例:rega =0; /合法赋值语句mema =0; /非法赋值语句如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的。mema3=0; /给memory中的第3个存储单元赋值为0。2.3 assign

17、和 always 语句模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。1).用“assign”声明语句采用“assign”语句是描述组合逻辑最常用的方法之一。7如: assign a = b 2).用实例元件如: and and_inst( q, a, b );采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。3).用“always”块“always”块既可用于

18、描述组合逻辑也可描述时序逻辑。如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。上面三个例子分别采用了“assign”语句、实例元件和“always”块。这三个例子描述的逻辑功能是同时执行的。也就是说,如果把这三项写到一个 VeriIog 模块文件中去,它们的次序不会影响逻辑实现的功能。这三项是同时执行的,也就是并发的。然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。always块的语法原则:

19、1) 每个always块只能有一个事件控制“(event-expression)“,而且要紧跟在always关键字后面。2) always块可以表示时序逻辑或者组合逻辑,也可以用always块既表示电平敏感的透明锁存器又同时表示组合逻辑。但是不推荐使用这种描述方法,因为这容易产生错误和多余的电平敏感的透明锁存器。3) 带有posedge 或 negedge 关键字的事件表达式表示沿触发的时序逻辑,没有posedge 或negedge关键字的表示组合逻辑或电平敏感的锁存器,或者两种都表示。在表示时序和组合逻辑的事件控制表达式中如有多个沿和多个电平,其间必须用关键字 “ or ” 连接 。4) 每

20、个表示时序always块只能由一个时钟跳变沿触发,置位或复位最好也由该时钟跳变沿触发。5) 每个在always块中赋值的信号都必需定义成reg型或整型。整型变量缺省为32bit,使用Verilog操作符可对其进行二进制求补的算术运算。综合器还支持整型量的范围说明,这样就允许产生不是32位的整型量。句法结构:integer:。6) always块中应该避免组合反馈回路。这也就是说,用always块设计纯组合逻辑电路时, 在生成组合逻辑的always块中参与赋值的所有信号都必需有明确的值即在赋值表达式右端参与赋值的信号都必需在always (敏感电平列表)中列出,下例。例:input a,b,c;

21、reg e,d;always (a or b or c)begine =d /* 因为d没有在敏感电平列表中,所以d变化时,e不能立刻变化,要等到a或b或c变化时才体现出来,这就是说实际上相当于存在一个电平敏感的透明锁存器在起作用, 把d信号的变化锁存其中 */d =e | c;end8边沿触发的always块常常描述时序逻辑,如果符合可综合风格要求可用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑,而电平触发的always块常常用来描述组合逻辑和带锁存器的组合逻辑,如果符合可综合风格要求可转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。一个模块中可以有多个always块,它们都是并行运

22、行的。2.4 阻塞赋值和非阻塞赋值1.非阻塞(Non_Blocking)赋值方式( 如 b 1;endend也可以用for语句来实现:for( bindex=1; bindex=size; bindex=bindex+1 )if(opbbindex)result = result + (opa(bindex-1);2.task和function说明语句的不同点task和function说明语句分别用来定义任务和函数。利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数便于理解和调试。输入、输出和总线信号的值可以传入、传出任务和函数。任务和函数往往还是大的程序模块中在不同地点多次用到

23、的相同的程序段。学会使用task和function语句可以简化程序的结构,使程序明白易懂,是编写较大型模块的基本功任务和函数有些不同,主要的不同有以下四点:1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。2) 函数不能启动任务,而任务能启动其它任务和函数。3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。4) 函数返回一个值,而任务则不返回值。函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。Verilog HDL模块使用函数时是把它当作表达式中的操作符,这个操作的结果值就是这个函数的返回值。下面让我们用例子来说明:例如,定义一任务或函数对一个16位的字进行操作让高字节与低字节互换,把它变为另一个字(假定这个任务或函数名为: switch_bytes)。任务返回的新字是通过输出端口的变量,因此16位字字节互换任务的调用源码是这样的:switch_bytes(old_word,new_word);任务switch_bytes把输入old_word的字的高、低字节互换放入new_word端口输出,而函数返回的新字是通过函数本身的返回值,因此16位字字节互换函数的调用源码是这样的:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。