技术论坛

  • FPGA

    Xilinx大学计划官方FPGA开发板(DIGILENT全球唯一原厂) & Pmods积木式传感器

    发帖数

    246
    请问这段约束文件代码如何对应成XDC格式的代码。
    ////////////////////////////////////////////////////时钟约束NET"clk"TNM_NET=clk;TIMESPECTS_CLK=PERIOD"clk"20nshigh50%;NET"clk"LOC="B8";//////////////////////////////////////////////////////////数码管NET"smg<7>"LOC="N13";NET"smg<6>"LOC="M12";NET"smg<5>"LOC="L13";NET"smg<4>"LOC="P12";NET"smg<3>"LOC="N11";NET"smg<2>"LOC="N14";NET"smg<1>"LOC="H12";NET"smg<0>"LOC="L14";NET"smg_an<3>"LOC="K14";NET"smg_an<2>"LOC="M13";NET"smg_an<1>"LOC="J12";NET"smg_an<0>"LOC="F12";//////////////////////////////////////////////////////按键//NET"btn<3>"LOC="A7";//NET"btn<2>"LOC="M4";NET"btn<1>"LOC="C11";NET"btn<0>"LOC="G12";////////////////////////////////////////////////////开关NET"sw<1>"LOC="L3";NET"sw<0>"LOC="N3";XDC具体该如何写约束代码?在社区里就找到了简单的引脚约束,电器约束,上拉和下拉约束格式。请问始终具体该如何写约束代码?
    发布于 21小时前
  • 开源微控制器(LabVIEW支持)

    树莓派(Raspberry Pi)、BeagleBone Black、chipKIT

    发帖数

    36
    LabVIEW+树莓派:LED流水灯
    LED采用共阳极接法(灌电流),为了符合操作习惯,初始化的时候布尔数组作了“非”运算。进入循环后通过一维数组循环移位函数不断改变状态,同时把值赋给DigitalWritevi,实现流水灯效果。当然,程序还有其他N种写法,有兴趣的小伙伴可以试一下。实物接线,注意程序引脚参数要设置正确,接线时引脚对应好,加个限流电阻(或排阻)。
    发布于 04-07
  • 口袋仪器

    Analog Discovery 2、Analog Discovery、Digital Discovery、Electronics Explorer

    发帖数

    41

创客圈

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

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

    发帖数

    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
  • 工科街(校园话题区)

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

    发帖数

    21
    嵌入式软件工程师面试题
    1.预处理器(Prerocessor)用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL我在这想看到几件事情:1).#define语法的基本知识(例如:不能以分号结束,括号的使用,等等)2).懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。3).意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。4).如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B)((A)<=(B)(A):))C/C++试题集C/C++Develoment这个测试是为下面的目的而设的:1).标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。2).三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。3).懂得在宏中小心地把参数用括号括起来4).我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?Least=MIN(*++,b);2.预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。3.死循环(Infiniteloos)嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。第三个方案是用gotoLoo:…gotoLoo;应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。4.数据声明(Datadeclarations)用变量a给出下面的定义a)一个整型数(Aninteger)b)一个指向整型数的指针(Aointertoaninteger)c)一个指向指针的的指针,它指向的指针是指向一个整型数(Aointertoaointertoaninteger)d)一个有10个整型数的数组(Anarrayof10integers)e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10ointerstointegers)f)一个指向有10个整型数数组的指针(Aointertoanarrayof10integers)g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Aointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:a)inta;//Anintegerb)int*a;//Aointertoanintegerc)int**a;//Aointertoaointertoanintegerd)inta[10];//Anarrayof10integerse)int*a[10];//Anarrayof10ointerstointegersf)int(*a)[10];//Aointertoanarrayof10integersg)int(*a)(int);//Aointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a[10])(int);//Anarrayof10ointerstofunctionsthattakeanintegerargumentandreturnaninteger人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?5.Static关键字static的作用是什么?这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。6.Const关键字const是什么含意?我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年DanSaks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:EmbeddedSystemsProgramming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?Constinta;intconsta;constint*a;int*consta;intconst*aconst;前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1).关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)2).通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。3).合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。7.Volatile关键字volatile有什么含意并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1).并行设备的硬件寄存器(如:状态寄存器)2).一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)3).多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。1).一个参数既可以是const还可以是volatile吗?解释为什么。2).一个指针可以是volatile吗?解释为什么。3).下面的函数有什么错误:intsquare(volatileint*tr){return*tr**tr;}下面是答案:1).是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。3).这段代码的有个恶作剧。这段代码的目的是用来返指针*tr指向值的平方,但是,由于*tr指向一个volatile型参数,编译器将产生类似下面的代码:intsquare(volatileint*tr){inta,b;a=*tr;b=*tr;returna*b;}由于*tr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:longsquare(volatileint*tr){inta;a=*tr;returna*a;}8.位操作(Bitmaniulation)嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其它位不变。对这个问题有三种基本的反应1).不知道如何下手。该被面者从没做过任何嵌入式系统的工作。2).用bitfields。Bitfields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bitfields因此完全对我无用,因为我的编译器用其它的方式来实现bitfields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。3).用#defines和bitmasks操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:#defineBIT3(0x1<<3)staticinta;voidset_bit3(void){a|=BIT3;}voidclear_bit3(void){a&am;=~BIT3;}一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&am;=~操作。访问固定的内存位置(Accessingfixedmemorylocations)C/C++Develoment嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(tyecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:int*tr;tr=(int*)0x67a9;*tr=0xaa55;一个较晦涩的方法是:*(int*const)(0x67a9)=0xaa55;即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。9.中断(Interruts)中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrut。下面的代码就使用了__interrut关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。__interrutdoublecomute_area(doubleradius){doublearea=PI*radius*radius;rintf("Area=%f",area);returnarea;}这个函数有太多的错误了,以至让人不知从何说起了:1).ISR不能返回一个值。如果你不懂这个,那么你不会被雇用的。2).ISR不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。3).在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4).与第三点一脉相承,rintf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。10.代码例子(Codeexamles)下面的代码输出是什么,为什么?Voidfoo(void){unsignedinta=6;intb=-20;(a+b>6)uts(">6"):uts("<=6");}这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。11.评价下面的代码片断:unsignedintzero=0;unsignedintcomzero=0xFFFF;/*1'scomlementofzero*/对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsignedintcomzero=~0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧…12.动态内存分配(Dynamicmemoryallocation)尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(hea)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是P.J.Plauger,他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?Char*tr;if((tr=(char*)malloc(0))==NULL)uts("Gotanullointer");elseuts("Gotavalidointer");这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Gotavalidointer”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。13.TyedefTyedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:#definedPSstructs*tyedefstructs*tPS;以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:tyedef更好。思考下面的例子:dPS1,2;tPS3,4;第一个扩展为structs*1,2;上面的代码定义1为一个指向结构的指,2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了3和4两个指针。晦涩的语法C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?Inta=5,b=7,c;c=a+++b;这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c=a+++b;因此,这段代码持行后a=6,b=7,c=12。如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。
    发布于 04-24

干货热帖

  • FPGA设计总结十五条
    1、硬件设计基本原则(1)速度与面积平衡和互换原则:一个设计如果时序余量较大,所能跑的频率远高于设计要求,能可以通过模块复用来减少整个设计消耗的芯片面积,这就是用速度优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么可以通过数据流串并转换,并行复制多个操作模块,对整个设计采用“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。从而实现了用面积复制换取速度的提高。(2)硬件原则:理解HDL本质(3)系统原则:整体把握(4)同步设计原则:设计时序稳定的基本原则2、Verilog作为一种HDL语言,对系统行为的建模方式是分层次的。比较重要的层次有系统级(system)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关级(Switch)。3、实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。4、if…else…和case在嵌套描述时是有很大区别的,if…else…是有优先级的,一般来说,第一个if的优先级最高,最后一个else的优先级最低。而case语句是平行语句,它是没有优先级的,而建立优先级结构需要耗费大量的逻辑资源,所以能用case的地方就不要用if…else…语句。补充:1.也可以用if…;if…;if…;描述不带优先级的“平行”语句。5、FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。6、FPGA和CPLD的组成:FPGA基本有可编程I/O单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等6部分组成。CPLD的结构相对比较简单,主要由可编程I/O单元、基本逻辑单元、布线池和其他辅助功能模块组成。7、BlockRAM:3种块RAM结构,M512RAM(512bit)、M4KRAM(4Kbit)、M-RAM(64Kbit).M512RAM:适合做一些小的Buffer、FIFO、DPRAM、SPRAM、ROM等;M4KRAM:适用于一般的需求M-RAM:适合做大块数据的缓冲区。Xlinx和LatticeFPGA的LUT可以灵活配置成小的RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM。补充:但是在一般的设计中,不提倡用FPGA/CPLD的片内资源配置成大量的存储器,这是处于成本的考虑。所以尽量采用外接存储器。8、善用芯片内部的PLL或DLL资源完成时钟的分频、倍频率、移相等操作,不仅简化了设计,并且能有效地提高系统的精度和工作稳定性。9、异步电路和同步时序电路的区别异步电路:电路核心逻辑有用组合电路实现;异步时序电路的最大缺点是容易产生毛刺;不利于器件移植;不利于静态时序分析(STA)、验证设计时序性能。同步时序电路:电路核心逻辑是用各种触发器实现;电路主要信号、输出信号等都是在某个时钟沿驱动触发器产生的;同步时序电路可以很好的避免毛刺;利于器件移植;利于静态时序分析(STA)、验证设计时序性能。10、同步设计中,稳定可靠的数据采样必须遵从以下两个基本原则:(1)在有效时钟沿到达前,数据输入至少已经稳定了采样寄存器的Setu时间之久,这条原则简称满足Setu时间原则;(2)在有效时钟沿到达后,数据输入至少还将稳定保持采样寄存器的Hold时钟之久,这条原则简称满足Hold时间原则。11、同步时序设计注意事项:异步时钟域的数据转换。组合逻辑电路的设计方法。同步时序电路的时钟设计。同步时序电路的延迟。同步时序电路的延迟最常用的设计方法是用分频或者倍频的时钟或者同步计数器完成所需的延迟,对比较大的和特殊定时要求的延时,一般用高速时钟产生一个计数器,根据计数产生延迟;对于比较小的延迟,可以用D触发器打一下,这样不仅可以使信号延时了一个时钟周期,而且完成了信号与时钟的初次同步。在输入信号采样和增加时序约束余量中使用。另外,还有用行为级方法描述延迟,如“#5a<=4’0101;”这种常用于仿真测试激励,但是在电路综合时会被忽略,并不能起到延迟作用。Verilog定义的reg型,不一定综合成寄存器。在Verilog代码中最常用的两种数据类型是wire和reg型,一般来说,wire型指定的数据和网线通过组合逻辑实现,而reg型指定的数据不一定就是用寄存器实现。12、常用设计思想与技巧(1)乒乓操作;(2)串并转换;(3)流水线操作;(4)异步时钟域数据同步。是指如何在两个时钟不同步的数据域之间可靠地进行数据交换的问题。数据时钟域不同步主要有两种情况:两个域的时钟频率相同,但是相差不固定,或者相差固定但是不可测,简称为同频异相问题。两个时钟频率根本不同,简称异频问题。两种不推荐的异步时钟域操作方法:一种是通过增加Buffer或者其他门延时来调整采样;另一种是盲目使用时钟正负沿调整数据采样。13、模块划分基本原则:(1)对每个同步时序设计的子模块的输出使用寄存器(用寄存器分割同步时序模块原则)。(2)将相关逻辑和可以复用的逻辑划分在同一模块内(呼应系统原则)。(3)将不同优化目标的逻辑分开。(4)将送约束的逻辑归到同一模块。(5)将存储逻辑独立划分成模块。(6)合适的模块规模。(7)顶层模块最好不进行逻辑设计。14、组合逻辑的注意事项(1)避免组合逻辑反馈环路(容易毛刺、振荡、时序违规等)。解决:A、牢记任何反馈回路必须包含寄存器;B、检查综合、实现报告的warning信息,发现反馈回路(combinationalloos)后进行相应修改。(2)替换延迟链。解决:用倍频、分频或者同步计数器完成。(3)替换异步脉冲产生单元(毛刺生成器)。解决:用同步时序设计脉冲电路。(4)慎用锁存器。解决:A、使用完备的if…else语句;B、检查设计中是否含有组合逻辑反馈环路;C、对每个输入条件,设计输出操作,对case语句设置default操作。特别是在状态机设计中,最好有一个default的状态转移,而且每个状态最好也有一个default的操作。D、如果使用case语句时,特别是在设计状态机时,尽量附加综合约束属性,综合为完全条件case语句。小技巧:仔细检查综合器的综合报告,目前大多数的综合器对所综合出的latch都会报“warning”,通过综合报告可以较为方便地找出无意中生成的latch。15、时钟设计的注意事项(1)同步时序电路推荐的时钟设计方法:时钟经全局时钟输入引脚输入,通过FPGA内部专用的PLL或DLL进行分频/倍频、移相等调整与运算,然后经FPGA内部全局时钟布线资源驱动到达芯片内所有寄存器和其他模块的时钟输入端。FPGA设计者的5项基本功:仿真、综合、时序分析、调试、验证。掌握HDL语言虽然不是FPGA设计的全部,但是HDL语言对FPGA设计的影响贯穿于整个FPGA设计流程中,与FPGA设计的5项基本功是相辅相成的。对于FPGA设计者来说,用好“HDL语言的可综合子集”可以完成FPGA设计50%的工作——设计编码。练好仿真、综合、时序分析这3项基本功,对于学习“HDL语言的可综合子集”有如下帮助:1.通过仿真,可以观察HDL语言在FPGA中的逻辑行为。2.通过综合,可以观察HDL语言在FPGA中的物理实现形式。3.通过时序分析,可以分析HDL语言在FPGA中的物理实现特性。对于FPGA设计者来说,用好“HDL语言的验证子集”,可以完成FPGA设计另外50%的工作——调试验证。1.搭建验证环境,通过仿真的手段可以检验FPGA设计的正确性。2.全面的仿真验证可以减少FPGA硬件调试的工作量。3.把硬件调试与仿真验证方法结合起来,用调试解决仿真未验证的问题,用仿真保证已经解决的问题不在调试中再现,可以建立一个回归验证流程,有助于FPGA设计项目的维护。FPGA设计者的这5项基本功不是孤立的,必须结合使用,才能完成一个完整的FPGA设计流程。反过来说,通过完成一个完整的设计流程,才能最有效地练习这5项基本功。对这5项基本功有了初步认识,就可以逐个深入学习一些,然后把学到的知识再次用于完整的设计流程。如此反复,就可以逐步提高设计水平。采用这样的循序渐进、螺旋式上升的方法,只要通过培训入了门,就可以自学自练,自我提高。市面上出售的有关FPGA设计的书籍为了保证结构的完整性,对FPGA设计的每一个方面分开介绍,每一方面虽然深入,但是由于缺少其他相关方面的支持,读者很难付诸实践,只有通读完全书才能对FPGA设计获得一个整体的认识。这样的书籍,作为工程培训指导书不行,可以作为某一个方面进阶的参考书。对于新入职的员工来说,他们往往对FPGA的整体设计流程有了初步认识,5项基本功的某几个方面可能很扎实。但是由于某个或某几个方面能力的欠缺,限制了他们独自完成整个设计流程的能力。入职培训的目的就是帮助他们掌握整体设计流程,培养自我获取信息的能力,通过几个设计流程来回的训练,形成自我促进、自我发展的良性循环。在这一过程中,随着对工作涉及的知识的广度和深度的认识逐步清晰,新员工的自信心也会逐步增强,对个人的发展方向也会逐步明确,才能积极主动地参与到工程项目中来。
    亮了(0) 40 0 04-24
  • 对Verilog初学者比较有用的整理(持续更新中...)
    先记下来:1、不使用初始化语句;2、不使用延时语句;3、不使用循环次数不确定的语句,如:forever,while等;4、尽量采用同步方式设计电路;5、尽量采用行为语句完成设计;6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;7、所有的内部寄存器都应该可以被复位;8、用户自定义原件(UDP元件)是不能被综合的。一:基本Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器,还有可能被优化掉。二:Verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。2、过程性赋值:过程性赋值只出现在always语句中。阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。过程性赋值的赋值对象有可能综合成wire,latch,和fli-flo,取决于具体状况。如,时钟控制下的非阻塞赋值综合成fli-flo。过程性赋值语句中的任何延时在综合时都将忽略。建议同一个变量单一地使用阻塞或者非阻塞赋值。3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门,一些操作符不能被综合:===、!==。4、算术操作符:Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:Wire[3:0]A,B;Wire[4:0]C;AssignC=A+B;C的最高位用来存放进位。6、关系运算符:关系运算符:<,>,<=,>=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。7、相等运算符:==,!=注意:===和!==是不可综合的。可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。9、部分选择:部分选择索引必须是常量。10、BIT选择:BIT选择中的索引可以用变量,这样将综合成多路(复用)器。11、敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。12、IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。13、循环:只有for-loo语句是可以综合的。14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。15、不能在多个always块中对同一个变量赎值。16、函数函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。17、任务:任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。18、Z:Z会综合成一个三态门,必须在条件语句中赋值19、参数化设计:优点:参数可重载,不需要多次定义模块三:模块优化1、资源共享:当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。2、共用表达式:如:C=A+B;D=G+(A+B);两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.3、转移代码:如循环语句中没有发生变化的语句移出循环.4、避免latch:两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。5、模块:综合生成的存储器如ROM或RAM不是一种好方法,只是成堆的寄存器,很费资源。最好用库自带的存储器模块。四、验证:1、敏感表:在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。2、异步复位:建议不要在异步时对变量读取,即异步复位时,对信号赋以常数值。
    亮了(0) 84 0 04-10
  • Zynq Book知识点笔记(未完待续...)
    先上ZynqBook中文版下载链接:www.digilent.com.cn/community/63.html第一~第七章1.PS和PL分工:软件(在PS端)常常用来完成一些一般性的顺序执行的任务,比如操作系统、用户应用程序以及图形界面,而偏向于数据流计算的任务则更加适合于在PL端实现。。另外,那些具有并行限制的软件算法,也应该考虑在PL端实现。这比较近似于“协处理器”模型,可以把处理器从那些重在计算并且具有并行性的任务中解放出来,改为硬件处理,从而在整体上提升性能。2.选择PS的操作系统:操作系统:它可以是例如Linux或者Android这样的成熟的操作系统;也可以是嵌入式操作系统;对于时序严格确定的程序则可选用实时操作系统(RTOS);或者是Standalone,一个轻型的包含大多数基本函数的“操作系统”。软件也可以直接和硬件通信,这也就是常常被提及的“裸跑”应用。由于是双核架构,所以也可能部署两个不同的操作系统,每一个使用一个核心。3.ISE和vivado区别和联系:4.关于zynq在图像视频处理分工:PL很适合诸如像素点级别的图像处理所需的快速、并行的操作。计算机视觉功能则可以由运行在Zynq的PS上的软件来实现,然后还需要与更高层级上的软件应用做集成。这两者之间通过对图像内的特征与目标的检测而进行的转换,可以由带着与PS之间恰当接口的PL来实现,也可以利用NEON处理器的SIMD功能。对NEON的丰富的支持在第三方图像和视频处理产品中可以找到。5.一些关于可以用在zynq上的视频图像处理工具:我们还应该考虑在促进为Zynq开发图像处理系统的设计中,Xilinx和第三方开发工具的作用。以下罗列了一些值得一提的相关说明:•XilinxIP包—在IPIntegrator里有很多IP包是用于图像和视频处理应用的,包括视频存储、图像增强和色彩调整功能。•OenCV—开放计算机视觉(OenComuterVision)是一个开源项目,实现了一组用于图像和视频处理的C/C++库[34]。OenCV的工具可以用来开发运行在PS上的软件算法。•VivadoHLS视频库—VivadoHLS包含一个能综合到HDL里去的函数库,实现了对图像和视频处理的特殊支持。这些函数可以替代部分OenCV函数,因此如有需要,对应的功能就能方便地被划分到硬件中去。•MATLAB/Simulink—MATLAB和Simulink提供了丰富的用于图像和视频处理以及计算机视觉的工具。不仅提供相关的函数和开发环境,还可以把开发好的算法转换成能实现在Zynq上的C/C++代码。6.ZYNQ的生态系统7.第七章第十三个文献J.Monson,M.Wirthlin,andB.L.Hutchings,“ImlementingHigh-Performance,Low-PowerFPGA-BasedOticalFlowAcceleratorsinC”,Proceedingsofthe24thIEEEInternationalConferenceonAlication-SecificSystems,ArchitecturesandProcessors(ASAP),WashingtonDC,USA,June2013,.363-369.这篇文献主要是用zynq实现光流法的第九章:一般嵌入式系统架构第十一章:硬件/软件划分1.FPGA可编程逻辑适合解决那种能高效地划分为多道并行任务的问题。由于可编程逻辑固有的并行执行方式,多个运算可以被同时处理,用比串行处理更短的时间计算出最终的结果。FPGA实现的例子应用包括数字过滤计算、波束形成和图像处理。传统上这些任务是重复的,而且计算的过程本质上是完全静态的。另一方面,存在一些更动态、不可预测的问题,这些任务更适合在基于处理器的系统上实现。在决定一个过程应该以硬件还是软件来实现的时候,另一个要考虑的因素是要用到的格式的数量。传统上,由于存在特别开发的向量数学引擎和专用的浮点单元,处理器对于浮点运算具有更好的支持。FPGA可以支持浮点计算,但是需要很大数量的逻辑单元来实现。对于高精度定点计算也是类似的情况。现在,随着FPGA尺寸的增加,用于实现高精度计算的逻辑部分所占的面积,相对于芯片的尺寸已经变少了,所以高精度计算也变得常见了。因此,如果一个应用需要高精度浮点运算,最好的选择是要么用处理器实现,要么在大规模的FPGA中实现。2.串并比较第十三章:IP包设计1.VivadoHLS设计流程:•IP-XACT—IP-XACT是由SPIRIT财团提出的一种公共的设计IP的文档规范。这是一种被广泛使用的描述IP的XML模版,它与具体的工具无关而且机器可读[1]。如果你的IP设计要被引入到VivadoIPCatalog,就应该选择这种格式[6]。<br/>第18章《IP重用与集成》更详细地说明了IPXACT。•IPCore—选择这个选项的时候,你的IP会被输出成能被输入到XPS去的格式。•SysGen—这个选项让你能把结果RTL文件输出成一个可以用在SystemGenerator的设计中的包。2.选择正确的IP创建方法实现最高运算频率、利用最少的硬件资源、最短的开发时间,还是折中。你还必须考虑你或你的团队对于哪种方法最具经验,以及采用不熟悉的方法时所需的学习曲线的问题。如果某种格式具有仿真模型,比如MATLAB/Simulink或C/C++,你很有可能可以利用它们,然后用某个方法从中产生IP,比如HDLCoder或VivadoHLS。第十四章:高层综合终于可以学vivadoHLS这方面的内容啦,后嗨新,在接下来两章里面介绍高级综合和vivadoHLS使用。1.VivadoHLS把C、C++或SystemC的设计转换成RTL实现,然后就可以在XilinxFPGA或Zynq芯片的可编程逻辑中综合并实现了。2.在做HLS的时候,要分析设计的两个主要方面:•设计的接口,也就是它的顶层连接,以及;•设计的功能性,也就是它所实现的算法。3.VivadoHLS设计流第十五章:VivadoHLS1.VivadoHLS综合过程的概述2.VivadoHLS的C和C++任意精度数据类型注意在C中使用任意精度整数类型的时候,必须使用另一个编译器(acc而不是gcc),细节见[18]。C++无需如此。并非所有的浮点运算都被HLS所支持,所以写代码的时候得要记着这些限制。未完待续...
    亮了(0) 131 0 04-10
  • 机器学习 | Zynq + PYNQ + Python:在PYNQ-Z1上搭建二值神经网络(BNN)
    来源|Xilinx技术论坛作者|Sleibso,Xilinx战略市场及商业计划总监译者|Stark01机器学习与CNN机器学习(MachineLearning)以及其中的深度学习(DeeLearning)在最近几年的科技行业非常地吸引眼球,取得了爆发式的发展——仅仅在过去两年间,机器学习技术所取得的发展成就,就已超越了之前45年的总和,并且依然维持着高速的发展轨迹,而这些方法是实现人工智能应用的重要手段。未来的视觉识别、语音识别和自然语言处理将会大大改变我们的日常生活。在具体的实现过程中,卷积神经网络(ConvolutionalNeuralNetworks,CNN)受到了科学家们的青睐,已成为当前语音分析和图像识别领域的研究热点。CNN采用的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。当网络的输入是多维图像时其优点表现得更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。02CNN所面临的挑战与BNN的问世当前,CNN技术所面临的一大挑战在于如何在高速运转下降低功耗,以及如何能够更为易于使用。在最近举办的第25届国际可编程门阵列(FPGA)技术研讨会(the25thInternationalSymosiumonFieldProgrammableGateArrays)上的一篇论文就提出了一种快速可扩展的二值神经网络(BinarizedNeuralNetworks,BNN)框架,其在CNN基础上进行了优化,不仅降低了功耗而且使得系统运行更快。文中指出:“大量研究发现传统的卷积神经网络(CNN)会产生大量的冗余。这种使用浮点计算的神经网络要求大存储空间和大计算量,严重阻碍了其在移动端设备上的应用。二值神经网络(BNN)设法让计算主要在正1或负1间进行,几十倍地降低了网络大小和计算量,但一直以来难以达到高预测准确率。最新的进展大幅提高了二值神经网络的预测准确率并接近实用水平。相比浮点型计算,FPGA器件更适合这种二值化操作,而且表现出不俗的性能。”图1:全连接二值化神经网络(BNN)层示例该篇论文随后介绍了作者所开发的用于生成BNN的技术,并且将之实例化应用于FPGA中。论文中所发表的基于ZynqZ-7045SoC器件所完成的测试结果令人印象深刻:“从纯图像吞吐量来看,我们的设计相比其它任何已有方案都表现得更为优异。针对MINST数据集,我们的SFC-max设计与LFC-max设计分别实现了超过48倍/6倍FPS于现今最为接近的最高吞吐量设计。相比于Alemdaretal.所执行的网络,我们的SFC-maxdesign的精度要比之低,但我们的LFC-maxdesign比之最接近的精确设计表现得更为优异:分别是6倍吞吐量以及1.9倍FPS/W之于前者的表现。针对其它数据集,我们的CNV-maxdesign相比TrueNorth更为卓越,分别取得了17倍FPS于CIFAR-10数据集,以及8倍FPS于SVHN数据集的表现。同时,我们的吞吐量9.44倍高于Ovtcharovetal.的设计,2.2倍于Hegdeetal.的最快结果。”从以上可见,对于图片分类应用,BNN虽然降低了一定精度但是性能显著提升,功耗也大幅度降低。03PYNQ让BNN触手可及更加令人兴奋的是,由于其高度可扩展性,上述二值神经网络(BNN)目前已经能够在价廉物美的DigilentPYNQ-Z1开发板上轻松搭建!基于上述论文,位于爱尔兰的Xilinx研究实验室(XilinxResearchLabs),联合挪威科技大学(NorwegianU.ofScienceandTechnology,NTNU),与悉尼大学(U.ofSydney)于近日最新共同发布了面向PYNQ-Z1的开源二值神经网络(BNN)一直框架,适合更多爱好者以及入门者学习。PYN1-Z1是由迪芝伦(DIGILENT)公司设计开发的ZYNQ7020开发板卡,国内市场官方定价:¥2,478(学术价格:¥998)。正如Xilinx研究实验室的科学家GiulioGambardella所述:“PYNQ-Z1不同的机器学习数据集(dataset)的测试结果显示:对于MNIST数据集PYNQ-Z1能实现每秒168000张图片的分类,延迟102微妙,准确率达98.4%;对于CIFAR-10、SVHN、GTSRB数据集PYN1-Z1能实现每秒1700张图片的分类,延迟2.2毫秒,准确率分别为80.1%、96.69%和97.66%,系统功耗均保持在2.5W左右。”图2:迪芝伦(DIGILENT)PYNQ-Z1板卡,基于XilinxZynqZ-7020SoCPYNQ-Z1开发采用Python开发语言以及Juyter开发环境。如果看到这儿你对使用PYNQ搭建二值神经网络(BNN)感兴趣,一些参考资料分享如下,我是雷锋:1.PYNQ-Z1开发板试用测评(文末隐藏福利):htt://www.digilent.com.cn/community/379.html2.XilinxBNN-PYNQ框架入门:htts://github.com/Xilinx/BNN-PYNQ3.产品详情:htt://www.digilent.com.cn/roducts/ynq-z14.撸板热线:htts://digilent.taobao.com5.上述aer原文档:请见附件。声明:本文由DIGILENT中文技术社区原创出品,版权归作者所有,转载请查看以下要求,DIGILENT对于违规侵权者保有法律追诉权。转载要求:1.网站转载请在文章开头粗体表明:本文转载自DIGILENT中文技术社区,表明作者,并附上本文链接。2.微信公众号转载请在开头粗体注明:本文转载自DIGILENT中文技术社区,表明作者,并设置阅读原文链接为本文链接。3.网站和微信转载具体文章后需来信至邮箱desmond.zhou@digilent.com.cn说明,备注转载文章标题、转载的微信号名称和转载日期。4.DIGILENT中文技术社区只接受如上几种转载方式,其余均视为侵权,如需商业合作请致信:desmond.zhou@digilent.com.cn
    亮了(0) 237 1 04-06
  • PYNQ-Z1首发测试!!!独家首发~~~
    盼来盼去,PYNQ终于盼到手了!首先感谢@Mr.D友情支持!真的是太给力了!据说PYNQ-Z1我是从Digilent渠道第一个拿到的!厉害咯!首先先放几张艳照包装盒Zybo和PYNQ-Z1用我的MotorolaAtrix4G(ME860)Ladock充当显示器PYNQ-Z1、ZYBO、RasberryPi3(白色)、RasberryPi2(黑色)PYNQ=Pink?所以很粉红有木有?ØPYNQ从这个项目一出来我就非常关注。为什么?主要还是因为Python,我是个地地道道的软件工程师,Python在每个软件工程师的心中,都有着非常独特的地位!对我来说,Python是远比C++来的更容易的一门语言(我的C/C++基础还是非常好的,至少复杂指针没怎么出错过,嘻嘻),也是现有的编程语言中唯一一个最接近伪代码描述的语言。很早就听说Google在自己的框架开发中大量引入了Python。听说NI新版的LabVIEW也引入了Python?可见这是一个编程上的大趋势。一会儿详细介绍一下Python!项目网址:htt://www.ynq.io/ØPYNQ-Z1的小秘密nPYNQ-Z1,Xilinx给的定位是用Python可以进行全部的ZYNQ的设计,包括PS编程和PL控制。我相信Xilinx暂时还没有能力把Python转化成VerilogHDL,原因一会儿你看完Python的介绍就知道为啥了……n所以现有的PYNQ自带一个*.bit,也就是常被提起的比特流文件,Xilinx和Digilent官方还是很贴心的,里面的模块如下:资料来源:htts://ynq.readthedocs.io/en/latest/16_creating_overlays.html对于每个PMOD接口和Arduino扩展接口,都有一个Microblaze,所以,PYNQ-Z1里头一共有3个Microblaze。查一查ZYNQ-7020的Datasheet:资料来源:htts://www.xilinx.com/roducts/silicon-devices/soc/zynq-7000.html#roductTable对比一下之前用的Arty(Artix7,XC7A35T)资料来源:htts://www.xilinx.com/roducts/silicon-devices/fga/artix-7.html#roductTable性能上的差距十分明显了,感觉Xilinx和Digilent下了血本来搞异构融合,PYNQ-Z1虽然是初代产品,但是用了这么好的Zynq,莫名的兴奋涌上心头!n启动PYNQ镜像的时候,发现了另外一个小秘密:有没有看到Model那一栏写的什么?对,是ZynqARTYZ7DevelomentBoard!再用一组照片对比一下:资料来源:htt://store.digilentinc.com/arty-z7-asoc-zynq-7000-develoment-board-for-makers-and-hobbyists/htt://store.digilentinc.com/ynq-z1-ython-roductivity-for-zynq/天生的双胞胎啊!但是设计目的还是不同的,一个是为了Python,另一个还是通过XSDK和Petalinux方式设计。据说PYNQ-Z1和ArtyZ7-Z20能共用镜像,反正我没试过,要是有机会谁可以试一下。Ø关于PythonnPython是什么?资料来源:htt://baike.baidu.com/link?url=K8JWPnYCxJUG6CPmK15UgzQvSluHsSs_gj31daxDt4zt_TgvOmmyehtJ7Olxrxh9HrsaHtKCCe2r4Sm4d3B_Python,是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNUGeneralPublicLicense)协议[2]。Python语法简洁清晰,特色之一是强制用空白符(whitesace)作为语句缩进。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3]有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。解析和编译语言的区别,C/C++是将源代码通过编译翻译成机器可以理解的二进制执行文件,这类语言是编译型语言;而Python则是将源代码先通过解析器进行解释,翻译成中间代码,然后再去运行,这就是解析型语言。通常解析型语言的功能都更强大一点,库也更为丰富,例如Java、Python、Perl、Ruby、PHP等等。但是解析并不像C/C++翻译来的那么简单,更接近人的语言,反而与机器能够理解的语言越来越远,所以解释成VerilogHDL,还是有很大难度的。最原始的Python的源代码和解析器都是用C/C++写的。所以很容易理解它与C/C++的胶水特性。当然,作为这么流行的语言,并且是开源项目,支持的人自然非常多了,第三方的库丰富的不要不要的……甚至,有人还将Python的解析器使用其他的语言进行了重写,使其兼容更多的语言。原始的项目CPython:htts://www.ython.org/Java进行改写的项目Jython:htt://www.jython.org/Python进行改写的项目PyPy:htt://yy.org/(对,你没看错,是Python自己解释自己,通过JIT技术让Python运行更快)(C#)Microsoft.NETFramework和Mono改写的IronPython:htt://ironython.net/所以,用过Xilinx和Digilent的ZYNQ开发板的人应该恍然大悟了,其实开发流程没有太大的变化,只是Xilinx为了方便像我们这种软件工程师进行开发,重新对原有完全依赖于硬件基础和知识的C函数库进行了改写(这个思路感觉是从RasberryPi那里学来的),总之是方便了一大批不具有硬件基础的人了解FPGA。nPython2.7与Python3.xPython现在有两个版本!!!对,是两个,主要原因是:语法上差别太大!Python3.x把2.7里认为不规范的语法修改了一番,然而2.7用户那么多……所以现在就保持共存的局面了……PYNQ-Z1使用的Python3.x,最新的镜像用的Ubuntu15.10Wily+Python3.4/3.6,想学PYNQ-Z1就直接看Python3.x好了廖雪峰的Python教程我用的最多,分享给大家Python2.7htt://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000Python3.xhtt://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000同时分享一下Python的一个小教程,见附件niPython和juytoriPython和juytor就不同于上边的那四个项目了,iPython主要解决的是CPython解析器的使用上的不方便。解析型语言的解析器其实是可以逐条输入语句去执行的。嗯,你没听错,下面的截图可以很明显的看出来但是,一旦输入,你就没法更改了,而且没有自动补全……这,岂不是很尴尬。iPython设计之初的目的就是这个。类似于Mathematica,iPython更像命令行下的笔记本(Notebook)系统。iPython同时开发了一套网页版的Notebook系统,直接在网页上就可以运行。在iPython4.0之后,网页版的Notebook被单独分离出来,形成了juytor。Ø上电运行!n激动人心的时刻类似于树莓派,你需要一张SD卡,一条micro-USB线(负责电源和串口通信)、一条以太网网线(负责访问juyter)。设置教程:htts://ynq.readthedocs.io/en/latest/1_getting_started.htmlSD卡烧写好提供的镜像文件,以太网直接连接电脑,设置好自己电脑的IP地址,连好USB线,打开开关,等待LD4、LD5闪烁之后熄灭(在此之前Linux系统在加载硬件设置和Linux系统的关键服务),等待10~15s之后,就可以访问juyter了。注意:默认的用户名和密码都是xilinx,一定要记住n已有资源Juyter自带了非常多的示例例程(examles),以及一些ython的小教程(getting_started),我主要依照例程试验了一下HDMI的输入输出,放上两段视频,由于没有使用VDMA,所以SD卡直接读取,输出到HDMI特别卡……时间问题,就先这样了:视频1:SD卡内的视频直接输出(1080视频):htt://v.qq.com/x/age/b0387jf4tis.html视频2:HDMI_IN->HDMI_OUT串流输出(4K视频):htt://v.qq.com/x/age/d03873lyour.html附上这部分代码n小贴士uZYNQ-7020(XC7Z020)心里话是发热比较严重的一个器件,当然和ARM-CortexA53四核@1.2GHz的树莓派3相比,其实还好,但是使用像图像处理的时候,一定要注意散热的问题,要不真的快要可以做暖手宝了。u虽然官方没说使用什么样的MicroSD,只是说8GB以上即可,但是从某种意义上,SD卡作为一个存储设备,相当于硬盘了,IO设备如何拖累速度的,相信看了刚才的视频应该知道了……所以,强烈建议使用Class10以上级别的SD卡,像什么UHS-I(1)、UHS-II(3)什么的太贵就算了……u参考文档和资料链接:htt://www.ynq.io/htts://github.com/Xilinx/PYNQ/htts://ynq.readthedocs.io/en/latest/Ø最后给设计上提一点建议:nXC7Z020的PL部分真的很强势,但是PS部分ARMCortex-A9双核@866MHz确实是有一点鸡肋……,下一个档次就是XC7Z030,PS也就ARMCortex-A9双核@1GHz,Cost-Otimized也就止步于此了。在中高端才能见到Cortex-R53、Cortex-A53,Cortex-R5的设计。所以有没有可能提高一下ARM核心的性能?虽然Xilinx是FPGA厂商,但是估计市场还是有这方面的需求。ARM作为一种专用的IP核存在,提供比MicroBlaze更成熟的CPU调度,这方面没得说。但是也得跟进一下潮流,低端和性价比市场是不是可以考虑Cortex-A53了呢,毕竟ARM-v8a已经是主流了,Cortex-A9代表的ARM-v7时代很快就会成为过去时,真的非要对标CycloneVSoCs?好尴尬……n文档表述上有很多含糊的地方。也可能是英语转换的语义偏差。PYNQ-Z1还行,但是还是需要扩充一下。比如HDMI_OUT除了frame_raw()一个函数就没其他方法输出了吗?这个地方很迷惑……n从SD卡读写的速度上来看,还是推荐板载DRAM的同时可以板载eMMC/UFS,提高容量和读写速度,要不然视频播放十分尴尬nXilinx的目标还是很好的,PYNQ-Z1虽然没有完全Python化,但是还是实现了接近于树莓派的这种开发体验。但是,Linux没图形化界面还是很尴尬。估计也是和ARM不给力有一定关系,再加上本身Linux系统驱动的配置、相互之间的依赖和关联比较复杂,可能还需要一定时间。强烈建议使用稳定版的Ubuntu/Debian做开发,而且希望支持更多第三方的库……用惯了at-get的Linux老鸟的希望nVerilogHDL能不能变成PyHDL?我可拭目以待哦
    亮了(1) 383 2 03-25
  • 【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) 120 0 03-17
解决问题:39
干货热帖:116
会员总数:4127
总帖数:404
我要发帖

贡献榜

  • 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",非典型张江男一枚。致力于为有执着有梦想的志同道合者缔造一个可以互相勾搭的中文开源技术社区。