外观
3.3 从第一个FPGA工程开始学习Verilog语法
约 2876 字大约 10 分钟
本节内容对应视频链接:【开源骚客】FPGA小白超详细系统入门视频教程-Verilog语法、图像处理、千兆网、PCIE、神经网络(Xilinx版本)】
从这节课开始,我们就正式的进入到了 Verilog 的语法内容。在我们正式给大家去讲解 Verilog 的语法内容之前,我们先给大家推荐两本书籍。第一本是 Verilog 嵌入式数字系统设计教程,这本书是由夏宇闻教授他们翻译的。然后第二本书是 Verilog 数字系统设计教程,这本书是由夏宇闻教授他们自己编写的。这两本书的口碑都是非常不错的,可以说是我们 FPGA 新手刚开始去学习 Verilog 语言的入门首选。

接下来给大家介绍一下我们关于录制的这部分的 Verilog 语法内容的课程安排。第一个是我们的一个总时长,我们会控制在 3~4 个小时里面。当然我们如果说要在 3~4 个小时里面把原来一本书的内容全部讲完了,这肯定是不现实的。所以我们在视频里面是只讲解 Verilog 的一些基本语法,也就是我们常用的一些语句。我们在这个过程里面会和练习一起结合起来,最后争取让大家能够达到可以独立设计一些基础练习,并完成仿真调试的程度。
比如说像我们常见的流水灯、呼吸灯。当然像呼吸灯这个练习,对于我们刚开始学习 FPGA 的同学来讲,还是有一些难度的。但是当你自己能够独立的去把呼吸的这个效果实现出来的时候,其实就已经说明你对于我们的 FPGA 开发还有 Verilog 语言是基本已经入门了的,大家也要相信自己。虽然说呼吸灯这一个练习相对来讲是有一些难度,但是只要你仔细跟着我们视频的一个节奏,跟着我们视频这个操作,还有跟着我们视频里面讲解的这些设计思路,你是完全有能力可以把呼吸灯这个效果实现出来的。
接下来我们再给大家提醒一个点,就是咱们 Verilog HDL中 HDL 的全称,它是叫 Hardware Description Language,翻译过来就是硬件描述语言,大家注意,Verilog 是我们硬件描述语言的其中一种,当然硬件描述语言我们还有 VHDL。它是叫硬件描述语言,它不是说硬件编程语言,对吧?大家要注意一下好吧。
现在我们就正式的进入到 Verilog 语法内容。现在我们来打开在上一节课程里面编写的这个点亮 LED灯 的代码文件。

在我们上一节来编写这个代码的时候,大家心里面或多或少可能都有一些疑问。为什么我们的代码要这样子写,它就能实现我们对应的这个功能呢?那现在就来结合对应的这个 .v 文件,来一起学习一下 Verilog 语法。顺便也来给大家解释我们的代码为什么是要这样子来写的,好吧,我们先从第一行代码来给大家去进行介绍,在这边也去新建一个学习笔记。
1、timescale
第一行代码是以 `timescale 开头的。
那这个代码的话,它是只对我们的仿真起作用,你如果说把它放到我们的综合软件,也就是我们的 vivado 里面去进行编译的时候,那这句代码它是没有作用的。就是你完全把这行代码删掉,在 vivado 里面重新去进行编译,重新去生成比特文件。它是对我们的整体的功能是不会有影响的。这个代码它是在仿真的时候才会作用。我们现在就暂时先不对它的一个用法给大家去展开介绍,等我们后面给大家去讲到仿真的时候,我们再来给大家去详细的进行说明。但是这个代码我们还是给大家做一个笔记。`timescale 仅在仿真的时候起作用。
2、注释
那在第 1 行之后,我们来看到从第 2 行到第 20 行,这个是属于代码的注释部分。在 Verilog 里面,它代码注释其实也是分为成两种的,和C语言里面是完全一样的。现在我们代码里面用的这种方式,它叫行注释。
行注释就是两个斜杠,两个斜杠后面你再去加注释的内容,注释就相当于我们在代码里面给自己做一些说明。
第二种我们是叫块注释。块注释它是可以对多行代码同时去进行注释。
块注释是以斜杠开始,然后斜杠后面一个星号,然后再星号斜杠结束,它注释的内容把它放在中间。

3、module
接下来我们看到第 23 行这边的 module ,从第 23 行开始它这边就是属于咱们 Verilog 代码里面的一个主体部分。它这边是用 module 开头,大家注意,这个 module 对应的这个字体颜色是不一样的,是一个蓝色对吧?那这边我们用这个编辑器的话,它这边颜色变了,表明它是属于咱们在 Verilog 语言里面的一个关键字。
module 你翻译过来,它其实对应着我们中文意思里面的一个模块。

现在可以来看到咱们的 PPT,Verilog 语言中的基本描述单位是模块,模块它描述某个设置的功能或结构,以及它与其他外部模块进行通信的端口。
大家这边就要注意,我们模块定义的一个写法,它是以 module 开始,endmodule 结束。也就是 module 和这个 endmodule 它们是成对出现的。
然后把 module 这个关键字写上之后,后面接着的是 module _name ,我们定义的这个模块的名字。
那对于模块这个概念,如果大家之前有编程语言的基础的话,比如说我们之前,你学过C语言的话,那你可以认为,我们这边给它去定义的一个模块,你可以把它理解成 C 语言里面的一个函数。你可以暂时先这样的类比一下,当然了因为我们现在是在学习FPGA,学习 Verilog ,它是和硬件有一定的联系的。
如果是站在硬件的角度,我们可以把咱们对应的一个模块,你把它去类比成咱们在电路板上面的一块芯片。就比如说咱们这边的这个开发板上面,一个可以把我们在 Verilog 里面,你定义的一个模块,一个 module,你先把它想象成是咱们在电路板上面的一块芯片。那你想我们在电路板上面的一块芯片,这块芯片它是不是对应着也会有一个名字?那比如说这边的一块 DDR3 芯片,我们就相当于把这块芯片的名字把它称之为DDR3,对吧?那同样的,我们对于 Verilog 里面定的这个模块,它相应的也会有它模块自己的名字,对吧?那在 module后面,会写上我们定义这个模块对应的名字。

module 后面我们写了一个 led,当然这边我们一定是要打空格的,就是把它隔开。但具体几个空格这个无所谓,你一定要给它隔开。

那提到的模块名字,我们这边就需要给大家去多说明几点。模块的定义,是由 module 开始,然后 endmodule 结束,然后下面再去加上模块的名称。模块名称的取名要求,我们这边要注意一下,它是可以由任意的字母、数字、还有符号和下划线,是由这几种进行组成的。但是这边名称的第一个字符要注意,必须是字母或者下划线。当然这个也不仅仅是咱们模块取名的一个要求,其实也是我们在模块内部去定义一些其他信号的一个要求。当然了,对于我们模块名称的一个不成文的规定,就是你这个模块它的名称,还是要觉得有意义。
这是第一点,是语法的要求。第二个是我们不成文的规定,模块名称要取得有意义。
说个题外话,想象一下,你这边写了这个模块,你是来控制咱们的 LED 的,然后这边模块名称,你直接来一个 hahaha 是吧?那你这个名称,你到底是对于你这边的一个模块功能到底是怎么样的?对不对?那还要再通篇去看一下你对应的这个内部的代码是怎么样的,才能大概了解对应的这个模块的功能是怎么样的对吧?那你这样的你随便取名的话,这个就没有意义的,对不对?所以我们模块名称,你要取得有意义,能够简单的概括咱们模块的功能。
还有第三点,就是咱们的这个 .v 文件的代码,文件名称和它的模块名称我们是给它写成了一样的,对吧?这是 led.v 这个文件的名称是led ,然后咱们模块的名称也是 led,对不对?当然这个也是一个不成文的规定,就是我们你想要去找哪个模块的时候,到时候你只需要去找它对应的这个文件,你看到这个文件是什么名称,那我们对应的模块名称就是怎么样的,这个也是一个不成文的规定。
当然这个并不是说是语法的要求,这是我们自己你写代码的,你自己去创建稳健的一个风格,好吧。代码文件,.v 文件名称和模块名称持相同。

我们现在来看到模块名称后面,它有个括号,那这个括号的作用是什么呢?
括号里面写的是叫端口列表,我们是在括号里面,是把它写一个端口列表。那端口列表你从字面意思上面去进行理解,就相当于你要把你这个模块,它对应的端口要整理出来,把它整理成一个清单在这边列出来。那这个模块的端口,其实你可以把它类比成我们在电路板上面的这些芯片的引脚。把我们模块的端口,把它理解成是这个芯片上面的这些引脚。
