65.9K
CodeProject 正在变化。 阅读更多。
Home

Xilinx FPGA 与 AVRILOS

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (12投票s)

2011年5月28日

CDDL

21分钟阅读

viewsIcon

51728

downloadIcon

707

如何将 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 的工具是

  1. (软件) WinAVR (适用于 Windows 的 AVR GCC)。
  2. (软件) Atmel AVR Studio (用于仿真)。
  3. (软件) 您偏好的编辑器。
  4. (软件) 终端程序 (例如,Terminal, PuTTY)。
  5. (软件) 编程器软件 (AVRDude 已包含在 WinAVR 中,但如果您愿意,也可以使用 AVREAL32)。
  6. (硬件) 硬件板,您的控制器和 FPGA 在上面运行!
  7. (硬件) AVR 编程器加密狗。
  8. (硬件) USB/RS232-TTL 串行电平转换器,用于连接监视器。

用于 FPGA 开发的工具 (本文中介绍)

  1. Xilinx Spartan4K 开发工具
  2. (软件) CvtFPGA,将 HEX 或 BIN 文件转换为 C 数组代码的工具。

您可能需要的其他工具

  1. GNUWIN32 (用于 makefiles,如果我不使用 WinAVR,即其他编译器包,如 MPLAB)
  2. (硬件) 示波器 (推荐)
  3. (硬件) 万用表 (至少这个!)
  4. 您可以想象到的任何其他适合的工具。

AVRILOS & FPGA

目录结构

目录结构如下:

dirtree.jpg

主要有两个目录:HW 和 SW。

  1. HW 是我所有硬件开发进行的地方。这包括板原理图和 PCB 文件以及 FPGA 设计。
  2. SW 是微控制器的软件树,有关更多信息,请参阅我关于 AVRILOS 的第一篇文章。

我将简要概述 FPGA 的目录结构。

  1. 目录 VHDL:这里是我的 FPGA 源文件。
  2. 目录 CFG:包含 FPGA 配置文件,如约束文件,其中放置了引脚锁定和时序指令。
  3. 目录 Scripts:包含 makefiles 和其他脚本。
  4. 目录 SIM:我在这里放置进行仿真的源文件。任何仿真脚本也放在这里。
  5. 目录 Synthesis:我在这里放置用于逻辑综合的文件。
  6. 目录 EDIF:生成的综合输出放在这里。
  7. 目录 Xilinx:布局和布线,以及通用的 Xilinx 流程。
  8. 目录 BIT:最终比特流放在这里。
  9. 目录 BRD:包含生成的 C 输出。

我们需要的是此结构中的 BRD 目录。此目录包含最终的 C 源文件及其相应的头文件,我们将需要将其包含到 AVRILOS 中。这些文件应复制到“sw/avr16/applic/cfg”目录,但名称必须正确,才能正确编译。稍后会详细介绍。

AVRILOS FPGA 架构说明

AVRILOS 中有两个主要模块与可编程逻辑相关。

第一个模块用于 FPGA 器件的配置或编程。对于 CPLD,XSVF 文件将在逻辑更改后按需执行以(重新)编程 CPLD。

AVRILOS 的 CPLD 配置

04_cpldavrilos.png 

然而,FPGA 器件在每次上电后都需要其代码。

AVRILOS 的 FPGA 配置

03_fpgaavrilos_s.png

第二部分是与逻辑的接口。此模块是可选的,仅在我们希望微控制器控制可编程逻辑时才需要。FPGA 可能可以独立于微控制器工作。例如,这种情况可能是一个固定的计数器,或一个自主的硬件控制器。在这种情况下,此模块将不再需要。

但是,如果 FPGA 需要微控制器的某些控制,您将需要相应的模块来接口特定的 FPGA。在每个设计中,您可能有不同的接口(在硬件和软件上都匹配),但这如果想重用代码,效率不高。我得出的结论是采用 SPI/SSI 接口,它需要微控制器和 FPGA 的 3-4 条 I/O 线,并且是一个标准的逻辑接口。这使得基本的 FPGA 通信例程可以跨项目在 μC 上保持一致,并在 FPGA 上保持一致的代码。我只在 SW 和 HW 中提供一些常量来定义需要访问多少寄存器,以减少 FPGA 侧的门数。请参见下面的 CPU 和 FPGA 之间互连的示例。请参见下面的原理图。

原理图 (点击查看全尺寸图像)

Baracuda_124_thumb.png

模块说明 (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_Initb_Resetb_Dinb_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 线),我们将输入和输出信号多路复用在一根线上(请参见描述中的相关图)。有三个主要函数。

  1. f_InitSSI:用于初始化模块并进行 I/O 方向设置。
  2. f_FPGARd:用于读取 FPGA 寄存器。
  3. 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 组成。

SSI 接口

05_ssi_s.png

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。

ssi_hw_ifc.png 由于读取寄存器会消耗资源,我只使两个寄存器可读(频率和 LED)。所有其他寄存器都是只写寄存器。如果您尝试读取它们,您将得到 0xFF。

请参见下面的寄存器文件。

ssi_regfile.png

模块: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 来匹配所需的最高地址位数以及要访问的最高寄存器数。

架构如下所示。

PWM 伺服控制

06_pwm_s.png

原理很简单。有一个主时钟(在本例中为 8MHz)。此主时钟被分频以产生两个时间基准:

  1. 0.5ms 频率控制(脉冲开始)。
  2. 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 功能。

示例用法

我们的示例应用程序将实现支持小型机器人的基本功能。我将展示一个手工制作的板,它控制一个用于运动的电机,一个用于方向控制的伺服,一个用于头部方向(集成了红外距离传感器)的伺服,以及一个夹持器伺服。该板的框图如下所示。

硬件框图

BlockDiagram_s.png


请参见文章开头的详细原理图。

在此示例中,我提供了一个中间的 robolayer.c,它提供更高级别的控制。此层为将控制机器人的更高级别提供了一个简单的接口。我还没有构建它,但提供的代码足以展示 FPGA 与微控制器集成的功能。请参阅相关视频。

AVRILOS 和 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 的硬件细节。
© . All rights reserved.