1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html 4)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 5)关注正点原子公众号,获取最新资料更新
Verilog HDL(Hardware Description Language)是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。Verilog HDL可以在较短的时间内学习和掌握,目前已经在FPGA开发/IC设计领域占据绝对的领导地位。 本章包括以下几个部分: 1.1 Verilog概述 1.2 Verilog基础知识 1.3 Verilog程序框架 1.4 Verilog高级知识点 1.5 Verilog编程规范
1.1 Verilog概述本节主要描述了Verilog HDL(以下简称Verilog)简介、Verilog和VHDL以及和C语言的区别。 1.1.1 Verilog简介 Verilog是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 数字电路设计者利用这种语言,可以从顶层到底层逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后利用电子设计自动化(EDA)工具,逐层进行仿真验证,再把其中需要变为实际电路的模块组合,经过自动综合工具转换到门级电路网表。接下来,再用专用集成电路ASIC或FPGA自动布局布线工具,把网表转换为要实现的具体电路结构。 Verilog语言最初是于1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。由于他们的模拟、仿真器产品的广泛使用,Verilog HDL作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。Verilog语言于1995年成为IEEE标准,称为IEEE Std1364-1995,也就是通常所说的Verilog-95。 设计人员在使用Verilog-95的过程中发现了一些可改进之处。为了解决用户在使用此版本Verilog过程中反映的问题,Verilog进行了修正和扩展,这个扩展后的版本后来成为了电气电子工程师学会Std1364-2001标准,即通常所说的Verilog-2001。Verilog-2001是对Verilog-95的一个重大改进版本,它具备一些新的实用功能,例如敏感列表、多维数组、生成语句块、命名端口连接等。目前,Verilog-2001是Verilog的最主流版本,被大多数商业电子设计自动化软件支持。 1.1.2 为什么需要Verilog 在FPGA设计里面,我们有多种设计方式,如原理图设计方式、编写描述语言(代码)等方式。一开始很多工程师对原理图设计方式很钟爱,这种输入方式能够很直观的看到电路结构并快速理解,但是随着电路设计规模的不断增加,逻辑电路设计也越来越复杂,这种设计方式已经越来越不满足实际的项目需求了。这个时候Verilog语言就取而代之了,目前Verilog已经在FPGA开发/IC设计领域占据绝对的领导地位。 1.1.3 Verilog和VHDL区别 这两种语言都是用于数字电路系统设计的硬件描述语言,而且都已经是IEEE的标准。 VHDL 1987年成为标准,而Verilog是1995年才成为标准的。这是因为VHDL是美国军方组织开发的,而Verilog是由一个公司的私有财产转化而来。为什么Verilog能成为IEEE标准呢?它一定有其独特的优越性才行,所以说Verilog有更强的生命力。 这两者有其共同的特点:
- 能形式化地抽象表示电路的行为和结构;
- 支持逻辑设计中层次与范围地描述;
- 可借用高级语言地精巧结构来简化电路行为和结构;
- 支持电路描述由高层到低层的综合转换;
- 硬件描述和实现工艺无关。 但是两者也各有特点。Verilog推出已经有20年了,拥有广泛的设计群体,成熟的资源,且Verilog容易掌握,只要有C语言的编程基础,通过比较短的时间,经过一些实际的操作,可以在1个月左右掌握这种语言。而VHDL设计相对要难一点,这个是因为VHDL不是很直观,一般认为至少要半年以上的专业培训才能掌握。 近10年来,EDA界一直在对数字逻辑设计中究竟用哪一种硬件描述语言争论不休,目前在美国,高层次数字系统设计领域中,应用Verilog和VHDL的比率是80%和20%;日本与中国台湾和美国差不多;而在欧洲VHDL发展的比较好;在中国很多集成电路设计公司都采用Verilog。我们推荐大家学习Verilog,本教程全部的例程都是使用Verilog开发的。 1.1.4 Verilog和C的区别 Verilog是硬件描述语言,在编译下载到FPGA之后,会生成电路,所以Verilog全部是并行处理与运行的;C语言是软件语言,编译下载到单片机/CPU之后,还是软件指令,而不会根据你的代码生成相应的硬件电路,而单片机/CPU处理软件指令需要取址、译码、执行,是串行执行的。 Verilog和C的区别也是FPGA和单片机/CPU的区别,由于FPGA全部并行处理,所以处理速度非常快,这个是FPGA的最大优势,这一点是单片机/CPU替代不了的。 1.2 Verilog基础知识 本节主要讲解了Verilog的基础知识,包括5个小节,下面我们分别给大家介绍这5个小节的内容。 1.2.1 Verilog的逻辑值 我们先看下逻辑电路中有四种值,即四种状态: 逻辑 0:表示低电平,也就是对应我们电路的GND; 逻辑 1:表示高电平,也就是对应我们电路的VCC; 逻辑 X:表示未知,有可能是高电平,也有可能是低电平; 逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态。 如下图所示:
图 7.2.1.1 Verilog逻辑值 1.2.2 Verilog的标识符 定义 标识符(identifier)用于定义模块名、端口名和信号名等。Verilog的标识符可以是任意一组字母、数字、 和 ( 下 划 线 ) 符 号 的 组 合 , 但 标 识 符 的 第 一 个 字 符 必 须 是 字 母 或 者 下 划 线 。 另 外 , 标 识 符 是 区 分 大 小 写 的 。 以 下 是 标 识 符 的 几 个 例 子 : C o u n t C O U N T / / 与 C o u n t 不 同 。 R 5 6 6 8 F I V E 和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子: Count COUNT //与Count不同。 R56_68 FIVE 和(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子:CountCOUNT//与Count不同。R5668FIVE 虽然标识符写法很多,但是要简洁、清晰、易懂,推荐写法如下: count fifo_wr 不建议大小写混合使用,普通内部信号建议全部小写,参数定义建议大写,另外信号命名最好体现信号的含义。 规范建议 以下是一些书写规范的要求: 1、用有意义的有效的名字如sum、cpu_addr等。 2、用下划线区分词语组合,如cpu_addr。 3、采用一些前缀或后缀,比如:时钟采用clk前缀:clk_50m,clk_cpu;低电平采用_n后缀:enable_n; 4、统一缩写,如全局复位信号rst。 5、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。 6、自定义的标识符不能与保留字(关键词)同名。 7、参数统一采用大写,如定义参数使用SIZE。 1.2.3 Verilog的数字进制格式 Verilog数字进制格式包括二进制、八进制、十进制和十六进制,一般常用的为二进制、十进制和十六进制。 二进制表示如下:4’b0101表示4位二进制数字0101; 十进制表示如下:4’d2表示4位十进制数字2(二进制0010); 十六进制表示如下:4’ha表示4位十六进制数字a(二进制1010),十六进制的计数方式为0,1,2…9,a,b,c,d,e,f,最大计数为f(f:十进制表示为15)。 当代码中没有指定数字的位宽与进制时,默认为32位的十进制,比如100,实际上表示的值为32’d100。 1.2.4 Verilog的数据类型 在Verilog语法中,主要有三大类数据类型,即寄存器类型、线网类型和参数类型。从名称中,我们可以看出,真正在数字电路中起作用的数据类型应该是寄存器类型和线网类型。
- 寄存器类型 寄存器类型表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值过程中被保存下来。如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为寄存器;如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;寄存器类型的缺省值是x(未知状态)。 寄存器数据类型有很多种,如reg、integer、real等,其中最常用的就是reg类型,它的使用方法如下:
//reg define
reg [31:0] delay_cnt; //延时计数器
reg key_flag ; //按键标志
- 线网类型 线网表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z(高阻态)。线网类型同寄存器类型一样也是有很多种,如tri和wire等,其中最常用的就是wire类型,它的使用方法如下: //wire define wire data_en; //数据使能信号 wire [7:0] data ; //数据
- 参数类型 我们再来看下参数类型,参数其实就是一个常量,常被用于定义状态机的状态、数据位宽和延迟大小等,由于它可以在编译时修改参数的值,因此它又常被用于一些参数可调的模块中,使用户在实例化模块时,可以根据需要配置参数。在定义参数时,我们可以一次定义多个参数,参数与参数之间需要用逗号隔开。这里我们需要注意的是参数的定义是局部的,只在当前模块中有效。它的使用方法如下: //parameter define parameter DATA_WIDTH = 8; //数据位宽为8位 1.2.5 Verilog的运算符 大家看完了Verilog的数据类型,我们再来介绍下Verilog的运算符。Verilog中的运算符按照功能可以分为下述类型:1、算术运算符、 2、关系运算符、3、逻辑运算符、 4、条件运算符、 5、位运算符、 6、移位运算符、 7、拼接运算符。下面我们分别对这些运算符进行介绍。
- 算术运算符 算术运算符,简单来说,就是数学运算里面的加减乘除,数字逻辑处理有时候也需要进行数字运算,所以需要算术运算符。常用的算术运算符主要包括加减乘除和模除(模除运算也叫取余运算)如下表所示: 表 7.2.1 算术运算符 符号 使用方法 说明
- a + b a 加上 b
- a - b a 减去 b
- a * b a 乘以 b / a / b a 除以 b % a % b a 模除 b 大家要注意下,Verilog实现乘除比较浪费组合逻辑资源,尤其是除法。一般2的指数次幂的乘除法使用移位运算来完成运算,详情可以看移位运算符章节。非2的指数次幂的乘除法一般是调用现成的IP,QUARTUS/ISE等工具软件会有提供,不过这些工具软件提供的IP也是由最底层的组合逻辑(与或非门等)搭建而成的。
- 关系运算符 关系运算符主要是用来做一些条件判断用的,在进行关系运算符时,如果声明的关系是假的,则返回值是0,如果声明的关系是真的,则返回值是1;所有的关系运算符有着相同的优先级别,关系运算符的优先级别低于算术运算符的优先级别如下表所示。 表 7.2.2 关系运算符 符号 使用方法 说明
a > b a 大于 b < a < b a 小于 b = a >= b a 大于等于 b
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?