介绍
与传统的微控制器相比,FPGA(现场可编程门阵列)是独一无二的,因为它们不执行顺序指令。相反,它们由一组可配置的逻辑块组成,这些逻辑块可以被重新编程以执行自定义的数字逻辑功能。这使得FPGA可以并行执行多个操作,使其在信号处理、数据处理和实时控制等特定任务中非常高效。
为了定义FPGA的功能,我们使用硬件描述语言(HDL),它指定了逻辑元素应该如何配置和互连。在这个项目中,我将使用SystemVerilog,这是Verilog的高级版本,它引入了额外的特性,如增强的类型安全、断言和面向对象编程功能,使其更适合FPGA设计。
对于硬件,我使用的是Arty S7-25,这是一个基于Xilinx Spartan-7 FPGA的开发板。它在尺寸、性能和可负担性之间提供了一个很好的平衡,使其成为初学者的绝佳选择。该板具有双Arduino头,便于原型设计,以及PMOD头,允许扩展额外的外设。当我使用这个特定的板时,如果您遵循这个项目,任何来自Spartan-7家族或更高版本的Xilinx FPGA都应该兼容。
XADC (Xilinx模数转换器)
XADC是Xilinx FPGA中的集成模数转换器(ADC),使其能够处理模拟信号和数字逻辑。该功能对于电压监测、传感器数据采集和实时模拟信号处理等应用特别有用。通过将ADC直接集成到FPGA中,减少了对外部ADC组件的需求,简化了硬件设计并提高了系统集成度。
XADC的主要特性:
•双12位adc能够以高达1 MSPS(每秒百万采样)的速度采样,允许高速数据采集。
•支持多达16个外部模拟输入通道(根据FPGA封装不同而不同),支持多个传感器或信号连接。
•用于FPGA温度监测和电源电压跟踪的片上传感器,有助于系统可靠性和热管理。
•灵活的接口选项:支持AXI Lite,动态重新配置端口(DRP)或直接寄存器控制,允许与不同的FPGA设计集成。
•支持单极(0V至1V)和双极(-0.5V至0.5V)输入模式,适应各种模拟信号范围。
•可配置报警阈值,使自动警报电压或温度异常。
XADC通过弥合模拟和数字域之间的差距,增强了FPGA的多功能性,使其成为需要在基于FPGA的系统中进行实时模拟信号处理的应用的理想选择。
Vivado:赛灵思的FPGA设计软件
Vivado是Xilinx的综合FPGA设计套件,用于设计、模拟、合成和编程基于FPGA的系统。它为HDL开发提供了一个完整的工具链,包括逻辑分析仪、IP集成器和调试工具,使其成为FPGA开发必不可少的工具。无论您是实现简单的逻辑电路还是复杂的数字系统,Vivado都可以通过其高级合成(HLS),基于块的设计方法和硬件调试工具简化设计流程。
下载安装程序
访问AMD/Xilinx官方网站并导航到下载部分。
下载最新版本的统一安装程序,选择与您的操作系统(Windows或Linux)兼容的版本。
注意:您需要登录或创建一个免费的AMD/Xilinx帐户才能访问下载。
安装过程
运行安装程序并按照屏幕上的说明操作。
在安装过程中,您可以选择完全安装或自定义安装,这取决于您是否需要额外的工具,如Vitis(用于嵌入式开发)或仅用于FPGA设计的Vivado。
准备好大量下载(几gb),因此建议使用稳定且快速的互联网连接。
创建第一个项目
一旦安装了Vivado,下一步就是在AMD Vivado设计套件中创建一个新项目。本项目将作为工作空间,您将在其中编写,模拟和合成您的FPGA设计。
步骤1:创建项目
打开Vivado并从欢迎屏幕中选择Create New Project。
选择一个项目名称(例如,DisplayXADC)并选择一个方便的位置来保存项目文件。
单击Next继续。
步骤2:选择项目类型
当提示项目类型时,选择RTL项目(注册-传输级别),因为这允许您使用SystemVerilog编写设计。
启用“此时不指定源”复选框,除非您已经准备好了源文件。
单击Next继续。
步骤3:创建源文件和约束文件
进入项目后,创建一个新的源文件:选择create file→选择SystemVerilog作为文件类型。将其命名为任何您喜欢的名称(例如,xadc_display.sv)。
创建空约束文件:选择“创建文件”→确保文件类型为XDC (Xilinx Design Constraints)。将其命名为您喜欢的任何名称(例如,constraints.xdc)。稍后将使用该文件定义引脚映射、时钟约束和定时设置。
步骤4:选择FPGA板
将出现一个对话框,提示您在零件和电路板之间进行选择。
选择Boards选项卡并键入您的FPGA板型号(例如,Arty S7-25)。如果没有显示您的单板,请单击“刷新”或确保安装了单板文件。
单击Next,然后单击Finish以完成设置。
配置XADC
要在FPGA设计中使用XADC (Xilinx模数转换器),需要在Vivado中添加和配置XADC IP核。按照以下步骤正确设置:
步骤1:添加XADC IP核
在Vivado的左侧,找到并单击IP Catalog。
在搜索栏中,输入“XADC”。
选择“XADC向导”,然后双击打开其配置设置。
步骤2:自定义XADC IP
将出现一个对话框,允许您配置XADC核心。
选择接口类型:配置接口模式为DRP (Dynamic Reconfiguration Port)。这允许通过寄存器实时访问ADC转换。
选择转换模式:在模式选择下,选择“单通道”,设置为“连续模式”。这确保了ADC连续采样单个模拟输入,而不是通过多个通道循环。
禁用告警(本项目不需要):导航到“告警”页签。禁用所有警报,因为此应用程序不需要它们。这些告警通常用于监控电源电平和FPGA温度。
选择模拟输入引脚:在单通道选项卡下,找到外部模拟输入部分。为A0引脚(或FPGA上相应的ADC引脚)选择VAUXP0/VAUXN0。确切的引脚映射可能因FPGA板而异,因此请检查约束文件(.xdc)以验证正确的引脚。
步骤3:生成XADC IP核
保留所有其他设置为默认值,除非您的应用程序需要进一步定制。
单击OK关闭自定义窗口。
在下一个对话框中,选择“生成输出产品”,然后单击“生成”。
此时,将生成XADC IP核并准备将其集成到您的设计中。该模块将允许您的FPGA与模拟信号接口,例如从电位器或其他传感器读取电压电平。
代码
ConstrainFile
约束文件(.xdc)在FPGA设计中至关重要,因为它定义了项目的I/O引脚映射、时钟约束和时序要求。该文件告诉FPGA使用哪个物理引脚进行输入和输出,确保您的设计与外部硬件(如按钮,led,传感器或通信接口)正确交互。
每个FPGA板都有一个唯一的约束文件,因为不同的板有不同的引脚分配和硬件配置。
七段模块
该子模块设计用于一次控制单个七段LED显示屏。它需要一个输入时钟信号来同步显示更新和一个输入数字(十六进制0-F)。
高层模块
主模块被指定为源文件层次结构中的“顶层”模块。这个顶层模块作为设计的入口,类似于C语言编程中的主要功能。通过用清晰的层次结构构建设计,顶层模块确保所有组件有效地协同工作,使调试和扩展系统更容易。
顶层模块的角色
•它充当集成和连接设计中所有其他子模块的最高级模块。
•它定义了与FPGA外部引脚接口的I/O端口。
•它实例化其他模块的实例,在它们之间传递信号以确保正确的通信。
初始化模块实例
在顶部模块中,您将创建项目中定义的其他模块的实例。这些实例的行为类似于软件编程中的函数调用,但它们不是按顺序执行,而是并行操作。
我们首先定义它的输入和输出端口,这决定了FPGA如何与外部硬件组件交互。
时钟输入(用于同步)
模拟输入(用于从XADC读取数据)
输出控制七段显示
实例化XADC模块
接下来,我们实例化XADC模块,该模块连续采样模拟输入信号并将其转换为16位数字值。然后对这些数据进行处理,以提取相关信息进行显示。
实例化七段显示模块
由于我们正在使用两个七段显示,因此我们创建了sevenSegment模块的两个实例。这些实例接收处理过的数据并驱动相应的显示段。
数据处理和路由
来自XADC的原始数据是16位宽,但是一个7段的显示器通常一次只显示一个数字。
为了显示有意义的值,我们对16位数据进行切片,只提取高阶位,它们代表ADC转换结果的最高有效数字。
切片后的数据被发送到七段模块,在那里被转换成二进制编码格式(BCD)显示。
构建和编程
一旦编码阶段完成,我们就进入构建和编程过程,在此过程中,设计被合成、实现并转移到FPGA硬件。
步骤1:生成比特流
•在Vivado中,找到左侧面板中的“构建和调试”部分。
•点击“生成比特流”来启动这个过程。
•如果出现提示,单击“Yes”继续。
该过程包括三个主要步骤:综合:将SystemVerilog代码转换为门级表示。实现:将逻辑映射到FPGA的物理资源上。比特流生成:创建将加载到FPGA上的最终二进制文件。
此过程可能需要一些时间,具体取决于设计的复杂性和系统的性能。
步骤2:连接FPGA板
•一旦比特流成功生成,转到“打开硬件管理器”。
•现在,使用微型USB电缆将FPGA板连接到计算机。确保单板已上电。
•在硬件管理器中,点击“自动连接”。这将扫描连接的FPGA设备。将出现检测到的硬件设备列表。
步骤3:FPGA编程
•在列表中找到您的FPGA设备。
•右键单击设备,选择“程序设备”。
•将出现一个对话框,确认要使用的比特流文件(.bit)。
•点击“Program”将设计加载到FPGA上。
该程序在FPGA中是临时的,一旦电源被切断,它就会回到工厂或以前烧毁的程序。如果您想将程序刻录到FPGA中,则选择“程序eFUSE寄存器”,这将刻录程序,并且在电源周期后不会丢失。
布线
在这个项目中,我使用IO0到IO13引脚连接两个七段LED显示屏。这些引脚被分配来控制单个LED段。
连接七段显示器
•根据您的设计将7段LED段连接到IO0-IO13。
•应相应地连接公共地(用于公共阴极显示器)或公共电源(VCC)(用于公共阳极显示器)。
•确保显示模块的地与FPGA的地相连,完成电路。
自定义Pin分配
•可以根据项目需要更改这些pin分配。
•如果修改了pin分配,则必须相应地更新约束文件(.xdc)以反映新的连接。
•验证七段显示器与FPGA的I/O电压水平的电压兼容性(例如,3.3V逻辑用于Arty S7-25)。
连接XADC电位器
•您可以使用任何通用的10K电位器作为模拟输入设备。
•连接方式:一端接VCC (3.3V)。另一端到GND。中间(雨刷)引脚到XADC输入引脚(VAUXP0/VAUXN0,如约束文件中定义)。