Verilog HDL基础语法讲解之模块代码基本结构

Verilog HDL基础语法讲解之模块代码基本结构

?

本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的基本结构。

以下为本章中例子中的代码:


01????/*=======================================

02????*????file neme : mux2.v

03????*????author????:????小梅哥

04????*????Verison????:????V1.0

05????*????date????????:????2015年07月01日

06????*????description:

07????*????????????当sel为0时,将输入端口in_a上的数据通过out端口输出,

08????*????????否则将输入端口in_b上的数据通过out端口输出

09????=======================================*/

10

11????module mux2(in_a,in_b,sel,out);

12

13????????input
[1:0]????in_a;????//输入端口in_a

14????????input
[1:0] in_b;????//输入端口in_b

15????????

16????????input
[0:0]????sel;????//通路选择线

17????????

18????????output
[1:0] out;????//输出端口out

19

20????/*--------------------------------------------????

21????????当sel为0时,选择将in_a端口的数据通过out端口输出,

22????????当sel为1时,选择将in_b端口的数据通过out端口输出.

23????--------------------------------------------*/????

24????????assign out =
(sel ==
1‘b0)? in_a : in_b;

25

26????endmodule

?

(注:最左侧一列行号是作者为了讲解方便加上的,不属于代码内容,请知悉)

以上代码描述的电路如下图所示:

?

图:二选一多路器电路模型

?

第1到9行:

该部分为文件头,记录了本设计文件中的一些基本信息如设计者、版本号、修改历史以及代码实现的功能描述。在编译时,该部分属于注释内容,将不被综合成任何内容。

?

第11行:module mux2(in_a,in_b,sel,out);

该行第一个字符串"module"为Verilog中的一个保留字(关键词),该保留字的出现表明了一个模块内容的开始。相对应的,第26行的"endmodule"也是一个保留字,该保留字的出现表明了一个模块内容的结束。在Verilog语法中,module和encmodule总是成对出现,module和encmodule之间的内容则是用户代码。

module之后是一个空格(或制表符"tab"),空格或制表符数量不一定限定为1个,也可以是多个,对结果没有任何影响。紧跟空格之后的mux2则是模块名称,该名称由用户自己定义,但一般要求与设计内容有一定关系,通过该名称能够体现出模块的功能或作用,例如这里使用mux2表明这是一个二选一多路器,让人一目了然。换个例子,如果要做PWM波生成模块,则可以直接以PWM作为模块名(module PWM(……);)这样简洁直观,一看就能理解模块的功能。

mux2之后使用圆括号括起来的部分则是端口列表,该列表中列出了该模块所有需要外部输入或者需要输出到外部的信号,信号间以英文中的逗号","隔开。端口名的命名也尽量能够代表该端口信号的实际功能或意义,例如"in_a",很清晰的就能告诉读者这是数据输入通道的a端口。

?

第13行到18行

13????????input
[1:0]????in_a;????//输入端口in_a

14????????input
[1:0] in_b;????//输入端口in_b

15????????

16????????input
[0:0]????sel;????//通路选择线

17????????

18????????output
[1:0] out;????//输出端口out

?

这里蓝色保留字"input"和"output"是端口类型,input表示该端口是本模块的输入型端口,output表示该端口是本模块的输出型端口。另外,在实际项目中,还有一种很常见的端口类型是双向端口,Verilog中用关键字"inout"来表示。在本例中,由于没有使用到双向端口,因此不做介绍,该部分内容将在后面以一个单独的章节来进行讲解。

第13行紧跟着"input"之后用方括号括起来的部分[1:0]表示端口的宽度,这里表示输入端口in_a的位宽为2。需要注意的是,定义位宽时虽然写成[1:0][0:1]表示的位宽是一致的,但是Verilog中习惯使用[MSB:LSB]的形式,请大家在自己写代码时也统一遵照这一要求。当位宽为1时,位宽定义部分可以省略,例如第16行的[0:0]是可以省略的,即写成"input sel;""input
[0:0]????sel;"效果是一样的。

?

第20行到23行

该部分为注释内容,注释主要是为了方便阅读和理解代码,在综合电路时会被忽略。Verilog语法中,注释的格式与C语言中一致,也支持单行注释和块注释。单行注释以"//"开始,有效作用域只在以此符号开始的本行紧随其后的内容,换行后就不起作用了。例如第13行的"//输入端口in_a"就是注释内容,换行后第14行就不再是被注释掉的内容了。第20行到第23行为块注释,块注释以"/* */"组织,两个"*"之间的内容即为注释内容,此种注释方式支持换行,注释内容以"/*"开始,换行后注释属性依然有效,直到出现"*/",则注释部分结束。不过需要注意的是,块注释不支持嵌套,当强行使用这种方式时会导致编译错误。例如以下这种格式就是错误的:

/*????

一级块注释内容

/*????

二级块注释内容

*/

……

*/

?

第24行:24????????assign out =
(sel ==
1‘b0)? in_a : in_b;

这一行为赋值语句,这里是Verilog中最基础的一种赋值方式——连续赋值语句。这段代码的意义就是"判断括号中的条件是否成立,若成立,则将in_a的值赋给out,否则,则将in_b的值赋给out",即通过这种方式实现了根据条件选择通道的功能。其中,"?"之后":"之前的信号为括号中条件满足时需要赋给out的的源信号,":"之后的信号则是括号中条件不满足时需要赋给out的源信号。此种赋值方式还支持多重选择,例如下面的代码:

?


assign out =
(sel1 ==
1‘b0)? in_a :
(sel2 ==
1)? in_b : in_c;

?

这里有三个数据输入端口"in_a , in_b , in_c",两个选择输入端口"sel1 , sel2"。该句话的意思就是,当第一个括号中的条件满足时,则将in_a的数据赋值给out,否则再判断第二个括号中的条件是否满足,满足则将in_b的值赋给out,不满足则将in_c的值赋给out。括号中的内容可以直接简写为(!sel1)或者(!sel2),这一点与C语言一样。

?

通过这一章,我们学习了采用Verilog HDL设计简单的模块的基本代码结构,包括声明模块的"module endmodule"、端口的定义、端口类型以及位宽的声明、注释内容的格式以及连续赋值语句的写法,而且通过此例子完成了一个简单的二选一多路器的设计。希望对于Verilog HDL语法零基础的读者在看罢此文后能够关闭此文档,在Quartus II或Modelsim、ISE等工具中实际动手敲一遍。可结合前面介绍Altera 公司FPGA器件开发流程一章中的步骤,实际建立工程并输入代码,然后分析和综合,通过综合工具,查看自己编写的代码是否有错误,如有错误,则根据软件提示加以改正。

下一章,将以此模块的测试文件(testbench)为例,介绍Testbench的基本语法。

?

小梅哥FPGA设计思想与验证方法教程系列文档
2015年07月02号于Snow Dream电子工作室

时间: 2024-12-11 02:28:47

Verilog HDL基础语法讲解之模块代码基本结构的相关文章

Lua基础语法讲解

Lua 是什么? Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发. 设计目的 其设计目的是

Python基础系列讲解——时间模块详解大全之time模块

Python中提供处理时间日期相关的内置模块有time.datetime和calendar. time模块中大多数函数调用了所在平台C library 的同名函数,因此更依赖于操作系统层面,所以time模块的有些函数与平台相关,在不同的平台上可能会有不同的效果,这点需要特别注意下,即time模块的功能并不适用于所有平台. 使用时需要导入time模块,如下所示: import time time模块的时间表现的格式主要有以下三种: timestamp时间戳.时间戳表示的是从新纪元开始按秒计算的偏移

Swift基础语法(五)枚举、结构体与类的区别

swift中的结构体值可以是整型.浮点型.字符串.字符.元祖,如果不赋值默认为整型且从0开始计数,如果为整型枚举且要求不是从0开始只需指定枚举的第一个值以后的值自动依次加1 引用方式也与oc有所出入 //枚举定义 enum 枚举名 { case 标识符1,标识符2 case 标识符3(类型列表) case 标识符4=值 } //引用 枚举名.标识符 //或者直接 .标识符 枚举多类型读取 enum Barcode { case UPCA(Int, Int, Int) case QRCode(St

MiS603 开发板2.2 Verilog HDL硬件语言基础

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.2 Verilog HDL硬件语言基础 2.2.1 技术背景 大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅

Verilog HDL的程序结构及其描述

这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出. 一.Verilog HDL的程序结构 首先我们不开始讲Verilog HDL的语法,我们从Verilog HDL的程序结构出发.相信大家都看过芯片吧,它有个名字,有个外壳,外壳向外伸出有引脚(BGA封装的那种请不要乱搅和...),然后芯片它可以实现一定的功能. Ok,知道这些之后,我们就来看看Verilog HDL的描

JSP/Servlet基础语法

相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html http://blog.csdn.net/liaoxiaohua1981/article/details/6761053 http://computer.c.blog.163.com/blog/static/102524482012314537670/ http://ww

Verilog HDL设计进阶:有限状态机的设计原理及其代码风格_zt

http://www.21ic.com/app/eda/201308/189781_1.htm 由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集.又由于HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同. 本书中有关可综合风格的Verilog HDL的内容,我们只着重介绍RTL级.算法级和门级逻辑结构的描述,而系统级

浅谈Verilog HDL代码编写风格

消失了好久,没有写文章,也没有做笔记,因为最近再赶一个比赛,时间很紧,昨天周六终于结束了,所以趁着周末这会儿有时间,写点东西,记录下来.首先我学习FPGA才一年多,我知道自己没有资格谈论一些比较深层次的问题,对于这个行业来说可能我才是一直脚踩在门外面.所以这篇文章是写给一些刚开始学习FPGA.Verilog HDL的同学,我看过一些大神写的代码,然后尽量模仿大神写法,经过好几个大神的影响和自己的习惯摸索,最终算是总结出了一套自己的代码书写风格,当然我的代码风格还是一直在进化中.现在将自己的一些经

MiS603开发板 2.1 Verilog HDL 代码规范

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.1 Verilog HDL 代码规范 规范的代码风格,可以让程序更容易阅读和维护. u 文档管理 合理的文档管理也是程序代码规范的重