“ 在本文中,我将向大家展示一个结合了树莓派Pico (RP2040) 与 Cyclone 10 FPGA 的pcb设计项目。我将解释项目中的一些设计决策,如何准备生产所需的文件,以及如何在本次项目的赞助商 NextPCB 完成PCBA下单。此外,我们还将用 C 语言和 Verilog 硬件描述语言(HDL)开发一些固件,来共同“点亮”这块板子,并玩转它的两个核心:RP2040 和 FPGA。话不多说,让我们开始吧!”
1lyp5uvnsuu6405415422.png
目录顶层硬件/软件架构RP2040+FPGA 硬件设计指南与文档PCB布局、功能分区与引脚定义在NextPCB + HQ-Online(华秋商城)下 PCBA 订单硬件上电(冒烟)测试与注意事项RP2040 GPIO测试 (LED闪烁)RP2040 ADC + PWM 示例Cyclone 10 FPGA IO 测试 (DIP开关 + LED)Cyclone 10 FPGA JTAG 编程Cyclone 10 FPGA QSPI Flash 配置测试项目核心测试:RP2040 + FPGA (SPI通信)RP2040 + FPGA SPI 最高速度测试RP2040 OLED显示示例其他板载外设测试总结顶层硬件/软件架构
首先,这个项目背后的初衷是设计一块集成 RP2040 微控制器和低成本 FPGA 的板卡,用于实验各种芯片间的数字通信方案,例如 SPI 总线和自定义 IO 总线(使用PIO)。
我们可以将系统设置成这样:从 RP2040 的角度看,FPGA 是完全“透明”的,就像一个内存映射 I/O(MMIO)的外设扩展。反之,我们也可以在 FPGA 上实现一个软核处理器,并将RP2040配置为一个从设备。这种架构非常灵活,拥有无限的应用可能。
下图展示了我们项目中要实现的目标硬件/软件系统架构。
q0hyxmfyygi6405415522.png
RP2040 侧在 RP2040 这边,我们会使用一个主 SPI 外设来处理与 FPGA 的底层通信。在固件(软件栈)中,我们会实现某种形式的 MMIO 寻址、IO 读写操作、解码等。通过这种方式,我们可以将 MMIO 外设的寻址操作从固件的应用层中抽象出来。
然后,我们可以为 FPGA 上实现的自定义硬件外设编写一些固件驱动程序。这样做同样能将自定义外设的操作细节从应用层的视角中抽象出来。
最终,使用 RP2040 微控制器自身的硬件定时器外设,和使用一个在 FPGA 上自定义设计的硬件定时器外设,体验将几乎没有差别。当然,我们不会仅仅为了多几个定时器就大费周章,但你应该能明白这个思路。
FPGA (Cyclone 10) 侧在 FPGA 这边,我们将实现一个硬件从 SPI 外设来处理与 RP2040 的通信。然后,我们会将接收到的数据传递给一个自定义的总线管理器,该管理器内部应包含某种状态机,用于编解码传入/传出的 SPI 数据。在这一步,串行的 SPI 数据将被转换为并行的总线数据/控制信号。
接着,我们会连接一个 MMIO 控制器,它负责控制自定义外设的内存 IO 操作,并标准化每个自定义外设的挂载方式。这使得系统更具扩展性和可移植性。
同样,这也只是系统工作方式的一个例子。它当然也可以将 SPI 总线桥接到 AXI-4/AXI-Lite 总线,以便挂载软核处理器或标准的硬件 IP 核,可能性还有很多。
RP2040-FPGA 芯片间连接RP2040 微控制器和 Cyclone 10 FPGA 芯片之间有两条总线连接:SPI 总线 (4线)
使用 SPI 总线,我们可以利用 RP2040 的硬件外设与 FPGA 进行高速通信(最高可达62.5Mbps)。我们还可以通过 RP2040 内部的 DMA 单元实现批量数据传输,从而极大地减少 CPU 的干预。自定义IO总线 (4线)
利用 RP2040 独特的 PIO(可编程I/O),我们可以轻松实现任何自定义的数字通信协议,以达到非常高的数据传输速度。这为未来的无限可能性和实验敞开了大门。
[/ol]硬件设计指南与文档在设计这样的系统时,官方文档和指南是我们最好的朋友。Intel/Altera提供了许多非常有用的文档,我在设计这块板子时都用到了,包括:
Cyclone 10 LP 器件数据手册Cyclone 10 LP 设计指南Cyclone 10 LP (10CL006) 引脚信息RP2040 也是如此,树莓派官网上有几份很有帮助的文档:
RP2040 参考手册RP2040 硬件设计指南树莓派 Pico 数据手册你也可以参考我之前关于 RP2040 的项目,它演示了如何围绕 RP2040 微控制器设计自定义 PCB 板,我在这个项目中也完全沿用了那部分设计。
https://deepbluembedded.com/raspberry-pi-pico-rp2040-schematic-pcb-design-in-kicad/
PCB 布局、功能分区与引脚定义这是板子在KiCAD 3D视图中的顶层和底层布局。我特意将所有东西按逻辑分区,并保持其易用性。在 CAD 软件里看起来很大的 PCB,现实中很容易变得笨拙难用。我尽力将用户需要交互的元件放在易于触及和操作的位置。
板子尺寸为:6cm x 9cm (它非常小,不像在CAD软件里看起来那么大)
ht4dqkc4f2x6405415622.png
1. 直流电源输入 + USB
板上有两个 USB-C 接口,一个用于电源输入(+5V)和 RP2040 的 USB 通信(UF2烧录程序时需要),另一个 USB 口连接到一个 USB 转 UART 桥接芯片,通往FPGA。
2. 电源 (稳压器)
板上有三个 DC/DC 降压转换器和一个模拟电压参考,它们分别是:
+3V3 (FPGA+RP2040 Vcc)+1V2 (FPGA Core)+2V5 (FPGA Aux.)+3.3VA (REF3033)
r15clcjljbn6405415722.png
3. RP2040 MCU电路 + QSPI FLASH
RP2040 微控制器需要 +3.3V 的 IOVdd 输入电压、内部稳压器提供的 +1.1V 核心电压、100nF 的去耦电容和一个 12MHz 的晶体振荡器。
与市面上大多数微控制器不同,RP2040 没有内置闪存,因此需要一个外部 QSPI 闪存芯片。你可以选择2MB、4MB、8MB或16MB的闪存。
在我的板子上,我使用了 RP2040 的 XIP(eXcute-In-Place)接口所允许的最大闪存容量:16MB (128Mbit)。
我还增加了一个RESET按钮,以及用于UF2编程的BOOT按钮。
4. Cyclone 10 LP (10CL006) FPGA电路
FPGA 芯片有很多 Bank 和特殊功能的 IO 引脚,需要按照 Intel/Altera 官方文档中详细说明的方式进行连接。
VCCIO、VCCA 和 VCCINT 引脚都按数据手册建议连接。MSEL[2:0] = ASx1 (Active Serial) 模式允许 FPGA 从一个 SPI 串行闪存芯片加载配置比特流。我使用了一个64Mbit的QSPI闪存芯片。
我用作 FPGA 主时钟源的 CMOS 振荡器是一个 50MHz 的振荡器。当然,我们可以利用 FPGA 内部的2个PLL单元来调整这个频率(这款FPGA的PLL最高可达 400MHz)。
5. RP2040 板载外设
连接到RP2040微控制器的板载外设有:
2个按键 (Reset, Boot)1个 LED (可用 PWM 控制)1个 OLED 0.96 英寸显示屏1个旋转电位器1个6轴 IMU 传感器 (ICM-42670)6. FPGA 板载外设
连接到Cyclone 10 LP FPGA的板载外设有:
8个 DIP 开关8个 LED4个按键1个模拟 RGB (PWM) LED1个 NeoPixel RGB (WS2812) LED1个 64kBit I2C EEPROM芯片 (24C64)7. IO端口
板上有4组排针端口:
2x (25x2) IO 排针: RP2040 = 15个 IO, FPGA = 41个IO1x FPGA JTAG 排针1x RP2040 SWD 排针RP2040+FPGA 板引脚定义图
这是我们项目板卡的引脚定义图。
5mvcx0ff3up6405415822.png
在 @NextPCB 上下单
可以在网页上下单,也可以使用 KiCad 的插件:
jeffun2usp56405415922.jpg
q32il51ny5o6405416022.jpg
到货了!
x0lxl5ddc346405416123.png
硬件上电(冒烟)测试与注意事项首先,我需要手动焊接/安装一些直插元器件。
m53xgbjie1f6405416223.png
然后,我用显微镜和“Fine Needle”万用表探头快速检查,确保关键电源网络没有短路,并检查关键电源路径(VCC, VCCINT, VCCA等)的导通性。
一切看起来都很完美。下一步,我从我的“限流”电源上给板子通电(+5V/50mA)。这样做是为了以防万一,即使有问题,也不会有足够大的电流造成严重损坏。谢天谢地,它完美地工作了起来,只消耗了几个毫安的电流。
以下是实际测量的电源电压:
p1wihlckfsm6405416323.png
到这一步,我信心十足地插上了 USB 线,准备开始真正的测试工作!
RP2040 GPIO 测试 (LED闪烁)这是第一个“RP2040测试”示例,我们将闪烁板载的 LED 灯。编译固件并使用 UF2 引导加载程序将其烧录到板子上。
测试结果: LED成功闪烁!
RP2040 ADC + PWM 示例接下来,我们测试 RP2040 的 ADC。通过读取板载的模拟旋转电位器的值,然后用它作为占空比控制信号,来调节板载 LED 的亮度。
测试结果: 转动电位器,LED亮度平滑变化。
Cyclone 10 FPGA IO测试 (DIP开关 + LEDs)这是第一个“FPGA测试”示例。我将 8 个 DIP 开关通过 FPGA 内部连接到 8 个 LED,用开关控制灯的状态。同时,将 3 个按键连接到 RGB LED 的红、绿、蓝引脚。这是一个非常基础的测试,用来验证 FPGA 至少能正常工作,并能接收比特流文件来执行相应的功能。
测试结果: 开关和按键都能正确控制对应的LED。
Cyclone 10 FPGA JTAG 编程为了将比特流加载到我的 Cyclone 10 FPGA 上,我尝试了市面上常见的两种 Altera USB Blaster。由于我使用的是最新版本的 Quartus Prime(精简版),所以 Waveshare USB Blaster v2 对我来说比较好用。
不过,便宜的 USB Blaster 也能用,电脑也能检测到,驱动程序也能安装,一切正常。但它在我这里没有出现在 Quartus Prime 软件中。也许它在旧版本的软件包下能用。
uybzho224og6405416423.png
Cyclone 10 FPGA QSPI Flash 配置测试在之前的示例中,只要按下复位按钮或断电,FPGA的 配置(比特流)就会丢失。因此,我们需要测试 QSPI Flash 的配置功能。我将比特流准备成 JIC(JTAG间接配置)文件格式,然后通过JTAG连接将其烧录到QSPI存储器中。
这将使我们的FPGA设计永久存储在QSPI闪存中,并在上电或按下复位按钮后自动加载。
测试结果: 断电重启后,FPGA 成功加载了之前的配置,功能恢复正常。
项目核心测试:RP2040 + FPGA (SPI通信)现在,我们来进行真正的核心测试。在这个例子中,我们将实现:
RP2040固件(C语言): RP2040 将使用 ADC 读取模拟电位器的值,将其从12位缩放到8位,然后通过 SPI 发送给 FPGA 芯片。Cyclone10 FPGA HDL(Verilog): 在 FPGA 上,我们将创建一个硬件 SPI 从机模块和一个 PWM 生成器。每当 SPI 从机设备接收到一个字节的数据,它就会被锁存并加载到 PWM 的占空比控制寄存器中。PWM 的输出将连接到板载 RGB 的蓝色 LED。
c0fxrfswrby6405416523.png
因此,RP2040的电位器将控制 FPGA 的 PWM 输出,进而控制 RGB 上蓝色 LED 的亮度。我们将 SPI 通信速度设置为 1Mbps 以确保一切正常,然后再逐步提高速度。
测试结果: 完美实现!转动电位器,蓝色LED的亮度随之变化。
RP2040 + FPGA SPI 最高速度在对系统在 1Mbps SPI 速度下的性能充满信心后,我开始逐渐提高 SPI 通信速度。当速率达到 30Mbps 时,通信开始出错,这是因为我的 FPGA 使用的是板载的原始 50MHz 时钟源。
因此,我启用了 FPGA 内部的一个PLL单元,将时钟“泵”到 30Mbps,并将该时钟提供给我所有的HDL模块(尤其是SPI从机)。这样做之后,我们就可以在 62.5Mbps 的速率下轻松维持稳定的 SPI 通信,这也是 RP2040 在 125MHz 系统时钟下运行时的最高 SPI 速度。
这对我来说简直太棒了!因为我在网上看到很多关于 SPI 线路端接以及在速度超过 30MHz 时会出现问题的讨论。而我没有使用任何并行或串联端接电阻,只是遵循了信号完整性的通用布线最佳实践。
RP2040 OLED 显示示例在结束本项目之前,最后一个示例演示是板载 0.96 英寸 OLED RGB 显示屏。以下是一段演示视频,展示了一些存储在 RP2040 上并在 OLED 屏幕上显示的图像。
额外的电路板外设测试鉴于这是该硬件设计 PCB 项目的首次迭代。目前,所有测试都按预期运行,没有任何问题。这已经是一个很大的成功了!
如果其他辅助外设也能正常工作,那将是额外的胜利。剩余未测试的外设包括:
IMU (ICM-42670) – [RP2040]I2C EEPROM (24C64) – [FPGA]Neopixel RGB (WS2812) LED – [FPGA]
我没有时间为上述部件开发一些设备驱动程序,但我相信它们也能正常工作。
总结通过这个项目,我希望你觉得它对你有帮助、有启发,或者至少觉得它很有趣。我有很多想用这块板子做的实验,特别是微控制器和 FPGA 之间的数字通信。我将尽力记录后续的工作,并希望能在我们的油管频道上分享一些内容,敬请关注。
如果你有任何问题,或者希望我用这块板子做一个特定的应用,甚至是用不同的规格(FPGA、MCU、传感器、外设等)创造一块新板子,欢迎在评论中告诉我。我很乐意听听你的看法。
以下是油管的完整项目视频链接:
https://youtu.be/bl_8qcS0tug
本文转载自:https://deepbluembedded.com/rp2040-cyclone-10-fpga-pcb-design-project/,经过翻译、校对
注意:如果想第一时间收到 KiCad 内容推送,请点击下方的名片,按关注,再设为星标。
常用合集汇总:
和 Dr Peter 一起学 KiCad
KiCad 8 探秘合集
KiCad 使用经验分享KiCad 设计项目(Made with KiCad)常见问题与解决方法KiCad 开发笔记插件应用
发布记录
|