用MCU的方式玩FPGA——Arduino MKR Vidor 4000评测

网友投稿 2018-11-24 19:02

Arduino MKR Vidor 4000的出现确实让我挺意外的,为何?因为它是一款FPGA开发板。众所周知,Arduino最深入人心的东西就是其简单的入门,快速的开发,这种特性很好的体现在它的硬件以及开发工具上,因此,Arduino一度成为刚接触嵌入式编程的学生或者工程师群体,甚至是电子业余爱好者的首选。

但是,MKR Vidor 4000的推出打破了这种简单,FPGA相比MCU入门更难,开发工具也庞大复杂,学习成本大,甚至说你没有一定的专业知识连入门都不易,那这种有违Arduino特色的板子意义何在?我理解为两点:

① 目前人工智能火爆,而FPGA则是人工智能中可谓全能的角色,高端可用于推理加速乃至训练,入门级的则作为嵌入式边缘计算的辅助被很好的应用在低功耗领域,如物联网、移动电子设备等,所以FPGA作为一个“有潜力的风口”切入不错。

② 目前Arduino所有的产品核心器件较为单一,都是简单的通用MCU,甚至连个“全家桶”MCU都没有,这种单一适合初学者,但是无法满足更高需求的用户,因此推更加灵活和强大的FPGA作为产品线的补充,用于覆盖更多用户群体。当然,这只是我个人的推测,事实究竟是怎样?相信看完本文你也会有自己的理解。

MKR Vidor 4000

MKR Vidor 4000作为一款拇指型的开发板,小巧精致是它固有的特性,这是优点,同时也是缺点。优点在于没有复杂的硬件,上手理解应该会比较简单;而缺点则是因为太过简单,所以注定不可能搭载很多功能,而且更多的功能实现都需要靠外接其它功能外设支持,成本花销会很大。不过对于MKR Vidor 4000来说,这种缺点不明显,为何?因为它不像其它的Arduino开发板一样搭载纯粹的MCU,MKR Vidor 4000搭载英特尔FPGA与Microchip MCU相结合,其特有的属性让它变得非常灵活又难能可贵,比如它可以做以往Arduino系列板卡做不到的事情,处理高速的音频、视频信号。

https://cdn.china-scratch.com/timg/181126/1Z2113401-0.jpg

从我见到MKR Vidor 4000的第一眼开始就知道这个板子非常适合作为原型开发,当你了解清楚这板子的功能后完全可以基于此做应用级的开发,板子搭载的众多丰富接口都有配套的外设模块,有钱就买买买,当然没钱的话玩玩单板其实也是可以的,毕竟FPGA的无限可编程性还是能给大家留下一个预期。Vidor 4000的外设接口分布如下图所示:

https://cdn.china-scratch.com/timg/181126/1Z2116458-1.jpg

Vidor 4000板子的背面很简洁,主要是板卡的电源管理部分。而对应的另一侧则是miniPCIe接口,这在Arduino的开发板上还属于十分罕见,也是因为这个接口的原因,很多应用可以直接基于Vidor 4000做原型开发。有些疑问的地方是板子PCB两个U型凹槽不知道有什么意义?

https://cdn.china-scratch.com/timg/181126/1Z212A18-2.jpg

在靠近MicroUSB接口处有两颗电源芯片,一颗为TI的bq24195L,集成了开关模式电池管理和系统电源路径管理,可以应用于各类移动电源、平板电脑和其他便携式设备的单节锂离子和锂聚合物电池,在这块板子上,当同时存在电池与USB供电的时候,通过内部开关会自动切换为USB供电;另一颗为英特尔的EZ6301QI,这是一款可扩展的多输出 PowerSoC,集成了 3 个独立电源:一个 1.5A DC-DC 降压转换器(包含集成式电感器)和两个300mA的线性稳压器,如下图所示,仅需少量的外围器件就可以组成Vidor 4000所需要的电源系统。

https://cdn.china-scratch.com/timg/181126/1Z2145919-3.jpg

板子正面的5V MicroUSB供电接口,外接I2C模块接口以及锂电池供电接口。

https://cdn.china-scratch.com/timg/181126/1Z215K37-4.jpg

另一侧则是几个比较“高端”的接口,miniPCEIe、MiPi CSI、MicroHDMI。

https://cdn.china-scratch.com/timg/181126/1Z2156331-5.jpg

这种接口一般在Arduino的MCU开发板上基本不会存在,但在Vidor 4000上齐全了,这主要依托于板载的这颗Intel Cyclone 10 FPGA,因此板子上的miniPCIe接口所涉及到的引脚都是FPGA的可编程IO口,用户可以自己定义需要的接口信号,非常灵活,也易于嵌入式到现有的产品中去。

https://cdn.china-scratch.com/timg/181126/1Z2162M5-6.jpg

英特尔的Cyclone FPGA具体型号为10CL016YU256CBG,包含16K逻辑单元,504 KB嵌入式RAM和56个18x18 bit HW乘法器,用于高速DSP。每个pin脚都可以在150 MHz以上速度进行切换,并可配置为UART,(Q)SPI,高分辨率/高频率 PWM,正交编码器,I2C,I2S,Sigma Delta DAC等功能。

FPGA部分关联的功能以及外设接口,参照下表:

https://cdn.china-scratch.com/timg/181126/1Z21A152-7.jpg

MCU部分关联的功能以及外设接口,参照下表:

https://cdn.china-scratch.com/timg/181126/1Z21C138-8.jpg

上电使用

如果您本身熟悉FPGA开发,那么毫无疑问你对Verilog,VHDL和RTL都不陌生。虽然Vidor的工具链提供了对这些语言的支持,但这肯定不是它原本的目的,要不然用户为何要选择这个Arduino的FPGA开发板(市面上更多功能,更强性能的FPGA开发板多的是),而且,这样的话将Arduino的生态置于何处?

Vidor 4000的目的显然是让任何人都可以更轻松配置FPGA,玩转FPGA,所以传统的FPGA开发方式肯定不是Vidor 4000想传达给用户的,这点很重要,也就是说,你可以将Vidor看作是一个使用FPGA的平台,而不是一个学习FPGA的平台。真要学习FPGA的朋友,推荐使用爱板网评测过的另一款小脚丫FPGA比较合适。

官方为MKR Vidor 4000开发板提供了不少库以及IP,如MIPI相机输入、DVI输出、120MHz DAC、QR码跟踪器、PWM、四编码器、I2C,I2S,SPI和UART、FFT、FIR滤波器,所以,我们可以直接拿来使用。

必要的开发环境安装有:(Vidor 4000三件套)

  • Arduino IDE工具

  • MKR Vidor开发板支持包

  • 库管理包

https://cdn.china-scratch.com/timg/181126/1Z21KP4-9.jpghttps://cdn.china-scratch.com/timg/181126/1Z21HY1-10.jpghttps://cdn.china-scratch.com/timg/181126/1Z21I460-11.jpg

东西准备就绪,那就可以使用上面的“三件套”实现基本的功能演示,我们借助了树莓派上的摄像头,通过MiPi摄像头接口输入,MicroHDMI输出,输出连接到显示器上。

https://cdn.china-scratch.com/timg/181126/1Z21L937-12.jpg

程序是一个二维码检测器。

https://cdn.china-scratch.com/timg/181126/1Z21G3Q-13.jpg

源码如下

#include "VidorGraphics.h"
#include "VidorCamera.h"

VidorCamera vcam;

#define MAXDIM 10

static uint16_t x[QR_PT_DET_NUM], y[QR_PT_DET_NUM];

struct qrPtn {
uint16_t x[QR_PT_DET_NUM];
uint16_t y[QR_PT_DET_NUM];
};

static qrPtn qrBufferPtn[MAXDIM];

uint16_t count = 0, last;

void setup() {
Serial.begin(9600);

// wait for the serial monitor to open,
// if you are powering the board from a USB charger remove the next line
while (!Serial);

if (!FPGA.begin()) {
Serial.println("Initialization failed!");
while (1) {}
}
/**
begin() enable the I2C communication and initialize the display for the camera
*/
if (!vcam.begin()) {
Serial.println("Camera begin failed");
while (1) {}
}
/**
qrrec.begin(); enable the QR code recognition
*/
vcam.qrrec.begin();
delay(4000);
Serial.println("Power ON");
}

void loop() {
/**
qrrec.readQRCode(); get, if available, the coordinates of the QR code in the screen
*/
vcam.qrrec.readQRCode();
for (int i = 0; i < QR_PT_DET_NUM; i++) {
if (vcam.qrrec.qr.pt[i].valid) {
x[i] = (vcam.qrrec.qr.pt[i].xs + vcam.qrrec.qr.pt[i].xe) / 2;
y[i] = (vcam.qrrec.qr.pt[i].ys + vcam.qrrec.qr.pt[i].ye) / 2;
vcam.vgfx.Cross(x[i], y[i], 65535);

}
}

last = count % MAXDIM;
for (int i = 0; i < QR_PT_DET_NUM; i++) {
vcam.vgfx.Cross(qrBufferPtn[last].x[i], qrBufferPtn[last].y[i], 0, 0);
qrBufferPtn[last].x[i] = x[i];
qrBufferPtn[last].y[i] = y[i];
}
count++;
}

编译下载,实际的运行结果如下,可以在显示器上看到经过摄像头采集,FPGA处理后输出的图像效果,显然图像处理方面应该没有任何调教过,优化,所以看起来会比较渣,但是二维码的检测定位的功能是没问题的。

https://cdn.china-scratch.com/timg/181126/1Z21Va6-14.jpg

除了此demo外还有不少关于摄像头输入和HDMI输出的demo,相较之下还比这个二维码检测的demo少了些许功能,而在图像输出上也没什么提升,所以不再演示了。从Vidor 4000提供的一些demo不难发现基本上都是关于一些IP的使用,明白我意思不,这个所谓的“使用”,不是教你如何去学习开发FPGA,而是教你如何像先前使用Arduino IDE开发MCU那样去玩FPGA,官方将复杂的功能实现都模块化成库或者IP,用户只需通过原本的Arduino IDE工具像简单的MCU开发一样去使用FPGA。

小结

相比传统的Arduino开发板,Vidor 4000的优势在于集成了灵活多变的FPGA,体现在板卡上的话就是具备了MiPi CSI(没有MIPI DSI接口是个遗憾)、MicroHDMI、miniPCIe等与传统的Arduino MCU开发板不同的“先进”接口,配合Arduino官方提供的库以及相关的IP,用户可以在原本简单的Arduino开发板实现更加灵活、更多功能的扩展,实现更复杂的应用。在不少用户眼里,认为Arduino的简单是理所当然的,但是我要说的是我们现在所能得到Arduino的一切理所当然的简单是靠许许多多工程师倾注心血用复杂去构建,Arduino之所以能在全球范围内流行,并不是因为它本身简单,而是它将复杂简单化,就比如说文章中的MKR Vidor 4000,这或许是你这辈子最有底气去接触FPGA的一个产品了。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com