谁能给我讲讲这个二次函数讲座,顺便有偿求一个c++学霸

学霸讲堂c++_腾讯视频
三倍流畅播放
1080P蓝光画质
新剧提前看
1080P蓝光画质
纯净式无框播放器
三倍流畅播放
扫一扫 手机继续看
下载需先安装客户端
{clientText}
客户端特权:
3倍流畅播放
当前播放至 {time}
扫一扫 手机继续看
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要Digilent | 分享创新的乐趣,发现更好的自己
坐标:上海师大
更换背景图片
选择主题或自己上传图片
未选择任何文件
对于Zedboard的基本情况,不了解的可以点击官网产品页,在此就不再做赘述了,只是记录下本人如何在拿到开发板之后,怎么从零开始构建并运行linux系统,并在其上运行一个hello_world程序。先附上成功运行截图:第一步,安装arm-linux交叉编译器,在网站htts://code.google.com//zedboard-book-source/downloads/list上的download里下载红色所圈出的文件,如果不想安装双系统,可以在虚拟机VMware上安装Ubuntu10.04_i386,然后将打开将该文件复制到linux系统中,(笔者是放入了共享文件夹中,方法百度,很容易找然后,进入如下目录,安装xilinx--arm-xilinx-linux-gnueabi.bin,具体步骤如下:(必须保证当前已经进入到该文件所在的文件夹)&sudo–s&输入密码&./xilinx--arm-xilinx-linux-gnueabi.bin,附图如下出现图如下一路默认就好了,最终安装完成后如下所示:安装完成后,修改当前dash为bash,具体方法如下:弹出如下对话框,选择NO,即可。最后,修改/etc/bash.bashrc文件,在其中添加如下代码:方法如下:在命令行上输入gedit/etc/bash.bashrc第三个exort即为默认的软件安装路径。最后,关闭该文件,并使其立即生效,输入source/etc/bash.bashrc。此时,可以查看当前的PATH是否已经成功更新,在命令行上输入$PATH,若其中有上述PATH,则更新成功!在本帖附件中,下载Linux镜像。如红色线条所画文档,并解压,将解压后的文件夹sd_image中的文件复制到sd卡上(在这之前保证sd卡被格式化为FAT32格式)。然后将SD卡插入到开发板上,按如图所示连接线路,注意红色线条所示的部分:编写测试文件:hello_world.c#includeintmain(){&&&rintf(&Hello,ZedBoard!\nI'mjefby!\n&);&&&&&&return0;}在命令行下如下编译(进入到该文件所在的文件夹)&arm-xilinx-linux-gnueabi-gcc-ohello_worldhello_world.c将生成的文件拷贝到U盘中,然后按图1所示连接电路,上电,出现如下问题:下载驱动,打开设备管理器,更新驱动程序(CyUSB2Serial_v3.0.11.0.zi,附件中下载),又出现如下问题,再次更新此驱动(同一个目录),至此驱动安装完成。使用超级终端(windowsSuerzd.rar,附件中下载)建立串行连接,如下设置串口参数:最后输出如下:(部分图)红线所示为笔者U盘的挂载名称在命令行下将其挂载到mnt下,并运行hello_world,具体如下,Ok,到此就大功告成了!
已被管理员加精
作者:李博杰链接:htts://www.zhihu.com/question//answer/来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。问题「用FPGA代替CPU」中,这个「代替」的说法不准确。我们并不是不用CPU了,而是用FPGA加速适合它的计算任务,其他任务仍然在CPU上完成,让FPGA和CPU协同工作。本回答将涵盖三个问题:为什么使用FPGA,相比CPU、GPU、ASIC(专用芯片)有什么特点?微软的FPGA部署在哪里?FPGA之间、FPGA与CPU之间是如何通信的?未来FPGA在云计算平台中应充当怎样的角色?仅仅是像GPU一样的计算加速卡吗?一、为什么使用FPGA?众所周知,通用处理器(CPU)的摩尔定律已入暮年,而机器学习和Web服务的规模却在指数级增长。人们使用定制硬件来加速常见的计算任务,然而日新月异的行业又要求这些定制的硬件可被重新编程来执行新类型的计算任务。FPGA(FieldProgrammableGateArray)正是一种硬件可重构的体系结构,常年来被用作专用芯片(ASIC)的小批量替代品,然而近年来在微软、百度等公司的数据中心大规模部署,以同时提供强大的计算能力和足够的灵活性。&imgsrc=&htts://ic3.zhimg.com/50/v2-71bb2dab64eb85e80b815c_hd.jg&data-rawwidth=&2106&data-rawheight=&1147&class=&origin_imagezh-lightbox-thumb&width=&2106&data-original=&htts://ic3.zhimg.com/v2-71bb2dab64eb85e80b815c_r.jg&&不同体系结构性能和灵活性的比较。FPGA为什么快?「都是同行衬托得好」。CPU、GPU都属于冯·诺依曼结构,指令译码执行、共享内存。FPGA之所以比CPU甚至GPU能效高,本质上是无指令、无需共享内存的体系结构带来的福利。冯氏结构中,由于执行单元(如CPU核)可能执行任意指令,就需要有指令存储器、译码器、各种指令的运算器、分支跳转处理逻辑。由于指令流的控制逻辑复杂,不可能有太多条独立的指令流,因此GPU使用SIMD(单指令流多数据流)来让多个执行单元以同样的步调处理不同的数据,CPU也支持SIMD指令。而FPGA每个逻辑单元的功能在重编程(烧写)时就已经确定,不需要指令。冯氏结构中使用内存有两种作用。一是保存状态,二是在执行单元间通信。由于内存是共享的,就需要做访问仲裁;为了利用访问局部性,每个执行单元有一个私有的缓存,这就要维持执行部件间缓存的一致性。对于保存状态的需求,FPGA中的寄存器和片上内存(BRAM)是属于各自的控制逻辑的,无需不必要的仲裁和缓存。对于通信的需求,FPGA每个逻辑单元与周围逻辑单元的连接在重编程(烧写)时就已经确定,并不需要通过共享内存来通信。说了这么多三千英尺高度的话,FPGA实际的表现如何呢?我们分别来看计算密集型任务和通信密集型任务。计算密集型任务的例子包括矩阵运算、图像处理、机器学习、压缩、非对称加密、Bing搜索的排序等。这类任务一般是CPU把任务卸载(offload)给FPGA去执行。对这类任务,目前我们正在用的Altera(似乎应该叫Intel了,我还是习惯叫Altera……)StratixVFPGA的整数乘法运算性能与20核的CPU基本相当,浮点乘法运算性能与8核的CPU基本相当,而比GPU低一个数量级。我们即将用上的下一代FPGA,Stratix10,将配备更多的乘法器和硬件浮点运算部件,从而理论上可达到与现在的顶级GPU计算卡旗鼓相当的计算能力。&imgsrc=&htts://ic4.zhimg.com/50/v2-ff703e9c57f9cf55777b_hd.jg&data-rawwidth=&1053&data-rawheight=&832&class=&origin_imagezh-lightbox-thumb&width=&1053&data-original=&htts://ic4.zhimg.com/v2-ff703e9c57f9cf55777b_r.jg&&FPGA的整数乘法运算能力(估计值,不使用DSP,根据逻辑资源占用量估计)&imgsrc=&htts://ic2.zhimg.com/50/v2-404dcbcf292c4e31b3e12ebc228963af_hd.jg&data-rawwidth=&1070&data-rawheight=&831&class=&origin_imagezh-lightbox-thumb&width=&1070&data-original=&htts://ic2.zhimg.com/v2-404dcbcf292c4e31b3e12ebc228963af_r.jg&&FPGA的浮点乘法运算能力(估计值,float16用软核,float32用硬核)在数据中心,FPGA相比GPU的核心优势在于延迟。像Bing搜索排序这样的任务,要尽可能快地返回搜索结果,就需要尽可能降低每一步的延迟。如果使用GPU来加速,要想充分利用GPU的计算能力,batchsize就不能太小,延迟将高达毫秒量级。使用FPGA来加速的话,只需要微秒级的PCIe延迟(我们现在的FPGA是作为一块PCIe加速卡)。未来Intel推出通过QPI连接的Xeon+FPGA之后,CPU和FPGA之间的延迟更可以降到100纳秒以下,跟访问主存没什么区别了。FPGA为什么比GPU的延迟低这么多?这本质上是体系结构的区别。FPGA同时拥有流水线并行和数据并行,而GPU几乎只有数据并行(流水线深度受限)。例如处理一个数据包有10个步骤,FPGA可以搭建一个10级流水线,流水线的不同级在处理不同的数据包,每个数据包流经10级之后处理完成。每处理完成一个数据包,就能马上输出。而GPU的数据并行方法是做10个计算单元,每个计算单元也在处理不同的数据包,然而所有的计算单元必须按照统一的步调,做相同的事情(SIMD,SingleInstructionMultileData)。这就要求10个数据包必须一起输入、一起输出,输入输出的延迟增加了。当任务是逐个而非成批到达的时候,流水线并行比数据并行可实现更低的延迟。因此对流式计算的任务,FPGA比GPU天生有延迟方面的优势。&imgsrc=&htts://ic2.zhimg.com/50/v2-1ffb204e56f3d02b0cabdcd6f6c3fb34_hd.jg&data-rawwidth=&1435&data-rawheight=&476&class=&origin_imagezh-lightbox-thumb&width=&1435&data-original=&htts://ic2.zhimg.com/v2-1ffb204e56f3d02b0cabdcd6f6c3fb34_r.jg&&计算密集型任务,CPU、GPU、FPGA、ASIC的数量级比较(以16位整数乘法为例,数字仅为数量级的估计)ASIC专用芯片在吞吐量、延迟和功耗三方面都无可指摘,但微软并没有采用,出于两个原因:数据中心的计算任务是灵活多变的,而ASIC研发成本高、周期长。好不容易大规模部署了一批某种神经网络的加速卡,结果另一种神经网络更火了,钱就白费了。FPGA只需要几百毫秒就可以更新逻辑功能。FPGA的灵活性可以保护投资,事实上,微软现在的FPGA玩法与最初的设想大不相同。数据中心是租给不同的租户使用的,如果有的机器上有神经网络加速卡,有的机器上有Bing搜索加速卡,有的机器上有网络虚拟化加速卡,任务的调度和服务器的运维会很麻烦。使用FPGA可以保持数据中心的同构性。接下来看通信密集型任务。相比计算密集型任务,通信密集型任务对每个输入数据的处理不甚复杂,基本上简单算算就输出了,这时通信往往会成为瓶颈。对称加密、防火墙、网络虚拟化都是通信密集型的例子。&imgsrc=&htts://ic1.zhimg.com/50/v2-d74634adc21db32f6fafed538c7b91ca_hd.jg&data-rawwidth=&1434&data-rawheight=&478&class=&origin_imagezh-lightbox-thumb&width=&1434&data-original=&htts://ic1.zhimg.com/v2-d74634adc21db32f6fafed538c7b91ca_r.jg&&通信密集型任务,CPU、GPU、FPGA、ASIC的数量级比较(以64字节网络数据包处理为例,数字仅为数量级的估计)对通信密集型任务,FPGA相比CPU、GPU的优势就更大了。从吞吐量上讲,FPGA上的收发器可以直接接上40Gbs甚至100Gbs的网线,以线速处理任意大小的数据包;而CPU需要从网卡把数据包收上来才能处理,很多网卡是不能线速处理64字节的小数据包的。尽管可以通过插多块网卡来达到高性能,但CPU和主板支持的PCIe插槽数量往往有限,而且网卡、交换机本身也价格不菲。从延迟上讲,网卡把数据包收到CPU,CPU再发给网卡,即使使用DPDK这样高性能的数据包处理框架,延迟也有4~5微秒。更严重的问题是,通用CPU的延迟不够稳定。例如当负载较高时,转发延迟可能升到几十微秒甚至更高(如下图所示);现代操作系统中的时钟中断和任务调度也增加了延迟的不确定性。&imgsrc=&htts://ic2.zhimg.com/50/v2-b5b50a3c73cba5223ada6c6_hd.jg&data-rawwidth=&817&data-rawheight=&594&class=&origin_imagezh-lightbox-thumb&width=&817&data-original=&htts://ic2.zhimg.com/v2-b5b50a3c73cba5223ada6c6_r.jg&&ClickNP(FPGA)与DellS6000交换机(商用交换机芯片)、Click+DPDK(CPU)和Linux(CPU)的转发延迟比较,errorbar表示5%和95%。来源:[5]虽然GPU也可以高性能处理数据包,但GPU是没有网口的,意味着需要首先把数据包由网卡收上来,再让GPU去做处理。这样吞吐量受到CPU和/或网卡的限制。GPU本身的延迟就更不必说了。那么为什么不把这些网络功能做进网卡,或者使用可编程交换机呢?ASIC的灵活性仍然是硬伤。尽管目前有越来越强大的可编程交换机芯片,比如支持P4语言的Tofino,ASIC仍然不能做复杂的有状态处理,比如某种自定义的加密算法。综上,在数据中心里FPGA的主要优势是稳定又极低的延迟,适用于流式的计算密集型任务和通信密集型任务。二、微软部署FPGA的实践2016年9月,《连线》(Wired)杂志发表了一篇《微软把未来押注在FPGA上》的报道[3],讲述了Catault项目的前世今生。紧接着,Catault项目的老大DougBurger在Ignite2016大会上与微软CEOSatyaNadella一起做了FPGA加速机器翻译的演示。演示的总计算能力是103万Tos,也就是1.03Exa-o,相当于10万块顶级GPU计算卡。一块FPGA(加上板上内存和网络接口等)的功耗大约是30W,仅增加了整个服务器功耗的十分之一。&imgsrc=&htts://ic4.zhimg.com/50/v2-de52eeb2acae767ec3a3_hd.jg&data-rawwidth=&1410&data-rawheight=&731&class=&origin_imagezh-lightbox-thumb&width=&1410&data-original=&htts://ic4.zhimg.com/v2-de52eeb2acae767ec3a3_r.jg&&Ignite2016上的演示:每秒1Exa-o(10^18)的机器翻译运算能力微软部署FPGA并不是一帆风顺的。对于把FPGA部署在哪里这个问题,大致经历了三个阶段:专用的FPGA集群,里面插满了FPGA每台机器一块FPGA,采用专用网络连接每台机器一块FPGA,放在网卡和交换机之间,共享服务器网络&imgsrc=&htts://ic3.zhimg.com/50/v2-880465ced11d754f07f8edd225e48cab_hd.jg&data-rawwidth=&1077&data-rawheight=&1335&class=&origin_imagezh-lightbox-thumb&width=&1077&data-original=&htts://ic3.zhimg.com/v2-880465ced11d754f07f8edd225e48cab_r.jg&&微软FPGA部署方式的三个阶段,来源:[3]第一个阶段是专用集群,里面插满了FPGA加速卡,就像是一个FPGA组成的超级计算机。下图是最早的BFB实验板,一块PCIe卡上放了6块FPGA,每台1U服务器上又插了4块PCIe卡。&imgsrc=&htts://ic1.zhimg.com/50/v2-8edb5cfe1cf_hd.jg&data-rawwidth=&2483&data-rawheight=&1101&class=&origin_imagezh-lightbox-thumb&width=&2483&data-original=&htts://ic1.zhimg.com/v2-8edb5cfe1cf_r.jg&&最早的BFB实验板,上面放了6块FPGA。来源:[1]可以注意到该公司的名字。在半导体行业,只要批量足够大,芯片的价格都将趋向于沙子的价格。据传闻,正是由于该公司不肯给「沙子的价格」,才选择了另一家公司。当然现在数据中心领域用两家公司FPGA的都有。只要规模足够大,对FPGA价格过高的担心将是不必要的。&imgsrc=&htts://ic4.zhimg.com/50/v2-aa8f6a91bfa87bd5db9165_hd.jg&data-rawwidth=&714&data-rawheight=&599&class=&origin_imagezh-lightbox-thumb&width=&714&data-original=&htts://ic4.zhimg.com/v2-aa8f6a91bfa87bd5db9165_r.jg&&最早的BFB实验板,1U服务器上插了4块FPGA卡。来源:[1]像超级计算机一样的部署方式,意味着有专门的一个机柜全是上图这种装了24块FPGA的服务器(下图左)。这种方式有几个问题:不同机器的FPGA之间无法通信,FPGA所能处理问题的规模受限于单台服务器上FPGA的数量;数据中心里的其他机器要把任务集中发到这个机柜,构成了in-cast,网络延迟很难做到稳定。FPGA专用机柜构成了单点故障,只要它一坏,谁都别想加速了;装FPGA的服务器是定制的,冷却、运维都增加了麻烦。&imgsrc=&htts://ic2.zhimg.com/50/v2-70aa39ffd70ec_hd.jg&data-rawwidth=&2534&data-rawheight=&1206&class=&origin_imagezh-lightbox-thumb&width=&2534&data-original=&htts://ic2.zhimg.com/v2-70aa39ffd70ec_r.jg&&部署FPGA的三种方式,从中心化到分布式。来源:[1]一种不那么激进的方式是,在每个机柜一面部署一台装满FPGA的服务器(上图中)。这避免了上述问题(2)(3),但(1)(4)仍然没有解决。第二个阶段,为了保证数据中心中服务器的同构性(这也是不用ASIC的一个重要原因),在每台服务器上插一块FPGA(上图右),FPGA之间通过专用网络连接。这也是微软在ISCA'14上所发表论文采用的部署方式。&imgsrc=&htts://ic2.zhimg.com/50/v2-7b73facc9e24d0fceca7e_hd.jg&data-rawwidth=&858&data-rawheight=&612&class=&origin_imagezh-lightbox-thumb&width=&858&data-original=&htts://ic2.zhimg.com/v2-7b73facc9e24d0fceca7e_r.jg&&OenComuteServer在机架中。来源:[1]&imgsrc=&htts://ic4.zhimg.com/50/v2-e23b8d5c807ad2fffbec_hd.jg&data-rawwidth=&2433&data-rawheight=&736&class=&origin_imagezh-lightbox-thumb&width=&2433&data-original=&htts://ic4.zhimg.com/v2-e23b8d5c807ad2fffbec_r.jg&&OenComuteServer内景。红框是放FPGA的位置。来源:[1]&imgsrc=&htts://ic1.zhimg.com/50/v2-f0ca82beaa1389406ebbc15_hd.jg&data-rawwidth=&1034&data-rawheight=&594&class=&origin_imagezh-lightbox-thumb&width=&1034&data-original=&htts://ic1.zhimg.com/v2-f0ca82beaa1389406ebbc15_r.jg&&插入FPGA后的OenComuteServer。来源:[1]&imgsrc=&htts://ic3.zhimg.com/50/v2-6d0fdf2e59d9a4b579fc59c_hd.jg&data-rawwidth=&1002&data-rawheight=&1353&class=&origin_imagezh-lightbox-thumb&width=&1002&data-original=&htts://ic3.zhimg.com/v2-6d0fdf2e59d9a4b579fc59c_r.jg&&FPGA与OenComuteServer之间的连接与固定。来源:[1]FPGA采用StratixVD5,有172K个ALM,2014个M20K片上内存,1590个DSP。板上有一个8GBDDR3-1333内存,一个PCIeGen3x8接口,两个10Gbs网络接口。一个机柜之间的FPGA采用专用网络连接,一组10G网口8个一组连成环,另一组10G网口6个一组连成环,不使用交换机。&imgsrc=&htts://ic1.zhimg.com/50/v2-a932a3ac4cd8_hd.jg&data-rawwidth=&2431&data-rawheight=&1218&class=&origin_imagezh-lightbox-thumb&width=&2431&data-original=&htts://ic1.zhimg.com/v2-a932a3ac4cd8_r.jg&&机柜中FPGA之间的网络连接方式。来源:[1]这样一个1632台服务器、1632块FPGA的集群,把Bing的搜索结果排序整体性能提高到了2倍(换言之,节省了一半的服务器)。如下图所示,每8块FPGA穿成一条链,中间用前面提到的10Gbs专用网线来通信。这8块FPGA各司其职,有的负责从文档中提取特征(黄色),有的负责计算特征表达式(绿色),有的负责计算文档的得分(红色)。&imgsrc=&htts://ic4.zhimg.com/50/v2-aaef099e0f6cf7aaf9e5be6bb3b0bc27_hd.jg&data-rawwidth=&1655&data-rawheight=&1155&class=&origin_imagezh-lightbox-thumb&width=&1655&data-original=&htts://ic4.zhimg.com/v2-aaef099e0f6cf7aaf9e5be6bb3b0bc27_r.jg&&FPGA加速Bing的搜索排序过程。来源:[1]&imgsrc=&htts://ic2.zhimg.com/50/v2-8bd4abed27f2cbb8605f_hd.jg&data-rawwidth=&963&data-rawheight=&638&class=&origin_imagezh-lightbox-thumb&width=&963&data-original=&htts://ic2.zhimg.com/v2-8bd4abed27f2cbb8605f_r.jg&&FPGA不仅降低了Bing搜索的延迟,还显著提高了延迟的稳定性。来源:[4]&imgsrc=&htts://ic3.zhimg.com/50/v2-bb29f3d4b687ce294b329c_hd.jg&data-rawwidth=&963&data-rawheight=&647&class=&origin_imagezh-lightbox-thumb&width=&963&data-original=&htts://ic3.zhimg.com/v2-bb29f3d4b687ce294b329c_r.jg&&本地和远程的FPGA均可以降低搜索延迟,远程FPGA的通信延迟相比搜索延迟可忽略。来源:[4]FPGA在Bing的部署取得了成功,Catault项目继续在公司内扩张。微软内部拥有最多服务器的,就是云计算Azure部门了。Azure部门急需解决的问题是网络和存储虚拟化带来的开销。Azure把虚拟机卖给客户,需要给虚拟机的网络提供防火墙、负载均衡、隧道、NAT等网络功能。由于云存储的物理存储跟计算节点是分离的,需要把数据从存储节点通过网络搬运过来,还要进行压缩和加密。在1Gbs网络和机械硬盘的时代,网络和存储虚拟化的CPU开销不值一提。随着网络和存储速度越来越快,网络上了40Gbs,一块SSD的吞吐量也能到1GB/s,CPU渐渐变得力不从心了。例如Hyer-V虚拟交换机只能处理25Gbs左右的流量,不能达到40Gbs线速,当数据包较小时性能更差;AES-256加密和SHA-1签名,每个CPU核只能处理100MB/s,只是一块SSD吞吐量的十分之一。&imgsrc=&htts://ic2.zhimg.com/50/v2-5aeb1ccedd0b0f00cd82_hd.jg&data-rawwidth=&1842&data-rawheight=&546&class=&origin_imagezh-lightbox-thumb&width=&1842&data-original=&htts://ic2.zhimg.com/v2-5aeb1ccedd0b0f00cd82_r.jg&&网络隧道协议、防火墙处理40Gbs需要的CPU核数。来源:[5]为了加速网络功能和存储虚拟化,微软把FPGA部署在网卡和交换机之间。如下图所示,每个FPGA有一个4GBDDR3-1333DRAM,通过两个PCIeGen3x8接口连接到一个CPUsocket(物理上是PCIeGen3x16接口,因为FPGA没有x16的硬核,逻辑上当成两个x8的用)。物理网卡(NIC)就是普通的40Gbs网卡,仅用于宿主机与网络之间的通信。&imgsrc=&htts://ic2.zhimg.com/50/v2-974dfbd7fc14f_hd.jg&data-rawwidth=&1265&data-rawheight=&625&class=&origin_imagezh-lightbox-thumb&width=&1265&data-original=&htts://ic2.zhimg.com/v2-974dfbd7fc14f_r.jg&&Azure服务器部署FPGA的架构。来源:[6]FPGA(SmartNIC)对每个虚拟机虚拟出一块网卡,虚拟机通过SR-IOV直接访问这块虚拟网卡。原本在虚拟交换机里面的数据平面功能被移到了FPGA里面,虚拟机收发网络数据包均不需要CPU参与,也不需要经过物理网卡(NIC)。这样不仅节约了可用于出售的CPU资源,还提高了虚拟机的网络性能(25Gbs),把同数据中心虚拟机之间的网络延迟降低了10倍。&imgsrc=&htts://ic3.zhimg.com/50/v2-dad5b8d8d6ac0e047a016924_hd.jg&data-rawwidth=&2371&data-rawheight=&1316&class=&origin_imagezh-lightbox-thumb&width=&2371&data-original=&htts://ic3.zhimg.com/v2-dad5b8d8d6ac0e047a016924_r.jg&&网络虚拟化的加速架构。来源:[6]这就是微软部署FPGA的第三代架构,也是目前「每台服务器一块FPGA」大规模部署所采用的架构。FPGA复用主机网络的初心是加速网络和存储,更深远的影响则是把FPGA之间的网络连接扩展到了整个数据中心的规模,做成真正cloud-scale的「超级计算机」。第二代架构里面,FPGA之间的网络连接局限于同一个机架以内,FPGA之间专网互联的方式很难扩大规模,通过CPU来转发则开销太高。第三代架构中,FPGA之间通过LTL(LightweightTransortLayer)通信。同一机架内延迟在3微秒以内;8微秒以内可达1000块FPGA;20微秒可达同一数据中心的所有FPGA。第二代架构尽管8台机器以内的延迟更低,但只能通过网络访问48块FPGA。为了支持大范围的FPGA间通信,第三代架构中的LTL还支持PFC流控协议和DCQCN拥塞控制协议。&imgsrc=&htts://ic1.zhimg.com/50/v2-c1dbeccbb5_hd.jg&data-rawwidth=&2209&data-rawheight=&993&class=&origin_imagezh-lightbox-thumb&width=&2209&data-original=&htts://ic1.zhimg.com/v2-c1dbeccbb5_r.jg&&纵轴:LTL的延迟,横轴:可达的FPGA数量。来源:[4]&imgsrc=&htts://ic3.zhimg.com/50/v2-7ce4e13c6a60fe7923ceb_hd.jg&data-rawwidth=&968&data-rawheight=&791&class=&origin_imagezh-lightbox-thumb&width=&968&data-original=&htts://ic3.zhimg.com/v2-7ce4e13c6a60fe7923ceb_r.jg&&FPGA内的逻辑模块关系,其中每个Role是用户逻辑(如DNN加速、网络功能加速、加密),外面的部分负责各个Role之间的通信及Role与外设之间的通信。来源:[4]&imgsrc=&htts://ic1.zhimg.com/50/v2-b9d7f53b5125aecfd5d0b719b1a4179f_hd.jg&data-rawwidth=&1272&data-rawheight=&971&class=&origin_imagezh-lightbox-thumb&width=&1272&data-original=&htts://ic1.zhimg.com/v2-b9d7f53b5125aecfd5d0b719b1a4179f_r.jg&&FPGA构成的数据中心加速平面,介于网络交换层(TOR、L1、L2)和传统服务器软件(CPU上运行的软件)之间。来源:[4]通过高带宽、低延迟的网络互联的FPGA构成了介于网络交换层和传统服务器软件之间的数据中心加速平面。除了每台提供云服务的服务器都需要的网络和存储虚拟化加速,FPGA上的剩余资源还可以用来加速Bing搜索、深度神经网络(DNN)等计算任务。对很多类型的应用,随着分布式FPGA加速器的规模扩大,其性能提升是超线性的。例如CNNinference,当只用一块FPGA的时候,由于片上内存不足以放下整个模型,需要不断访问DRAM中的模型权重,性能瓶颈在DRAM;如果FPGA的数量足够多,每块FPGA负责模型中的一层或者一层中的若干个特征,使得模型权重完全载入片上内存,就消除了DRAM的性能瓶颈,完全发挥出FPGA计算单元的性能。当然,拆得过细也会导致通信开销的增加。把任务拆分到分布式FPGA集群的关键在于平衡计算和通信。&imgsrc=&htts://ic1.zhimg.com/50/v2-5a17afc6d68df612e27e2_hd.jg&data-rawwidth=&1827&data-rawheight=&394&class=&origin_imagezh-lightbox-thumb&width=&1827&data-original=&htts://ic1.zhimg.com/v2-5a17afc6d68df612e27e2_r.jg&&从神经网络模型到HaaS上的FPGA。利用模型内的并行性,模型的不同层、不同特征映射到不同FPGA。来源:[4]在MICRO'16会议上,微软提出了HardwareasaService(HaaS)的概念,即把硬件作为一种可调度的云服务,使得FPGA服务的集中调度、管理和大规模部署成为可能。&imgsrc=&htts://ic4.zhimg.com/50/v2-e87fddf2b776f27c0d37cba5a521beed_hd.jg&data-rawwidth=&1025&data-rawheight=&950&class=&origin_imagezh-lightbox-thumb&width=&1025&data-original=&htts://ic4.zhimg.com/v2-e87fddf2b776f27c0d37cba5a521beed_r.jg&&HardwareasaService(HaaS)。来源:[4]从第一代装满FPGA的专用服务器集群,到第二代通过专网连接的FPGA加速卡集群,到目前复用数据中心网络的大规模FPGA云,三个思想指导我们的路线:硬件和软件不是相互取代的关系,而是合作的关系;必须具备灵活性,即用软件定义的能力;必须具备可扩放性(scalability)。三、FPGA在云计算中的角色最后谈一点我个人对FPGA在云计算中角色的思考。作为三年级博士生,我在微软亚洲研究院的研究试图回答两个问题:FPGA在云规模的网络互连系统中应当充当怎样的角色?如何高效、可扩放地对FPGA+CPU的异构系统进行编程?我对FPGA业界主要的遗憾是,FPGA在数据中心的主流用法,从除微软外的互联网巨头,到两大FPGA厂商,再到学术界,大多是把FPGA当作跟GPU一样的计算密集型任务的加速卡。然而FPGA真的很适合做GPU的事情吗?前面讲过,FPGA和GPU最大的区别在于体系结构,FPGA更适合做需要低延迟的流式处理,GPU更适合做大批量同构数据的处理。由于很多人打算把FPGA当作计算加速卡来用,两大FPGA厂商推出的高层次编程模型也是基于OenCL,模仿GPU基于共享内存的批处理模式。CPU要交给FPGA做一件事,需要先放进FPGA板上的DRAM,然后告诉FPGA开始执行,FPGA把执行结果放回DRAM,再通知CPU去取回。CPU和FPGA之间本来可以通过PCIe高效通信,为什么要到板上的DRAM绕一圈?也许是工程实现的问题,我们发现通过OenCL写DRAM、启动kernel、读DRAM一个来回,需要1.8毫秒。而通过PCIeDMA来通信,却只要1~2微秒。&imgsrc=&htts://ic4.zhimg.com/50/v2-ade077e9ffe5e9babeb857_hd.jg&data-rawwidth=&1761&data-rawheight=&647&class=&origin_imagezh-lightbox-thumb&width=&1761&data-original=&htts://ic4.zhimg.com/v2-ade077e9ffe5e9babeb857_r.jg&&PCIeI/Ochannel与OenCL的性能比较。纵坐标为对数坐标。来源:[5]OenCL里面多个kernel之间的通信就更夸张了,默认的方式也是通过共享内存。本文开篇就讲,FPGA比CPU和GPU能效高,体系结构上的根本优势是无指令、无需共享内存。使用共享内存在多个kernel之间通信,在顺序通信(FIFO)的情况下是毫无必要的。况且FPGA上的DRAM一般比GPU上的DRAM慢很多。因此我们提出了ClickNP网络编程框架[5],使用管道(channel)而非共享内存来在执行单元(element/kernel)间、执行单元和主机软件间进行通信。需要共享内存的应用,也可以在管道的基础上实现,毕竟CSP(CommunicatingSequentialProcess)和共享内存理论上是等价的嘛。ClickNP目前还是在OenCL基础上的一个框架,受到C语言描述硬件的局限性(当然HLS比Verilog的开发效率确实高多了)。理想的硬件描述语言,大概不会是C语言吧。&imgsrc=&htts://ic4.zhimg.com/50/v2-f0af9adc093_hd.jg&data-rawwidth=&1647&data-rawheight=&618&class=&origin_imagezh-lightbox-thumb&width=&1647&data-original=&htts://ic4.zhimg.com/v2-f0af9adc093_r.jg&&ClickNP使用channel在elements间通信,来源:[5]&imgsrc=&htts://ic2.zhimg.com/50/v2-e6ca6cdab83c_hd.jg&data-rawwidth=&1585&data-rawheight=&359&class=&origin_imagezh-lightbox-thumb&width=&1585&data-original=&htts://ic2.zhimg.com/v2-e6ca6cdab83c_r.jg&&ClickNP使用channel在FPGA和CPU间通信,来源:[5]低延迟的流式处理,需要最多的地方就是通信。然而CPU由于并行性的限制和操作系统的调度,做通信效率不高,延迟也不稳定。此外,通信就必然涉及到调度和仲裁,CPU由于单核性能的局限和核间通信的低效,调度、仲裁性能受限,硬件则很适合做这种重复工作。因此我的博士研究把FPGA定义为通信的「大管家」,不管是服务器跟服务器之间的通信,虚拟机跟虚拟机之间的通信,进程跟进程之间的通信,CPU跟存储设备之间的通信,都可以用FPGA来加速。成也萧何,败也萧何。缺少指令同时是FPGA的优势和软肋。每做一点不同的事情,就要占用一定的FPGA逻辑资源。如果要做的事情复杂、重复性不强,就会占用大量的逻辑资源,其中的大部分处于闲置状态。这时就不如用冯·诺依曼结构的处理器。数据中心里的很多任务有很强的局部性和重复性:一部分是虚拟化平台需要做的网络和存储,这些都属于通信;另一部分是客户计算任务里的,比如机器学习、加密解密。我们首先把FPGA用于它最擅长的通信,日后也许也会像AWS那样把FPGA作为计算加速卡租给客户。不管通信还是机器学习、加密解密,算法都是很复杂的,如果试图用FPGA完全取代CPU,势必会带来FPGA逻辑资源极大的浪费,也会提高FPGA程序的开发成本。更实用的做法是FPGA和CPU协同工作,局部性和重复性强的归FPGA,复杂的归CPU。当我们用FPGA加速了Bing搜索、深度学习等越来越多的服务;当网络虚拟化、存储虚拟化等基础组件的数据平面被FPGA把持;当FPGA组成的「数据中心加速平面」成为网络和服务器之间的天堑……似乎有种感觉,FPGA将掌控全局,CPU上的计算任务反而变得碎片化,受FPGA的驱使。以往我们是CPU为主,把重复的计算任务卸载(offload)到FPGA上;以后会不会变成FPGA为主,把复杂的计算任务卸载到CPU上呢?随着Xeon+FPGA的问世,古老的SoC会不会在数据中心焕发新生?「跨越内存墙,走向可编程世界」(Acrossthememorywallandreachafullyrogrammableworld.)参考文献:[1]Large-ScaleReconfigurableComutinginaMicrosoftDatacenterhtts://www.microsoft.com/en-us/research/w-content/uloads/2014/06/HC26.12.520-Recon-Fabric-Pulnam-Microsoft-Catault.df[2]AReconfigurableFabricforAcceleratingLarge-ScaleDatacenterServices,ISCA'14htts://www.microsoft.com/en-us/research/w-content/uloads/2016/02/Catault_ISCA_2014.df[3]MicrosoftHasaWholeNewKindofComuterChi—andIt’llChangeEverything[4]ACloud-ScaleAccelerationArchitecture,MICRO'16htts://www.microsoft.com/en-us/research/w-content/uloads/2016/10/Cloud-Scale-Acceleration-Architecture.df[5]ClickNP:HighlyFlexibleandHigh-erformanceNetworkProcessingwithReconfigurableHardware-MicrosoftResearch[6]DanielFirestone,SmartNIC:AcceleratingAzure'sNetworkwith.FPGAsonOCSservers.
已被管理员加精
译文来源:xilinx.eetrend.com作者:Sleibso编译:csc57可编程逻辑(PLD)是由一种通用的集成电路产生的,逻辑功能按照用户对器件编程来确定,用户可以自行编程把数字系统集成在PLD中。经过多年的发展,可编程逻辑器件由70年代的可编程逻辑阵列器件(PLD)发展到目前的拥有数千万门的现场可编程阵列逻辑(FPGA),随着人工智能研究的火热发展,FPGA的并行性已经在一些实时性很高的神经网络计算任务中得到应用。由于在FPGA上实现浮点数会耗费很多硬件资源,而定点数虽然精度有限,但是对于不同应用通过选择合适的字长精度仍可以保证收敛,且速度要比浮点数表示更快而且资源耗费更少,已经使其成为嵌入式AI和机器学习应用程序的理想选择。最新的证明点是英国伯明翰大学电子电气和系统工程系的YufengHao和StevenQuigley最近发表的论文。论文标题为“在XilinxFPGA上实现深度递归神经网络语言模型“,介绍了使用Python编程语言成功实现和训练基于固定点深度递归神经网络(DRNN);Theano数学库和多维数组的框架;开源的基于Python的PYNQ开发环境;DigilentPYNQ-Z1开发板以及PYNQ-Z1板上的赛灵思ZynqZ-7020的片上系统SoC。Zynq-7000系列装载了双核ARMCortex-A9处理器和28nm的Artix-7或Kintex-7可编程逻辑。在单片上集成了CPU,DSP以及ASSP,具备了关键分析和硬件加速能力以及混合信号功能,出色的性价比和最大的设计灵活性也是特点之一。使用PythonDRNN硬件加速覆盖(一种赛灵思公司提出的硬件库,使用PythonAPI在硬件逻辑和软件中建立连接并交换数据),两个合作者使用此设计为NLP(自然语言处理)应用程序实现了20GOPS(10亿次每秒)的处理吞吐量,优于早期基于FPGA的实现2.75倍到70.5倍。论文的大部分讨论了NLP和LM(语言模型),“它涉及机器翻译,语音搜索,语音标记和语音识别”。本文随后讨论了使用VivadoHLS开发工具和Verilog语言实现DRNNLM硬件加速器,可以为PYNQ开发环境合成一个定制的硬件覆盖。由此产生的加速器包含五个过程元素(PE),能够在此应用程序中提供20GOPS的数据吞吐量。以下是设计的框图:DRNN加速器框图Vivado设计套件为下一代超高效率的C/C++和基于IP的设计提供了新的方法。融入了新的超快高效率设计方法集,用户可以实现10-15倍的效率的提升。VivadoHLS支持ISE和Vivado设计环境,可以通过集成C,C++和SystemC标准到赛灵思的可编程器件中而无需创建RTL模型,加快IP的创建。这篇论文中包括了大量深入的技术细节,但是这一句话总结了这篇博客文章的理由:“更重要的是,我们展示了软件和硬件联合设计和仿真过程在神经网络领域的应用“。对于PDF版论文原文有兴趣的小伙伴,可以点击本帖附件查看。
已被管理员加精
没有直接可用的Pmod驱动?传授你一招填坑秘籍之前我们提到过「Pmod传感模块」,这一搭配FPGA开发板进行快速原型系统开发的利器。事实上,除了Pmod标准定义接口的专利方——Digilent公司所提供的近百种功能丰富的原厂Pmod传感模块之外(一般都配有免费的i驱动供开发者直接调用),市场上存在着很多来自不同供应商所提供的可用Pmod模块。然鹅,很多来自于不知名小厂的Pmod(以台湾、深圳的山寨厂商居多),往往并不提供模块驱动,需要用户自己去写驱动填坑。如果你不幸中招,聊表安慰之余,今天就传授你一招填坑秘籍,教你在没有可用驱动情况下的应对之策。先说重点:如果没有可用的驱动,可以使用ZynqSoCPL端(可编程逻辑)的Pmod桥模块,它让我们能够在选用的开发板与Pmod端口之间建立正确的映射,然后开发我们自己的ZynqPS(处理系统)驱动。假如你仔细研究正规厂商所提供的Pmod驱动,你会发现这些驱动其实也是使用Pmod桥加上一个AXII2C或者SPI组件所实现的。图:DigilentPmodAD2:12位四通道模拟数字转换器的驱动组件此文中,我们就将以Digilent(迪芝伦)PmodDA4:8通道DAC模块,以及PmodAD2:4通道ADC模块为例,我们将这两个模块整合在一起,借助Pmod桥模块自行开发驱动,用PmodDA4生成模拟信号,并用PmodAD2来接收信号。图:用DigilentAnalogDiscovery口袋仪器对PmodDA4测试Pmod桥模块允许我们定义开发板板载Pmod接口上下两排的输入类型,可以选择定义为GPIO、UART、I2C或者SPI协议接口。我们为所需驱动的板载Pmod接口上下层都进行相应的选择配置,使得Pmod传感器的管脚输出(inout)与对应的板载接口标准一致。有兴趣的朋友,可点击「本帖附件」,下载查看DigilentPmod传感器的接口标准文档。对于PmodDA4,我们只需要在板载Pmod接口上层使用SPI协议。这样选择后,我们需要提供实际的SPI通信通道。由于我们使用的是ZynqSoC开发板(DigilentArtyZ7),所以这里我们有两个选择。第一个方法是在PL端使用AXISPIIP模块与Pmod桥模块建立连接。第二个方法(也是这里我们将采用的)是使用EMIO建立ZynqPSSPI与Pmod桥中间的连接。这一方法将让我们能够在PSSPI端口与Pmod桥模块输入管脚之间建立直连。为了实现这一点我们需要阅读官方的Pmod接口标准文档来确保SPI管脚与Pmod桥输入管脚之间正确的映射(例如哪个PSSPI信号连接到IN_0)。Pmod桥模块的管脚代表不同的接口类型,它们的命名也是通用的。下面的框图展示了这里我们是如何实现PmodDA4管脚的映射。在这个示例中我们完成管脚映射后就可以构建工程,导出到SDK,编写软件程序驱动DA4。我们可以使用SDK中由BSP创建的SPI驱动来驱动PmodDA4。为了实现与PmodDA4的交互,第一件事我们要做的就是初始化SPI控制器。我们设置好SPI时钟相位和主操作选项后就可以定义缓冲区,并使用轮询传输模式将所需的信息传递给PmodDA4。更复杂的驱动则将使用中断驱动方式而非轮询的方式。下面,我们对创建好的PmodDA4驱动文件进行测试。我们驱动一个简单的谐波输出,并使用DigilentAnalogDiscovery口袋仪器的示波器功能来监测DAC输出。接收到的信号如下:完成了所有设置PmodDA4以预期的方式正常工作,然后我们将PmodDA4与PmodAD2连接在一起,这样ZynqSoC才能够接收信号:测试时我们要非常仔细,以确保PmodDA4输出的信号在PmodAD2的工作范围内,全部完成后则会显示PmodDA4能够在硬件上正常工作。到这里,相信大家已经了解了在没有可用驱动的情况下如何自行创建Pmod驱动。当然,填坑是不得已而为之,人生苦短,芳华有限,尽量少碰不提供驱动的山寨小厂Pmod才是王道。附:DigilentPmod传感器列表:htt://www.digilent.com.cn/roducts/mods.html&
已被管理员加精
在图像处理应用开发中,捕获或显示图像的最简单方法之一是使用HDMI(高清晰度多媒体接口)。HDMI是一种可以传输高清数字视频和音频数据的专有标准,被许多显示器和相机支持并广泛采用。这个特点使得HDMI成为Zynq图像处理应用的理想接口标准。在这篇文章中,我们将向大家介绍如何在不同目标开发板上使用基于Zynq的HDMI传输。&&&图:ArtyZ7HDMI输入输出案例&&&基于Zynq开发板对HDMI视频解码包含两种方式:●&外部解码(PS端)然后通过I2C总线传到PL端●&内部解码(PL端)内部直接解码&&图:支持HDMI的Zynq开发板如果开发板使用外部编解码器,则可以使用ADI公司的ADV7511和ADV7611实现发送和接收。外部HDMI编解码器直接与HDMI连接器连接,并生成包含图像、音频数据的TMDS信号(最小化传输差分信号)。I2C总线,像素数据总线,时序同步信号和像素时钟组成了编解码器和ZynqPL(可编程逻辑)之间的接口。我们将像素数据,同步信号和时钟直接传送到PL端。使用ZynqPS(处理系统)端的I2C控制器来控制I2C接口,并通过EMIO将ZynqSoC的I2CIO信号传输到PLIO。为了简化编码解码器和PL之间的集成复杂度,这里介绍两个AVNET所开发的IP核,可通过AvnetGitHub下载。在图像处理链中,可以把它们放在处理链的最前端和最后端来连接外部的编解码器。另一种方法是使用位于ZynqPL端的内部编解码器。在这种情况下,HDMITMDS信号直接传输到PLIO,而编解码器用可编程逻辑实现。为了不从头编写这样复杂的编解码器,可以直接使用DIGILENT所提供的两个编解码器IP核(可从本帖附件下载)。在设计中使用这些内核意味着约束文件中的TMDS信号的IO标准被设置为TMDS_33IO。注:此IO标准仅适用于高范围(HR)IO组。图:本文提到的HDMIIP核事实上,并非所有Zynq开发板都可以接收和传输HDMI信号。例如,ZedBoard只提供HDMI输出。如果必须使用此类开发板接收HDMI信号,我们则可以通过FMC接口配合FMC-HDMI子板来进行操作。DigilentFMC-HDMI子板提供两路HDMI输入,可以使用外部和内部编解码器接收HDMI数据。在两路输入中,第一路使用ADV7611,第二路均衡HDMI信号,并直接传输到ZynqPL中解码。这就使得我们能够示范当使用外部编解码器进行图像传输时,如何将内部和外部编解码器植入ZedBoard。然而,这里首先我们需要用电烙铁在J18上焊接一条跳线,这样我们才能够根据FMC-HDMI子板的要求将ZedBoard上的VADJ设置为3v3。图:Zedboard+FMC-HDMI子板我们还应该记住,尽管我在这里主要讨论了ZynqSoC,但上述方法也同样适用于集成了DislayPort功能的ZynqUltraScale+MPSoC哦~
已被管理员加精
本文只讲如何在zedboard上运行linaro,不深讲原理,只讲操作。1.环境1.1硬件环境zedboardusingtheXilinxZynq(R)-7000AllProgrammableSoC.AES-Z7EV-7Z020-GREV-D版本(!!始终没有弄好图形界面!!)1.2软件环境Vivado2016.4XilinxSDK2016.4Debian9x86_64交叉编译器用vivado自带的arm-xilinx-linux-gnueabi-2.系统启动流程电源打开后,CPU0会执行已经写死在板子上BootROM中的程序,程序会根据JP7-JP11的设定状态来更新状态寄存器。如上的状态表示从SD卡启动。还有NORFlash、JTAG等方式。如果是SD卡模式启动,那么它会读取sd卡的第一分区,寻找boot.bin(不分大小写)文件。该文件包含了FSBL(FirstStageBootLoader)程序,它接管CPU。CPU0会将该程序复制到内部256KB的片上内存中,并执行FSBL,进入下一个阶段。FSBL初始化DDR内存,GPIO等,接下来载入放在boot.bin中的位元流(bitstream),用它来对可编程逻辑区块(ProgrammableLogic,PL)进行设定,板子的蓝灯将亮起来(如果在制作boot.bin文件时没有添加bitstream,那么蓝灯不会亮,PL也没有设定,只是在跑arm)。CPU将交给boot.bin中的下一部分接管,可以是用户自己的程序(Note.1),或者是SSBL(SecondStageBootLoader)。如果SSBL是uboot,它可以做一些准备工作之后启动linux内核(或者用户程序),可以再继续引导启动sd卡第二个分区的系统,比如linaro-ubuntu。几种开发模式:开发模式解释纯PL开发纯PS开发典型的demohellowordPS+PL(无OS)没有操作系统,生成的elf文件包括了硬件配置信息(xm)和裸跑的C程序。包含bit文件PS+PL(含OS)包含boot.bin(boot.elf,your_bitstream.bit,fsbl.elf),devicetree.dtb,linux内核镜像,文件系统本文介绍的构建系统,属于上述表格中的最后一种。我们需要的东西有:Boot.bin,devicetree.dtb,uboot,rootfs。rootfs(文件系统),我们有两种选择:ramdisk:非常小,几乎没什么功能,运行在ram里,任何修改在重启之后就会丢失完整的Linux文件系统,比如LinaroUbuntu3.准备SD卡分成两个主分区FAT32格式,&=50MBext4格式,&=你要安装的linux系统的大小4.生成BOOT.BINboot.bin文件包括:包含的文件解释FSBLbitstream配置PL端的程序,可选,如果需要使用显示器输出,则必须。SSBL这里使用uboot4.1FSBL制作打开vivado2016.4,新建项目,选择zedboardzynqevaluationanddevelomentKit。(全文没有重点指出的操作和设置,均为default即可)先新建一个BlockDesign(左边ProjectManager–》IPintegrator–》createBlockdesign),在Diagram视图中addIP。输入zynq选择唯一的zynq7rocesssystem,并点击上方的“RunBlockautomation”,双击生成的:弹出Re-customizeIP窗口,上图红色圈中是我们需要取消的引脚。从ClockConfiguration中展开PLFabricClocks,取消FCLK_CLK0,确认之后,会发现上图中的FCLK_CLK0消失。对于其他,以取消TTC为例,从ZynqBlockDesign中点击TTC,会自动跳转到对应的详细设计部分,取消勾选,再切换回zynqblockdesign,取消掉其他红框里的内容,点击OK完成。可以右键–》regeneratelayout,自动调整下布局,则会变成下图的样子:回到BlockDesign的sources视图,在System上右键选择CreateHDLWraer。完成后点击左边FlowNavigator中的GenerateBitStream。等待Vivado完成综合、实现、生成bitstream,右上角有进度,时间比较长。点击File-&Exort-&ExortHardware,勾选includebitstream,确认后点击File-&LaunchSDK,系统会自动开启SDK软件在SDK中点击菜单File-&New-&AlicationProject。项目名fsbl(可以更改),OS平台standalone,语言为C,点击Next,Temlates选项选择ZynqFSBL。点击Finish,SDK会自动编译FSBL代码,并在工程Debug下生成fsbl.elf目标文件。ProjectExlorer–》binaries–》fsbl.elf。4.2编译Uboot官方github地址建议直接从release里选择版本,此处选择了xilinx-v2016.4。下载,解压出来。设置环境变量,实际上新版本的vivado已经包含了xilinx-armtoolchain,因此只需要使用vivado目录下的环境变量设置脚本,即可使用arm-xilinx-*工具#你的vivado地址source~/d/fga/Vivado/2016.4/settings64.shexortCROSS_COMPILE=arm-xilinx-linux-gnueabi-修改include/configs/zynq_common.h中sdboot数据,让我们的u-boot在启动的时候不会试图去加载ramdiskimage(这一步可选):&sdboot=then&\&&&\&&echoCoyingLinuxfromSDtoRAM...&&&\&&loadmmc0${kernel_load_address}${kernel_image}&&&\&&loadmmc0${devicetree_load_address}${devicetree_image}&&&\&&bootm${kernel_load_address}-${devicetree_load_address};&\生成zedboard配置文件并编译ubootmakeARCH=armCROSS_COMPILE=arm-xilinx-linux-gnueabi-&zynq_zed_configmakeARCH=armCROSS_COMPILE=arm-xilinx-linux-gnueabi-将得到的可执行文件u-boot修改为elf格式mvu-bootu-boot.elf4.3生成BOOT.BIN打开xilinxSDK,菜单XilinxTools–》CreateBootImage。设置BIF文件路径(BIF文件用于指定当前boot.bin制作过程中用到的三个文件的路径,相当于一个项目配置文件),然后在下方的配置里按照顺序添加如下文件FSBL文件,默认在你的项目路径/项目名.sdk/fsbl/Debug/fsbl.elf,添加后,会自动识别分区格式为bootloader,bitstream文件,从vivado,File–》Exort–》exortbitstreamfile,保存到你想保存的位置,然后同FSBL文件一样,添加上,会自动识别分区格式为datafile。uboot文件,就是上一步编译出的u-boot.elf文件,同样添加上。点击CreateImage创建boot.bin,成功的话会在输出路径生成相应文件。在sdk底部的console会有个错误输出awk:symbollookuerror:awk:undefinedsymbol:mfr_z_sub但是文件正常生成了,而且运行没有问题。不清楚这个错误有什么问题。5.编译内核和设备树5.1编译内核从xilinx提供的官方linuxkernel的release下载,不要gitclone(或者clone时添加--deth=1来限制拉取的commit记录),否则文件夹会很大。解压出来,配置编译环境、内核参数,并编译内核:exortARCH=armexortCROSS_COMPILE=arm-xilinx-linux-gnueabi-#安装uboot工具sudoat-getinstallu-boot-toolsmakexilinx_zynq_defconfigmakeuImageLOADADDR=0x注意:如果你的系统比较新,那么oenssl库应该是1.1,由于oenssl库升级的缘故,在编译现有的xilinxlinuxkernel时,会出现:error:dereferencingointertoincomletetye‘RSA{akastructrsa_st}’&if(BN_num_bits(key-&e)&64)的错误。现在xilinx官方邮件列表正在讨论这个问题。截止,尚未merge补丁。所以需要将你本地的oenssl库降级成1.0:sudoat-getinstalllibssl1.0-dev会自动卸载当前最新的版本1.1。5.2编译devicetree设备树devicetree,也称作OenFirmware(OF)或FlattenedDeviceTree(FDT)。本质上是一个字节码格式的数据结构,其中包含信息在内核启动时非常有用。bootloader在跳到内核入口点之前将这一块数据复制到RAM中的已知地址。修改arch/arm/boot/dts/zynq-zed.dts文件:chosen{#默认bootargs是空的字符串,填充如下数据bootargs=&console=ttyPS0,115200root=/dev/mmcblk02rwearlyrintkrootfstye=ext4rootwaitdevtmfs.mount=0&;stdout-ath=&serial0:&;};表示root目录在sd卡的第二个分区。cd到arch/arm/boot/dts/,执行:~/d/fga/make_boot/linux-xlnx-xilinx-v2016.4/scrits/dtc/dtc–Idts–Odtb-o&../../../devicetree.dtb./zynq-zed.dtsdtc是xilinx官方kernel里带的一个工具,-Idts表示输入格式是dtc,-Odtb表示输出格式是dtb,-o表示生成的dtb放哪里,最后是输入文件的位置。注意一定要先cd到dts文件所在目录,因为它引用了当前目录下别的文件。6.linaroubuntu从linaro发行版官网下载ubuntuimagesdeveloer版本或者其他版本,解压出下载的压缩包(网上有些文章用的是老版本的包,系统在binary/boot/filesystem.dir),将加压出的内容拷贝到sd卡第二个分区。cdbinary#我的自动挂载点是/media/find/rootsudorsync-a./*/media/find/root/#卸载,一定要等待写入结束sudoumount/media/find/rootsudoumount/media/find/boot7.启动将sd卡插好,usb连接到PC,打开zedboard开关,PC上打开命令行,使用minicom连接。7.1minicom设置sudominicom-s#选择serialortsetu,并设置串口设备为ttyACM0A-&&SerialDevice&&&:/dev/ttyACM0&#确认bs之类如下,波特率选为(数据位8,奇偶校验无,停止位1),&E-&&Bs/Par/Bits&&&:配置完成后,可通过sudominicom连接设备7.2启动root分区的linaroubuntu系统由于之前我们已经修改了bootargs,因此这里可以直接通过boot命令启动。
已被管理员加精
ArtyA7&是Digilent所推出的面向FPGA兴趣爱好者与开源创客的&Arty家族系列(顾名思义=ArduinoComability)开发板的Artix-7版本。另外两款分别是&ArtyZ7(Zynq),与&ArtyS7(Sartan7),该系列开发板以高性价比、深受创客喜爱的Arduino兼容接口、支持众多开源内核、以及针对Xilinx最新上市器件的快速评估而著称。此贴对原厂官方与Digilent中文技术社区的ArtyA7学习资料进行汇总整理,以方便学习者查阅与交流。序号描述序号描述1FPGA编程完成指示LED11SPI接口(兼容Arduino/chiKIT)2&JTAG/UART共用USB接口12chiKIT处理器复位跳线3以太网接口13FPGA编程模式选择跳线(支持JTAG/Flash)4电源跳线(支持外部电源/USB)14chiKIT处理器复位按键5电源接口(用于可选外部电源)15Pmod接口6电源指示灯16FPGA编程复位按键7用户LED17SPI闪存8用户拨码开关18ArtixFPGA器件9用户按键19MicronDDR3存储器10Arduino/chiKIT子板接口20ADIADP5052电源官方手册:ArtyA7用户手册(见附件)教学视频:ArtyA7开源创客开发板起步教程社区资源整理:01.&「ArtyA7入门连载教程」&&&&1)实验1:Vivado板卡文件安装教程(htt://www.digilent.com.cn/community/192.html)&&&&2)实验2:Vivado中创建MicroBlaze嵌入式系统硬件工程(htt://www.digilent.com.cn/community/197.html)&&&&3)实验3:SDK中创建MicroBlaze嵌入式系统软件工程(htt://www.digilent.com.cn/community/202.html)&&&&4)实验4:星星点灯—点亮你的LED(htt://digilent.com.cn/community/232.html)&&&&5)实验5:Vivado与SDK程序固化(htt://www.digilent.com.cn/community/281.html)02.&「ArtyA7开发板学习笔记分享」(htt://www.digilent.com.cn/community/238.html)&&&&1)实验1:点亮LED流水灯&&&&2)实验2:按键控制LED灯&&&&3)实验3:FIFORAMIP核联合使用&&&&4)实验4:DDS正弦波发生器&&&&5)实验5:DDR3读写与控制&&&&6)实验6:以太网通信03.&「ArtyA7开发实战」&&&&1)实验1:玩不腻的LED(htt://www.digilent.com.cn/community/124.html)&&&&2)实验2:GPS串口6起来(htt://www.digilent.com.cn/community/220.html)&&&&3)实验3:定时器中断(htt://www.digilent.com.cn/community/326.html)&&&&4)实验4:基于ArtyA7的Web服务器搭建(htt://www.digilent.com.cn/community/373.html)04.「以ArtyA7为例,教你如何从Flash启动MicroBlaze软核」(htt://www.digilent.com.cn/community/563.html)05.「ArtyA7FPGA开发板+FreedomE300开源SoC折腾笔记」(htt://www.digilent.com.cn/community/565.html)06.&「ArtyA7开发板+PULPino开源处理器折腾笔记」(htt://www.digilent.com.cn/community/566.html)ArtyA7开源项目作品:01.&「基于ArtyA7的电子相框」(htt://www.digilent.com.cn/roject/details/137.html)02.&「基于ArtyA7的简易测距装置」(htt://www.digilent.com.cn/roject/details/167.html)03.&「基于ArtyA7与Basys3的WiFi电子钢琴」(htt://www.digilent.com.cn/roject/details/133.html)04.&「在Arty上构建可用Arduino编程的开源MCU」(htt://www.digilent.com.cn/roject/details/170.html)05.&「使用ArtyA7制作的自动贩卖机」(htt://www.digilent.com.cn/roject/details/105.html)06.「基于ArtyA7的视觉素描机器人」(htt://www.digilent.com.cn/roject/details/192.html)【本帖最后更新:】
已被管理员置顶
已被管理员加精
在诸多关于MicroBlaze软核处理器的例程中,往往都是使用JTAG下载然后借助SDK执行程序代码。然而无论是在项目展示还是实际应用中,我们都希望我们的设计可以即插即用,免去重复烧写的麻烦和必须使用SDK运行程序的限制。事实上,为了部署一个真实的系统,需要在没有任何人为操作的情况下从非易失性存储器中启动MicroBlaze处理器并加载程序代码。本篇教程,我们就围绕这个话题,以&DigilentArtyArtix-7开发板为例,教你如何在板载的QSPIFlash中存储比特流配置文件和应用程序。QSPI有两个主要作用:●&配置ArtixFPGA●&存储应用软件对于第一个功能,我们在Vivado设计中不需要包含QSPI接口。我们只需要在Vivado配置中更新对QSPI的设置,提供QSPIFlash存储器与FPGA配置管脚的连接。然而,一旦FPGA配置完成并调用MicroBlaze软核处理器,我们则需要在设计中引入与QSPIFlash通信的接口。这个新添加的接口允许引导程序(bootloader)从QSPIFlash存储器中复制应用程序到Arty实际执行的DDRSDRAM存储介质中。当然,这会引起一个问题,即MicroBlazebootloader(引导程序)从何而来?开发bootloader(引导程序)的流程图如下所示:我们的目标是创建一个MCS镜像,它包含了FPGA比特流和应用软件文件,我们要将它烧写到QSPIFlash中。为了实现这个方案我们需要在Vivado和SDK中执行以下步骤:●&在已经存在的VivadoMicroBlaze设计中引入(添加)一个QSPI接口。●&在Vivado中编辑器件设置,使用MasterSPI_4来配置器件,并且将bit文件压缩,构建完成后将应用导出到SDK。●&在SDK中,基于导出的硬件设计创建一个新的应用工程。在工程创建对话框,选择SRECSPIBootloader模板。这个选择会创建一个SRECbootloader应用,它会从QSPIFlash中加载主应用程序代码。在构建bootloaderELF之前,我们首先要为应用软件定义对于QSPI基址的地址偏移,在这个示例中为0x600000。我们在blconfig.h中定义这个偏移量。我们还需要更新SRECBootloaderBSP来鉴别正确的串口Flash存储器件。因此重新配置BSP。使用的系列标识号在BSPlibsrc目录下的xilisf.h中定义。对于这个应用我们选择类型5,因为Arty板卡使用MicronQSPI器件,它的标识号即为类型5。●&现在我们在SDK中创建第二个应用工程。这也是我们将使用bootloader加载的应用程序。在这个应用中我们创建了一个简单的“helloworld”工程,确保在linker文件中这个程序从DDRSDRAM开始运行。为了创建MCS文件,我们需要应用程序为S-record格式。这个格式以ASCII格式存储二进制信息。(这个格式已经有40年的历史,最初是为8位Motorola6800微处理器而开发的。)我们可以使用SDK将生成的ELF转换为S-record格式。为了在SDK中生成S-record文件,我们打开bashshell窗口,切换到ELF所在的目录然后输入如下命令:cmd/cmb-objcoy-Osrec&a&.elf&a&.srec●&创建好bootloaderELF文件后,现在我们要在Vivado内将比特流(bitstream)文件与bootloaderELF文件合并。这个步骤允许bootloader被加载到MicroBlaze处理器的本地存储空间,并且按照配置运行。因为这个存储空间很小,所以bootloader应用也需要很小才可以。如果你正遇到减小软件应用大小的问题,不妨在增加本地存储内存之前考虑使用编译器优化。●&创建好bit文件和S-record文件后,我们使用Vivado硬件管理器来增加配置存储器。●&最后一步是生成统一的MCS文件,包含合并的bitstream(比特流)文件和应用软件。当生成这个文件时,我们需要记住加载应用程序时使用与SRECbootloader相同的偏移量。一旦这个文件构建完成并烧写到QSPI存储中,我们就可以进行测试查看MCS文件的工作情况。将Arty板卡与PC终端建立连接然后按下板卡上的复位(reset)按钮。几秒钟后你就会看到Arty板卡上的“done”LED灯亮起,然后在终端窗口中看到SRECbootloader的执行结果。报告应该显示S-record文件在程序执行前已经从QSPI加载到DDRSDRAM中了。到这里,我们就有了一个可以部署到我们设计中的MicroBlaze工作系统了。
已被管理员加精
本文首发于:CSDN博客作者:w主要分为两个大部分,OenCV在PCUbuntu上的安装和OenCV在Zedboard上的移植。一、OenCV在PCUbuntu上的安装采用的是Ubuntu14.04系统,在OenCV官网下载的源码版本为2.3.11.安装第三方库获取su权限进行操作。安装第三方库,命令如下:at-getinstallbuild-essentialat-getinstallcmakecmake-guiat-getinstalllibgtk2.0-devat-getinstalllibavcodec-devlibavformat-devlibswscale-devat-getinstalllibdc1394-22-devat-getinstalllibjeg-devlibng-devlibtiff-devlibjaser-dev2.新建安装文件夹将OenCV解压到自建目录/home/linux/OenCV-2.3.1下,新建目标build。这是个临时文件夹,安装完成后可以删除。进入build目录。进行命令配置:mkdirbuildcdbuildcmake-DCMAKE_BUILD_TYPE=RELEASE-DCMAKE_INSTALL_PREFIX=/usr/local../在这里设置了安装目录为/usr/local(其实也是默认的安装路径,当然可以修改为自定义路径),命令完成后build目录下多了一些文件,可以通过ls命令进行查看。3.OenCV安装配置执行ccmake./进行OenCV配置,把WITH_1394,WITH_CUDA,WITH_FFMPEG设置为OFF,其他不变;按c键进行配置,g键产生Makefile。4.进行编译和安装:这个过程时间比较长,make比较占时间。makemakeinstall安装结束后可以在/usr/local/lib目录下看到OenCV的链接库。5.配置系统变量vi/etc/ld.so.conf.d/oencv.conf添加/usr/local/lib,保存并退出,进行配置:sudoldconfig打开并修改bash.bashrc文件:vi/etc/bash.bashrc在末尾添加如下两行:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/kgconfigexortPKG_CONFIG_PATH保存并重启终端。6.测试OenCV的效果进入OenCV的解压目录,找到samles文件夹,运行其中的C程序样例进行测试cd/home/linux/OenCV-2.3.1/samles/cchmod+xbuild_all.sh./build_all.sh./facedetectlena.jg测试效果如图所示:二、OenCV在Zedboard上的移植前提是Ubuntu要配置好交叉编译环境,也需要获取su权限1.新建安装文件目录新建文件夹OenCV_zed,作为OenCV移植Zedboard的相关文件的配置文件夹;将OenCV源码解压;此时的目录/home/linux/OenCV_zed/OenCV-2.3.1;2.配置安装链在OenCV-2.3.1文件夹内建立install和build文件夹,并创建toolchain.cmake文件,其内容如下:set(CMAKE_SYSTEM_NAMELinux)set(CMAKE_SYSTEM_PROCESSORarm)set(CMAKE_C_COMPILERarm-xilinx-linux-gnueabi-gcc)set(CMAKE_CXX_COMPILERarm-xilinx-linux-gnueabi-g++)3.OenCV安装配置进入bulid文件夹进行命令配置,关联toolchain.cmake文件并配置移植OenCV的安装目录:cmake-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake-DCMAKE_INSTALL_PREFIX=/home/linux/OenCV_zed/OenCV-2.3.1/install../4.生成Makefile文件执行ccmake./进行OenCV配置,将所有WITH开头的选项选成OFF(除了WITH_V4L为ON);按c键进行配置,g键产生Makefile5.编译安装通过make编译,makeinstall进行安装;安装结束后Zedboard上的OenCV库已经生成,在install文件夹下。6.OenCV库移植可以通过将OenCV运行库压缩到ramdisk镜像中的方法进行移植;不过在这里将OenCV运行库压缩成镜像,Zedboard上板测试时通过加载镜像的方式使用;下面进行镜像制作:cd/home/linux/OenCV_zed///生成镜像的目录ddif=/dev/zeroof=oencv_lib.imgbs=1Mcount=80//镜像的名字oencv_lib.img和大小80M,可以根据实际链接库的大小进行设置mkfs.ext2-Foencv_lib.imgchmodgo+woencv_lib.imgmountoencv_lib.img-oloo/mntc/home/linux/OenCV_zed/OenCV-2.3.1/install/*/mnt//复制相应的库的即将压缩的镜像中chmodgo-woencv_lib.imgumount/mnt在相应的/home/linux/OenCV_zed/目录下就会生成oencv_lib.img镜像文件,可以在Zedboard上加载使用。7.移植结果测试测试的源码为《嵌入式系统软硬件协同设计实战指南》书上的edge_detection.c,如下:#include&cv.h&#include&highgui.h&IlImage*doCanny(&&IlImage*in,&&doublelowThresh,&&doublehighThresh,&&doubleaerture){&&if(in-&nChannels!=1)&&&&return0;&//Cannyonlyhandlesgrayscaleimages&&IlImage*out=cvCreateImage(&&&&&cvGetSize(in),&&&&in-&deth,&//IPL_DEPTH_8U,&&&&&&1);&&cvCanny(in,out,lowThresh,highThresh,aerture);&&return(out);};intmain(intargc,char**argv){&&if(argc!=3)rintf(&argumentserror!formatorigin_image.bmtarget_image.bm\n&);&&IlImage*img_rgb=cvLoadImage(argv[1]);&&IlImage*img_gry=cvCreateImage(cvSize(img_rgb-&width,img_rgb-&height),img_rgb-&deth,1);&&&cvCvtColor(img_rgb,img_gry,CV_BGR2GRAY);&&//cvNamedWindow(&ExamleGray&,CV_WINDOW_AUTOSIZE);&&//cvNamedWindow(&ExamleCanny&,CV_WINDOW_AUTOSIZE);&&//cvShowImage(&ExamleGray&,img_gry);&&IlImage*img_cny=doCanny(img_gry,10,100,3);&&if(cvSaveImage(argv[2],img_cny,0)!=0)&&&&rintf(&SaveImageSuccessful\n&);&&//cvShowImage(&ExamleCanny&,img_cny);&&//cvWaitKey(0);&&cvReleaseImage(&img_rgb);&&cvReleaseImage(&img_gry);&&cvReleaseImage(&img_cny);&&//cvDestroyWindow(&ExamleGray&);&&//cvDestroyWindow(&ExamleCanny&);&&return0;}对edge_detection.c进行交叉编译,命令如下arm-xilinx-linux-gnueabi-g++-I/home/linux/OenCV_zed/OenCV-2.3.1/install/include-I/home/linux/OenCV_zed/OenCV-2.3.1/install/include/oencv-L/home/linux/OenCV_zed/OenCV-2.3.1/install//lib-loencv_core-loencv_imgroc-loencv_highgui-loencv_ml-loencv_video-loencv_features2d-loencv_calib3d-loencv_objdetect-loencv_contrib-loencv_legacy-loencv_flann./edge_detection.c-o./edge_detection.o生成可执行文件edge_detection.o;将OenCV库文件oencv_lib.img、可执行文件edge_detection.o和原图像lena.bm放入U盘中,启动Zedboard,挂载U盘:mount/dev/sda1/mnt将镜像文件oencv_lib.img挂载到/usr/lib文件夹中:cd/usrmkdirlibmount/mnt/oencv_lib.img/usr/lib查看挂载结果,如图所示:运行可执行文件./edge_detection.olena.bmout.bm,如果出现successful则编译成功,如图所示:边缘检测的结果保存在输出图像out.bm中。不能挂载U盘的仿zedboard板子(俺的就是),可以采用以下流程将板子自带的4G的SD卡格式化成fat32格式,将edge_detection.o和lena.bm(使用jg格式会出错)以及oencv_lib.img和官网的OOB文件全部拷到SD卡中,将zedboard板跳帽设置成从SD卡启动,上电后挂载SD卡:在超级终端中输入fdisk-l可知SD卡为/dev/mmcblk01,然后挂载:mount/dev/mmcblk01/mnt/SD卡挂载完成后,进入/mnt可看到SD卡里面的文件,将oencv_lib.img挂载到/usr/lib(板子如果没有lib可建立该目录)mount/mnt/oencv_lib.img/usr/lib在超级终端中进入SD卡挂载的目录/mnt,然后执行./edge_detection.o./lena.bm./lena_edge.bm即可得到边缘检测后的图片lena_edge.bm,最后将lena_edge.bm拷贝到电脑上看效果。
已被管理员加精
本文使用Vivado2015.4在DigilentNexys4DDR(以下简称N4DDR)开发板上实现DDR的读写。FPGA如果需要对DDR进行读写,则需要一个DDR的控制器。根据官方的文档(UG586,下载链接在文末),DDR控制器的时序主要有三:(1)首先是控制信号,如下图:&从上图可以看出,只有当a_rdy信号有效时,程序所发出的读写命令才会被控制器接收。这点必须注意。(2)然后是写操作时序,如下图:由图可知,在向DDR写数据时,需要提供写命令a_cmd、地址a_addr、数据a_wdf_data等信号,且写入的数据最多可以比a_cmd提前一个时钟周期有效,最迟可以比a_cmd晚两个时钟周期有效。&【特别注意】在写数据的时候必须检测a_rdy和a_wdf_rdy信号是否同时有效,否则写入命令无法成功写入到DDR控制器的命令FIFO中,从而导致写操作失败。&(3)最后是读操作时序,如下图所示:读操作的时序比较简单,只需要注意a_rdy是否有效即可,其余不再赘述。&Xilinx在Vivado中提供的MemoryInterfaceGenerator的IP核就是我们需要的DDR控制器,如下图所示。&这里我们可以直接双击上面的MIG的IP核,开始例化我们所需的DDR控制器。(此时Win7以后的Windows版本(不含Win7)打开此IP核会报错,解决方法见htt://blog.csdn.net/qq_/article/details/)打开后是如下图所示的界面,点Next。&给模块起个名字,根据实际情况选择控制器数量(这里笔者选择1),继续Next,如下图所示。&在开发板芯片型号所对应的方框前打勾,如下图所示。根据开发板上的DDR芯片选择DDR的种类,如N4DDR的开发板上的DDR芯片是DDR2的,因此如下图选择。&&然后在ClockPeriod中输入合适的时钟周期长度(N4DDR的官方文档建议DDR的时钟为325MHz,故此处填3077s);&接着在MemoryPart中选择开发板上的DDR芯片的具体型号(N4DDR官方文档上说明为MT47H64M16HR-25E);&然后输入DataWidth,此处以16为例。如下图所示。选择InutClockPeriod,这里填开发板的系统时钟(N4DDR为100MHz)。根据应用需要选择地址映射方式(这里保持默认的Bank-Row-Column)。&然后,这里的SystemClock、ReferenceClock建议选择NoBuffer,SystemResetPolarity则根据应用需要灵活选择(这里设置为低电平有效),如下图所示。&InternalTerminationImedence的选取应当参考开发板的官方文档说明,这里选50欧姆即可,继续Next。选择FixedPinOut。&接下来是DDR芯片的引脚分配。官网应该能找到,这里直接给出。文末会给出与此对应的引脚约束文件(n4ddr_ddr2_io_assign.ucf)。&耐心填完之后点击Validate按钮,没有错误的话会弹出一个对话框提示“CurrentPinoutisvalid.”&然后的3个信号建议选择Noconnect,后面由我们自己根据需要连接到板上的相应引脚。&&后面一直Next下去,点Accet,然后就可以点击Generate了。后面会再弹出一个对话框,直接点默认选中的按钮即可。好了,下面是笔者自己编写的测试DDR2读写的程序。文末将提供对应工程的下载链接。//*****************************************************************************//Author&&&&&:Z.M.J.@CSE,SEU//Alication&&&:MIGv2.4//Filename&&&&:examle_to.v//DateCreated&&:FriDec302016////Device&&&&&:7Series(Nexys4DDR)//DesignName&&&:DDR2SDRAM//Purose&&&&&:AdemoofDDR2'sreadandwrite//Reference&&&&:ug586_7Series_MIS_v2.4.df//*****************************************************************************`timescale1s/1smoduleexamle_to(&&//systemsignals&&inut&&&&&&&&&sys_rst,&&inut&&&&&&&&&sys_clk_i,&&//alicationsignals&&inut&[15:0]&&&&&switch_i,&&outut[15:0]&&&&&led,&&outut[7:0]&&&&&&an,&&outut[7:0]&&&&&&select_seg,&&//DDR2chisignals&&inout[15:0]&&&&&&ddr2_dq,&&inout[1:0]&&&&&&ddr2_dqs_n,&&inout[1:0]&&&&&&ddr2_dqs_,&&outut[12:0]&&&&&ddr2_addr,&&outut[2:0]&&&&&&ddr2_ba,&&outut&&&&&&&&&ddr2_ras_n,&&outut&&&&&&&&&ddr2_cas_n,&&outut&&&&&&&&&ddr2_we_n,&&outut[0:0]&&&&&&ddr2_ck_,&&outut[0:0]&&&&&&ddr2_ck_n,&&outut[0:0]&&&&&&ddr2_cke,&&outut[0:0]&&&&&&ddr2_cs_n,&&outut[1:0]&&&&&&ddr2_dm,&&outut[0:0]&&&&&&ddr2_odt);&&arameterDQ_WIDTH&&&&&=16;&&arameterECC_TEST&&&&&=&OFF&;&&arameterADDR_WIDTH&&&&=27;&&arameternCK_PER_CLK&&&=4;&&localaramDATA_WIDTH&&&=16;&&localaramPAYLOAD_WIDTH&&=(ECC_TEST==&OFF&)?DATA_WIDTH:DQ_WIDTH;&&localaramAPP_DATA_WIDTH&=2*nCK_PER_CLK*PAYLOAD_WIDTH;&&localaramAPP_MASK_WIDTH&=APP_DATA_WIDTH/8;&&//Wiredeclarations&&rega_en,a_wdf_wren,a_wdf_&&reg[2:0]a_&&reg[ADDR_WIDTH-1:0]a_&&reg[APP_DATA_WIDTH-1:0]a_wdf_&&wire[APP_DATA_WIDTH-1:0]a_rd_&&wire[APP_MASK_WIDTH-1:0]a_wdf_&&wirea_rdy,a_rd_data_end,a_rd_data_valid,a_wdf_&&//***************************************************************************&&wire[7:0]&&wire[7:0]select_&&reg[31:0]digit_&&always@(osedgesys_clk_i)begin&&&&if(switch_i[3])&&&&&&digit_data&=a_&&&&elsecase(switch_i[1:0])&&&&&&2'b00:digit_data&=read_data[31:0];&&&&&&2'b01:digit_data&=read_data[63:32];&&&&&&2'b10:digit_data&=read_data[95:64];&&&&&&2'b11:digit_data&=read_data[127:96];&&&&endcase&&end&&digitU2(&&&&.wb_clk_i(sys_clk_i),&&&&.wb_rst_i(~sys_rst),&&&&.wb_dat_i(digit_data),&&&&.an(an),&&&&.select_seg(select_seg)&&);&&reg[1:0]read_valid=2'b0;&&reg[127:0]read_data=128'h0;&&always@(osedgea_rd_data_valid)begin&&&&read_data=a_rd_&&&&read_valid[0]=(a_rd_data==data0);&&&&read_valid[1]=(a_rd_data==data1);&&end&&assignled[15]=a_&&assignled[14]=init_calib_&&assignled[13]=a_&&assignled[12]=a_wdf_&&assignled[4]=sys_rst?read_valid[1]:1'b0;&&assignled[3]=sys_rst?read_valid[0]:1'b0;&&assignled[2]=sto_w[1];&&assignled[1]=sto_w[0];&&assignled[0]=a_cmd[0];&&reg[15:0]counter=16'h0;&&arametercnt_init=16'h1;//minimum:1&&reg[26:0]addr0=27'h000_0008;&&reg[26:0]addr1=27'h003_0100;&&reg[127:0]data0=128'h33_66_;&&reg[127:0]data1=128'h_aaaa_bbbb_cccc_dddd_eeee_&&reg[1:0]sto_w=2'b00;&&always@(osedgesys_clk_iornegedgesys_rst)begin&&&&if(sys_rst==1'b0)begin&&&&&&counter=12'b0;&&&&&&sto_w=2'b0;&&&&&&a_en=1'b0;&&&&&&a_addr=27'h0;&&&&&&a_cmd=3'b1;&&&&&&a_wdf_data=128'h0;&&&&&&a_wdf_end=1'b0;&&&&&&a_wdf_wren=1'b0;&&&&endelsebegin&&&&&&if(counter==cnt_init&&~sto_w[0])&&&&&&&&if(a_rdy&a_wdf_rdy)begin&&&&&&&&&&a_wdf_data=data0;&&&&&&&&&&a_addr=addr0;&&&&&&&&&&a_cmd=3'b0;&&&&&&&&&&a_wdf_wren=1'b1;&&&&&&&&&&a_wdf_end=1'b1;&&&&&&&&&&a_en=1'b1;&&&&&&&&endelse&&&&//Holdsecificsignalsuntila_wdf_rdyisasserted.&&&&&&&&&&counter=counter-16'h1;&&&&&&elseif(counter==cnt_init+1&&~sto_w[0])&&&&&&&&if(a_rdy&a_wdf_rdy)begin&&&&&&&&&&a_wdf_end=1'b0;&&&&&&&&&&a_wdf_wren=1'b0;&&&&&&&&&&a_en=1'b0;&&&&&&&&&&a_cmd=3'b1;&&&&&&&&&&sto_w[0]=1'b1;&&&&&&&&endelse&&&&//Holdsecificsignalsuntila_wdf_rdyisasserted.&&&&&&&&&&counter=counter-16'h1;&&&&&&elseif(counter==cnt_init+8&&~sto_w[1])&&&&&&&&if(a_rdy&a_wdf_rdy)begin&&&&&&&&&&a_wdf_data=data1;&&&&&&&&&&a_addr=addr1;&&&&&&&&&&a_cmd=3'b0;&&&&&&&&&&a_wdf_wren=1'b1;&&&&&&&&&&a_wdf_end=1'b1;&&&&&&&&&&a_en=1'b1;&&&&&&&&endelse&&&&//Holdsecificsignalsuntila_wdf_rdyisasserted.&&&&&&&&&&counter=counter-16'h1;&&&&&&elseif(counter==cnt_init+9&&~sto_w[1])&&&&&&&&if(a_rdy&a_wdf_rdy)begin&&&&&&&&&&a_wdf_end=1'b0;&&&&&&&&&&a_wdf_wren=1'b0;&&&&&&&&&&a_en=1'b0;&&&&&&&&&&a_cmd=3'b1;&&&&&&&&&&sto_w[1]=1'b1;&&&&&&&&endelse&&&&//Holdsecificsignalsuntila_wdf_rdyisasserted.&&&&&&&&&&counter=counter-16'h1;&&&&&&elseif(counter==cnt_init+88)begin&&&&&&&&a_addr=switch_i[2]?addr1:addr0;&&&&&&&&a_en=1'b1;&&&&&&&&if(~a_rdy)counter=counter-16'h1;&&&&&&endelseif(counter==cnt_init+89)&&&&&&&&a_en=1'b0;&&&&&&counter=counter+16'h1;&&&&end&&end&&//StartofUserDesigntoinstance&&//***************************************************************************&&//TheUserdesignisinstantiatedbelow.Thememoryinterfaceortsare&&//connectedtotheto-levelandthealicationinterfaceortsare&&//connectedtothetrafficgeneratormodule.Thisrovidesareference&&//forconnectingthememorycontrollertosystem.&&//***************************************************************************&&my_ddru_my_ddr(&&&&//Memoryinterfaceorts&&&&.ddr2_cs_n&&&&&&&&&(ddr2_cs_n),&&&&.ddr2_addr&&&&&&&&&(ddr2_addr),&&&&.ddr2_ba&&&&&&&&&&(ddr2_ba),&&&&.ddr2_we_n&&&&&&&&&(ddr2_we_n),&&&&.ddr2_ras_n&&&&&&&&(ddr2_ras_n),&&&&.ddr2_cas_n&&&&&&&&(ddr2_cas_n),&&&&.ddr2_ck_n&&&&&&&&&(ddr2_ck_n),&&&&.ddr2_ck_&&&&&&&&&(ddr2_ck_),&&&&.ddr2_cke&&&&&&&&&(ddr2_cke),&&&&.ddr2_dq&&&&&&&&&&(ddr2_dq),&&&&.ddr2_dqs_n&&&&&&&&(ddr2_dqs_n),&&&&.ddr2_dqs_&&&&&&&&(ddr2_dqs_),&&&&.ddr2_dm&&&&&&&&&&(ddr2_dm),&&&&.ddr2_odt&&&&&&&&&(ddr2_odt),&&&&//Alicationinterfaceorts&&&&.a_addr&&&&&&&&&(a_addr),&&&&.a_cmd&&&&&&&&&&(a_cmd),&&&&.a_en&&&&&&&&&&(a_en),&&&&.a_wdf_rdy&&&&&&&&(a_wdf_rdy),&&&&.a_wdf_data&&&&&&&(a_wdf_data),&&&&.a_wdf_end&&&&&&&&(a_wdf_end),&&&&.a_wdf_wren&&&&&&&(a_wdf_wren),&&&&.a_rd_data&&&&&&&&(a_rd_data),&&&&.a_rd_data_end&&&&&&(a_rd_data_end),&&&&.a_rd_data_valid&&&&&(a_rd_data_valid),&&&&.a_rdy&&&&&&&&&&(a_rdy),&&&&.a_sr_req&&&&&&&&(1'b0),&&&&.a_ref_req&&&&&&&&(1'b0),&&&&.a_zq_req&&&&&&&&(1'b0),&&&&.a_wdf_mask&&&&&&&(16'h0000),&&&&.init_calib_comlete&&&&(init_calib_comlete),&&&&//SystemClockPorts&&&&.sys_clk_i&&&&&&&&&(sys_clk_i),&&&&//ReferenceClockPorts&&&&.clk_ref_i&&&&&&&&&(sys_clk_i),&&&&.sys_rst&&&&&&&&&&(sys_rst)&&);endmodule保存后直接生成比特流就可以下板验证了。&在摸索过程中笔者发现,写入了数据之后最快要到发出写命令的第8个系统时钟才能读出所写入的数据,且读操作必须在写操作后经过8的整数倍个时钟后进行。有时将比特流下载到N4DDR上面之后读写的数据有误,但是重启开发板再重新下载即可解决问题,知道个中缘由的朋友欢迎在评论中告知笔者,笔者在此先行谢过。&需要说明的是,此处突发长度(BL)为8,因此a_addr必须是8对齐的地址。同时,由于前面选择的DataWidth为16,因此每次读写数据的长度为8*16bit==128bit。·参考文档:&Nexys4-DDR_rm.df&ug586_7Series_MIS_v2.4.df·模板工程下载链接:&htt://download.csdn.net/detail/qq_8980·测试代码下载链接:&htt://download.csdn.net/detail/qq_5407&【注意】由于工程大小超出上限,此处仅提供工程的源码文件和比特流文件。·DDR2IP核引脚约束文件下载链接:&n4ddr_ddr2_io_assign.ucf转自:blog.csdn.net/qq_/article/details/&作者:SEU_MJ
已被管理员加精
今天说的vivado的仿真是指用vivado自带的仿真工具进行仿真,主要内容集中在如何运用脚本对代码进行仿真。1.Vivado自带工具的图形界面仿真很简单,这里不做过多介绍,但是在图形界面仿真的时候有一点值得注意,就是如何产生设计中所有信号的波形,因为一般Vivado是默认产生顶层模块的IO波形,而如果想产生其他信号的波形,还要在仿真之前添加进去,而如果仿真期间还要加信号的话,就只能重新添加信号,然后重新仿真。所以这里我们利用verilog中的dumvars系统调用来dum出所有的波形。做法就是在仿真设置下面加一条命令-testlusargdum_all。这个命令会被代码中的if($test$lusargs(&dum_all&))begin捕捉到,从而会执行$dumfile(&board.vcd&);$dumvars(0,board);系统调用函数来dum出所有的波形。2.下面主要说一下怎么在命令行界面进行仿真:在命令行界面进行仿真就必须了解vivado的仿真机理,例如,----源代码是如何被编译,然后执行的;----如果设计中包含i核,仿真的过程有事怎样的;----有些i核对应的有源码,而有些i核实没有源码的,这个时候该利用什么队i核进行仿真;首先,Vivado的命令行仿真是可以脱离vivado环境来实现的,就想第三方仿真工具仿真一样。在vivado中,用于仿真的工具有三个:xvlog,xelab,xsim。分别对应comile,elaboration和simulation。下面我们就从这三个方面对应vivado的命令行仿真就行介绍。xvlog:在仿真之前,我们要对源代码进行analyze,关于xvlog这一段究竟做了什么,我现在还不是很清楚。因为从vivado的userguide和实际的命令行仿真来看,编译是在xelab下完成的,所以xvlog具体做了什么,我也很模糊。xvlog有几个重要的命令参数,-i:只include文件,用于代码中的·include语句的文件查找;-f:是对应源码文件的集合,即可以看代码的路径卸载一个文件里,然后用-f进行连接。xvlog最后会输出一个work文件夹,作为后面xelab编译时的模块的查找,work文件夹其实就是用户代码转换成的一个lib库。这里就要说明一下,如果设计中包含没有源码的i核,该怎么办,其实i核本身没有源码,不代表仿真的时候没有源码可以参考,在生成i的过程中,一般也会生成的用于仿真的verilog模型文件,我们仿真的时候只需把这个文件加到我们的源代码中即可,即把这个verilog模型文件就看做是我们的源码文件。xelab:这是对代码进行编译和解析,最后生成可执行文件。xelab也有很多地方需要说,首先就是xelab是怎么利用xvlog产生的work库的,这就涉及到xelab时怎么进行模块的查找的,xelab会默认查找work文件夹,这个不要我们指定,但是如果代码中用到了vivado软件中自带的其他的库,那么我们就要指定了,指定的方式就是利用-L参数,可以利用多个-L参数来指定多个lib;然后,在xelab中,我们必须指定顶层的模块,如果顶层模块指定错误,我们的仿真就会出现很难察觉的错误,我就是经历过这样的教训,还有如果设计中包含i核,我们就要同时指定glbl为顶层模块,关于glbl的作用,这里暂且不说,以后会有总结;最后,我们需要为利用-s参数生成一个snashot文件,即仿真阶段的可执行文件。xsim:这就是真正进行仿真的工具了,在这里我们利用利用-testlusargdum_all来dum所有的波形,同时也可以利用-t参数指定某个tcl脚本来运行,tcl脚本可以指定仿真运行的时间等。其实命令行的仿真和图形界面的过程是一样的,但是从命令行仿真我们更可以看出vivado仿真的具体流程,而不是只停留在鼠标点击某个botton的层面上,这就是命令行最大的好处吧,下面给出我的命令行的脚本作为参考:#simulationscrit#rm-rfxsim.*rm-fxsim_1*rm-fxvhdl.*rm-fxvlog.*rm-felaborate.*rm-f*.log##comilesourceandsimulationfile#echo&comilesourceandsimulationfile&xvlog-m64-itests/-idsort/-ifunctional/-fxilinx_lib.f-fsource-design-list.f-fsource-i-list.f-fsource-simulation-list.f;##elaboratethedesign-list#echo&elaboratethedesign&xelabwork.boardwork.glbl-m64--debugtyical--mt8-Lxil_defaultLib-Lxm-Lblk_mem_gen_v8_3_2-Lunisims_ver-Lunimacro_ver-Lsecurei--snashotboard_behave-logelaborate.#-Lxil_defaultLib-Lxm-Lblk_mem_gen_v8_3_2-Lunisims_ver-Lunimacro_ver-Lsecurei#startsimulationthedesign#-Lxil_defaultLib-Lxm-Lblk_mem_gen_v8_3_2-Lunisims_ver-Lunimacro_ver-Lsecurei#echo&startsimulation&xsimboard_behave-testlusargdum_all-testlusargsamle_smoke_test0-tsimulation_control.tcl-logsimulation.log
已被管理员加精
在XilinxISE中不同的操作都有不同的文件类型对应,例如综合、布局、布线、生成比特流等都会产生特定格式的文件,在vivado中也是一样,只不过在vivado中,文件的格式相比于ISE中更加统一。1、.dc文件。在ise中每个过程都会产生特定格式的文件,例如.ncd,.cf,.ngd等等,但是在vivado中,不论是综合还是布局布线都只会产生一种格式的文件,即.dc文件,每个阶段的.dc文件都是下一阶段的输入文件,.dc文件实际上包含了对应阶段处理的信息,用vivado可以直接打开,File-&OenCheckoint。.dc文件主要包括PhysicalConstraints,DeviceConstraints,Netlists以及device的信息,如下图所示:从这可以看出其实.dc文件就是ise中的网表文件和约束文件的集合,只不过在vivado中被集合在了一个文件里。2.&.xdc文件,这个是vivado的约束文件,vivado的约束文件和ise中的约束文件.ucf或者.cf相比有很大不同,.xdc中的约束文件其实就是一系列的tcl语句,所以对于vivado中的约束文件,可以作为一个源文件放在工程里,在综合和布局布线中调用;也可以在tclconsole中输入,立即执行。.xdc文件的内容大致如下所示:################################################################################TimingConstraints################################################################################create_clock-namesys_clk-eriod10[get_ortssys_clk_]##set_false_ath-to[get_ins{vc707_cie_x8_gen2_suort_i/ie_clock_i/clk_i1_bufgctrl.clk_i1/S0}]set_false_ath-to[get_ins{vc707_cie_x8_gen2_suort_i/ie_clock_i/clk_i1_bufgctrl.clk_i1/S1}]##create_generated_clock-nameclk_125mhz_x1y0[get_insvc707_cie_x8_gen2_suort_i/ie_clock_i/mmcm_i/CLKO

我要回帖

更多关于 三角函数讲解 的文章

 

随机推荐