ArduinoMKRVidor4000的出现确实让我挺意外的,为何?因为它是一款FPGA开发板。众所周知,Arduino最深入人心的东西就是其简单的入门,快速的开发,这种特性很好的体现在它的硬件以及开发工具上,因此,Arduino一度成为刚接触嵌入式编程的学生或者工程师群体,甚至是电子业余爱好者的首选。但是,MKRVidor4000的推出打破了这种简单,FPGA相比MCU入门更难,开发工具也庞大复杂,学习成本大,甚至说你没有一定的专业知识连入门都不易,那这种有违Arduino特色的板子意义何在?我理解为两点:1.目前人工智能火爆,而FPGA则是人工智能中可谓全能的角色,高端可用于推理加速乃至训练,入门级的则作为嵌入式边缘计算的辅助被很好的应用在低功耗领域,如物联网、移动电子设备等,所以FPGA作为一个“有潜力的风口”切入不错;2.目前Arduino所有的产品核心器件较为单一,都是简单的通用MCU,甚至连个“全家桶”MCU都没有,这种单一适合初学者,但是无法满足更高需求的用户,因此推更加灵活和强大的FPGA作为产品线的补充,用于覆盖更多用户群体。当然,这只是我个人的推测,事实究竟是怎样?相信看完本文你也会有自己的理解。MKRVidor4000MKRVidor4000作为一款拇指型的开发板,小巧精致是它固有的特性,这是优点,同时也是缺点。优点在于没有复杂的硬件,上手理解应该会比较简单;而缺点则是因为太过简单,所以注定不可能搭载很多功能,而且更多的功能实现都需要靠外接其它功能外设支持,成本花销会很大。不过对于MKRVidor4000来说,这种缺点不明显,为何?因为它不像其它的Arduino开发板一样搭载纯粹的MCU,MKRVidor4000搭载英特尔FPGA与MicrochipMCU相结合,其特有的属性让它变得非常灵活又难能可贵,比如它可以做以往Arduino系列板卡做不到的事情,处理高速的音频、视频信号。从我见到MKRVidor4000的第一眼开始就知道这个板子非常适合作为原型开发,当你了解清楚这板子的功能后完全可以基于此做应用级的开发,板子搭载的众多丰富接口都有配套的外设模块,有钱就买买买,当然没钱的话玩玩单板其实也是可以的,毕竟FPGA的无限可编程性还是能给大家留下一个预期。Vidor4000的外设接口分布如下图所示:Vidor4000板子的背面很简洁,主要是板卡的电源管理部分。而对应的另一侧则是miniPCIe接口,这在Arduino的开发板上还属于十分罕见,也是因为这个接口的原因,很多应用可以直接基于Vidor4000做原型开发。板子PCB上也贴心的开了两个U型凹槽用于螺丝固定,真正方面那些需求融合进自己产品设计的用户。在靠近MicroUSB接口处有两颗电源芯片,一颗为TI的bq24195L,集成了开关模式电池管理和系统电源路径管理,可以应用于各类移动电源、平板电脑和其他便携式设备的单节锂离子和锂聚合物电池,在这块板子上,当同时存在电池与USB供电的时候,通过内部开关会自动切换为USB供电;另一颗为英特尔的EZ6301QI,这是一款可扩展的多输出PowerSoC,集成了3个独立电源:一个1.5ADC-DC降压转换器(包含集成式电感器)和两个300mA的线性稳压器,如下图所示,仅需少量的外围器件就可以组成Vidor4000所需要的电源系统。板子正面的5VMicroUSB供电接口,外接I2C模块接口以及锂电池供电接口。另一侧则是几个比较“高端”的接口,miniPCEIe、MiPiCSI、MicroHDMI。这种接口一般在Arduino的MCU开发板上基本不会存在,但在Vidor4000上齐全了,这主要依托于板载的这颗IntelCyclone10FPGA,因此板子上的miniPCIe接口所涉及到的引脚都是FPGA的可编程IO口,用户可以自己定义需要的接口信号,非常灵活,也易于嵌入式到现有的产品中去。英特尔的CycloneFPGA具体型号为10CL016YU256CBG,包含16K逻辑单元,504KB嵌入式RAM和56个18x18bitHW乘法器,用于高速DSP。每个pin脚都可以在150MHz以上速度进行切换,并可配置为UART,(Q)SPI,高分辨率/高频率PWM,正交编码器,I2C,I2S,SigmaDeltaDAC等功能。FPGA部分关联的功能以及外设接口,参照下表:MCU部分关联的功能以及外设接口,参照下表:上电使用如果您本身熟悉FPGA开发,那么毫无疑问你对Verilog,VHDL和RTL都不陌生。虽然Vidor的工具链提供了对这些语言的支持,但这肯定不是它原本的目的,要不然用户为何要选择这个Arduino的FPGA开发板(市面上更多功能,更强性能的FPGA开发板多的是),而且,这样的话将Arduino的生态置于何处?Vidor4000的目的显然是让任何人都可以更轻松配置FPGA,玩转FPGA,所以传统的FPGA开发方式肯定不是Vidor4000想传达给用户的,这点很重要,也就是说,你可以将Vidor看作是一个使用FPGA的平台,而不是一个学习FPGA的平台。真要学习FPGA的朋友,推荐使用爱板网评测过的另一款小脚丫FPGA比较合适。官方为MKRVidor4000开发板提供了不少库以及IP,如MIPI相机输入、DVI输出、120MHzDAC、QR码跟踪器、PWM、四编码器、I2C,I2S,SPI和UART、FFT、FIR滤波器,所以,我们可以直接拿来使用。必要的开发环境安装有:(Vidor4000三件套)ArduinoIDE工具MKRVidor开发板支持包库管理包东西准备就绪,那就可以使用上面的“三件套”实现基本的功能演示,我们借助了树莓派上的摄像头,通过MiPi摄像头接口输入,MicroHDMI输出,输出连接到显示器上。程序是一个二维码检测器。源码如下#include"VidorGraphics.h"#include"VidorCamera.h"VidorCameravcam;#defineMAXDIM10staticuint16_tx[QR_PT_DET_NUM],y[QR_PT_DET_NUM];structqrPtn{uint16_tx[QR_PT_DET_NUM];uint16_ty[QR_PT_DET_NUM];};staticqrPtnqrBufferPtn[MAXDIM];uint16_tcount=0,last;voidsetup(){Serial.begin(9600);//waitfortheserialmonitortoopen,//ifyouarepoweringtheboardfromaUSBchargerremovethenextlinewhile(!Serial);if(!FPGA.begin()){Serial.println("Initializationfailed!");while(1){}}/**begin()enabletheI2Ccommunicationandinitializethedisplayforthecamera*/if(!vcam.begin()){Serial.println("Camerabeginfailed");while(1){}}/**qrrec.begin();enabletheQRcoderecognition*/vcam.qrrec.begin();delay(4000);Serial.println("PowerON");}voidloop(){/**qrrec.readQRCode();get,ifavailable,thecoordinatesoftheQRcodeinthescreen*/vcam.qrrec.readQRCode();for(inti=0;iif(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(inti=0;ivcam.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处理后输出的图像效果,显然图像处理方面应该没有任何调教过,优化,所以看起来会比较渣,但是二维码的检测定位的功能是没问题的。除了此demo外还有不少关于摄像头输入和HDMI输出的demo,相较之下还比这个二维码检测的demo少了些许功能,而在图像输出上也没什么提升,所以不再演示了。从Vidor4000提供的一些demo不难发现基本上都是关于一些IP的使用,明白我意思不,这个所谓的“使用”,不是教你如何去学习开发FPGA,而是教你如何像先前使用ArduinoIDE开发MCU那样去玩FPGA,官方将复杂的功能实现都模块化成库或者IP,用户只需通过原本的ArduinoIDE工具像简单的MCU开发一样去使用FPGA。小结相比传统的Arduino开发板,Vidor4000的优势在于集成了灵活多变的FPGA,体现在板卡上的话就是具备了MiPiCSI(没有MIPIDSI接口是个遗憾)、MicroHDMI、miniPCIe等与传统的ArduinoMCU开发板不同的“先进”接口,配合Arduino官方提供的库以及相关的IP,用户可以在原本简单的Arduino开发板是实现更加灵活、更多功能的扩展,实现更复杂的应用。在不少用户眼里,认为Arduino的简单是理所当然的,但是我要说的是我们现在所能得到Arduino的一切理所当然的简单是靠许许多多工程师倾注心血用复杂去构建,Arduino之所以能在全球范围内流行,并不是因为它本身简单,而是它将复杂简单化,就比如说文章中的MKRVidor4000,这或许是你这辈子最有底气去接触FPGA的一个产品了。