FPGA嵌入式设计:实现
更强大的FPGA和更有效的编程环境的可用性使FPGA的实现变得广泛,但使用FPGA似乎令人望而生畏。 编者按:随着智能产品设计中先进算法的不断涌现,开发人员经常发现自己难以实现能够满足这些算法相关处理需求的嵌入式系统。FPGA可以提供所需的...
更强大的FPGA和更有效的编程环境的可用性使FPGA的实现变得广泛,但使用FPGA似乎令人望而生畏。
<img data-lazy-fallback="1" decoding="async" style="width: 150px; margin: 0px 4px 4px 0px; float: left;" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_cover.jpg">
编者按:随着智能产品设计中先进算法的不断涌现,开发人员经常发现自己难以实现能够满足这些算法相关处理需求的嵌入式系统。FPGA可以提供所需的性能,但长期以来,使用FPGA进行设计一直被认为仅限于FPGA编程专家的权限。然而,今天,更强大的FPGA和更有效的开发环境的可用性使FPGA的开发变得广泛。在这段摘录中,这本书的第4章构建高性能嵌入式系统,作者对FPGA设备、实现语言和FPGA开发过程进行了全面的回顾,并详细介绍了如何在自己的设计中开始实现FPGA。完整摘录在以下一系列分期付款中呈现:
1:硬件资源
2:实现语言
三:开发过程
4:正在构建项目
5:实施(本文)
改编自构建高性能嵌入式系统,作者:Jim Ledin。
测试逻辑行为
在FPGA中运行模拟之前,使用模拟测试逻辑的行为是很重要的。这是因为在模拟环境中检测和修复问题比在FPGA内运行逻辑更容易。Vivado仿真工具在表示电路行为方面做得很好:
- 在来源子窗口,右键单击模拟来源并选择添加源…:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f19.png" alt="">
图4.18–模拟源的“添加源…”菜单选择
- 在添加源对话框,确保添加或创建模拟源被选中,然后单击下一个.
- 在添加或创建仿真源对话框,单击创建文件.
- 输入文件名vhdl语言然后单击好啊.
- 点击完成驳回添加或创建仿真源对话框,然后单击好啊在定义模块对话框并单击对当被问及是否确定要使用这些时
- 双击Adder4测试台(行为)(Adder4TestBench.vhdl)在下面模拟来源。删除自动填充的vhdl语言编辑器窗口中输入以下代码加法器4TestBench.vhdl编辑:
图书馆IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用IEEE.NUMERIC_STD.ALL;实体ADDER4_TESTBENCH是结束实体ADDERD_TESTBENCH;ADDER4_TESTBENCH的体系结构行为是组件ADDER4是端口(A4:在std_logic_vvector中(3向下到0);B4:在std_logic_vvector中(3下降到0);SUM4:输出std_logic_vvector(3下降到0);C_OUT4:输出std_logic);末端组件;信号a:std_logic_vvector(3下降到0);信号b:std_logic_vvector(3下降到0);信号s:std_logic_vvector(3下降到0);信号c_out:标准逻辑;信号expected_sum5:无符号(4下降到0);信号expected_sum4:无符号(3下降到0);预期信号_c:std_logic;信号错误:std_logic;begin TESTED_DEVICE:ADDER4端口映射(A4=>a,B4=>b,SUM4=>s,C_OUT4=>C_out);TEST(测试):进程开始——在0到15循环中测试两个4位加数的所有组合(总共256次测试),用于0到15环路中的a_val和b_val——设置ADDER4组件的输入a<=std_logic_vvector(to_unsigned(a_val,a'length));b<=std_logic_vvector(to_unsigned(b_val,b'长度));等待1 ns;--计算两个4位值的5位和expected_sum5<=无符号('0'&a)+无符号('0'&b);等待1 ns;--将和分解为4位输出和进位位expected_sum4<=expected_sum5(3下降到0);expected_c<=expected_sum5(4);等待1 ns;--如果发生错误,则“错误”信号仅变为1,如果((unsigned(s)=unsigned的(expected_sum4))和(c_out=expected_c)),则错误<=“0”;否则错误<=“1”;结束if;--每次通过内环需要10ns等待7ns;末端回路;末端回路;等待结束过程测试;终端架构行为;
此代码通过将4位数字的所有组合呈现给A4和B4型输入到加法器4组成部分它比较了总和4和输出4(_O)的输出加法器4组件转换为相同输入的独立计算值。在每次添加操作之后错误如果加法器4输出与预期值匹配,或者设置为1.如果存在不匹配。
中的代码加法器4TestBench.vhdl类似于传统的软件代码,它使用嵌套的for循环将所有测试输入组合应用于加法器4正在测试的组件。在模拟模式下运行测试的代码是不可合成的,这意味着它不纯粹代表硬件逻辑电路,并且能够进行传统的类似软件的操作,例如对于循环。
然而,与物理电路一样,在测试台代码中使用<=运算符赋值的信号不能在随后的表达式中同时使用。这是因为模拟环境代表了传播延迟的真实世界影响,即使在微小的FPGA设备中也是如此。三个人等待1 ns; 测试台代码中的语句暂停电路操作以允许传播延迟。这些1ns的延迟为刚好在等待语句,以便在下面的语句中使用它们。决赛等待7纳秒; 内部循环中的语句是一个暂停,使我们能够在信号跟踪显示中清楚地看到模拟循环的每次迭代的结果。
- 右键单击Adder4测试台(行为)(Adder4TestBench.vhdl)在下面模拟来源并选择自动更新和编译顺序。这套加法器4_测试台作为模拟运行的顶级对象:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f20.png" alt="">
图4.19–设置自动更新和编译顺序的菜单选择
- 点击运行模拟然后运行行为模拟在流程导航器窗口以进入模拟模式。如果您尚未保存编辑器文件,系统将提示您保存。单击拯救。然后将运行模拟:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f21.png" alt="">
图4.20–运行行为模拟菜单选择
- 当模拟窗口打开,单击模拟输出窗口中标题为“最大化”的按钮无标题1:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f22.png" alt="">
图4.21–模拟结果窗口
每次通过内环的总模拟时间为10ns。因为有256次通过环路加法器4TestBench.vhdl,运行模拟的时间为2560ns。
- 在顶部工具栏中将模拟运行时间设置为2560 ns(步骤1在下图中),按下指向左侧的重新启动按钮(步骤2),然后按下向右按钮运行模拟2560 ns(步骤3),最后,按下缩放比例按钮(步骤4)要缩放模拟输出数据范围以适应窗口:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f23.png" alt="">
图4.22–从运行开始到结束的模拟结果
您可以使用放大镜图标放大跟踪的任何点,并观察测试期间执行的每个添加操作的结果。例如,下图显示了将十进制值6和2相加以产生进位为0的结果8。这些值与预期值匹配,导致错误设置为0。这个错误对于所有256个测试用例,信号均为0,表明我们的逻辑电路通过了所有测试:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f24.png" alt="">
图4.23–放大模拟结果
- 通过单击关闭模拟模式十、蓝色的模拟数据跟踪上方的条形图单击好啊当被问及是否要关闭模拟时。
通过行为测试后,我们将定义设计中使用的I/O信号。
定义I/O信号
我们的下一步是将电路的输入和输出连接到Arty板上的硬件设备。输入将是板开关和按钮,输出将是LED。
以下步骤将创建一个约束文件,描述我们将在FPGA设备上使用的I/O引脚以及连接到Arty板上这些引脚的功能。约束文件的扩展名为xdc:
- 在来源子窗口,右键单击限制条件并选择添加源….
- 在添加源对话框,确保添加或创建约束被选中,然后单击下一个.
- 在添加或创建约束对话框,单击创建文件.
- 输入文件名艺术品-A7-100.xdc(或艺术品-A7-35.xdc如果适用于您的设备),然后单击好啊.
- 点击完成驳回添加或创建约束
- 展开限制条件源树并双击艺术品-A7-35.xdc.
- Digilent为Arty A7板提供预先填充的约束文件Visithttps://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-35-Master.xdc并将浏览器窗口的全部内容复制到Vivado中的Arty-A7-35.xdc编辑器窗口中。如果适用于您的设备,请在https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-100-Master.xdc相反
- 所有I/O引脚都会在约束文件中注释掉,方法是通过删除每行开头的#字符来取消对文件中相应行的注释。我们将使用阿尔蒂- A7-100直流文件:开关,RGB公司 发光二极管(但仅限于发光二极管0_g,第一个绿色LED),发光二极管和按钮。下图显示了取消注释后的这些行:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f25.png" alt="">
图4.24-约束编辑器窗口
在下一节中,我们将创建一个顶级VHDL文件,该文件将加法器代码与I/O设备接口。
创建顶级VHDL文件
接下来,我们将创建一个顶级VHDL文件,将我们的4位加法器组件连接到相应的板I/O信号:
- 在来源子窗口,右键单击设计来源并选择添加源….
- 在添加源对话框,确保添加或创建设计源被选中,然后单击下一个.
- 在添加或创建设计源对话框,单击创建文件.
- 输入文件名vhdl语言然后单击好啊.
- 点击完成驳回添加或创建设计源对话框,然后单击好啊在定义模块对话框并单击对当被问及是否确定要使用这些时
- 双击vhdl语言在下面设计来源。删除自动填充的艺术附录.vhdl编辑器窗口中输入以下代码艺术附录.vhdl编辑:
--加载标准库IEEE;使用IEEE.STD_LOGIC_1164.ALL;实体ARTY_ADDER是端口(sw:在STD_LOGIC_VECTOR中(3向下到0);btn:在STD_LOGIC_VECTOR中(3下降到0);led:输出STD_LOGIC_VECTOR(3下降到0);led0_g:out STD_LOGIC);末端实体ARTY_ADDER;ARTY_ADDER的体系结构行为是——参考之前对4位加法器组件ADDER4的定义,ADDER4是端口(A4:在std_logic_vvector中(3向下到0);B4:在std_logic_vvector中(3下降到0);SUM4:输出std_logic_vvector(3下降到0);C_OUT4:输出std_logic);末端组件;开始ADDER:ADDER4端口映射(A4=>sw,B4=>btn,SUM4=>led,C_OUT4=>led0_g);终端架构行为;
此代码映射中命名的I/O设备的信号名称艺术品-A7-100.xdc像软件(4个开关),顺便说一句(4个按钮),带路(4个单色LED),以及发光二极管0_g(第一个多色LED的绿色通道)到加法器4输入和输出。
虽然VHDL不区分大小写,但扩展数据中心Vivado中的约束文件区分大小写。中定义的I/O设备名称中使用的大小写扩展数据中心文件在VHDL文件中引用时必须相同。具体来说,VHDL中的I/O信号名称在此文件中必须是小写的,因为它们在约束文件中是小写的。
我们现在已经准备好对Arty板的设计进行综合、实施和编程。
FPGA比特流的合成与实现
或者,您可以选择生成比特流Vivado将执行所有必要的步骤,包括合成、实现和比特流生成,而无需进一步的用户干预。如果发生致命错误,进程将停止并显示错误消息。执行以下步骤以生成比特流:
- 点击生成比特流开始构建您可能会被问到是否要保存文本编辑器。点击拯救。您可能会被告知没有可用的实施结果,并被问及是否可以启动综合和实施。点击对:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f26.png" alt="">
图4.25–生成比特流菜单选择
- 这个启动跑步对话框,然后您可以为作业数量最多可容纳计算机中的处理器内核数。使用更多的内核可以加快进程,但如果你想在漫长的构建过程中继续使用它,它可能会让你的机器陷入困境。点击好啊要启动生成,请执行以下操作:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f27.png" alt="">
图4.26–启动运行对话框
- 在构建过程中,Vivado将在主窗口的右上角显示状态。如有必要,您可以通过单击取消生成过程取消状态显示旁边:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f28.png" alt="">
图4.27–编译状态显示
- 当构建过程完成时,假设没有致命错误比特流生成完成对话框虽然提供了其他选项,但我们将直接将比特流下载到Arty板。选择打开硬件管理器然后单击好啊:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f29.png" alt="">
图4.28-比特流生成完成对话框
接下来,我们将把比特流下载到FPGA中。
将比特流下载到板
执行以下步骤将比特流下载到Arty A7板:
- 这个硬件管理器对话框将出现并指示没有打开硬件目标.
- 使用USB将您的Arty A7-35或A7-100板连接到计算机。等待几秒钟以识别板,然后单击打开目标然后自动连接:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f30.png" alt="">
图4.29–打开目标和自动连接选项
- 几秒钟后,Vivado应指示板已连接。点击程序设备要将FPGA比特流下载到Arty,系统将提示您选择比特流文件。如果您使用了与本例相同的目录结构,则文件将位于C: /项目/艺术广告/ArtyAdder.runs/impl_1/ARTY_ADDER.bit艺术添加程序:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f31.png" alt="">
图4.30–编程设备对话框
- 点击程序将程序下载到FPGA设备并启动它
- 现在,您可以使用Arty I/O测试程序的操作。将所有四个开关放置在关位置(将开关移向相邻的板边缘),不要按下四个按钮中的任何一个。四个绿色指示灯应全部熄灭。
- 如果您打开任何单独的开关或按下任何一个按钮,相应的绿色LED应点亮。在按下任何数量的按钮的同时打开任何开关组合将添加相应的4位数字,并用If there a carry(例如,打开开关3然后按下顺便说一句3同时),绿色进位LED将点亮。
这里执行的编程过程将程序存储在FPGA RAM中。如果在FPGA板上循环通电,则需要重复编程过程以重新加载程序。或者,您可以将FPGA配置文件存储在板载闪存中,如下节所述。
将位流编程到板载闪存
要在每次Arty板通电时配置FPGA,必须将FPGA配置文件存储到板上的闪存中。如果安装了MODE跳线,FPGA将尝试在通电时从板载闪存下载配置文件。该存储器位于与Artix-7 FPGA相邻的单独芯片中。按照以下步骤将配置文件编程到闪存中:
- 安装模式Arty板上的跳线(如果还没有)
- 右键单击生成比特流并选择比特流设置….
- 在设置对话框,选中旁边的框-bin文件然后单击好啊:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f32.png" alt="">
图4.31–比特流设置对话框
- 在主Vivado对话框中,单击生成比特流并重复比特流生成过程。点击取消当比特流生成完成对话
- 在硬件对话框,右键单击FPGA部件号(xc7a100t_0)并选择添加配置内存设备…:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f33.png" alt="">
图4.32–添加配置内存设备…菜单选择
- 类型第25页第127页进入搜索这应该会显示一个匹配的零件号。选择零件并单击好啊:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f34.png" alt="">
图4.33–添加配置内存设备对话框
- 您将看到一个对话框,询问您想现在对配置内存设备进行编程吗?点击好啊.
- 这将带来一个程序配置内存设备对话框,请求配置文件名。单击…右侧的按钮配置文件并选择C: /项目/ArtyAdder/ArtyAdder.runs/impl_1/ARTY_ADDER.bin。点击好啊:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f35.png" alt="">
图4.34–程序配置内存设备对话框
- 编程过程将花费几秒钟时间。在将文件编程到板闪存中后,您应该会收到一条指示成功的消息:
<img data-lazy-fallback="1" decoding="async" src="https://uploads.9icnet.com/images/aritcle/20230419/ledin_f36.png" alt="">
图4.35-程序闪存完成对话框
此后,每次循环板电源时,4位加法器程序将加载并运行。使用我们用于加载配置文件的设置加载程序需要很长时间。为了避免等待FPGA加载程序,您可以通过执行以下步骤来提高配置文件加载的速度:
- 选择开放式综合设计在里面流程导航器.
- 在Vivado主菜单中,选择工具/编辑设备财产….
- 在全体的选项卡,集合启用比特流压缩到符合事实的.
- 在配置选项卡,集合配置速率(MHz)至33,然后单击好啊.
- 再次生成比特流,并按照说明对闪存进行编程。您需要移除配置内存设备并再次将其添加回来,以显示重新编程选项。
- 关硬件 经理.
- 拔下Arty板的USB电缆并将其插入。程序应该在通电后立即开始运行。
本节介绍了一个简单组合逻辑与FPGA I/O引脚上的信号交互的示例。这里的目的是让你熟悉Vivado
工具套件,并演示如何使用这些工具来执行完整的FPGA开发周期。
总结
本章从讨论FPGA在实时嵌入式系统架构中的有效使用开始,并继续描述标准FPGA设备及其包含的底层组件。介绍了FPGA设计语言的范围,包括HDL、框图方法和流行的软件编程语言,如C/C++。介绍了FPGA的开发过程。本章以FPGA开发周期的完整示例结束,从需求陈述开始,到在低成本FPGA开发板上实现的功能系统结束。
完成本章后,您应该了解FPGA如何在实时嵌入式系统架构中有效应用,并了解FPGA集成电路中的组件。您已经了解了FPGA算法设计中使用的编程语言、FPGA开发周期中的步骤,并了解了FPGA开发过程中的步骤顺序。
下一章将扩展FPGA的开发过程,以提供一种完整的方法来构建包含FPGA的实时嵌入式系统。它还将开始开发一个原型高性能嵌入式系统,一个数字示波器,这将作为以下章节的例子。
经Packt出版社许可重新印刷。版权所有©2021 Packt Publishing
<img data-lazy-fallback="1" decoding="async" alt="" style="width: 150px; float: left; margin: 0px 4px 0px 0px;" src="https://uploads.9icnet.com/images/aritcle/20230419/Jim_Ledin.jpg">
吉姆·莱丁Jim是Ledin Engineering,Inc.的首席执行官。Jim是嵌入式软件和硬件设计、开发和测试方面的专家。他还擅长嵌入式系统网络安全评估和渗透测试。他拥有爱荷华州立大学航空航天工程学士学位和佐治亚理工学院电气和计算机工程硕士学位。Jim是加利福尼亚州的注册专业电气工程师、认证信息系统安全专家(CISSP)、认证道德黑客(CEH)和认证渗透测试仪(CPT)。