Xilinx FPGA 与 AVRILOS
如何将 Xilinx FPGA 配置数据嵌入 AVRILOS。
摘要
在上一篇文章中,我介绍了 AVRILOS 协作式多任务操作系统。在本文中,我将介绍如何将 FPGA 配置数据集成到代码中,并能够在无需外部串行或 PROM/Flash 的情况下配置 FPGA 器件。这可以减少芯片数量,如果您将 FPGA 与微控制器集成,就像我经常做的那样。此外,我还将介绍一个简单的 VHDL SSI/SPI 接口,您可以将其用作 FPGA 外设,并通过 AVRILOS 进行控制。示例应用程序是一个 8 通道 R/C 伺服控制器,通过视频演示。
相关链接
引言
可能需要本文信息的有两种用户。
第一类用户是那些不知道如何设计 FPGA 或至少没有参与该过程的用户。这些用户有兴趣直接从第三方比特流下载 FPGA 设计,并将其集成到他们的嵌入式设计中。
第二类用户是完全实现其设计(包括 FPGA 器件)的用户。这些用户拥有或需要对其流程和设计参数进行完全控制。
我假设您已经阅读了关于如何使用我的工具 cvtfpga3.exe 从 FPGA 比特流文件生成 C 源代码的前一篇文章。如果您还没有阅读,链接在此。
在本文中,您将看到如何通过 SPI 接口进行 SRAM 基础的 FPGA 配置。此外,您还将看到如何通过 3 线接口将 FPGA 设计与您的微控制器链接并进行控制。
我将使用本文介绍的开源 AVRILOS 操作系统。在当前的文章中,我将提供 AVRILOS 的 FPGA 配置和通过 SSI 接口集成您的设计的扩展功能。
示例应用程序将演示一个由微控制器通过 SSI(同步串行接口,即 SPI)控制的多通道 RC 伺服外设。提供的代码将是支持此功能的下一个 AVRILOS 版本,以及所演示设计的 VHDL 源代码。
VHDL SSI 接口可用于接口您所需的任何逻辑,并提供一个标准的微处理器接口,通过该接口您可以访问您的新炫酷电路。
此外,我对 AVRILOS 的 makefile 脚本进行了一些改进。
背景
微控制器之所以流行,是因为它们可以轻松控制系统,并且非常灵活。如今,微控制器拥有更大的内存容量和一整套几乎无所不能的外设。
另一类与微控制器相似的器件是称为 CPLD(复杂可编程逻辑器件)或 FPGA(现场可编程门阵列)的可编程逻辑器件。
由于我同时设计 FPGA 和微控制器,我最喜欢的设置是进行组合设计。我使用微控制器处理主逻辑,然后添加 FPGA 进行外设扩展。FPGA 提供逻辑门、触发器和许多 I/O,我可以用它们来扩展标准的 AVR DIP40 封装。因为微控制器有足够的内存,我将 FPGA 配置包含在 Flash 中,从而消除了外部串行 PROM/Flash。
在此过程中,我假设您知道如何编写、仿真、综合、布局和布线,并生成最终的 FPGA 比特流。尽管我将为 Xilinx Spartan 器件展示此技术,但您可以几乎使用任何器件(当然还有微控制器)。
描述
项目目标
项目目标是提供一个平台,方便地将 FPGA 和微控制器集成到单个设计中。
工具
我用于 AVRILOS 的工具是
- (软件) WinAVR (适用于 Windows 的 AVR GCC)。
- (软件) Atmel AVR Studio (用于仿真)。
- (软件) 您偏好的编辑器。
- (软件) 终端程序 (例如,Terminal, PuTTY)。
- (软件) 编程器软件 (AVRDude 已包含在 WinAVR 中,但如果您愿意,也可以使用 AVREAL32)。
- (硬件) 硬件板,您的控制器和 FPGA 在上面运行!
- (硬件) AVR 编程器加密狗。
- (硬件) USB/RS232-TTL 串行电平转换器,用于连接监视器。
用于 FPGA 开发的工具 (本文中介绍)
- Xilinx Spartan4K 开发工具
- (软件) CvtFPGA,将 HEX 或 BIN 文件转换为 C 数组代码的工具。
您可能需要的其他工具
- GNUWIN32 (用于 makefiles,如果我不使用 WinAVR,即其他编译器包,如 MPLAB)
- (硬件) 示波器 (推荐)
- (硬件) 万用表 (至少这个!)
- 您可以想象到的任何其他适合的工具。
AVRILOS & FPGA
目录结构
目录结构如下:
主要有两个目录:HW 和 SW。
- HW 是我所有硬件开发进行的地方。这包括板原理图和 PCB 文件以及 FPGA 设计。
- SW 是微控制器的软件树,有关更多信息,请参阅我关于 AVRILOS 的第一篇文章。
我将简要概述 FPGA 的目录结构。
- 目录 VHDL:这里是我的 FPGA 源文件。
- 目录 CFG:包含 FPGA 配置文件,如约束文件,其中放置了引脚锁定和时序指令。
- 目录 Scripts:包含 makefiles 和其他脚本。
- 目录 SIM:我在这里放置进行仿真的源文件。任何仿真脚本也放在这里。
- 目录 Synthesis:我在这里放置用于逻辑综合的文件。
- 目录 EDIF:生成的综合输出放在这里。
- 目录 Xilinx:布局和布线,以及通用的 Xilinx 流程。
- 目录 BIT:最终比特流放在这里。
- 目录 BRD:包含生成的 C 输出。
我们需要的是此结构中的 BRD 目录。此目录包含最终的 C 源文件及其相应的头文件,我们将需要将其包含到 AVRILOS 中。这些文件应复制到“sw/avr16/applic/cfg”目录,但名称必须正确,才能正确编译。稍后会详细介绍。
AVRILOS FPGA 架构说明
AVRILOS 中有两个主要模块与可编程逻辑相关。
第一个模块用于 FPGA 器件的配置或编程。对于 CPLD,XSVF 文件将在逻辑更改后按需执行以(重新)编程 CPLD。
AVRILOS 的 CPLD 配置
然而,FPGA 器件在每次上电后都需要其代码。
第二部分是与逻辑的接口。此模块是可选的,仅在我们希望微控制器控制可编程逻辑时才需要。FPGA 可能可以独立于微控制器工作。例如,这种情况可能是一个固定的计数器,或一个自主的硬件控制器。在这种情况下,此模块将不再需要。
但是,如果 FPGA 需要微控制器的某些控制,您将需要相应的模块来接口特定的 FPGA。在每个设计中,您可能有不同的接口(在硬件和软件上都匹配),但这如果想重用代码,效率不高。我得出的结论是采用 SPI/SSI 接口,它需要微控制器和 FPGA 的 3-4 条 I/O 线,并且是一个标准的逻辑接口。这使得基本的 FPGA 通信例程可以跨项目在 μC 上保持一致,并在 FPGA 上保持一致的代码。我只在 SW 和 HW 中提供一些常量来定义需要访问多少寄存器,以减少 FPGA 侧的门数。请参见下面的 CPU 和 FPGA 之间互连的示例。请参见下面的原理图。
模块说明 (SW)
模块:xcs_cfg
我建议阅读 Xilinx 的以下 PDF 文件
http://www.xilinx.com/support/documentation/application_notes/xapp098.pdf
此模块只有一个函数:void f_CfgSPIFPGA(void)
在主循环开始之前,在 AVRILOS 初始化期间调用此函数。由于此过程可能需要一些时间(数百毫秒),因此最好将其放置在初始化区域。此外,逻辑的任何后续初始化(通过应用程序接口)都可以在配置完成后生效。
我有一个旧版本,当时我配置旧的 XC3000 系列 FPGA,该配置是通过位操作下载的。这可以提供更好的引脚分配灵活性。然而,这种方法比目前模块使用的 SPI 接口要慢。
您需要以下 FPGA I/O 来以 Slave-Serial 模式进行配置
PROGRAM (MCU Output), (b_Prog)
INIT (MCU Input during configuration), (b_Init)
DONE (MCU Input), optional, not used in this module
DIN (MCU Output), connect to SPI-MOSI, (b_Din)
CCLK (MCU Output), Connect to SPI-SCLK, (b_CClk)
此模块要求您已在全局设置文件“include/settings.h”中输入了正确的引脚分配。
/**************** FPGA Configuration I/O ***********/
#define c_CFGPIN PINB
#define c_CFGPORT PORTB
#define c_CFGDDR DDRB
/* for Spartan/XL, XC4000 */
#define b_Init 3
#define b_Prog 2
/* Used with SPI */
#define b_Din 5 /* MOSI for SPI */
#define b_CClk 7
/* old definitions for XC3000 */
#define b_Reset b_Prog
#define b_Done b_Init
在上面的示例中,我仅使用 PORT-B 来控制 FPGA 配置。SPI 也在同一个端口,这简化了初始化。命名约定如下
c_CFGPIN : Pin port, for direct Input capture c_CFGPORT: Port register for setting/reseting bits c_CFGDDR: Data direction Register
位名称 b_Done
/b_Init
、b_Reset
、b_Din
、b_CClk
与端口 B 中的相应位位置相关联。例如,B_Done
/b_Init
分配给 1,表示端口 B,位 1:PB1。
文件“periphext/xcs_cfg.c”的开头包含用于方向和位控制的 I/O 宏。因此,我们可以通过“include/settings.h”文件轻松地为每个项目重新定义 I/O,并保持代码易于阅读。方向设置以及引脚控制都可以作为简单的人类可读格式命令提供。
“periphext/xcs_cfg.c”的片段
#define ToggleCCLK do{ \
cbi(c_CFGPORT, b_CClk); \
sbi(c_CFGPORT, b_CClk); \
}while(0)
// Spartan Config SPI
#define SetInit do{ sbi(c_CFGPORT, b_Init);}while(0)
#define ClrInit do{ cbi(c_CFGPORT, b_Init);}while(0)
#define InitInput do{ cbi(c_CFGDDR, b_Init) ;}while(0)
#define InitOutput do{ sbi(c_CFGDDR, b_Init) ;}while(0)
#define ClrCCLK do{ cbi(c_CFGPORT, b_CClk) ;}while(0)
#define ClrDin do{ cbi(c_CFGPORT, b_Din) ;}while(0)
#define SetProg do{ sbi(c_CFGPORT, b_Prog);}while(0)
#define ClrProg do{ cbi(c_CFGPORT, b_Prog);}while(0)
#define ProgInput do{ cbi(c_CFGDDR, b_Prog) ;}while(0)
#define ProgOutput do{ sbi(c_CFGDDR, b_Prog) ;}while(0)
…
实际下载的 FPGA 数据必须位于“applic/cfg/fpga_cfg.c/h”文件中。这是“hw/fpga/brd”目录的副本,由 cvtfpga3.exe 工具生成。
您可能需要稍微修改原始生成的 lut_cfgfpga[]
常量定义,以适应特定编译器指令,如下所示(对于 AVRGCC)。
INT8U __attribute__ ((progmem)) lut_cfgfpga[]={
0xFF, 0x04,
0xB0, 0xB4,
0xF9, 0xEA,
...
如果您使用 FPGA 流程文章中提供的 makefile,您只需相应地复制并重命名文件即可。如果您使用 -o AVRILOS 选项(make AVR)转换了比特流,该文件就符合 AVRILOS。无需内部修改。
配置函数的第一段初始化端口方向。然后初始化配置周期,之后下载数据。在最后阶段,成功或失败会报告在 v_sysstat
寄存器中。
您可以启用一些调试信息,通过启用相应的宏将其输出到串行端口
#define DBGFPGA
然后 Init 信号的状态将在各个阶段报告。
最初,代码断言 b_Prog
位以启动 FPGA 的配置周期。然后等待 b_Init
输入变高,表示 FPGA 已清除其配置内存。配置期间,数据以同步方式下载。如果过程中出现错误,b_Init
将变低,表示错误。如果下载成功,b_Init
将保持高电平。这是确定 FPGA 已配置的间接方法。或者,您必须使用一个额外的引脚并采样 DONE 信号(低电平有效)。
如果配置失败,您可以采取三种可能的行动:重试、忽略和冻结。
重试意味着您可以尝试重新配置 FPGA 一次或多次直到成功。然而,除非存在硬件问题,否则您不应出现配置错误。此外,重试机制会更复杂。而且您仍然可能无法成功。
忽略意味着您继续执行程序,FPGA 成功标志未设置,微控制器进入主循环。您可以通过不同时间的 LED Alive 来通知用户,并尽可能进行优雅降级。这在“applic/kernel.c”文件中有所展示。
#ifdef MOD_FPGAXCS_ON
v_retval = f_CfgSPIFPGA();
if (v_retval == c_FPGACFG_ERR) f_SystickSetErrLevel(c_ALIVEFPGAERR_ms);
#endif
如果发生 FPGA 配置错误,LED 将以不同的周期闪烁。
冻结意味着程序执行会暂停在一个无限循环中。因此,微处理器将无法运行,用户可能会立即注意到。尽管这是一种硬核方法,但可能无法做任何更有用的事情。
在这一段代码中,我选择了忽略选项。这是最简单的方法,并且允许在需要时进行优雅降级。此外,如果发生错误,用户会通过不同的 LED 闪烁周期得到通知。
模块:FPGA SSI 模块
此模块提供将微控制器与您的硬件设计链接的通信层。此文件与 FPGA 硬件的 SSI 接口链接。该接口是一个简单的 SPI 接口(3 线),我们将输入和输出信号多路复用在一根线上(请参见描述中的相关图)。有三个主要函数。
f_InitSSI
:用于初始化模块并进行 I/O 方向设置。
f_FPGARd
:用于读取 FPGA 寄存器。
f_FPGAWr
:用于写入 FPGA 寄存器。
读取或写入的过程如下:
Chip Select 信号被激活。然后通过 SPI 将 8 位数据传输到 FPGA。MSB 包含读或写位信息。这控制第二个传输的字节是输入还是输出(读或写操作)。其余位是访问的寄存器地址。然后第二个传输的字节是要写入该寄存器的数据(写)或寄存器的内容(读)。MCUData 引脚的数据方向由第二个字节传输的读/写位控制。
SSI 接口的端口定义在“include/settings.h”文件中定义,如下所示:
/**************** FPGA Application I/O *************/
#define c_IFCPIN PIND
#define c_IFCPORT PORTD
#define c_IFCDDR DDRD
#define b_MCUClk 7
#define b_MCUFrame 6
#define b_MCUData 3
我们假设控制 SSI 的所有端口位都在同一个端口上。在这种情况下,是 D 端口。
另一种方法是使用 SPI 接口(您可以将内部输入输出数据信号直接连接到 MISO-MOSI,而无需多路复用它们,从而形成正常的 SPI 4 线接口)。这可能对于与 FPGA 之间传输数据更快,但当您尝试通过 SPI 重新编程 AVR 时可能会出现问题,因为 FPGA 会干扰 SPI。在我使用 SPI 的一些线路进行 SSI 的情况下,我不得不保持 FPGA 复位才能重新编程 AVR。
模块:调试器
我提供了调试器命令扩展,用于控制 FPGA 访问机制(FPGA 读写操作)的主要功能。
此功能总结如下:
命令和格式摘要
命令 | 描述 |
F 00XX |
读取 FPGA 寄存器 XX (自定义命令,取决于 FPGA 代码) |
f 00XX YY |
将字节 YY 写入 FPGA 寄存器 XX (自定义命令,取决于 FPGA 代码) |
U |
执行 FPGA 重新配置,自定义命令 |
注意:所有数字均为十六进制格式,并且应为大写(区分大小写)。
我还修改了用户调试命令 (U
) 以手动重新配置 FPGA 进行测试。通常,我有一个连接到 FPGA DONE 输出的 LED,该 LED 在配置期间或设备未配置时亮起。如果编程成功,LED 将熄灭,(视觉上)指示逻辑正在运行。因此,如果我执行“U”命令,LED 将激活几秒钟,然后熄灭。如果有什么问题,LED 将保持激活状态,表示错误条件。通常这与您的互连硬件有关。
这些扩展实现在 dbgext.c 文件中。您可以在 dbgext.c 中提供自己的命令,但您还需要修改 base debugger.c 文件来获取输入并处理新命令。如果您在“scripts/hw.in”文件中禁用了 FPGA SSI 接口,则此功能会自动删除。附加命令的功能始终存在于调用 dbgext.c 函数的 debugger.c 中。
请记住,robolayer.c 在每次循环运行时都会更新 FPGA PWM 寄存器,这意味着您写入这些寄存器的任何值都将无效,因为该值几乎会立即被覆盖。但是,频率和 LED 寄存器可以测试(这些不会被更新)。
模块:串行应用程序
有关串行应用程序的详细说明,请参阅 AVRILOS 的第一篇文章。
在此示例中,我编程了以下命令:
电机 H 桥驱动器
q
:增加电机功率(后轮)。
a
:降低电机功率(后轮)。
请注意,您可以停止电机,或向前(Q)或向后(A)移动。当电机功率接近 0 时,电机停止。两个电机输出都被控制(克隆)。
RC 伺服
o
:将前轮向左转。
p
:将前轮向右转。
l
/k
:关闭/打开夹持器
m
/n
:头部向右/左转
系统启动后,输入 '*' 进入串行应用程序(默认 AVRILOS 启动到调试器模式)。然后使用上述命令手动控制机器人功能。
模块:电机
此模块是 Timer1.c 的复制粘贴。但是,对 H 桥双驱动器进行了修改。它配置电机的 PWM 频率(而 Timer1.c 用于伺服控制的低频信号)。还提供了允许刹车、停止、前进或后退的函数。它有一个非常简单的接口,您可以在其中选择要操作的通道。
模块说明 (HW)
模块:SSI 接口
我将从 FPGA 端描述 SSI 接口逻辑。SSI 块由 SSISync、SSIBitCnt、SSIFSM、SSIDecoder、SSIShifter 和 SSIRego 组成。
SSISync
执行输入同步。由于我们有高频系统时钟,所有信号都与该时钟同步(即使是 MCUClk
,用于将数据移入 FPGA 的软件时钟)。因此,此块将接口信号引入内部逻辑,避免了亚稳态问题。
SSIShifter
将数据串行移出,并提供并行输出表示,实际上是一个 SIPO 寄存器(串入并行出)。此外,此寄存器的 MSB 是逻辑的串行输出,从而实现 PISO(并行入串行出)。
SSIBitCnt
实现一个计数器,该计数器在每个位时钟上递增。FSM 使用此计数器为主系统提供控制,用于读取或写入寄存器。
SSIFSM
提供所有控制信号,用于移位、加载、读取或写入寄存器。它是通信的主要控制单元。
SSIDecoder
使相应的寄存器能够链接到 SSI 接口。每次操作(读/写)都针对选定的寄存器执行。
SSIRego
是一个寄存器类,实现 SSI 接口的寄存器输出。这是每次通信的最终数据目标。在读取模式下,其并行输出被加载到移位寄存器中,以便将数据串行移出。
时序细节如下所示。数据始终从 MSB 到 LSB 传输。第一阶段是地址阶段,其中 R/W 位是 MSB(0:写,1:读),然后是 7 位地址。如果您需要更少的寄存器,未使用的 MSB 地址位是无关紧要的,但我的习惯是将其写为零。第二阶段是数据阶段。如果 MCU 写入 FPGA,MCUData I/O 不改变方向,我们写入寄存器。如果方向是读取,则 MCUData 在 FPGA 中变成输出(并且 AVR 也应更改方向,以避免信号冲突)。由于采样限制,通信时钟的频率应低于主时钟除以 4。即,在这种情况下,8MHz 时钟最多提供 2MHz 的 MCUClk。
由于读取寄存器会消耗资源,我只使两个寄存器可读(频率和 LED)。所有其他寄存器都是只写寄存器。如果您尝试读取它们,您将得到 0xFF。
请参见下面的寄存器文件。
模块:PWM
尽管此模块命名为 pwm,但它实现了一个 8 通道 R/C 伺服控制器。实际上,通道数可以通过更改 avrilos_pkg.vhd 文件来编程。
PACKAGE avrilos_pkg IS
CONSTANT cMaxChan: integer := 8;
CONSTANT cMaxAddr: integer := 4;
CONSTANT cMaxRegs: integer := 10;
CONSTANT cADDR_FQBASE: integer := 0;
CONSTANT cADDR_PWMBASE: integer := 1;
CONSTANT cADDR_LDBASE: integer := 9;
可以更改常量 cMaxChan 来增加或减少通道数。您可能需要调整 cMaxAddr 和 cMaxRegs 来匹配所需的最高地址位数以及要访问的最高寄存器数。
架构如下所示。
原理很简单。有一个主时钟(在本例中为 8MHz)。此主时钟被分频以产生两个时间基准:
- 0.5ms 频率控制(脉冲开始)。
- 8μs 步长,用于控制脉冲宽度。
有一个频率寄存器,用于控制脉冲周期。分辨率为 0.5ms。通常,您应该将频率寄存器编程为具有 20ms (0x28) 的周期。
此频率对所有通道通用。
每个通道都有一个可编程的脉冲宽度。最小宽度为 0.5ms (0x00),最大宽度为 2.5ms (0xFF)。中间位置为 1.5ms (0x7F)。尽管标称值应在 1-2m 之间,但有时伺服具有不同的范围。因此,对于这些情况,我提供了一个更宽的范围,允许使用不同范围的周期,具体取决于您的硬件。
由于 FPGA 尺寸限制,只有频率和 LED 寄存器可以通过 SSI 读取。用于测试已经足够。如果出现问题,您可以验证对频率寄存器的写操作是否成功,或者读取的值与写入的值无关,这表明有问题。
此外,从 LED 寄存器可以获得两个控制位。一个(位 5)用于禁用输出(不生成脉冲),第二个(位 4)用于反转输出,因此您可以完全控制生成的波形。请记住,如果输出信号被反转并且您禁用了输出,则默认状态将是 '1' 而不是 '0'。
系统设置
此版本的 AVRILOS 包含一些额外的增强功能,以便于环境适配。文件“cfg/env.in”包含两个新变量:
PROGPORT = COM3 PROGDEV = avrispv2
这两个变量定义了 avrdude 的输出 COM 端口和编程器类型。因此,如果您使用的硬件与我的不同,您只需要更改环境配置文件。
在文件“cfg/hw.in”中,您定义是否需要执行 FPGA 配置以及是否需要包含 SSI 接口。
# select FPGA Configuration
# FPGA Configuration from AVR
# 2: AVR Configures FPGA XCS Spartan
# 1: AVR Configures FPGA XC3K (legacy)
# 0: FPGA configures itself from PROM
ADD_FPGA_CFG = 2
# FPGA SSI Interface (FPGA slave)
ADD_FPGA_SSI = 1
对于 ADD_FPGA_CFG
,有效值为 0(禁用)或 2(启用)。选项 1(启用 XC3K)不支持。当我需要同时支持 XC3K 和 Spartan 器件时,我使用了这个。
只有当您需要从微控制器控制逻辑时,才需要 ADD_FPGA_SSI
。如果您实现不同的通信接口或您的逻辑独立于控制器,则不需要它。
文件“cfg/swdef.in”已添加针对单个微处理器的熔断器控制。
例如,我在此示例中使用的 ATMega164p 在 Port.B1 上输出时钟(晶振频率 8MHz)。我还禁用了 JTAG 接口,因为我没有为此部分使用 JTAG 编程器,并且我需要 JTAG 端口用于正常 I/O。有一些网站可以为您计算熔断器,例如:http://www.engbedded.com/fusecalc/
输入您的参数并计算熔断器。然后将您的 l/h/efuse 参数放在相应的控制器部分,如下所示:
ifeq ($(MCU),atmega164p)
CDEFS := $(CDEFS) -Dc_MCU=3
PMCU = MEGA164P
PMCU2 = m164p
lfuse = 0xa7
hfuse = 0xd9
efuse = 0xff
endif
Cfg/Srcobj.in 文件已更新,其中包含新的源文件以支持额外的 FPGA 功能。
示例用法
我们的示例应用程序将实现支持小型机器人的基本功能。我将展示一个手工制作的板,它控制一个用于运动的电机,一个用于方向控制的伺服,一个用于头部方向(集成了红外距离传感器)的伺服,以及一个夹持器伺服。该板的框图如下所示。
请参见文章开头的详细原理图。
在此示例中,我提供了一个中间的 robolayer.c,它提供更高级别的控制。此层为将控制机器人的更高级别提供了一个简单的接口。我还没有构建它,但提供的代码足以展示 FPGA 与微控制器集成的功能。请参阅相关视频。
此视频中有两个主要部分。第一部分应用程序在特定间隔(在 ifc_time.h 中定义,c_AppInterval_ms)运行。由于在下一次应用程序迭代之前接受了许多按键,因此运动不平滑。当我将应用程序移至每个主循环运行(或可以提高应用程序频率)时,运动变得更平滑。
结论
在本文中,我介绍了一个对先前简单框架的补充,用于在您的微控制器设计中包含 FPGA 配置和控制。我试图采用一种简化的方法,以便更容易地集成具有通用通信功能的各种硬件。所有这些附加功能都放在 AVRILOS 框架内。其优点是,即使不了解 FPGA 开发的用户,也可以使用其他人为他们的主板设计的现成 FPGA 设计。唯一的限制是引脚锁定。如果他们有一个经过验证的设计及其综合网表,他们可以通过运行一个生成当前文章所需 C 源文件的脚本来运行 FPGA 的其余流程(请参阅先前相关的文章),并带有特定的引脚锁定约束。
许可证
本文以及任何相关的源代码和文件,均受 CDDL 许可(https://open-source.org.cn/licenses/cddl1.php)
如有任何问题:avrilos[at]ilialex.gr
历史
- 版本 1.0,初始发布。
- 版本 1.1,增加了 SSI 的硬件细节。