FPGA入门学习笔记(一):认识FPGA、与STM32的区别及开发工具 1. 前言我为什么开始学习FPGA1.1 我的学习背景大家好我是一颗小电阻目前是一名电气工程专业的研究生。因为课题组需要我开始接触FPGA。我想很多初学者对FPGA也有不少疑惑比如FPGA到底是什么同样是控制芯片它和STM32有什么区别写好的Verilog代码是怎么在芯片里面工作的刚开始学习的时候这些问题也困扰了我很久但是最近我完成了FPGA的第一轮基础学习接触了二选一多路选择器、3-8译码器、计数器、LED闪烁与流水灯的Verilog实现和仿真验证。虽然距离熟练应用还有很长的路但是我想从现在开始把学习中的理解和疑问记录下来。1.2 这个系列准备记录什么这个系列将围绕着我的FPGA的学习过程展开从基础的概念和简单的实验开始逐步整理以下内容基础概念记录对组合逻辑、时序逻辑、寄存器等概念的理解。设计思路与代码说明我们想实现的功能如何拆解以及怎么用Verilog描述。仿真与验证介绍仿真代码的编写过程结合波形验证设计是否符合预期。学习心得分享对代码的理解和体会记录对 FPGA 理解的变化。因此这是一个初学者的学习记录我会随着理解的加深持续对内容进行补充和修正。对我来说写文章也是复习的一部分我希望通过整理学习内容逐步做到独立完成一些基础设计。也希望给刚刚学FPGA的朋友一些参考欢迎交流与指正。2. FPGA是什么2.1 FPGA的名称与基本概念FPGA 的英文全称是“ Field-Programmable Gate Array”中文通常译为“现场可编程门阵列”。光听名字就很抽象可以先这样理解FPGA 是一种能够通过配置改变内部数字逻辑功能和连接关系的芯片。它的内部已经制造好了大量的可配置资源比如查找表LUT实现各种组合逻辑功能。触发器配合时钟用于保存电路的状态。可编程互连资源用于连接不同的逻辑单元输入与输出资源与芯片外部的电路交换信号等等我们可以把FPGA想象成一盒积木在芯片出厂的时候里面已经准备好了各种积木有的积木负责计算有的负责记住数据有的负责联通一个积木与另一个积木。在搭积木时同一盒积木可以被搭成房子也可以被搭成汽车。FPGA也是相似的道理通过配置内部资源的功能和连接方式同一颗芯片就可以实现不同的数字电路比如译码器、计数器或 LED 流水灯控制电路。那么我们怎样告诉 FPGA要把这些“积木”搭成什么呢一种常见的方法是编写 Verilog 代码描述所需电路的功能和工作方式。开发工具软件根据代码安排内部资源的使用和连接负责安排积木搭成什么样哪块积木与哪块积木连接并生成配置文件。将配置文件加载到 FPGA 后芯片内部的资源就按照相应配置组成电路实现我们设计的功能。注积木的比喻也不意味着芯片内部的元件会真的移动实际改变的是资源的配置和资源之间的连接方式。2.2 用Verilog描述电路是什么意思Verilog是一种硬件描述语言主要用于描述数字电路的结构和行为。我的理解是对于一个想要实现的功能我们用 Verilog 说明电路需要哪些输入、产生哪些输出以及输入、输出和内部数据之间有什么关系。如果电路需要有记忆功能需要保存状态还要说明这些状态在什么时候更新。开发工具再根据这些描述利用 FPGA 内部的资源实现相应的数字电路。下面通过一个例子来理解。假设我们需要这样一个功能有两个输入信号A和B只有它们都为 1 时输出Y为 1其余情况输出为 0。对应的真值表如下输入A输入B输出Y000010100111这是数电里面的与逻辑用Verilog语句描述如下module and_gate (input A,input B,output Y);assign Y A B;endmodule这段代码可以这样理解代码含义module开始定义一个模块and_gate模块名字由我们命名......声明模块的输入、输出端口assign Y A B;描述模块内部的与逻辑endmodule结束这个模块的定义,表示按位与运算其中assign是Verilog中“连续赋值”关键字连续指的是输入变化后输出也跟着立刻变化 assign Y A B的意思就是让Y始终反映A与B的计算结果。通过上面的 Verilog小例子我们描述了电路需要哪些输入和输出输入与输出之间满足什么关系除了这样简单的与逻辑Verilog 也可以描述其他的数字电路。例如要让 LED 每隔 500 ms 翻转一次就需要描述怎样计时怎么计时到500ms、怎样保存 LED 状态想要LED状态翻转我需要知道LED的当前状态以及什么时候改变状态。这些内容会在后续的 LED 闪烁实验中详细介绍。因此可以先把“用 Verilog 描述硬件”理解为说明电路有哪些输入和输出以及它们应该按照什么规则工作开发工具就可以根据这些描述利用 FPGA 内部资源实现这个电路。3. FPGA和STM32有什么区别刚开始学习 FPGA 时我经常用之前学习 STM32 的思路去理解它都是写代码再下载到板子上它们到底有什么不同想理解这个问题可以先看看两者内部有什么以及我们写的代码分别起什么作用。3.1 STM32:编写程序使用芯片中已有硬件STM32 是一个微控制器产品系列通常也被我们称为单片机。芯片内部已经有 CPU、存储器、GPIO、定时器、串口等硬件资源具体配置随型号而变化。如图1所示STM32F103xx 的芯片内部功能框图展示了各个功能模块及其连接关系。这些硬件模块已经由芯片厂家设计并集成在芯片内部。使用 STM32 时我们通常用 C 语言编写程序由 CPU 执行指令配置和使用这些硬件资源。图1STM32F103xx 内部功能框图具体资源配置随型号而变化3.2 FPGA:描述电路组合内部的逻辑资源FPGA 的开发方式则是我们用 Verilog 等硬件描述语言描述所需电路再由开发工具将设计映射到芯片内部的资源上。以“LED 每隔 500 ms 翻转一次状态”为例可以对比两种实现思路。使用 STM32 时一种简单的方法是用 C 语言编写循环程序CPU 执行程序通过 GPIO 将连接 LED 的引脚设置为点亮所需的电平延时 500 ms 后再将引脚设置为熄灭所需的电平再延时 500 ms重复这个过程。也可以使用定时器先配置芯片内部已有的定时器让它每隔 500 ms 产生一次中断再在中断处理程序中翻转 LED 状态。这里的定时器、GPIO 等硬件资源已经被厂家设计好集成在芯片里了我们通过程序设置它们的工作方式。使用 FPGA 时要实现 LED 每隔 500 ms 翻转一次可以通过计数时钟周期来判断经过的时间。时钟信号通常由开发板上的晶振电路提供。假设时钟频率为 50 MHz周期就是 20 ns2500 万个周期对应 500 ms。因此我们可以设计一个计数器每个时钟上升沿加一。由于从 0 开始计数我们想要25000000个周期计数终值应设为 25000000−1。计数到达终值时翻转 LED 状态同时将计数器清零开始下一轮计时。我们用 Verilog 描述计数值怎样保存和更新、什么时候清零以及 LED 状态什么时候翻转。开发工具再利用 FPGA 内部资源实现计数、判断和状态保存等电路。因此对我来说两者一个重要的区别是使用 STM32 时我主要考虑怎样通过程序配置和使用已有的硬件使用 FPGA 时我还需要考虑想要的功能应当由怎样的数字逻辑来实现。3.3 FPGA的优势前面用 LED 闪烁实验对比了 STM32 和 FPGA 的实现方式。不过简单的点灯实验还不太能体现 FPGA 的特点。FPGA 的优势主要体现在电路并行运行、高速数据处理以及精细的时序控制等方面。结合我们课题组涉及的高压脉冲实验可以更直观地理解它适合做什么。在高压脉冲发生器电路中FPGA 可以产生控制信号通过驱动电路去控制电路开关管如 MOSFET什么时候导通、导通多久、什么时候关断以及如何与其他开关管配合。例如有些开关管需要同时动作有些则需要间隔一段时间再动作。使用 FPGA 时我们可以让多路控制逻辑在同一个时钟下工作按照预先设计好的顺序和时间输出信号方便实现多路同步、脉宽调节和延时控制。STM32 的定时器也能完成许多脉冲控制任务。但当控制通道较多、各路信号之间的配合比较复杂时就需要考虑定时器数量、通道分配和同步方式等限制。FPGA 可以根据需要设计相应的控制逻辑因此在这类场景下更加灵活。此外脉冲实验中除了产生开关管的控制信号还可能需要接收上位机参数、读取采样数据以及处理故障状态。FPGA 可以分别实现脉冲控制、通信、数据采集接口和故障处理等逻辑让这些模块并行工作并通过内部信号协调。例如通信模块接收新的设置时脉冲控制模块仍然可以按照当前参数运行再在规定时刻应用新参数。这种结构适合同时处理多路信号、协调多个任务。虽然STM32 的定时器、DMA 等外设同样能够独立运行但FPGA 的特点在于可以根据需求设计和组合自定义逻辑而不只依赖已有外设提供的功能。 因此对我来说当系统出现以下需求时候会用到FPGA:需要控制较多路信号并安排它们之间的同步、延时等需要灵活设计脉宽、死区和动作顺序需要同时处理多路高速数据此外FPGA 和 STM32 也可以配合使用发挥各自的优势。例如在高压脉冲控制系统中可以让 STM32 负责按键、屏幕显示、与上位机通信等任务将接收到的脉宽、延时等参数传给 FPGA再由 FPGA 按照这些参数产生多路控制信号去控制开关管。这样STM32 负责参数设置和系统管理FPGA 负责具体的脉冲时序控制两者分工配合、相互补充。4. FPGA的开发工具下载与基本开发流程4.1开发工具下载Vivado目前我学习FPGA使用的是vivado2022.2该软件的下载流程是打开AMD官网https://www.amd.com/zh-cn.html进去之后要注册好账号很容易注册此处就略过点击左上角的“资源与支持”如图2所示图2 AMD官网界面接着点击“Vivado ML开发者工具”如图3所示图3 资源与支持界面接着进入图4的界面可以选择你想要的版本我以2022.2版本为例图4 Vivado ML开发者工具界面接着向下滑找到可以下载到Windows上面的EXE文件如图5所示然后点击AMD Unified Installer 2022.2: Windows Self Extracting Web Installer图5 Vivado ML开发者工具界面之后会跳到信息验证环节简单填写信息之后向下滑找到“下载”直接点击下载如图6所示图6 信息验证界面等待exe文件下载完成后打开exe文件会出现如下画面我们依次点击continue、Next,如图7所示图6 Vivado下载界面1接着输入注册好的AMD账号和密码然后点击Next如图7所示图7 Vivado下载界面2然后到图8的界面选择vivado点击Next图8 Vivado下载界面3接着选择Vivado ML Standard然后点Next如图9所示图9 Vivado下载界面4接着到选择要下载的资源界面我只选择了VivadoDesign suiteZynq-7000因为我看的教学视频是这个型号Install Cable Drivers以后如果需要其他的资源可以再下载如图10所示选择完成后点击Next图10 Vivado下载界面5接着把“I agree”全部勾选点击Next如图11图11 Vivado下载界面6接着选择要下载到的文件夹其余的保持默认因为我的电脑已经有了vivado所以这个界面可能和你们的不一致如图12所示图12 Vivado下载界面7之后等待下载完成即可下载完成桌面上得到两个软件Vivado 2022.2和Vitis HLS 2022.2软件图标和vivado打开界面如下图13 图标和vivado界面4.2 FPGA基本开发流程安装好 Vivado 后一个简单的 FPGA 项目通常需要经过以下步骤明确功能先想清楚电路需要实现什么功能有哪些输入和输出输入和人输出之间的逻辑关系是什么。编写设计代码使用 Verilog 描述电路的功能。进行仿真编写测试文件Testbench提供时钟、复位等输入信号通过仿真波形检查设计是否符合预期。添加约束指定信号连接到 FPGA 的哪些引脚并告诉开发工具时钟周期等信息。综合与实现开发工具将代码转换成数字逻辑再安排这些逻辑使用芯片内部的哪些资源、怎样连接并检查时序是否满足要求。生成配置文件并上板验证生成配置文件将其下载到 FPGA开发板观察开发板上的实际运行效果。5.学习参考资料我目前主要跟着小梅哥的 FPGA 教学视频学习这个系列主要记录我在学习过程中对知识点的理解、自己动手练习的过程以及遇到的问题和解决方法。课程连接是https://www.bilibili.com/video/BV1ravZBJETp/?spm_id_from333.337.search-card.all.clickvd_sourcec50d330baa3ca7dc4303c21f8628b714我觉得老师讲得很细致、清楚如果想进一步了解相关内容大家也可以去看看教学视频。文章中的表述包含我个人的理解目前还处于入门阶段如果有不准确的地方欢迎大家指出也欢迎一起交流学习。