技术论坛

创客圈

  • 创客小组(项目集散地)

    这里不仅有灵感与创意,更有实践、激情、与同道。创者无畏!

    发帖数

    22
    基于Basys3的2048小游戏
    首先十分感谢Digilent论坛提供的这次机会,我跟大家分享的是我设计的一款小游戏:基于Basys3的2048小游戏。游戏功能:游戏界面由4×4的16个方格组成,每个方格中可以存放一个数字。玩家通过操纵Basys3开发板的上下左右四个方向键和中央的reset键,控制方格中的数字移动。界面由VGA和Pmod接口oled两种方式显示。游戏成功时显示笑脸,失败时显示骷髅。游戏过程中,玩家每按动一次方向键,所有数字按照这个方向移动一次,该方向上相邻相同的数字合并为原来的2倍,并在反方向随机生成一个新的数字。玩家目标是在游戏中拼出2048或更高的数字,即为游戏成功。DIY动手指南:Ste1:材料准备硬件:Basys3开发板VGA连接线以及VGA显示器(可选)sh1106驱动的oled显示屏一块软件:Vivado2016.2Ste2:系统框架系统主要由以下几个模块构成,游戏主状态机、游戏数据寄存器{S16}、移动模块move、随机产生模块gen、随机数生成器ran、VGA驱动模块和oled驱动模块。Ste3:程序设计接下来分模块进行分析。1、按键去抖对每个按键设计了一个32位长的FIFO,按键值从低位进入直至高位溢出。每过10ms,FIFO被完全刷新一次,只有当32位为FFFFFFFFh时认为输入为1,00000000h时认为输入为0。2、游戏数据寄存器用4×4=16个4bit寄存器,存放16个格子中的数据,记为{S16},以【log2对数】形式存放。即如果格子中是512,则存放9;如果格子中是128,则存放7。特例是0用0来存放。这种存放的特点是,可以节约寄存器数量,而且原本的加法128+128=256可以用加1来表示:7+1=8。寄存器位置定义如下:3、游戏主状态机游戏主状态机中,主要操纵数据寄存器{S16}的数值,通过对这个寄存器中数值的改变来实现游戏的进行。状态机分为4个状态:检测按键+移动,产生随机数,游戏状态检测,游戏失败死循环。其中游戏状态检测时,检查当前游戏是否已经结束或成功,如果成功,游戏不中断,玩家可以继续下去,如果已经结束,则跳入游戏失败的死循环中,结束游戏。4、移动逻辑组合电路本游戏有4种移动方式,即上下左右,每次移动4条线,但本质都是相同的,只需要一个模块即可完成。如下图所示move(i3,i2,i1,i0,o3,o2,o1,o0)我们默认向右移动。(为什么呢?因为当我们调用这个模块时,可以以各种方向调用:如果向右移动,则调用move(15,14,13,12)向右,如果向左移动,则调用move(12,13,14,15)向右即可,还可以调用move{15,11,7,3}向下,调用move{1,5,9,13}向上等等。)那么向右移动时,用f3~f0判断这四位是否为空,通过对f3~f0的16种情况的mux来决定输出的值,如果有相同则合并后输出。(其实这个模块就是一个大mux)例如,下图所示,左图右移后,变为右图。再例如:2,2,4,8右移后变为0,4,4,8,再右移变为0,0,8,8再右移变为0,0,0,165、随机数生成器和随机产生模块随机数产生器为随机产生模块gen服务。随机数生成器产生3组随机数,分别为8bit,12bit和16bit。分别对应2空格、3空格和4空格的情况。例如,如果右移后的图片如下图所示,那么黄色格子里的2就是在最左列3空格情况下随机产生的一个位置。我们还是默认向右移动,那么最左边的四个格子(15,11,7,3)即可交给gen,在空白出产生一个随机位置的“2”。这里需要注意的是,2048游戏中规定必须是“有效移动”后才产生一个数字,以杜绝有投机的玩家一直按同一个方向键可以作弊的情况。这一逻辑只需要对上一步中move前后做一下对比即可。6、VGA显示模块640×480分辨率,25MHz的时钟信号。其中扫描时,将VGA坐标的后两位[1:0]舍去,即可将640×480像素变为160×120的色块。(注:源码中的VGA画图一段和oled画图一段看上去很复杂,其实是画点的方式比较奇怪,两种画法都是先将132x64的点阵水平划分为8条,每条8行,再以每列为1个byte的方式画出来。。。那么为什么要这么复杂呢?因为oled的sh1106驱动就是这么要求的,我先做了oled,后面vga就直接引用了~)Ste4:演示见视频~
    发布于 03-07
  • 竞赛 & 活动

    DIGILENT全可编程创新创业设计大赛(DDC)、江苏省虚拟仪器竞赛、极客DIY限时挑战等

    发帖数

    14
    【竞赛讨论专区】2017 DIGILENT(迪芝伦)全可编程创新创业设计大赛
    一个所有FPGAer展示自我的舞台,一场结合“脑洞创意”与“技术比拼”的动手实践派狂欢!高规格的组织阵容、丰厚的优胜者奖金、冠军代表中国参与全球决赛——DIGILENTDesignContest中国区选拔赛暨DIGILENT(迪芝伦)全可编程创新创业设计大赛荣耀回归中国,而我们等待的就是一个全情投入的你!竞赛官网:www.digilent.com.cn/ddc-china本帖作为此次竞赛的官方讨论贴,无论你有任何关于参赛报名、作品提交、推荐平台获取等赛事组织层面的疑问,或者是有关竞赛推荐平台的技术问题,均可通过讨论专区进行提问并获得及时解答。我们等你来战!
    发布于 03-03
  • 工科街(校园话题区)

    一条纯粹属于在校工科生的话题街。尽情释放内心的小怪兽,海侃校园内外,闲聊天南地北

    发帖数

    19
    这是写给硬件工程师的!
    作者简介北京航空航天大学教授、《单片机与嵌入式系统应用》杂志社主编,主要从事单片机与嵌入式系统的教学、科研和推广工作,出版有大量的单片机与嵌入式系统著作。微控制器诞生后,传统电子领域的工程师已升华为软、硬兼顾,可从事应用软件开发的电子工程师,但人们仍习惯称他们为硬件工程师。随着智能硬件系统的同质化、多种智能硬件的软件生成、软件开发工具层出不穷,如今,嵌入式产品开发中的纯硬件工作已很少见。智能电子系统的同质化,诞生了用户板;为解决操作系统通用性与用户板的特殊性矛盾,在操作系统中引入了板级支持包;FPGA诞生后,有了硬件描述语言的硬件系统设计模式。所有这些,都体现了嵌入式产品开发不断软化的趋势,而且软化中不断向用户开放,便有了如今的开源硬件概念。现在,开源硬件的三大领域包括板级开源硬件(树莓派们)、开源硬件描述语言,以及操作系统中的开源设备树(DeviceTree)。在开源硬件环境下,软件工程师与硬件工程师已趋同化。开源硬件概念起源与演化开源概念起源于操作系统的源代码开放。出于商业利益,众多商用操作系源代码不向用户开放。为了便于用户二次开发,Linux从一开始就是一个源代码对用户开放的操作系统,从此便有了开源软件的概念。目前在嵌入式系统领域有大量的开源RTOS,这些开源RTOS不仅为嵌入式应用做出了巨大的贡献,还形成了开源文化。即在市场经济利益交织环境下,为用户提供一个开放的、低成本的、可任意裁剪、可二次开发的一个公共平台。开源软件出现后,培养出了大批嵌入式领域的软件人才。相对于源代码开放的开源软件,开源硬件似乎今人费解。因为传统的硬件体系中没有数字化代码,何来开源?因此,开源硬件的开源内涵主要体现在开源文化中的开放、低成本、可二次开发与可任意裁剪上。开源硬件的开放不仅是电路系统的开放,还在于对软件工程师的开放,因此,开源硬件诞生后,吸引了众多软件工程师进入嵌入式应用领域。可二次开发的开源硬件,是一个基于软件开发的软硬件综合开发平台;基于软件的开发模式有利于软件工程师介入嵌入式产品开发;开源硬件可任意裁剪、任意选择的特点,为开发众多个性化嵌入式产品提供了低成本、低门槛、灵活、便捷的手段。嵌入式应用领域之所以能演化出开源硬件,与其硬件结构的同质化、开发环境的不断软化、开源操作系统引入有关。在早期的嵌入式系统产品设计中,电子工程师是主体,因为软件工程师无法介入硬件系统的应用开发。有了用户板的嵌入式产品平台后,软件工程师在用户板级产品平台上,不必了解硬件结构,借助开源RTOS、集成开发环境,就能实现嵌入式产品开发。另外,有了硬件描述语言,软件工程师可以绕开传统的硬件设计模式,实现SoC的嵌入式产品设计。所有这些硬件系统设计模式的转变,为软件工程师开放了传统的智能硬件系统设计领域。在他们看来,从用户可介入二次开发的开源概念出发,不妨以“开源硬件”来描述如今基于嵌入式产品平台、基于硬件描述语言、以软件技术为主的智能硬件的开发模式。从硬件系统开发不断软化的变革可以看出,当今的开源硬件有以下几类:一类是由用户板进化出的可二次开发的板级开源硬件(早期以树莓派为代表);另一类是开源硬件描述语言(以Chisel为代表源代码开放的开源硬件);还有一类是开源操作系统中的开源硬件数据结构(如ARMDeviceTree)。板级开源硬件用户板是最原始的板级开源硬件。由于嵌入式产品都有相同的微处理器内核及通用外围功能单元,将它们集合起来,可做成一个供众多嵌入式产品个性化开发的产品平台。最引人注目的是由树莓派(RasberryPi)引发的智能化通用板级开源硬件。最早推出的RasberryPi是为学习计算机编程而设计的一个只有信用卡大小的板级微型电脑,配置了Linux操作系统。由于它配置了众多的外围电路与外部交互接口,与其说是微型电脑,不如说是嵌入式的综合实验平台,是用户板系统的终极化发展。由于低价位、功能强大、有众多的外围电路与I/O端口、易开发的软件配置,树莓派迅速成为板级开源硬件的理想化通用产品平台。2015年统计,板级开源硬件已形成三大主流平台,即Arduino平台(Arduino板+ArduinoIDE)、Beagle板平台与RasberryPi板平台。它们集硬件(开放性板级智能电子系统)、软件(开源RTOS)、开发环境于一身,是一个最佳的通用产品开发平台。如今,网上商城都可以方便地选购。近年来,也出现了国产化的板级开源硬件,中航工业部门的有关研究所推出了由国产GD32微控制器和RT-Thread实时操作系统构建的一个Colibri-F207ZE开发板,具有软硬件自主可控、安全可靠,为嵌入式应用提供了有效解决方案,被称为口袋实验室。2017年《单片机与嵌入式系统应用》第3期吕华溢等人的“一种软硬件自主可控的嵌入式实时控制系统”,详细介绍了Colibri-F207ZE的板级开源硬件及其应用方法。在通用平台上开发个性化产品的优点是通用、便捷、裁剪方便,缺点是软硬件资源的冗余。这一点类似用FPGA开发硬件电路,在大规模量产时并不最优,不如转型到专用系统。开源硬件描述语言硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。硬件描述语言发展至今已有20多年的历史,它将硬件设计软件化,通过EDA工具进行仿真验证,最终通过微电子的ASIC手段或半定制的FPGA来实现一个真实的硬件系统。这是一种非主流电子工程师的非传统硬件系统设计方法,成功地应用于硬件设计的各个阶段,如建模、仿真、验证与数字化模块的综合等。随着系统级FPGA以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于系统设计和软件设计结合。硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言。硬件描述语言从一开始就是一种用软件工具、在软件方法基础上实现的电路系统设计方法。Chisel是加州大学伯克利分校研究人员设计并发布的一种新的开源硬件设计语言。他们认为现有的硬件描述语言VHDL、VerilogHDL等最初设计的目的是用来仿真的,所以有很多不可综合的语法,此外,VHDL、VerilogHDL缺少目前高级语言具备的一些特性,比如:对象、继承等,于是设计了Chisel,并将其开源。Chisel建立在Scala语言之上,可以支持高级硬件设计。用户使用Chisel时,以编写Scala程序的方式来设计硬件电路。采用Chisel设计的电路,经过编译可以得到FPGA、ASIC的VerilogHDL的相关代码。目前国内外已有人使用Chisel语言成功地实现了多种开源处理器。有多个开源项目使用Chisel作为开发语言,包括:采用RISC-V架构的开源标量处理器Rocket、开源乱序执行处理器BOOM(BerkeleyOut-of-OrderMachine)等。此外,Chisel的开源特性,也有助于用户了解硬件设计语言的内部实现机理,并在此基础上进行特定的优化与改进。2017年《单片机与嵌入式系统应用》第3期刊登雷思磊的“开源硬件描述语言Chisel的组合电路设计”详细地介绍了这种开源硬件的电路设计方法。操作系统中的开源设备树设备树是嵌入式操作系统中的一种开源硬件数据结构,是嵌入式操作系统中板级支持包(BoardSuortPackage,BSP)的华丽转身,其源头是PowerPC的DeviceTree技术。目前,最著名的是ARMLinux中的扁平设备树FDT(FlattenedDeviceTree)。早先在嵌入式系统中引入操作系统时为了满足操作系统对硬件单元的有效管理,设置了板级支持包,并添加有大量的驱动程序固件。板级支持包介于主板硬件与操作系统之间,是操作系统的一部分。程序员在使用嵌入式操作系统时,可以根据硬件结构的变化,在BSP中添加一些和系统相关的驱动程序。因此,随着主板的升级与变更,BSP也愈加庞杂。以ARMLinux为例,早期的ARMLinux中充斥着大量的垃圾代码,相当多的代码只是在描述板级细节,而这些板级细节对于内核来讲,只是垃圾。后来引入了PowerPC已成熟应用的DeviceTree技术,使得ARMLinux内核中的BSP华丽转身为扁平设备树(FDT)。DeviceTree是一种描述硬件的数据结构,基本上是一个描述电路板上CPU、总线、设备组成的树形结构,由一系列的结点(node)和属性(roerty)组成,结点本身可包含子结点,可用来描述原先kernel中的大量板级细节与硬件细节,直接透过它传递给Linux。Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的众多设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应设备。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息。由根结点、子结点、叶结点形成了硬件相关的树形结构,树结构将在节点之间创建父子关系,此父子关系是体系结构无关性的关键。当叶驱动程序或总线结点驱动程序本质上需要依赖于体系结构的服务时,该驱动程序会请求其父级节点提供该服务。采用此方法,不管计算机或处理器的体系结构是什么,驱动程序都可以正常运行。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息,这使得ARMLinux内核中的冗余编码大大减少,同时也使得用一个内核镜像去引导同一类ARM芯片集的硬件平台成为可能。2017年《单片机与嵌入式系统应用》第3期罗名驹等人的“扁平设备树FDT在ARMLinux中的应用研究”详细地介绍了ARMLinux中的FDT,以及如何通过FDT获取板级硬件的细节信息。结语开源硬件不是一天出现的。MCU诞生后,硬件工程师们便开始熟悉嵌入式产品的软件开发环境;有了软件搭桥,软件工程师也开始进入嵌入式领域。由于嵌入式系统领域中,计算机学科、电子技术学科、微电子学科交叉融合,逐渐形成了以软件手段为主的嵌入式产品开发环境。早先用户板基础上开放的产品开发平台、嵌入式操作系统中的板级支持包、VHDL和VerilogHDL的硬件描述语言,如今都已进化成树莓派型的板级开源硬件、嵌入式操作系统中的开源设备树和建立在Scala上的开源硬件描述语Chisel。这些开源硬件的诞生,极大地改变了嵌入式产品开发的生态环境,不仅深刻地改变了硬件工程师的产品开发模式,也将吸引更多的软件工程师进入嵌入式领域,从而开创了硬件工程师与软件工程师相互融合的时代。
    发布于 03-08

干货热帖

  • 【Arty开发实战】【第五篇】 基于Arty的Web 服务器搭建
    很高兴能与大家分享这段时间对Arty的以太网开发。官网里有一节详细的关于以太网环境搭建的指导,可以从那儿开始入门学习。首先我们还是来整理一下搭建以太网环境:Arty以太网开发需要的硬件资源有:1.Microblaze2.Usb_to_UART(调试用)3.4个LED4.DDR5.以太网hy块6.时钟7.定时器详细关于硬件环境搭建请关注官网的教程,本文不详细介绍。如果硬件环境搭建不成功,则后续将无法继续。继续按照官网的教程到SDK之后,选择lwiEchoServer,,这会儿,LWIP库则已经已经建立好了,用模板的例程则可以实现Telnet的功能。(详见官网的教程)(注意:连接网线后需要将i改为192.168.1.x,以及子网掩码为255.255.255.0,否则将无法传输数据)有了EchoServe之后,菜鹏我剖析了例程的关键源码,并继续学习了搭建一个简单的WebServe。为了实现Web服务器的相关教程,大家请按照前几章的教程,完成对LED即GPIO的初始化。关键源码1:iaddr.addr=echo_netif->i_addr.addr;gw.addr=echo_netif->gw.addr;netmask.addr=echo_netif->netmask.addr;分析:很好理解,将IP地址,子网掩码等赋值给LWIP的netif结构体。关键源码2:/*startthealication(webserver,rxtest,txtest,etc..)*/start_alication();想实现以太网各个功能,咱们开发者只需修改此函数即可。在此函数中,可以看出建立了一个TCP连接,有5个关键点:1./*createnewTCPPCBstructure*/cb=tc_new();建立一个TCP板块2/*bindtosecified@ort*/err=tc_bind(cb,IP_ADDR_ANY,ort);绑定了一个端口,值得说明的是Telnet服务中用的是端口7,而此时咱们做的HTTP协议要求用的端口803./*wedonotneedanyargumentstocallbackfunctions*/tc_arg(cb,NULL);不需要回调功能函数4./*listenforconnections*/cb=tc_listen(cb);监听端口5./*secifycallbacktouseforincomingconnections*/tc_accet(cb,accet_callback);TCP的回应使用accet_callback函数,此函数也是我们修改的重点,修改此回调函数可以将Telne服务转为WEB服务器或者TFTP关键代码3:err_taccet_callback(void*arg,structtc_cb*newcb,err_terr){//staticintconnection=1;tc_arg(newcb,(void*)alloc_arg());/*setthereceivecallbackforthisconnection*/tc_recv(newcb,recv_callback);/*justuseanintegernumberindicatingtheconnectionidasthecallbackargument*///tc_arg(newcb,(void*)connection);/*incrementforsubsequentaccetedconnections*///connection++;returnERR_OK;}注释部分为原来ECHO的回调函数,此函数菜鹏我对第一个函数并没有理解很透彻,也请希望大神能帮忙解释解释,而第二个函数则是TCP接收函数,如果有TCP回应,则调用recv_callback函数,而此函数也是我们修改的重中之中,进入这个函数,以下这两个函数也是菜鹏根据所学修改的,如果需要搭建一个web服务器,需要有兴趣的同学去研究研究HTTP协议,其中的POST和GET贯穿整个程序之中/*indicatethattheackethasbeenreceived*/tc_recved(tcb,->len);/*echobacktheayload*//*inthiscase,weassumethattheayloadis<TCP_SND_BUF*/generate_resonse(tcb,->ayload,->len);关键代码4intgenerate_resonse(structtc_cb*cb,char*htt_req,inthtt_req_len){enumhtt_req_tyerequest_tye=decode_htt_request(htt_req,htt_req_len);switch(request_tye){caseHTTP_GET:returndo_htt_get(cb,htt_req,htt_req_len);caseHTTP_POST:returndo_htt_ost(cb,htt_req,htt_req_len);default:xil_rintf("request_tye!=GET|POST\r\n");}}上边函数为WEB服务器核心代码,首先收回数据之后判断是GET报文还是POST报文,然后根据HTTP报文协议进行回复,值得注意的是HTTPGET报文有严格格式要求,请大家可以细心研究本章源码。PC机用浏览器连接服务器,都会发送一个GET报文,所以回复报文头部是有固定格式的,而内容,菜鹏我采用HTML语言储存在Microblaze的RAM里头。至于POST报文则是采集客户端信息反馈到服务器里,我们只需要分辨信息,然后做出相应的反应,菜鹏源码里是在网页里设计一个单选按钮,通过上交按钮发送信息给服务器,然后FPGA端LED进行相应的变换附件里有菜鹏我的源码以及HTTP报文协议的学习t,以及Arty以太网开发的官方教程~~
    亮了(0) 34 0 03-17
  • 知乎问答 | FPGA学习需要哪些东西?
    近来收到不少关注DIGILENT中文技术社区与「开源硬件创客坊」公众号的童鞋的私信,询问的问题概括起来可以总结为一句话:初入门者该如何学习FPGA?恰巧知乎上有不少类似的提问帖子,今天小编给大伙儿加个鸡腿,将其中的精华部分整理一番后与大伙分享,希望能藉此帮助有相同困惑的FPGAer菜鸟少年们~原提问FPGA学习需要哪些东西?我准备放假回家学学FPGA,没有开发板可以吗?我在某论坛看到这么一句话:“听说学FPGA不一定非得要开发板,这个东西就是时序,只要安装个ModelSim就可以学习了,时序这种东西是很容易用软件进行验证的,至于说下载到芯片里面去跑,可以不必立即开始,有一种所谓的前端设计人员,就是完全用软件仿真,然后TestBench进行验证,根本从来不会接触实际的硬件——完全只看波形图...”So,真的是这样吗?我可以脱离开发板来学习吗?弱弱的加一句,硬件方向fga学习些什么呢?❖~回帖者:运算放大器~1、语法层面搞懂阻塞和非阻塞语句,以及Verilog语言的时序描述方法,把自己想象成机器,尝试去编译自己写的Module。2、然后搞明白同步和异步,最后,一定要熟练地掌握状态机的设计。这是最初级也是最基本的要求。上面有人说语法太简单了,本人不敢苟同,Verilog语言并不简单,尤其Module之间时序不能同步,本该同相的信号输出有相位差的时候,简直能烦死人。3、然后再进一步就是自顶向下设计,复杂时序,同步和异步时序都有的应用。4、更进一步就是IP核的应用,会配置IP核之后你会发现新世界的大门正在被打开,这个时候FPGA真正的优势才体现出来了。5、最后就是SOC,以上四个阶段都是在硬件底层,SOC是应用层的东西,干的和码农一个活。具体学习思路就是买一块好点的开发板,Xilinx和Altera的都行,Altera的仿真器要便宜一些,更适合自己学习。好点的意思是能跑SOPC的,Xilinx至少弄个Sartan6的(当前普遍都是Artix7),Altera现在不清楚了,以前我们都是用DE2学的,简单好用资源多,缺点是贵。程序呢,自己用书学,一步一步来:前两步一本书(Verilog程序设计语言之类的),第三部一本书(Verilog程序设计实例之类的),第四步一本书(FPGA芯片IP核详解之类的),第五步一本书(FPGA芯片SOPC系统嵌入式编程之类的),总共四本书。书名都是我乱打的,不知道有没有,差不多就是这个名字。对了,还有一本书必须要学,比如你用的XILINX的FPGA,有XILINX软件详解之类的书,多年前看到Altera的,叫啥名字忘记了。当然你要是会用软件的HELP文档,而且不嫌烦,没有也可以。总之,FPGA是不该被低估的东西,它可以干市面上所有MCU和大部分CPU干的事,有些甚至比专用芯片还干的好。当然了,唯一缺点就是别要求功耗。祝进步飞速,学有所成。❖~回帖者:cunzhangcun~私以为任何硬件相关的东西的学习,都是不能脱离硬件的。如果你偏重算法,逻辑设计这方面,确实软件仿真可以搞定很多事情,甚至像是由于竞争冒险出现的毛刺都能出来个八九不离十,但是仅仅这些好像是不够的。比如你想挂外设,就很难单从仿真软件得到你想要的结果。我们拿最简单的数字滤波器为例,信源→AD→FPGA→DA→LPF→信宿。好,你说AD和DA波形我可以仿真出来,那过了LPF是个什么样子?何况DA出来的波形,用ISE仿真出来一个时钟周期是平着的,你看看真从DA出来,是平着的?是阶梯形的还是上下坡的?何况这么大一块FPGA芯片,如果你还想拿来做显示,你要怎么仿真?IIC,SPI,VGA时序对了,你能直观的看出来显示结果么。而且FPGA系统板布板也是个很麻烦的事情…你自己在那仿真了半天真要上手试板了连小系统都不会搭想来也是蛮醉人的…除非有别人替你做这些事情。要学的东西在下面:数字电路基础、微机原理及接口设计VerilogHDLorVHDLEDA,比如QUARTUS,Vivado或ISE(下载仿真一套环境都要搭起来)调试电路板。会用示波器,网仪,逻辑分析仪。最好会拿电烙铁。❖~回帖者:匿名用户~个人建议:1.一开始上手FPGA的话,能有开发板就用开发板,当第一次看到用自己的代码跑出流水灯的效果或者是计时器效果的时候,那种成就感是你用仿真软件感受不到的。基础的开发板Basys3功能就能满足初学者的要求,价格也不是很贵。大二的电子技术实验用的就是这种板子。大三选了门数字系统设计,改用Nexys4DDR,算是进阶了一点了吧。不过完成课程实验是绰绰有余了。2.选择一门语言,大二当时用的是verilog接触到的都是皮毛,但最重要的收获是硬件语言的并发执行,这点区别于软件编程语言,这点很重要。大三改用VHDL,虽然我不太赞成学校的这种安排。。但是好在学VHDL的时候,verilog的语法已经忘光了。。编程思想还是记得的-_-#3.找一个论坛,你可以在上面学到很多课本上没有或者老师不会教授的东西。当时我经常逛的是DIGILENT中文技术社区,Xilinx中文社区。还有很多国外优秀论坛,不过英文太渣,基本就是看看介绍,找找资料。4.最重要的,动手做项目。一个简单的序列检测器都能让自己收获不少。尤其是到了后期学习阶段,难度就不是代码写不写得出来的问题了,仿真验证的过程就很复杂,要知道硬件语言大部分语法都是用在testbench里面。这时候反而开发板强调的程度就不是很大了。以上都是作为菜鸟进阶一丢丢的我对刚刚入门的童鞋的个人意见,如有不正确的地方欢迎大家指出。❖~回帖者:晨晨~以下皆为个人看法(或者说经验)。1.学FPGA分为几个步骤:写HelloWorld。控制小灯亮灭、跑马灯之类的。这里主要是初步熟悉流程,熟悉从代码到板子的链路。2.琢磨各种“控件”,并且实例化出来玩一玩,各个接口什么的都跑一下,比如PLL、Counter什么的,复杂点儿的其实使用都差不多,但是这里主要练习的是查看文档的能力。3.重点学习各种存储单元:FIFO、单口双口RAM什么的,这个基础一定要做好,对后续的程序优化有非常非常大的帮助。4.学软件,主要就是Vivado/ISE和Quartus了。特别是一些可以省时省力的快捷方法。至于后期的高级方法,暂且可以放一放。5.弄一个处理器进来,但是现在A家和X家的都太强了,我建议去找个8051的核,用C再跑一遍小灯亮灭、跑马灯。6.如果希望深入,那么可以读一下8051的源码,或者做一些修改,比如把12分频改掉、把IO口精简或者扩展之类的。7.时序收敛,这里我也做不好。但是我有个诀窍,那就是资!源!千!万!别!用!满!❖~回帖者:JonsonXP~实战是最好的学习。操起所有武器,做几个实在的项目,在过程中学习并享受工匠的喜悦。比如可以试试:BitCoin挖矿机,视频音频信号处理,硬件排序,加密解密。。。学习思考的重点:了解典型FPGA运用场景和方式,FPGA擅长做什么,不擅长做什么。积累自己的硬件模块兵器库。❖~回帖者:王天祺~数字电路+微机原理好好学,这点切记切记,很多时候你觉得玄而又玄的问题,其实只是因为你本科时这几门课睡过了导致的基础不扎实而已。不少人搞不清什么是总线什么是寄存器,拿verilog当c语言那么写,然后拿着一堆log去论坛上问是不是我的EDA工具装的有问题。以X家FPGA为例,DocNav里面有详细的文档以及教程,视频的文本的stebyste的那种,拿块板子自己跑几个官方给的alication(人家连代码和bit文件都给你了),琢磨人家到底为什么这么设计,后面就该上手写几个实际项目了。切记不要买各种乱七八糟的中文教材,内容抄来抄去炒冷饭,而且基本就翻译免费的官方文档和教程,还卖的挺贵,更不能忍的就是还翻译得错误百出。❖~回帖者:MistyRain~有些人很菜,也过来答,简直是误导。有些人水平太高,答的很好但是人家依旧听不懂,得到赞确很少。学习FPGA,在不同层次的人明显有不同的答案。先说一句,说不要开发版的都是菜鸟级选手。我把FPGA层次划分为,鸡蛋级别,菜鸟级别,老鸟级别,高手级别四类。题主是鸡蛋级别的吧!啥也不会。那些得赞高的不少都是菜鸟级别的选手。当然,我现在告诉你的是如何成为一个菜鸟。以后有空我也会写从菜鸟变成老鸟的方法。1)熟悉语法,其实你不需要什么都会,但是要记住几个经典的时序,逻辑电路的描述方式。2)熟悉三个经典电路描述并仿真。仿真其实不是很重要,我开始学习压根没学那个玩意儿,因为要是只做接口那玩意儿没啥用。直接用ChiScho抓抓数据更快。仿真是给做算法,工程相对较大的人用的。三个经典电路分别是,分频器,计数器(可做一个时钟),序列检测器。这样你就基本熟悉了开发环境了。3)上板卡跑一个灯,熟悉一个板卡上时钟资源使用,硬件的使用原理。4)知道了FPGA学习主要不在于编程!压根没有编程这回事!!Verilog是硬件描述语言!描述!!写代码时脑子里必须有电路图!!知道FPGA主要学的是硬件和算法!!软件最多能占10%就不错了!!只要你能完成这上面的东西,恭喜你进入菜鸟行列,可以在别人设计好FPGA方案的条件下完成一些模块的设计了。其实华为招聘员工,很多人FPGA水平一开始都差不多这么菜。再写一下老鸟需要会什么,以后再答怎么做到。1)FPGA逻辑资源,特别是时钟资源要非常熟悉。2)做算法的必须熟悉sysgen的使用。说的容易了,sysgen画画图也没那么容易哦,你要熟悉使用各种滤波器,理论知识要求起点就不小。3)充分理解FPGA从上而下的设计原则,能够编写中等程度的FPGA详细设计方案。4)熟悉时序优化,时序收敛,区域约束等知识。并且能运用到编程之中,解决菜鸟们解决不了的“不科学”的问题。说白了就是会使用lanhead,以及ISE中那些你还没接触过的功能。一般菜鸟们ISE都只会编程,默认的编译一下,然后下载,ChiScho抓抓数看看。5)能够熟悉FPGA常用的接口,不求都会编程,但是要知道他们功能是什么。比如ADC,DAC,串口,EMIF等等。并且熟悉DSP等FPGA周边常用芯片工作原理。6)熟悉硬件设计,至少要知道Bank上IO规划怎么好,全局时钟,区域时钟大致怎么规划等等。7)信号源,示波器,频谱仪都要熟悉使用吧!等这些都熟悉了,差不多是老鸟了。要成为高手,你没有十来个FPGA程序设计经验,解决过十来个中大项目核心问题,没有做过大系统还是停留在小板卡,都是不行的。
    亮了(0) 74 0 03-13
  • 这是写给硬件工程师的!
    作者简介北京航空航天大学教授、《单片机与嵌入式系统应用》杂志社主编,主要从事单片机与嵌入式系统的教学、科研和推广工作,出版有大量的单片机与嵌入式系统著作。微控制器诞生后,传统电子领域的工程师已升华为软、硬兼顾,可从事应用软件开发的电子工程师,但人们仍习惯称他们为硬件工程师。随着智能硬件系统的同质化、多种智能硬件的软件生成、软件开发工具层出不穷,如今,嵌入式产品开发中的纯硬件工作已很少见。智能电子系统的同质化,诞生了用户板;为解决操作系统通用性与用户板的特殊性矛盾,在操作系统中引入了板级支持包;FPGA诞生后,有了硬件描述语言的硬件系统设计模式。所有这些,都体现了嵌入式产品开发不断软化的趋势,而且软化中不断向用户开放,便有了如今的开源硬件概念。现在,开源硬件的三大领域包括板级开源硬件(树莓派们)、开源硬件描述语言,以及操作系统中的开源设备树(DeviceTree)。在开源硬件环境下,软件工程师与硬件工程师已趋同化。开源硬件概念起源与演化开源概念起源于操作系统的源代码开放。出于商业利益,众多商用操作系源代码不向用户开放。为了便于用户二次开发,Linux从一开始就是一个源代码对用户开放的操作系统,从此便有了开源软件的概念。目前在嵌入式系统领域有大量的开源RTOS,这些开源RTOS不仅为嵌入式应用做出了巨大的贡献,还形成了开源文化。即在市场经济利益交织环境下,为用户提供一个开放的、低成本的、可任意裁剪、可二次开发的一个公共平台。开源软件出现后,培养出了大批嵌入式领域的软件人才。相对于源代码开放的开源软件,开源硬件似乎今人费解。因为传统的硬件体系中没有数字化代码,何来开源?因此,开源硬件的开源内涵主要体现在开源文化中的开放、低成本、可二次开发与可任意裁剪上。开源硬件的开放不仅是电路系统的开放,还在于对软件工程师的开放,因此,开源硬件诞生后,吸引了众多软件工程师进入嵌入式应用领域。可二次开发的开源硬件,是一个基于软件开发的软硬件综合开发平台;基于软件的开发模式有利于软件工程师介入嵌入式产品开发;开源硬件可任意裁剪、任意选择的特点,为开发众多个性化嵌入式产品提供了低成本、低门槛、灵活、便捷的手段。嵌入式应用领域之所以能演化出开源硬件,与其硬件结构的同质化、开发环境的不断软化、开源操作系统引入有关。在早期的嵌入式系统产品设计中,电子工程师是主体,因为软件工程师无法介入硬件系统的应用开发。有了用户板的嵌入式产品平台后,软件工程师在用户板级产品平台上,不必了解硬件结构,借助开源RTOS、集成开发环境,就能实现嵌入式产品开发。另外,有了硬件描述语言,软件工程师可以绕开传统的硬件设计模式,实现SoC的嵌入式产品设计。所有这些硬件系统设计模式的转变,为软件工程师开放了传统的智能硬件系统设计领域。在他们看来,从用户可介入二次开发的开源概念出发,不妨以“开源硬件”来描述如今基于嵌入式产品平台、基于硬件描述语言、以软件技术为主的智能硬件的开发模式。从硬件系统开发不断软化的变革可以看出,当今的开源硬件有以下几类:一类是由用户板进化出的可二次开发的板级开源硬件(早期以树莓派为代表);另一类是开源硬件描述语言(以Chisel为代表源代码开放的开源硬件);还有一类是开源操作系统中的开源硬件数据结构(如ARMDeviceTree)。板级开源硬件用户板是最原始的板级开源硬件。由于嵌入式产品都有相同的微处理器内核及通用外围功能单元,将它们集合起来,可做成一个供众多嵌入式产品个性化开发的产品平台。最引人注目的是由树莓派(RasberryPi)引发的智能化通用板级开源硬件。最早推出的RasberryPi是为学习计算机编程而设计的一个只有信用卡大小的板级微型电脑,配置了Linux操作系统。由于它配置了众多的外围电路与外部交互接口,与其说是微型电脑,不如说是嵌入式的综合实验平台,是用户板系统的终极化发展。由于低价位、功能强大、有众多的外围电路与I/O端口、易开发的软件配置,树莓派迅速成为板级开源硬件的理想化通用产品平台。2015年统计,板级开源硬件已形成三大主流平台,即Arduino平台(Arduino板+ArduinoIDE)、Beagle板平台与RasberryPi板平台。它们集硬件(开放性板级智能电子系统)、软件(开源RTOS)、开发环境于一身,是一个最佳的通用产品开发平台。如今,网上商城都可以方便地选购。近年来,也出现了国产化的板级开源硬件,中航工业部门的有关研究所推出了由国产GD32微控制器和RT-Thread实时操作系统构建的一个Colibri-F207ZE开发板,具有软硬件自主可控、安全可靠,为嵌入式应用提供了有效解决方案,被称为口袋实验室。2017年《单片机与嵌入式系统应用》第3期吕华溢等人的“一种软硬件自主可控的嵌入式实时控制系统”,详细介绍了Colibri-F207ZE的板级开源硬件及其应用方法。在通用平台上开发个性化产品的优点是通用、便捷、裁剪方便,缺点是软硬件资源的冗余。这一点类似用FPGA开发硬件电路,在大规模量产时并不最优,不如转型到专用系统。开源硬件描述语言硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。硬件描述语言发展至今已有20多年的历史,它将硬件设计软件化,通过EDA工具进行仿真验证,最终通过微电子的ASIC手段或半定制的FPGA来实现一个真实的硬件系统。这是一种非主流电子工程师的非传统硬件系统设计方法,成功地应用于硬件设计的各个阶段,如建模、仿真、验证与数字化模块的综合等。随着系统级FPGA以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于系统设计和软件设计结合。硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言。硬件描述语言从一开始就是一种用软件工具、在软件方法基础上实现的电路系统设计方法。Chisel是加州大学伯克利分校研究人员设计并发布的一种新的开源硬件设计语言。他们认为现有的硬件描述语言VHDL、VerilogHDL等最初设计的目的是用来仿真的,所以有很多不可综合的语法,此外,VHDL、VerilogHDL缺少目前高级语言具备的一些特性,比如:对象、继承等,于是设计了Chisel,并将其开源。Chisel建立在Scala语言之上,可以支持高级硬件设计。用户使用Chisel时,以编写Scala程序的方式来设计硬件电路。采用Chisel设计的电路,经过编译可以得到FPGA、ASIC的VerilogHDL的相关代码。目前国内外已有人使用Chisel语言成功地实现了多种开源处理器。有多个开源项目使用Chisel作为开发语言,包括:采用RISC-V架构的开源标量处理器Rocket、开源乱序执行处理器BOOM(BerkeleyOut-of-OrderMachine)等。此外,Chisel的开源特性,也有助于用户了解硬件设计语言的内部实现机理,并在此基础上进行特定的优化与改进。2017年《单片机与嵌入式系统应用》第3期刊登雷思磊的“开源硬件描述语言Chisel的组合电路设计”详细地介绍了这种开源硬件的电路设计方法。操作系统中的开源设备树设备树是嵌入式操作系统中的一种开源硬件数据结构,是嵌入式操作系统中板级支持包(BoardSuortPackage,BSP)的华丽转身,其源头是PowerPC的DeviceTree技术。目前,最著名的是ARMLinux中的扁平设备树FDT(FlattenedDeviceTree)。早先在嵌入式系统中引入操作系统时为了满足操作系统对硬件单元的有效管理,设置了板级支持包,并添加有大量的驱动程序固件。板级支持包介于主板硬件与操作系统之间,是操作系统的一部分。程序员在使用嵌入式操作系统时,可以根据硬件结构的变化,在BSP中添加一些和系统相关的驱动程序。因此,随着主板的升级与变更,BSP也愈加庞杂。以ARMLinux为例,早期的ARMLinux中充斥着大量的垃圾代码,相当多的代码只是在描述板级细节,而这些板级细节对于内核来讲,只是垃圾。后来引入了PowerPC已成熟应用的DeviceTree技术,使得ARMLinux内核中的BSP华丽转身为扁平设备树(FDT)。DeviceTree是一种描述硬件的数据结构,基本上是一个描述电路板上CPU、总线、设备组成的树形结构,由一系列的结点(node)和属性(roerty)组成,结点本身可包含子结点,可用来描述原先kernel中的大量板级细节与硬件细节,直接透过它传递给Linux。Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的众多设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应设备。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息。由根结点、子结点、叶结点形成了硬件相关的树形结构,树结构将在节点之间创建父子关系,此父子关系是体系结构无关性的关键。当叶驱动程序或总线结点驱动程序本质上需要依赖于体系结构的服务时,该驱动程序会请求其父级节点提供该服务。采用此方法,不管计算机或处理器的体系结构是什么,驱动程序都可以正常运行。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息,这使得ARMLinux内核中的冗余编码大大减少,同时也使得用一个内核镜像去引导同一类ARM芯片集的硬件平台成为可能。2017年《单片机与嵌入式系统应用》第3期罗名驹等人的“扁平设备树FDT在ARMLinux中的应用研究”详细地介绍了ARMLinux中的FDT,以及如何通过FDT获取板级硬件的细节信息。结语开源硬件不是一天出现的。MCU诞生后,硬件工程师们便开始熟悉嵌入式产品的软件开发环境;有了软件搭桥,软件工程师也开始进入嵌入式领域。由于嵌入式系统领域中,计算机学科、电子技术学科、微电子学科交叉融合,逐渐形成了以软件手段为主的嵌入式产品开发环境。早先用户板基础上开放的产品开发平台、嵌入式操作系统中的板级支持包、VHDL和VerilogHDL的硬件描述语言,如今都已进化成树莓派型的板级开源硬件、嵌入式操作系统中的开源设备树和建立在Scala上的开源硬件描述语Chisel。这些开源硬件的诞生,极大地改变了嵌入式产品开发的生态环境,不仅深刻地改变了硬件工程师的产品开发模式,也将吸引更多的软件工程师进入嵌入式领域,从而开创了硬件工程师与软件工程师相互融合的时代。
    亮了(0) 120 0 03-08
  • 《Vivado使用误区与进阶》电子书
    这本《Vivado使用误区与进阶》电子书汇集了赛灵思专家团队在客户支持时所碰见的诸多实际案例,以及相对应的解决方案;还有多年总结下来的设计技巧与代码参数详解。是您学习和掌握Vivado开发套件的一本不可多得的实战指导资料。对比于动辄数百页的PDF文档,本书通过9篇文章,总共64页的篇幅向大家详细讲解了那些在设计中非常重要、经常碰见的一些场景下Vivado的正确(高效)的使用方法。本书目录如下:第一章:十分钟教会你UltraFast第二章:XDC约束技巧之时钟篇第三章:XDC约束技巧之CDC篇第四章:XDC约束技巧之I/O篇(上)第五章:XDC约束技巧之I/O篇(下)第六章:Tcl在Vivado中的应用第七章:用Tcl定制Vivado设计实现流程第八章:在Vivado中实现ECO功能第九章:读懂用好TimingReort赛灵思Vivado设计套件推出已经两年多了,从Vivado的早期计划开始,本文作者Ally以及她的同事们就已经投入到客户的支持与推广工作中,两年多的时间里面,Vivado不断成熟,客户也从最初的焦虑到全面接受。随着与用户更深层次的技术交流之后,Ally发现其实很多Vivado的用户并没有真正地了解Vivado的好处和优势(或者说,要么不够深入,要么有些偏差),而赛灵思提供的官方文档又动辄上百页,且多是英文,阅读学习起来颇有些难度。正因为此,Ally开始整理和总结她以及她同事日常支持客户时候积累下来的案例与解决方案,陆续推出了《Vivado使用误区与进阶》系列博文,希望用一些简洁明快的文字和一目了然的图文叙事来把一些常见的理解误区或者他们所总结的设计方法技巧呈现出来。希望通过这样的方式让更多的Vivado用户真正体会和掌握到这一高效的设计工具的优势。电子书下载请点击附件。收好不谢~
    亮了(1) 214 1 03-07
  • 基于Basys3的2048小游戏
    首先十分感谢Digilent论坛提供的这次机会,我跟大家分享的是我设计的一款小游戏:基于Basys3的2048小游戏。游戏功能:游戏界面由4×4的16个方格组成,每个方格中可以存放一个数字。玩家通过操纵Basys3开发板的上下左右四个方向键和中央的reset键,控制方格中的数字移动。界面由VGA和Pmod接口oled两种方式显示。游戏成功时显示笑脸,失败时显示骷髅。游戏过程中,玩家每按动一次方向键,所有数字按照这个方向移动一次,该方向上相邻相同的数字合并为原来的2倍,并在反方向随机生成一个新的数字。玩家目标是在游戏中拼出2048或更高的数字,即为游戏成功。DIY动手指南:Ste1:材料准备硬件:Basys3开发板VGA连接线以及VGA显示器(可选)sh1106驱动的oled显示屏一块软件:Vivado2016.2Ste2:系统框架系统主要由以下几个模块构成,游戏主状态机、游戏数据寄存器{S16}、移动模块move、随机产生模块gen、随机数生成器ran、VGA驱动模块和oled驱动模块。Ste3:程序设计接下来分模块进行分析。1、按键去抖对每个按键设计了一个32位长的FIFO,按键值从低位进入直至高位溢出。每过10ms,FIFO被完全刷新一次,只有当32位为FFFFFFFFh时认为输入为1,00000000h时认为输入为0。2、游戏数据寄存器用4×4=16个4bit寄存器,存放16个格子中的数据,记为{S16},以【log2对数】形式存放。即如果格子中是512,则存放9;如果格子中是128,则存放7。特例是0用0来存放。这种存放的特点是,可以节约寄存器数量,而且原本的加法128+128=256可以用加1来表示:7+1=8。寄存器位置定义如下:3、游戏主状态机游戏主状态机中,主要操纵数据寄存器{S16}的数值,通过对这个寄存器中数值的改变来实现游戏的进行。状态机分为4个状态:检测按键+移动,产生随机数,游戏状态检测,游戏失败死循环。其中游戏状态检测时,检查当前游戏是否已经结束或成功,如果成功,游戏不中断,玩家可以继续下去,如果已经结束,则跳入游戏失败的死循环中,结束游戏。4、移动逻辑组合电路本游戏有4种移动方式,即上下左右,每次移动4条线,但本质都是相同的,只需要一个模块即可完成。如下图所示move(i3,i2,i1,i0,o3,o2,o1,o0)我们默认向右移动。(为什么呢?因为当我们调用这个模块时,可以以各种方向调用:如果向右移动,则调用move(15,14,13,12)向右,如果向左移动,则调用move(12,13,14,15)向右即可,还可以调用move{15,11,7,3}向下,调用move{1,5,9,13}向上等等。)那么向右移动时,用f3~f0判断这四位是否为空,通过对f3~f0的16种情况的mux来决定输出的值,如果有相同则合并后输出。(其实这个模块就是一个大mux)例如,下图所示,左图右移后,变为右图。再例如:2,2,4,8右移后变为0,4,4,8,再右移变为0,0,8,8再右移变为0,0,0,165、随机数生成器和随机产生模块随机数产生器为随机产生模块gen服务。随机数生成器产生3组随机数,分别为8bit,12bit和16bit。分别对应2空格、3空格和4空格的情况。例如,如果右移后的图片如下图所示,那么黄色格子里的2就是在最左列3空格情况下随机产生的一个位置。我们还是默认向右移动,那么最左边的四个格子(15,11,7,3)即可交给gen,在空白出产生一个随机位置的“2”。这里需要注意的是,2048游戏中规定必须是“有效移动”后才产生一个数字,以杜绝有投机的玩家一直按同一个方向键可以作弊的情况。这一逻辑只需要对上一步中move前后做一下对比即可。6、VGA显示模块640×480分辨率,25MHz的时钟信号。其中扫描时,将VGA坐标的后两位[1:0]舍去,即可将640×480像素变为160×120的色块。(注:源码中的VGA画图一段和oled画图一段看上去很复杂,其实是画点的方式比较奇怪,两种画法都是先将132x64的点阵水平划分为8条,每条8行,再以每列为1个byte的方式画出来。。。那么为什么要这么复杂呢?因为oled的sh1106驱动就是这么要求的,我先做了oled,后面vga就直接引用了~)Ste4:演示见视频~
    亮了(1) 120 2 03-07
  • 嵌入式视觉系统的概念及关键因素
    作者:AaronBehman,AdamTaylor  基于视觉的系统在很多行业和应用领域中已变得非常普遍。实际上,我们中的很多人每天就携着一个嵌入式视觉系统,比如在我们的智能手机中。这些智能设备不仅能够捕获图像和录制视频,而且还能执行增强现实的应用,这些都展示了嵌入式视觉技术是如何被普遍地广为接受。  处理能力、存储器密度和系统集成度的提升,促进了嵌入式视觉在传统和新兴应用领域(图1所示实例)的增长。这也使得嵌入式视觉在消费类、产业和政府领域被广泛接受,因而将在十年内实现显著增长。表1列出了一些嵌入式视觉的高增长领域,其中有一些显而易见,有些则不是很明显。图1常见的嵌入式视觉应用。表1预期的嵌入式视觉高增长领域什么是嵌入式视觉?  嵌入式视觉系统包含从所选成像传感器接收光到系统输出的整个信号链。系统输出是指从图像中提取的经过处理或未经处理的图像或信息,并提供给下游系统。当然,嵌入式系统架构师负责根据系统要求确保端到端性能。  为此,嵌入式视觉系统架构师需要熟悉与传感器和后处理系统有关的各种概念和技术。本文作为高级入门手册,旨在让读者对这些技术和概念有一个基本了解。  首先需要熟悉电磁波谱以及希望系统运行的光谱域。人眼只能看到390nm(蓝光)至700nm(红光)波长之间的光谱,也就是通常所指的可见光谱;成像设备凭借所采用的技术,则能捕获到更宽泛波长的图像,包括X光、紫外线、红外线以及可见光谱。  在近红外光谱及以下范围,我们可以使用电荷耦合器件(CCD)或CMOS(互补金属氧化物半导体)图像传感器(CIS);到了红外光谱范围,需要使用专用的红外检测器。红外光谱范围之所以需要专用传感器,部分原因在于芯片成像器(如CCD或CIS)需要的激发能。这些器件通常需要1eV的光子能量来激发一个电子,然而在红外范围,光子能量介于1.7eV-1.24meV之间,因此红外成像器应基于HgCdTe或InSb。这些器件需要更低的激发能量,经常与CMOS读出IC(即ROIC)配合使用,以控制和读出传感器。最常见的两种检测器技术分别是CCD和CIS● 电荷耦合器件被视为模拟器件,因此要集成到数字系统中就需要使用片外ADC以及所需模拟电压电平下的时钟生成功能。每个像素存储由光子产生的电荷。大多数情况下将像素排列成2D阵列,组成多个行,每行包含多个像素。读出CCD时通过行传输将每行并行传递到读出寄存器,再通过读出寄存器将每行串行读出。这个寄存器读出过程中,电荷转换为电压。● CMOS成像传感器能实现更紧密集成,使ADC、偏置和驱动电路都集成在同一晶片上。这大大降低了系统集成要求,同时也提高了CIS设计的复杂性。CIS的核心是有源像素传感器(APS),其中每个像素同时包含光电二极管和读出放大器,因此,与CCD不同,CIS能够读出阵列中的任意像素地址。  尽管大多数嵌入式视觉都采用CIS器件,但是CCD仍用于非常注重性能的高端科研应用领域。本文的要点内容适用于这两种成像技术。传感器考虑因素  选择正确的传感器需要了解系统要求,为此,必须从器件的几个方面加以考虑。  第一个要求是我们必须确定所需的分辨率,也就是每行有多少个像素,检测器需要多少行。最终应用对此起决定作用,例如,科研用的天文学应用可能需要高分辨率的2D器件,而工业检查成像可能仅需要行扫描方案。● 行扫描器件在X方向上包含单行(有时是几行)像素。如果通过相机或目标的移动生成Y方向上的图像,通常采用这类器件。它们用于检查或光学字符识别(OCR)领域。有些领域需要采用时域积分(TDI)线扫描传感器。这类传感器在X方向包含多行,随着目标移动,像素值也从一个向下一个移动,随着电荷在时间上积分,可实现更灵敏的检测。不过,TDI需要在行传输与目标移动之间进行同步,以防出现模糊和图像缺陷。由于只有几行需要读出,因此帧率可以非常高。● 2D阵列包含多个行,每行有多个像素,阵列大小是决定传感器最大帧率的一个因素。通常,为了实现更高的帧速率,2D器件并行读出多个像素。2D器件还能执行窗口操作(有时称为兴趣区域),即只读出特定的感兴趣区域,以获得更高帧速率。这类器件可用于众多领域,而且信息包含在2D图像中,例如高级驾驶员辅助系统(ADAS)、监控或科研领域。  确定成像器格式以及所需分辨率之后,我们还必须考虑像素间距。像素间距定义像素的大小,决定能收集多少入射光子产生的电荷。因此,较小的像素间距意味着在积分周期内(传感器暴露在图像中的时间)收集较少的电荷。如果像素间距较小,意味着捕捉图像需要更长的积分时间,这会影响传感器捕捉快速移动图像的能力,并降低低光拍照性能。  确定传感器格式后,我们必须考虑使用哪种技术,CCD、CMOS还是更为专业的技术。这里的重要参数是量子效率(QE);该参数是器件通过光子产生电子的效率。通常,我们希望在有用光谱上实现尽可能高的QE,这对于低光应用也具有重要意义。影响器件QE的因素有三个:吸收、反射和透射。QE降低的一个主因是器件结构。器件结构可能导致像素被传感器中的电路屏蔽,例如金属线或多晶硅栅极电路等。这些结构会吸收或反射光子,从而降低QE,因此要选好传感器。● 前照式—对于这类器件,光子以上面的介绍的传统方式照射器件的前面,像素可能被遮蔽,QE相应降低。● 背照式—这些器件经过后期处理,将器件的后部削薄,以便在后面接收光照,从而不受其他设计元件的阻挡。薄型背照式器件能实现最佳QE。我们还必须考虑图像传感器中所允许的噪声;有三个主要方面需要考虑。● 器件噪声—这在本质上讲是暂时的,包括散射噪声以及输出放大器和复位电路产生的噪声。● 固定图形噪声(FPN)—呈空间分布,由相同光照强度下像素的不同响应引起。FPN通常由每个像素的不同偏移和增益响应引起;偏移部分通常称为暗信号响应非均匀性(DSNU),增益部分称为图像响应非均匀性(PRNU)。有多种方法可以补偿FPN,最常见的方法是输出信号的相关双采样法。● 暗电流—这由图像传感器中的热噪声引起,甚至在无光照情况下也会出现。暗信号对最终图像质量的影响取决于帧速率;较高帧速率下影响不大,然而,随着帧速率降低(如科研应用)影响会很明显。由于暗电流与温度有关,因此在需要降低暗电流的情况下,通常做法是利用冷却器件(例如Peltier)来降低成像器件的工作温度。  理解了成像器的噪声模式后,我们就能确定能实现多大的信噪比(SNR)。  确定器件的噪声性能后,就可以确定图像传感器所需的动态范围。动态范围代表传感器捕获光照强度范围较大的图像的能力,单位是dB或以比率形式给出。这意味着图像同时包含高照度区和暗区。  传感器的实际动态范围由像素的满井容量决定,也就是像素饱和前所能承载的电子数量。将容量除以读出噪声,能方便地将比率转换为以dB为单位的值。  通常利用光子转换曲线测试法来确定动态范围,画出噪声与容量的关系曲线。  如果器件具有数字输出,可通过下面的公式利用输出端比特数计算该值。  然而,这并不能确保器件可以实现这样的动态范围;只是说明总线宽度所能代表的潜在范围,而没有考虑传感器性能因素。  IO标准也很重要,不仅用来输出像素数据,还用来输出命令和控制接口。这与帧速率有关,例如LVCMOS接口不适合高帧速率应用,但可用于简单的监控摄像头。随着帧速率、分辨率和每像素比特数的增加,成像器件的趋势正朝着采用LVDS系列或SERDES技术的专用高速串行链路发展。  现在我们已经介绍了图像传感器的多个重要方面,另一个尚未考虑的因素是成像器是彩色还是单色传感器。无论选择哪种,都取决于应用场合。● 彩色传感器—需要在每个像素上使用贝尔图形,在一条线上交替变换红色和绿色,下一条线上交替蓝色和绿色(绿色用得多是因为人眼对绿颜色波长更敏感)。这意味着要对接收到的光子进行滤波处理,使每个像素只接收具有所需波长的光子。我们可对图像进行后处理,用不同颜色围绕像素以重构每个像素上的颜色,从而确定像素颜色,而且不会降低图像分辨率。彩色传感器会使重构和输出图像所需的图像处理链变得复杂化。贝尔图形确实会导致分辨率降低,但是没有想象的那么差,通常降幅为20%。● 单色—由于图像阵列上没有贝尔图形,因此每个像素能接收所有光子。这样可增大图像灵敏度,使图像的读出更简单,因为不存在颜色重建所需的去马赛克效应。经选择我们决定使用CIS器件,而实际上这些属于复杂的专用片上系统。因此,我们还必须考虑以下关于读出模式和积分时间的问题。● 积分时间—这是读出之前像素的曝光时间。在比较简单的CCD系统上,需要接近电子装置在器件外执行该时序。然而对于CIS器件,积分时间可通过命令接口由寄存器来配置,然后CIS器件针对常用的两种读出模式精确地执行积分时间。● 全局快门模式—这种模式下,所有像素同时接受光照,然后读出。此模式下由于所有像素同时读出,因此会增大读出噪声。如果要对快速运动物体拍摄快照,适合使用该模式。● 滚动快门模式—这种模式下,进行逐行曝光和读出。这种模式的读出噪声较小,然而,在捕获快速运动物体方面不如全局快门模式。系统开发  选择了合适的传感器之后,在进行系统开发的过程中还需要考虑和解决诸多挑战。  除了技术挑战以外,开发系统时还会面对时间压力,确保在既定时限内将产品推向市场。我们要根据时间限制,重点弄清楚开发过程中的哪部分活动能实现附加价值,然后做出正确选择,分清哪部分应该自己开发(增值活动),哪部分可以购买商用现成产品(COTS)或者分包出去。重点关注增值活动并利用硬件、软件和FPGA层面的IP模块,是满足上市时间要求的重要促成因素之一。  除了上市时间要求,嵌入式视觉系统开发过程中还要经常考虑尺寸、重量、功耗和成本(SWAP-C)要求。究竟哪种要求占主导,取决于具体应用领域,例如手持设备在功耗方面就要比驾驶员辅助系统更为严格。然而,对于高级驾驶员辅助系统来说,由于要生产几百万台,因此方案成本就成了主导因素。  要在尺寸、重量、功耗和成本方面获得很好的效果,应该在传感器和处理系统中实现更为紧密的系统集成,即使用数量更少但功能更强的集成组件。  每种应用领域都具有不同增值点以及不同的尺寸、重量、功耗和成本考量,因此几乎所有嵌入式视觉系统都需要我们实现所谓的图像处理流水线。这种流水线可与所选的传感器建立接口连接,并且执行所需的操作以生成适合进一步加工或直接在网络上传输的图像。基本的图像处理流水线包含● 照相机接口—接收来自传感器的原始图像● 颜色滤波阵列—重建像素颜色● 色彩空间转换—转换成针对编解码器的正确色彩空间。● 输出格式化—与输出介质进行接口连接  在图像处理流水线中对接收的图像执行和应用算法。所实现应用不同,算法也会不同;不过,有一些常用的图像处理算法可用来提高对比度,检测图像中的特性、目标或运动,或者校正模糊图像。  应该在一个框架中开发这些算法,以便我们以最短时间将产品推向市场,并鼓励重复使用,降低非重复性和重复性工程成本。有几种现成的框架我们可以考虑使用。● OenVX—用于开发图像处理应用的开源应用程序。● OenCV—开源计算机视觉,多个面向实时计算机视觉的库,基于C/C++● OenCL—基于C++的开源计算机语言,用于开发GPU、FPGA等器件中常见的并行处理应用。● SDSoC—赛灵思的一款设计环境,借助该环境开发人员可在Zynq或UltraScale+MPSoC器件的ARM处理系统中最初实现用C/C++编写的算法,分析代码库特性以找出性能瓶颈,然后利用赛灵思高层次综合功能将这些瓶颈转换到硬件支持的IP核,并在器件的可编程逻辑(PL)部分运行。  采用FPGA或AllProgrammableSoC方案时,将这些框架与HLS结合使用,能够高效开发出嵌入式视觉应用,并通过硬件在闭环中快速演示。  图像经过处理流水线后,数据从系统的输出方式也很重要,我们有三种选择。● 利用视频图形阵列(VGA)、高清多媒体接口(HDMI)、串行数字接口(SDI)或DislayPort等标准将图像输出到显示器。很多电动车采用触摸式显示屏对系统进行控制和配置。● 将图像或从图像中提取的信息传送到另一个系统,该系统像云处理应用那样使用图像或提取出的信息● 将图像存储在非易失存储介质中,供以后访问。  对于绝大多数方式而言,在完成成像链后,我们都需要确定图像格式化方式,以便使用。此时,我们需要决定是否使用诸如H.264(MPEG-4Part10高级视频编码)或H.265(高效率视频编码)等行业标准图像/视频压缩算法对图像进行编码,这些实现方案通常称为编解码器。编解码器能提高通信和网络带宽的使用效率,或降低实现高保真度所需的存储空间,因为编码通常存在较大失真。如果因使用编解码器导致失真度无法接受,还可以按原始格式发送和存储图像,或者以无损格式进行编码。  大多数编解码器所使用的色彩空间都与图像传感器输出的色彩空间(前提是系统使用彩色器件)不同。嵌入式视觉中常用的色彩空间是:● 红、绿、蓝—包含RGB信息作为图像传感器的输出,常用作VGA等简单接口的输出● YUV—包含亮度(Y)和色度(U和V),该色彩空间用于大多数编解码器和一些显示标准。常用的YUV格式为YUV4:4:4和YUV4:2:2。两种格式的区别在于:4:4:4格式下,每像素由8位表示,得到24位像素。在4:2:2格式下,U值和V值在像素之间共享,得到16位像素,可节省存储空间。另一个对图像处理链和SWAP-C具有很大影响的决策是:大部分图像处理链应该在哪实现:● 在边缘,即在嵌入式视觉系统之内。这样会提高系统的功耗和处理/存储要求,但能够实现更快的响应。在边缘处理将在大部分嵌入式应用(例如高级驾驶员辅助、机器视觉等)中成为主导。● 在云中,这需要嵌入式视觉系统捕获图像,并且利用网络技术将图像发送到云。可在云中处理的典型应用包括医疗成像或科研应用。这类应用中,处理非常密集,且不需要实时结果。  为实现处理链,处于嵌入式视觉系统核心的处理内核不仅要能控制所选的图像传感器,还要能接收和实现图像处理流水线,并通过指定网络基础设施传送图像或发送到选定的显示器。考虑到这些严苛要求,因此经常要选择FPGA,或者越来越多的情况下需要使用AllProgrammable片上系统,例如Zynq器件。  Zynq器件将两个高性能ARMA9处理器与FPGA架构相结合。这样使得处理系统(PS)可用来通过GigE、PCIe或CAN等接口与主机系统通信,同时执行系统的一般管理和日常事务。器件的另一半,即可编程逻辑(PL)可用来接收和处理图像,充分利用FPGA架构的并行处理特性。如果要求通过网络基础设施传送图像,那么可使用Zynq中的直接存储器访问(DMA)控制器高效地将图像数据从PL移动到PSDDR存储器。图像到了PSDDR存储器内,可利用所选传输介质的DMA控制器进一步访问。  当然,一旦图像处在PSDDR,高性能A9处理器也可提供进一步的处理操作。Zynq架构的特点在于还可将处理后的图像从PSDDR移回PL中的图像流水线。传感器融合  很多嵌入式视觉系统还要求能够集成更多传感器数据以更好地感知环境。这包括使用很多同类传感器(同类传感器融合)扩大视场,例如高级驾驶员辅助系统的全景功能;或者整合多个不同类型的传感器(异构传感器融合)提供可见光谱下无法看到的视觉内容,例如在常规图像传感器数据上叠加红外信息。  很多情况下,需要将嵌入式视觉应用的输出与其他传感器数据进行融合,使产生的图像包含多个不同传感器的信息。最简单的传感器融合应用是将不同频谱的图像相结合,例如可见光与红外线融合以实现更好的夜视效果。  传感器融合的另一个更为复杂的用途是将成像系统、全球导航卫星系统(GNSS)、数字地图信息以及不同波长下运行的其他传感器(例如雷达)进行融合,以确定另一辆汽车的相对位置,从而实现避撞功能。  由于要将不同系统融合在一起,并提取信息,因此传感器融合对处理器的要求会非常高。AllProgrammable片上系统解决方案能够与多个传感器建立接口连接,并行处理信息,增大数据吞吐量,因而具有多种显著优势。结论  嵌入式视觉已变得非常普遍,其市场渗透率和应用范围将在下个十年里只增不减。  在传感器和系统层面,有多个因素必须加以考虑。有多种技术、框架和器件可用来实现嵌入式视觉系统。
    亮了(1) 79 0 03-06
解决问题:34
干货热帖:111
会员总数:3608
总帖数:374
我要发帖

贡献榜

  • hahavchen

    创新创业教育知名圈内人

    常隐匿于江湖的资深攻城狮,拥有超过10年的半导体与测控行业产品研发、技术支持、市场拓展及区域销售经验。目前同时担任上海交通大学本科生企业导师。

    • 王斌Jr

      工程师

      Andorid工程师,书呆子

    • mysunday2

      本科生

      武汉大学在读研究生,懂一点Java,懂一点LabVIEW

    • 风雨兼程

      本科生

      热爱科研,忠于技术,渴望在LabVIEW的世界里遨游。

    • 地板

      媒体人

      资深媒体人,现任职于国内某知名电子行业媒体

  • EltonLiang

    工程师

    汽车电子方向系统集成工程师,坐标北京。精通LabVIEW与测控技术,乐于分享总结。

    • Superlava

      工程师

      国家电网工程师,对于创新创造,我是真爱粉!

    • chnwjian

      研究生

      擅长物理实时测量和ardunio

    • linon

      教师

      东南大学电子科学与工程学院

    • suo ivy

      创业者

      乐忠于机器人的创业少年

  • CC

    研究生

    擅长FPGA以及LabVIEW程序设计,拥有多年项目开发经验,曾开发过高速误码仪、自动泊车系统,研发并将PM2.5检测仪推入市场,目前致力于FPGA的图像处理研究。

    • 冰淇淋

      研究生

      略懂c语言,爱玩爱交流

    • Veritas

      电子技术爱好者

      非电类专业的在校纯技术爱好者

    • 竹杖芒鞋轻胜马

      研究生

      擅长电子电力,电源,逆变器,Matlab的同济骚年

    • 熊猫家的猫

      研究生

      热爱电子设计,熟悉LabVIEW编程,希望和大家一起学习进步。

    • 李比希

      电子技术爱好者

      喜欢LabVIEW,会点c语言,痴迷玩创,让激情碰出创意的火花!

    • 糊涂宝宝

      研究生

      精通C语言与电路设计。善于软硬件结合开发实际工程项目。

    • LabVIEWers

      工程师

      汽车电子电控领域工程师。个人信条:追求卓越。

    • 南瓜粥

      本科生

      致力于精密测量@天津大学

  • philo

    工程师

    刚毕业的新晋TI验证工程师一枚。内心埋有一个小小的希望靠技术改变世界的种子。CLD(认证LabVIEW开发工程师)持有者,并熟悉C语言与MATLAB。

    • 阳光的新手125

      研究生

      Strict coding is the boddy, smart thoughts are the soul.

    • AoduLabVer

      工程师

      华为数字视频领域工程师,技术宅,CLD,热衷LabVIEW

    • 西兰花教负责人

      创业者

      俗称“福建三本“的某985高校毕业,正不务正业地创业中

    • berwin

      创业者

      好奇主义 & 观察者 & 行动派

  • RockMOOC

    教师

    博士,现于哈尔滨工业大学任教。拥有超过8年基于FPGA的数字系统硬件设计经验,精通FPGA开发。

    • wonderm

      本科生

      熟悉LabVIEW/Matlab/Verilog,擅长STM32/K60硬件开发

    • diguaguowang

      研究生

      一直羡慕会各种编程的人,也在向着这个方向努力

    • 阿Q

      工程师

      精通FPGA的酷创达人

    • wigger

      工程师

      Digilent元老级大牛

  • Mr. D

    工程师

    部落的发起者与第一位"Digger",非典型张江男一枚。致力于为有执着有梦想的志同道合者缔造一个可以互相勾搭的中文开源技术社区。