1.1 传统的数字系统设计方式—原理图设计
在传统的设计方法中,当设计工程师设计一个新的硬件、一个新的数字电路或一个数字逻辑系统时,他或许在CAE 工作站上做设计,为了能在CAE工作站做设计,设计者必须为设计画一张线路图,通常地,线路图是由表示信号的线和表示基本设计单元的符号连在一起组成线路图,符号取自设计者用于构造线路图的零件库。若设计者是用标准逻辑器件(如74系列等)做板极设计线路图,那么在线路图中,符号取自标准逻辑零件符号库;若设计是进行ASIC设计,则这些符号取自ASIC库的可用的专用宏单元。这就是传统的原理图设计方法。对线路图的逻辑优化,设计者或许利用一些EDA工具或者人工地进行逻辑的布尔函数逻辑优化。为了能够对设计进行验证,设计者必须通过搭个硬件平台(如电路板),对设计进行验证。
1.2 硬件语言描述方式—verilog
随着电子设计技术的飞速发展,设计的集成度、复杂度越来越高,传统的设计方法已满足不了设计的要求,因此要求能够借助当今先进的EDA工具,使用一种描述语言,对数字电路和数字逻辑系统能够进行形式化的描述,这就是硬件描述语言。硬件描述语言HDL(Hardware Description Language )是一种用形式化方法来描述数字电路和数字逻辑系统的语言。数字逻辑电路设计者可利用这种语言来描述自己的设计思想,然后利用 EDA工具进行仿真,再自动综合到门级电路,最后用ASIC或FPGA实现其功能。举个例子,在传统的设计方法中,对2输入的与门,我们可能需到标准器件库中调个74系列的器件出来,但在硬件描述语言中,“&”就是一个与门的形式描述,“C = A & B”就是一个2输入与门的描述。而“and ”就是一个与门器件。硬件描述语言发展至今已有二十多年历史,当今业界的标准中(IEEE标准)主要有VHDL和 Verilog HDL 这两种硬件描述语言。
Verilog HDL 语言最初是于1983 年由Gateway DesignAutomation 公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL 语言于1990 年被推向公众领域。Open Verilog International(O V I )是促进 Verilog 发展的国际性组织。1992 年,OVI 决定致力于推广Verilog OVI 标准成为IEEE 标准。这一努力最后获得成功,Verilog 语言于1995 年成为IEEE 标准,称为IEEE Std1364-1995 。完整的标准在Verilog 硬件描述语言参考手册中有详细描述。
Verilog HDL即verilog硬件硬件描述语言,它主要应用于数字电路和系统设计、数字电路和系统仿真等,即利用计算机和相关软件对VERILOG HDL等硬件语言建模的复杂数字电路设计进行仿真验证,再利用综合软件将设计的数字电路自动综合,以得到符合功能需求并且在相应的硬件结构止可以映射实现的数字逻辑网表,然后布局布线,根据网表和选定的实现器件工艺特性自动生成具体电路,同时软件生成选定器件的延时模型,经过仿真验证确定无误后,用来制造ASIC芯片或者写入FPGA和CPLD器件中,最终实现电路设计。
Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL 语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL 语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog 仿真器进行验证。语言从C 编程语言中继承了多种操作符和结构。Verilog HDL 提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL 语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
2 综合器和仿真器
Verilg是硬件描述语言,顾名思义,就是用代码的形式描述硬件的功能。而我们最终是要在电路上实现该功能的。当Verilog描述出硬件功能后,我们需要综合器对Verilog代码进行解释,将代码转化成实际的电路来表示,最终实际的电路,我们称之为网表。这种将Verilog代码转成网表的工具,就是综合器。上图左上角是一份verilog代码,该代码描述了一个加法器功能。该代码经过综合器解释后,转化成一个加法器电路。QUARTUS、ISE和VIVADO都是综合器,集成电路常用的综合器是DC。
我们在FPGA设计的过程中,不可避免会出现各种BUG。如果我们编写好代码,综合成电路,烧写到FPGA后,才看到问题,此时去定位问题就会非常地困难了。在综合前,我们可以在电脑里对代码进行仿真测试一下,把BUG找出来解决,最后才烧写进FPGA。我们可以认为,没有经过仿真验证的代码,一定是存在BUG的。
为了模拟真实的情况,我们需要编写测试文件。该文件也是用verilog编写的,描述了仿真对象的输入激励情况。该激励力求模仿最真实的情况,产生最将近的激励信号,将该信号的波形输入给仿真对象,查看仿真对象的输出是否与预期一致。
为了做仿真验证,我们编写了测试文件。将测试文件和被测试对象加入到仿真器中。仿真器对测试文件和被测试对象的代码进行解释。根据测试文件,产生测试激励,输入给被测试对象;根据补测试对象的代码,产生被测试对象的输出。需要注意的是,在仿真过程中,没有将代码转成电路,仿真器只是对代码进行仿真验证。至于该电路是否可转成电路,仿真器是不关心的。
常用的仿真器是MODELSIM和VCS等。
由此可见,verilog的代码不仅可以描述电路,还可以用于测试。事实上,Verilog定义的语法非常之多,但绝大部分都是为了仿真测试来使用的。只有少部分才是用于电路设计,详细可以参考本书的“可综合逻辑设计”一节。
Verilog中用于设计的语法,才是学习的重点。掌握好设计的语法,熟练应用于各种复杂的项目,这是技能的核心。其他测试用的语法,需要时查找和参考就已经足够了。
本书着重点,是用于本科、研究生的教学用途,因此将重点讲解设计用的语法。
3 Verilog HDL 基本语法
本节介绍Verilog HDL 语言的一些基本要素,包括标识符、注释、格式、数字值集合、两种数据类型、运算符和表达式和一些基本的语句如IF语句等。
3.1 标识符
verilog HDL的源文本文件是由一串词法标识符构成的,一个词法标识符包含一个或若干个字符。源文件中这些标识符的排放格式很自由,也就是说,在句法上间隔和换行只是将这些标识符分隔开来并不具有重要意义,转意标识符除外。
verilog HDL语言中词法标识符的类型有以下几种:间隔符、注释符、算子、数值、字符串、标识符、关键词。
接下来对这些标识符一一进行说明
3.1.1间隔符
间隔符包括空格字符,制表符,换行以及换页符。这些字符除了起到与其它词法标识符相分隔的作用外可以被忽略。
注意的是,在“字符串”中的空白和制表符会被认为是有意义的字符。
3.1.2注释符
Verilog HDL 中有两种注释的方式:单行注释和段注释(多行)。
单行注释以两个字符“//”起始,以新的一行作为结束。也就是注释一行。
段注释是以“”结束,在两个符号之间的语句都是注释语句,因此可扩展到多行。如:
以上n个语句都是注释语句。
段注释不允许嵌套,在段注释中单行注释标识符“//”没有任何特殊意义。
3.1.3算子
算子是由单个、两个或三个字符组成的序列串,分别称之为一元算子、二元算子和条件算子。它用在表达式中。
例如“|a”等都是一元算子。该例子是“a的所有比特相或”。假如a是三位信号并且值为011,则“|a”就是“0|1|1”等于1。
例如“a & b”、“a|b等是二元算子。该两个例子分别是a与b按位相与、a与b按位相或。
例如“a==1?b:c”,则是条件算子。该例子是说“当a等于1时,选择b,否则选择c”。
3.1.4标识符
标识符是用户在描述时给Verilog对象起的名字,用这个标识符来提及相应的对象。
标识符可以是字母、数字、$符和下划线_字符的任意组合序列,但它必须以字母(a-z,A-Z)或下划线(_)开头,不能是数字或$符。后面可以是字母、数字或者_。例如abc_123,_abc等。非法命名如下_abc,24abc。
标识符最长可以是1023个字符。
标识符是区分大小写的。例如sel和SEL是不同的标识符。
3.1.5关键字
Verilog HDL 定义了一系列保留字,叫做关键词。这些关键字都有一定的用途。
a. 下表列出了语言中的所有保留字。
b. 注意只有小写的关键词才是保留字。例如,标识符always (这是个关键词)与标识符ALWAYS(非关键词)是不同的。
c. 在给信号命名时,不要用关键字。
3.1.6系统任务标识符
系统任务标识符:$,其中$表示引入一个语言结构,其后所跟的标识符是系统任务或系统函数的名称。
系统功能可以执行不同的操作:
---实时显示当前仿真时间($time)
---显示/监视信号的值($display,$monitor)
---暂停仿真($stop)
---结束仿真($finish)
例: $monitor($time,”a=%b,b=%h”,a,b)
每次a或b信号的值发生变化,这一系统任务的调用负责显示当前仿真时间,二进制格式的a信号和十六进制格式的b信号。
注意,系统任务还有很多,在此不一一列出。但系统任务一般用于仿真测试用途,读者没必要重点学习,在学习工作过程中,如果需要用到时,再查找一下就可以了。
注:(本博客连载的内容将出版成图书,并将录制视频,免费公开学习,欢迎大家留意。本连载前面是基础部分,与一般教材无异,后面是项目实践,是本连载的特色。如果你有一定的基础(能看懂verilog代码即可),那么可跳过前面部分,直接学习后面的项目实践。
项目实践将有16个,从基础的闪烁灯开始,到最后是信号处理的项目,如信号发生器、FIR滤波器、插值滤波器和AD采集等。
本连载学习效果:不难看能懂代码,还能知道每一行代码怎么写,怎么设计) |