外观
3.2 我的第一个FPGA工程
约 6335 字大约 21 分钟
本节内容对应视频链接:【开源骚客】FPGA小白超详细系统入门视频教程-Verilog语法、图像处理、千兆网、PCIE、神经网络(Xilinx版本)】
在这一小节中,我们暂时不去介绍 Verilog 语法内容,先来看一下咱们开发 FPGA ,在软件上的操作流程是怎么样的,也顺带看一下 Verilog 语言是长什么样的。先让大家认识一下 FPGA 和 Verilog 语言这两个陌生的东西。
我们这一节的内容是使用之前安装好的 vivado 软件,去实现第一个 FPGA 工程点亮 LED 灯。我们在 FPGA 里面做的这个点亮 LED 灯实验,其实就相当于我们在学习第一门编程语言的时候,让这个编程语言它去打印输出一个 hello word,它类似于这样的一个地位。我们也是希望能够通过点亮 LED 灯的这个实现过程,让大家对于咱们的 FPGA 开发的这个流程有一个大概的了解和认识。
1、开发板LED点亮原理介绍
现在看到咱们的 OS-X75A484 FPGA 开发板。咱们这块板子上面总共是有6个LED灯。

左边的两个 LED 中,第一个是我们的电源指示灯。当咱们这个电源正常上电之后,这个 LED 灯它就会亮。然后第二个 DONE 这个 LED 灯是我们 FPGA 的加载指示灯。就比如说咱们的 FPGA,它下载完成之后,咱们的这个加载指示灯它就会亮的。
右边 4 个 LED 是和我们的 FPGA 连接在一起的,我们就可以通过 FPGA 来控制咱们这边的 LED1 到 LED4 。
那么具体怎么去进行控制呢?我们可以来看一下我们的原理图。

我们现在来简单看一下咱们这边 LED 的控制电路。我们以左边的这个 LED 为例,这个 LED 的正极已经接了一个 3.3V 的电源,负极接到一个电阻,然后电阻下边有一个三极管,然后三极管带下面有一个GND。那我们这边控制 LED 主要是利用了三极管的一个开关的功能。三极管是我们在本科模拟电路的这门课程里面学习到的一个知识点。
关于三极管的具体工作原理,我们这边就不展开去进行细讲了,我们主要简单来看一下我们这边怎么去进行使用 LED 的这个三极管。
三极管导通的时候,我们可以认为电阻的这一端,它是和这个GND直接连起来了。那这样的话我们的这个 LED 灯,它就能够亮起来。那当这个三极管它的截止的时候,我们就认为这个电阻原本与三极管连接的这一端和 GND 之间没有连线断开了,你就可以把这个三极管拆掉,它们中间这个电阻和 GND 之间是没有连接起来的,那这样的话这个 LED 灯它就亮不起来。

那我们就记住,当这个三极管导通的时候,LED 灯它会亮,当三极管截止的时候,LED 灯它是亮不起来的。
那这个三极管它具体什么时候导通,具体什么时候截止呢?它就是要通过我们这个 LED1 名称的引脚这边来进行控制了。那这个引脚我们来看一下这个 LED1 它是连接到了哪呢?

控制三极管导通与截止的引脚,是连接到了我们 FPGA 的N5这个引脚上面,也就是说这边的三极管的导通截止的状态,是由我们 FPGA 的引脚去进行控制的。
2、FPGA控制LED的原理介绍
好了,那这边我们要再来给大家去解释一下。我们的 FPGA 的话,它是属于我们这种逻辑器件,我们能够通过 FPGA 这个引脚,控制它去输出高电平或者低电平。
如果说我们让 FPGA 输出一个低电平,你可以简单的认为它输出了一个GND。
那你看当我们 FPGA 的引脚,也就是说 LED1 这个网络,如果它输出了一个是 GND 的话,那我们这个三极管就是一个截止的状态。当LED1 它是一个低电平的时候,也就是我们在 FPGA 的引脚输出为零的时候,我们这个三极管它是截止的状态,也就是这个LED灯它不会亮。
那当 FPGA 引脚连接到 LED1 的这个引脚上面,也就是N5这个引脚,它输出的是一个高电平的时候,那我们的这个三极管它就能够导通,那这样的话我的这个 LED 灯它就能亮。
其实你可以简单的认为,当我的 LED1 输出的是低电平的时候,就是 0 电平的时候,那我们的灯会灭。当我们的 LED 1 输出的是高电平的时候,就是我们的 FPGA 输出的是逻辑值电平为 1 的时候,那我们的这个 LED 灯它就能够亮起来。
这边四个灯的原理都是一样的。这里的 LED2、LED3、LED4 这边的三个引脚,我们也是把它连接到了 FPGA 对应的引脚上面。现在对于我们LED的控制原理清楚了之后,我们就可以使用 vivado 去对我们的 FPGA 进行开发了。
3、使用 Vivado 创建工程
好,现在我们先打开我们在上一节课程里面已经安装好的这个 vivado ,可能第一次启动它会稍微慢一点,大家可以跟着我的步骤一起来操作一下。
我们第一步要先来创建工程,这在我们使用大多数这种开发软件的时候,第一步都是要先去创建一个工程。
第 1 步:在 vivado 软件的开始界面中,点击 “Create Project” ,再弹出来的界面中直接点击Next.


第 2 步:填写工程名字并指定工程存放路径

那这里工程名的话我们可以默认,当然我们还是更加建议大家的工程名字取得稍微有意义一点。就是能够通过你的工程名字,就简单概括了你对应着这个工程的一个功能。
那这个工程路径可以自己去新建个文件夹,然后专门的去存放我们对应的一些工程。
第 3 步:选择工程类型

对于工程类型,我们是先创建一个RTL的工程。这一步可能大家第一次使用的时候,它这边是没有勾上的那这个勾上之后,就是说我们在创建工程的时候,就暂时先不去指定源文件。我先把它勾上,就是我这个步骤里面,我是只先去创建工程,暂时不去定义我们的源代码文件。选择好了之后,直接 Next。
第 4 步:选择对应的 FPGA 器件型号
这一步要去选择我们开发板对应的 FPGA 芯片型号了。
因为 vivado 软件,它内部是包含了很多个不同的 FPGA 芯片的。不同的 FPGA 芯片对应着后面 vivado 的一些操作可能会有些不一样,就是它里面的一些 IP 可能是有些不一样的。所以我们这边首先还是要去选择一下我们对应的这个开发板 FPGA 芯片型号,这个一定要选对。

我们可以来看一下这个图,稍微清楚一点。我们来看这个芯片上面的丝印,先把它转过来。你看这边是一个 ARTIX-7 ,然后它的型号是XC7A75T,然后后面是有个 FGG484,这个 FGG484 是它对应着 FPGA 芯片的封装。上面 XC7A75T 这个就是对应的一个型号,ARTIX7 就是它的一个家族一个系列。
在这个搜索框里面直接去输入 XC7A75TFGG484 ,然后我们这个芯片的型号,是-2这个速度等级的,大家注意一下,要选择XC7A75TFGG484-2 。

第 5 步:Finish ,工程创建完成
然后这边我们的工程创建就到了最后一步了,工程的一个总览信息,芯片型号这些,这边你如果确定了之后,那我们就可以点击finish。

在它创建完工程之后,你可以看一下创建的这个文件夹里面,这个文件夹里面对应的这些文件,还有它内部这些新的文件夹,这个都是我们通过 vivado 新建工程,它自动生成的。

4、添加 Verilog 代码文件
工程创建好了之后,接下来我们就可以去编写代码文件了。
那编写代码文件大家可以看一下,我们这边有一个界面,这边是source,这个界面下面它是对我们的这些代码文件进行管理的。我们可以在这边点一个加号,它这边是 add source ,添加源文件。

那这个源文件,它有三种类型,第一种是约束文件,第二个是设计文件,第三个是仿真文件。
那我们这里先去添加设计文件,我们的设计文件是使用 verilog 语言去进行编写代码。点击 next 。
因为现在的话,我们在这个工程里面,目前还没有 verilog 代码的文件,所以我们可以通过它的这个步骤先去创建一下。

在这边可以点击创建文件,然后文件类型的默认,他这边选的是 verilog ,当然还有其他的,还有 system verilog ,VHDL,但我们现在行业内的话,用的比较多的还是 verilog 。


好。那这个文件我们可以也先取名为一个LED,然后点击OK。

然后它在这个文件名的这个位置,它自动给你加上了后缀名 .v ,表示的是我们的一个 Verilog 语言的一个代码文件。好,我们点击finish。

这边关于这个模块有些端口的定义,我们这个就不管它。好,点击OK。
我们的这个 .v 文件创建好了之后,它就自动的加到我们这个工程里面来了。

然后这个文件它在哪里呢?你点到这个文件之后,它在这边也已经给你列出来它对应这个路径是在哪里的,在我们对应的这个工程文件夹下面有一个 .src ,然后source_1,后面还有个 new ,这个文件夹下面。
我们也可以在电脑上对应路径的文件夹下面,找到这个 .v 文件。

5、编写 Verilog 代码
现在文件有了,我们是不是应该在这个文件里面去实现控制我们 LED 的这个功能了,对不对?
在之前已经说过,我们这些 LED 要实现亮或者不亮的功能,我们是主要通过 LED1、LED2 、LED3 、LED4 这 4 个与 FPGA 相连的引脚,让它去输出高电平或者低电平对吧。
那这边我们总共是要使用到 FPGA 的四个引脚。然后这四个引脚的话,对于我们的 FPGA 来讲,是不是要给它定义成输出 ?就是说我们FPGA 是要通过这个引脚去输出高电平和低电平,来控制我们对应的 LED 灯的亮和灭。
现在我来编写一下这个代码,编写代码的话我不太习惯于去用 Vivado 默认的这个编辑器。大家可以双击这个文件,它是能够在 vivado 里面直接打开的。
然后在这个文件里面,刚才 vivado 创建的时候,它是自己给你加上了一些说明信息,下面是给你写好了这个 module 的一个模板。

我还是更加倾向于去使用我们自己之前安装的代码编辑软件去进行编写代码。我这边平常自己用的话,是用GVIM。但是对于GVIM的这个软件,它的使用门槛会稍微高一点。然后我在这边第一次用的话,还是给大先用这个 Notepad++ 。


对于这边的代码,我就直接去写了,就暂时不给大家去解释为什么要这样子做。
我们后面的话也会有专门的课程去给大家讲这些 Verilog 的语法,大家如果说感兴趣,你也可以跟着我们,在这个代码里面,你自己把它也跟着我们一起编写一下好吧。
那我们这边是要去控制 FPGA 的四个引脚,总共有 4 个 LED 灯。在代码里面,也和我们那边引脚的名字先暂时去定义成一样的 led1,led2,led3,led4。

我们这边的代码就已经写完了,现在就相当于对这边的四个端口全部都去输出高电平。
6、Vivado 软件进行综合,生成 bit 文件
接下来的一步,我们是要把编写好的代码文件,让 Vivado 去生成可以下载到 FPGA 里面的 bit 文件。
我先对咱们这个代码先去做一个综合。这边有一个run,执行综合这个步骤。

然后这一块大家可以点击 OK,我们耐心等待一下就可以了。

我们这个代码文件的比较简单,它应该综合的速度会稍微快一些。
7、绑定引脚
等这个综合结束之后,我们下一步操作是要给这些端口绑定引脚。因为我们这边虽然说在代码里面是把它对这些端口都进行赋值,但是这些端口他要和我们的 FPGA 的引脚要联系在一起,对不对?你不能说你这个代码写完了,对吧?那这个端口它对应的是我们 FPGA 的哪个引脚呢?它不知道。所以我们还是要通过这个 Vivado 软件,告诉我们的 FPGA 。他这边综合完成了之后,我们点击这一步,打开综合的设计。

等打开这个综合的设计之后,我们要对咱们这个代码里面,它涉及到这些端口去绑定引脚,和我们 FPGA 的引脚给它去联系起来。
好,它这边打开之后,默认就进入到了一个package界面。

这边又自动打开了一个叫 IO Planning,这个它是自动打开的。然后如果说大家的这个软件,你没有出现它对应的这个选项卡的话,那你可以再确认一下你这边的右上角这一块,是否选择到这个IO planning 。在底部的 IO Ports 下面可以把这些端口全部展开。


这边列出来这些端口的名字和你在代码里面的那个名字是完全一样的。那现在我们再来说,端口已经出来了,接下来我们就要看这边的引脚标号。你看 LED 1 连接的是这个 N5 ,那我们把它绑上叫 package pin 这一列下面你去绑一个输入 N5。其他 3 个 LED 的引脚也是同样的方法在原理图上去找,然后在软件里面填上。
这边我们的引脚是已经绑定好了。然后另外我们这边有一步要做的,就是引脚的电平标准。它这边默认的是 LVCMOS18 的,然后我们这边应该要绑定多少呢?要绑定成 LVCMOS15 。
这个具体为什么要这样选择成 LVCMOS15 ?这个是要结合我们对应的这个bank的供电电压来确定的。你比如说这个bank 35,我们可以来找到 FPGA 对应的这个供电电压,bank电源这一块。


你看 VCCO_35 这边我们接的是 1.5V 的电源,所以我们这边要选择 LVCMOS15 ,那这边我们都把引脚设定好了,然后这个电源电平标准设定好了之后,我们可以点击一下 Ctrl+S 或者说这边点一下这个保存按钮,点一下,然后它这边弹出来一个设计过去的一个提示,这个我们可以不用管,点击OK就可以了。


出现这个提示框,是因为我们这边把管脚绑定了,然后他这边问,你要保存在哪个文件下面是吧?
它的文件类型是一个叫 XDC 的一个文件,对不对?
但我们工程里面自己之前我们并没有去创建过这样一个 XDC 的文件,所以他这边让你自己创建一个,然后文件名我们可以输入 PIN 或者说 PINS 是吧?表示引脚相关的这个 XDC 文件,点击OK。
我们在这边可以找到 source ,刚才 xdc 文件在哪呢?在我们的约束这一类下面,你看 pins.xdc 。
你看这边对应的端口,然后引脚电平标准,它是通过这种代码的形式给你保存起来了。然后这边我们也可以给大家提醒一下,我们刚才绑定引脚是通过软件的工具,在这边一个引脚一个引脚的去输入,它这边输完之后,最终保存的形式就是咱们这边的这部分代码。
那其实是不是我们可以这样的理解,我其实如果在这个 XDC 文件里面,直接通过代码的形式去绑定这个引脚,其实也是可行的对吧?
只是说你最开始第一次用的时候,你对于这些代码可能不太清楚,我们可以借助这个工具,让他们把我们这些引脚绑定的这些信息自动的转换成代码。但是如果说你对于这些代码清楚了,那你是不是就可以直接去写代码,不需要使用这个工具了。
8、生成 bit 文件
好了,那现在我们把这个引脚绑定好了之后,我们接下来就可以直接去生成我们 FPGA 的下载文件。
这个 bit 文件你可以认为是我们 FPGA 的一个可执行文件。当然我们在这个 vivado 里面是把它称之为比特文件。

好,我们这边点击这个叫 Generate Bitstream,就是比特文件流,所以我们把它称之为叫比特文件。另外一个的话,因为它的后缀也是一个 .bit 的一个结尾。

好,他这边说设计已经过期了。好,那我们这边直接点击yes,让它重新去运行就可以了,点击OK。

好,比特文件生成完成。他在这边问你了,你可以去选择下面的哪个步骤是吧?我们这个先暂时不要关闭它。
然后接着我刚才说的,你这个比特文件不是生成完成了吗?那这个比特文件它生成到哪了呢?找到我们的工程文件夹。它这边有一个 *.runs,打开它找到这个 impl ,它这个文件夹。impl 它其实是我们 implement 的一个简写,impl 就是我们的实现,那进入到这个实现的文件夹里面。


9、下载 bit 文件到 FPGA 开发板
接下来我们就需要把这个比特文件下载到我们的 FPGA 里面去。好,那现在我们再来说怎么去执行它下载的这个步骤。

在刚才的界面里面,我们要打开这个 Hardware Manager,我们要通过它对应的这个工具,把我们生成的比特文件下载到 FPGA 芯片里面去。好,点击OK。好,那它现在就进入到了我们的 Hardware Manager 。

如果说你刚才那个点击 Open Hardware Manager 的界面一不小心给它关闭了怎么办呢?那你怎么去重新进入到我们的这个 Hardware Manager 的这个界面里面去呢?在最后我们的 program and Debug ,它的下载和调试这一个类别下面有 Open Hardware Manager ,你看同样是能进入到的。

好,那进入到这个步骤之后,我们接下来就要去连接我们的开发板了。

我们先准备好一根 type c 的数据线,然后把它先连接好我们的电脑。然后我们开发板这一块,它总共是有三个 type c的接口。最上面这个 type c 的接口,它是我们的一个电源供电的接口。然后中间这个是我们串口的这个 type c 接口,然后下面这个是我们下载器的这个type c 的接口。
我们是已经在开发板上面集成了下载器的功能,我们直接把这个 type c 的数据线连接我们这个下载器的这个 type c 接口就可以了。如果在板子上电的这个状态,我们随意去插拔下载器接口的这个 type c,很有可能会损坏我们芯片内部的下载电路,这个风险非常大,所以大家一定要注意。记住不要在板子上电的时候,去插拔下载调试的这个 type C 接口。
好,那现在我们可以给板子上电。接下来。我们在 vivado 里面去点击 open target ,让它去自动连接。

正常情况下我们在这个软件里面是能够识别到我们这个开发板上面的 FPGA 芯片的。你看XC7A75T对吧?

好,那现在我们准备去下载我们的比特文件,那下载的话它这边有一个 program device ,你点击它也可以。点击之后,它自动给你找到了这个比特文件。

大家注意看是不是在 runs实现了这个文件夹里面有一个 led.bit 。那如果他这边出现的这个比特文件,不是我们在当前这个工程下面生成的这个比特文件,那你同样可以自己浏览,自己去找一下。

好,下载完成。同样看到摄像头,你看我们现在四个灯都是已经亮了的。然后左边电源加载指示灯,都亮了。那现在我们这个点亮 LED 的工程,我们现在就已经做好了,是吧?功能是已经实现了的。
当然大家可以在你的代码里面,你自己说自己尝试改一改,比如说你把它改成0,看一下会是什么样的状态,对吧?

好,当然你要记得,代码改完之后,我们是需要重新去生成 bit 文件的。
重新生成 bit 文件之后,继续下载到 FPGA 开发板里面,看它的现象是怎么样的。

好,看到我们的摄像头,你看它这边这个灯它是熄灭的。因为我们在代码里面它是对于这个 LED2 是给它赋值了一个 0 ,也就是输出了一个 0 电平。那对应着它在三极管那边,它是处于一个截止的状态,所以对应的这个灯,它就熄灭了,对吧?没有亮。
10、总结
这就是咱们第一个FPGA的工程,点亮 LED 灯,大家现在可以不用管其他内容,大概看一下咱们FPGA的开发步骤是怎么样的,如果有开发板的话,也可以跟着我们一起来操作实验一下。