FPGA
文章平均质量分 64
张海军2013
这个作者很懒,什么都没留下…
展开
-
FPGA问答系列--Block RAM的资源如何计算?
比如一个512*19的空间,刚好可以使用512x36的原语来覆盖,那就只会占用一个18k BRAM,如果是群友的960bitx16bit,那么需要960/72=13.333,因此需要13个256x72的RAM36,剩下的空间由1个RAM18即可满足。A:首先要知道什么是BRAM,就是Block RAM,这些RAM就是分块的,可以当成36kb来使用,也可以当成18kb来使用,如果使用空间小于18kb,也会占用一整个18kb的BRAM。而且还要看使用的位宽和深度,这两个指标综合考虑来计算使用的BRAM的个数。原创 2024-05-03 22:02:40 · 437 阅读 · 0 评论 -
芯片开发中最常用的Makefile语法和功能
添加这的目的主要是避免免命令与目录下的文件名重复,如果目录下有个clean的文件,我们再执行make clean,Make工具会认为clean没有依赖文件,所以不会执行make clean,加上.PHONY后就可以避免这种情况。可以看到,later_variable是在后面定义的,因此one被应用时,才会被赋值later,而two是一开始就被赋值了,而此时later_variable还没有被赋值,因此,two中引用的later_variable是空的。而i变量没有在Makefile中定义,因此转化成了空。原创 2024-05-03 15:53:01 · 1050 阅读 · 0 评论 -
FPGA时序优化之Reduce MUXF Mapping
在Ultrascale系列的FPGA中,MUXF*是指MUXF7,MUXF8和MUXF9,需要注意的是:他们不是7选1,8选1和9选1的MUX,具体解释如下图:MUXF7有F7MUX_AB、F7MUX_CD、F7MUX_EF、F7MUX_GH这4个,每个MUXF7均可以与其后面的2个相邻的LUT构成一个8:1 MUX;MUXF8有F8MUX_BOT和F8MUX_TOP,每个MUXF8均可以与其后面的邻近2个F7MUX以及后面的邻近4个LUT构成一个MUX16_1;原创 2024-03-31 21:44:19 · 1012 阅读 · 0 评论 -
lwip代码分析
lwIP(Lightweight IP)是一个为嵌入式系统设计的轻量级TCP/IP协议栈。它旨在为资源受限的环境提供完整的网络协议功能,同时保持低内存使用和代码大小。由于其模块化的设计,开发者可以根据需要选择包含或排除特定功能,以满足特定应用的资源要求。Xilinx的lwIP是基于开源lwIP TCP/IP协议栈的一个适应版本,专门为Xilinx的硬件平台,如Zynq-7000和MicroBlaze,进行了优化和集成。原创 2023-10-29 15:16:08 · 947 阅读 · 0 评论 -
vitis如何更新xsa?
再refresh application project,然后build。把platform_project clean一下,然后重新build。在platform_project选择。欢迎关注公众号:傅里叶的猫。选择对应的xsa文件。原创 2023-08-13 22:19:37 · 1275 阅读 · 1 评论 -
Xilinx AXI VIP使用教程
AXI接口虽然经常使用,很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP,可以当做AXI的master、pass through和slave,本次内容我们看下AXI VIP当作master时如何使用。仿真代码放到文章末尾,代码中中导入的axi_demo_axi_vip_0_0_pkg,就是下面axi vip的component_name再加上后缀。可以看到,我们一开始向地址0xc0001000写入0x12345678,又发起一次读操作,可以将该数据读出。原创 2023-07-26 21:44:41 · 1766 阅读 · 0 评论 -
FPGA问答系列--clock skew是影响时序收敛吗?
如下图所示,图中左侧为建立时间时序报告,可以看到Clock Uncertainty,而右侧为保持时间时序报告,是没有Clock Uncertainty。A:这跟锯齿波的频谱有很大关系,如果我们画一下锯齿波的频谱,会发现它的频谱是很宽的,不像正弦波是单一的频点,所以当锯齿波信号带宽超过DAC的带宽时,输出的信号就会被削弱。的问题,并汇总成文章,如果问题多的话就每周整理一期,如果问题少就每两周整理一期,一方面是希望能帮到不经常看群消息的小伙伴,另一方面也算是我们的技术积累。Q:有什么好用的时序绘图工具?原创 2023-06-11 18:10:01 · 764 阅读 · 0 评论 -
FPGA问答系列--Vivado Schematic中的实线和虚线有什么区别?
如果在schematic中观察这两个图的差别,就很容易看出,显示虚线是因为这个net还连到了其他地方,但并没有在当前的schematic中显示出来,而实线则表示该net并未连接到其他地方,该schematic已经显示出了这个net的全部连接。A:在查时序报告时,很多工程师都希望能直接定位到源码处,此时我们可以打开时序违例处的schematic中的cell,然后右键,就可以直接跳转了。原创 2023-06-04 16:36:55 · 1013 阅读 · 0 评论 -
set_input_delay如何使用?
FPGA时序约束之set_input_delay原创 2022-09-06 20:55:37 · 4644 阅读 · 1 评论 -
FPGA中BEL Site Tile FSR SLR分别指什么?
在Xilinx FPGA中,从底层到整个设备可以划分为6个层次:BELSiteTileFSRSLRDevice下面我们从下到上依次来看一下各个定义。BEL(Basic Element of Logic) BEL是最底层的基本元素,也可以叫atomic unit(原子单位),BEL是FPGA中最小、不可分割的组件。BEL有两种:Logic BEL和Routing BEL。像我们常说的LUT、FF、CARRY都属于Logic BEL,Routing BEL我们平时不常说,很多工程师可原创 2022-02-17 20:28:50 · 3368 阅读 · 0 评论 -
vivado如何快速找到schematic中的object
在Vivado中,可能由于某些逻辑输入悬空而导致Implementation的opt_design时会错,比如:报的错误是dac_spi_i0/bit_cnt[4]_i_4的这个LUT有个输入悬空了,这个工程的逻辑比较简单,例化的嵌套也比较少,因此在schematic一层层找也很容易可以找到,但如果工程比较复杂,在很内部的一个LUT的输入悬空了,找起来就很费劲了。 笔者碰到的问题是在vivado的axi-interconnect ip中报了这个错误,而且是ip内部套了好几层的地方,如果再一层层往原创 2022-02-13 16:06:57 · 1763 阅读 · 2 评论 -
Xilinx FPGA中HP HR HD bank分别是什么用途
在开发FPGA绑定管脚时,经常会看到HP Bank、HR Bank和HD Bank,它们分别是什么意思?分别可以适用于哪些应用个? 首先我们要明确一点,这几个概念都是在7系列之后才有的,其中7系列的FPGA中有HP Bank和HR Bank,UltraScale FPGA有HP Bank、HR Bank和HD Bank,但并不是一个FPGA中会同时包含HP/HR/HD Bank。HP:High PerformanceHR:High RangeHD:High Density HP原创 2022-02-08 20:35:43 · 4089 阅读 · 0 评论 -
false path和asynchronous的区别
在FPGA的开发中,对于两个异步时钟,如果我们可以在RTL的设计中保证这两个时钟域之间的处理都是正确的,那就可以让工具不分析这两个时钟域之间的交互。如果不设置的话,Vivado默认都会分析的,这样会大大增加Implementation的时间。 常用的不让工具分析两个时钟域交互的方式有两种,一种是设置为伪路径(False Path),一种是设置为异步(Asynchronous)。那这两种设置方式有什么区别呢?(假设工程中有两个异步时钟clka和clkb)伪路径的设置是单向的,而异步时钟的约束是双向原创 2021-11-12 00:27:00 · 1950 阅读 · 1 评论 -
Xilinx FPGA的DNA是什么?
对于Xilinx的FPGA,每一片都有一个专门的ID,就像我们的身份证号一样,每个都不一样,Xilinx也形象的把这个ID叫做DNA。7系列以及之前FPGA的DNA有57bit,Ultrascale FPGA的DNA有96bit,Zynq Ultrascale+的FPGA有两个DNA,PL端一个,PS端也有一个。DNA都是只读的,我们不可以修改。 有两种方法可以读到这个DNA的值,一种是连上JTAG后,可以直接看到FPGA的DNA信息,以K7为例: 第二种方法就是通过例化DNA_PORT模原创 2021-11-10 13:30:51 · 2987 阅读 · 0 评论 -
Xilinx Ethernet MAC IP调试的小坑
本篇文章要写的是调试Xilinx网络IP时踩到的一个坑,也是控制PHY芯片时的一个坑,板卡上的PHY芯片是非常经典的88E1111,使用MDIO接口控制。 本身MDIO接口的时序也不是很难,非常类似I2C接口,内部寄存器的读写控制都是通过MDIO接口来实现。在MDIO的协议中,有一个PHY ADDR,这个是由PHY芯片的硬件决定的。Xilinx的IP也提供了mdio接口,我们可以直接通过配置IP内部寄存器来实现MDIO接口的配置。在IP Core的内部设置中,有一个MDIO PHY ADDR原创 2021-11-01 22:13:27 · 3443 阅读 · 0 评论 -
管脚约束问题导致生成bit时报错 如何在不重新Implentation情况下生成bit?
在FPGA开发中,我们经常遇到因为管脚忘记约束,导致最后生成bit的时候报错1.管脚电平未约束 像上面这个图中,由于在约束中忘记指定mdc和mdio的电平,再经过了长时间的综合和实现后,最后的Generate Bitstream报错了。 这种情况下,如何才能不重新Implementation的情况下生成bit呢?打开实现后的routed.dcp文件:如果不知道routed.dcp为何物,请参考之前的文章:Vivado的Implementation都包含哪些步骤?open_checkpo原创 2021-10-18 20:19:57 · 1128 阅读 · 0 评论 -
Vivado ECO实例教程一 增加LUT(GUI操作)
什么是ECO?ECO 指的是Engineering Change Order,即工程变更指令。目的是为了在设计的后期,快速灵活地做小范围修改,从而尽可能的保持已经验证的功能和时序。ECO 的叫法算是从IC 设计领域继承而来,其应用在FPGA设计上尚属首次,但这种做法其实在以往的FPGA 设计上已被广泛采用。 ECO在一些大的工程中是比较实用的,比如工程编好后,想将一个已有的信号连接到FPGA端口上观察,或者想增加Debug信号、修改寄存器初始值等,都可以直接对route之后的dcp进行修改,而不需要原创 2021-09-30 09:19:16 · 2127 阅读 · 0 评论 -
Vivado的Implementation都包含哪些步骤?
Vivado的Implementation主要有三大步:opt_design,会生成opt_desgin.dcpplace_design,会生成place_design.dcproute_design,会生成route_design.dcp如果再详细一点:opt_design在这一步,Vivado会对综合后的网表文件做一些优化,删除一些无用的或者Vivado认为可以冗余的逻辑,但如果代码中使用了DONT_TOUCH 和MARK_DEBUG,在此步骤就不会被优化掉。power_opt原创 2021-09-08 12:47:28 · 4436 阅读 · 2 评论 -
Vivado IP中的Shared Logic到底是干嘛的?
在很多Vivado的高速接口的IP中,比如Ethernet、PCIe、SRIO的设置中,都会有个Shared Logic的页面:可能很多同学并没有很关注这个页面,直接默认设置就完事了。 但其实这个页面的内容也是非常有用的,我们可以看到页面中有两个选择:Include Shared Logic in coreInclude Shared logic in example design首先,什么是Shared Logic?字面意思很好理解,就是共享逻辑,主要包括时钟、复位等逻辑。当选择Sh原创 2021-09-08 09:29:11 · 1600 阅读 · 2 评论 -
GTX/GTH/GTY/GTP/GTZ/GTM有什么区别?
首先需要明确的一点是,他们都是高速收发器,只是传输速率同,速率大小为:GTP < GPX < GTH < GTZ < GTY < GTM 不同芯片上使用的高速收发器也不同,而且同样是GTX,不同系列芯片上的速率也可能不同。 比如7系列的FPGA,GTP最高可以达到6.6Gb/s,GTX最高12.5Gb/s,GTH最高13.1Gb/s,GTZ最高28.05Gb/s下面几个表展示了7系列FPGA中高速收发器的使用情况:在A7上面使用的高速收发器是GTP:在K原创 2021-09-08 09:28:02 · 4494 阅读 · 0 评论 -
导出ILA数据到Python
导出ILA数据在空白处右键,选择Export ILA Data导出csv格式的文件,并选择文件路径和文件名:上面两步也可以使用tcl脚本代替:write_hw_ila_data -csv_file {C:\usr\zhj\ila\iladata.csv} hw_ila_data_1导出后的文件如下图所示,第一行是标题,有Sample in Buffer、Sample in Window、TRIGGER,后面就是我们采的信号的名称,但这个信号名称是包含例化的层级结构名字的。处理十进制.原创 2021-08-20 18:13:22 · 1387 阅读 · 0 评论 -
D触发器都有哪几种类型?对应什么样的代码?
今天我们来研究一下D触发器都有哪几种类型?又对应什么样的代码? 在Xilinx的FPGA中,D触发器是下面这个样子:其中,D是数据输入端口,CE是使能端口,CLK是时钟输入,SR是Set/Reset的意思,可用作置位或者复位,置位和复位又分同步和异步,因此D触发器有如下四种应用类型:异步复位(FDCE)异步置位(FDPE)同步复位(FDRE)同步置位(FDSE) 在Vivado的Language Templates中我们也可以看到,D触发器有下面四种类型:那这四种触发器都对应原创 2021-08-19 14:18:41 · 3657 阅读 · 0 评论 -
DDR突然初始化失败 Debug记录
背景:板卡用的一直好好的,硬件没有什么问题,DDR跑在2400M,也一直正常工作。但最近有个工程中,需要增加SRIO接口,SRIO接收的数据需要先过DDR,工程编完下载bit后,偶尔会提示DDR初始化失败:分析如下:板卡用了很久,DDR一直没出现过初始化失败的问题,说明硬件应该没有问题;DDR IP中提示时序有问题,本工程中带有PCIe模块,PCIe的IP中也提示时序问题,其它地方没有时序问题;首先想到的是在保证DDR吞吐速率满足系统要求下,降低DDR的主频,由2400M降到1600M,虽然原创 2021-08-10 15:23:00 · 4851 阅读 · 1 评论 -
System Generator 教程
System Generator & Vivado HLS数字信号处理教程(暨FPGA高级数字信号处理教程)已经发布,包含如下内容可能有同学会有疑问,FPGA数字信号处理的教程网上有很多,为什么还要再出一个?当然是我们不一样,而且我们的教程更加系统性和实用性。目前市面上绝大多数的教程都是在讲Vivado中的数字信号处理相关的IP的应用,而我们本次教程使用的工具是System Generator和HLS,其中System Generator中的IP跟Vivado中的IP用法很像,但用Sys原创 2020-12-05 11:49:56 · 2120 阅读 · 0 评论 -
Vivado HLS教程整理(一)任意精度数据类型
本文整理自高亚军老师的Vivado HLS视频教程,完整的笔记在公众号“Quant_Times"中回复”HLS“即可获取。System Generator & HLS数字信号处理教程暨FPGA高级数字信号处理教程:System Generator & HLS数字信号处理教程1. HLS新的数据类型C/C++数据类型:其中HLS中不支持char16_t和char32_t两种数据类型。在C/C++中,所有的数据位宽都是基于8-bit,即位宽都是8-bit的倍数,当在逻辑中使用时,会明原创 2020-11-14 22:45:33 · 1588 阅读 · 0 评论 -
Hold Time违例,该如何解决
首先,我们要知道的是,Hold Time违例,是因为时钟绕的太远,到达时间太晚。而且综合之后给出的时序报告都是估计值,因此综合之后可以不考虑Hold Time,只考虑Setup Time;即便此时Hold Time违例,我们也不需要去理会。在Place Design之后再去看Hold Time,如果此时Hold Time的违例比较小(比如-0.05ns),还是不需要理会的,因为工具在布线时会修复Hold,但如果Slack太大了,无法修复了,就会牺牲setup来弥补hold。这里补充一下综合实现的步骤:原创 2020-08-12 18:28:14 · 7002 阅读 · 2 评论 -
Vivado时序收敛技术(二) 时序违例的根本原因及解决方法
本文整理自Xilinx公开课:Vivado时序收敛技术。有些知识在公开课中讲的并不是很细,因此我又对齐进行了整理,分为了几篇文章。有很多内容也在我的时序约束课程中讲到过,都是免费课程,大家可以在我的知乎专栏上找到。FPGA Times如果出现了时序违例,我们会关注两点:为什么会出现时序违例?如何解决?首先我们要搞清楚时序是在哪个阶段违例:在综合阶段或者post opt阶段出现了时序违例,那么很有可能的原因如下:添加的时序约束没有生效约束过于严苛综合选项设置不正确电路设计中延原创 2020-08-11 09:40:55 · 6226 阅读 · 0 评论 -
Vivado时序收敛技术(一) Baseline基础理论
本文整理自Xilinx公开课:Vivado时序收敛技术。有些知识在公开课中讲的并不是很细,因此我又对齐进行了整理,分为了几篇文章。有很多内容也在我的时序约束课程中讲到过,都是免费课程,大家可以在我的知乎专栏上找到。FPGA Times如何知道该约束哪些时钟? 使用report_clock_networks指令或使用约束向导来查看有哪些主时钟需要约束和输入的主时钟是否被约束。report_clock_networks -name primaryClock如何检查时钟的约束? 使原创 2020-08-10 17:29:10 · 1311 阅读 · 0 评论 -
使用SystemVerilog简化FPGA中的接口
FPGA工程师们应该都会吐槽Verilog的语法,相当的不友好,尤其是对于有很多接口的模块,像AXI4/AXI-Lite这种常用的总线接口,动不动就好几十根线,写起来是相当费劲。 当然现在Xilinx推荐使用纯bd文件的方式来设计FPGA,这样HDL代码就会少了很多。但我们大多数的工程还是无法避免使用HDL来连接两个module。所以本文就推荐使用SystemVerilog来简化FPGA中接口的连接方式。 也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具原创 2020-07-20 23:50:25 · 735 阅读 · 2 评论 -
Xilinx FPGA Partial Reconfiguration 部分重配置 详细教程
Partial Reconfiguration(部分重配置)在现在的FPGA应用中越来越常见,我们这次的教程以Project模式为例来说明部分重配置的操作过程。 这里我们使用的Vivado版本是2017.2,使用的例程是Vivado自带的wavegen工程,并在工程中增加一个计数器模块,如下图所示这个模块的代码也很简单,就是加1计数module count_add( input clk, input rst, output reg [7:0]原创 2020-06-11 18:07:49 · 7911 阅读 · 5 评论 -
Vivado中jobs和threads的区别?选择多个jobs能加快实现速度么?
在用Vivado对工程编译时,会弹出下面的对话框:备注:虽然FPGA不能叫编译,但很多工程师为了方便起见,将综合+实现+生成bit文件的过程统称为编译了,这种说法大家理解就好。很多工程师都会选择多个jobs进行编译,以为这样会更快一些,而且这个jobs的数量跟本地CPU的线程数是一致的,这就更加让工程师们认为这个选项就是多线程编译了。 但对Vivado更加熟悉的工程师,肯定会知道...原创 2020-04-26 13:12:35 · 2487 阅读 · 4 评论 -
Vivado中模块封装成edif和dcp
我们完成Vivado的工程后,大部分情况不能把整个工程的源代码都直接给客户或者其他工程师,需要我们先进行一些封装后再给他们,就像软件代码中会编译成dll后再Release给别人。 在Vivado中,常用的三种封装形式有三种:IPedifdcp这三种封装形式在使用上都是相似的,都是我们只提供模块的接口让用户去调用。 这篇文章我们讲一下封装成edif和dcp的步骤、区别、注意事...原创 2020-03-01 16:13:09 · 8670 阅读 · 5 评论 -
FPGA中除法是怎么实现的?
在FPGA中,我们怎么实现除法操作?最简单的方法当然是调IP Core。 在Divider Generator的IP Core中,我们可以选择有/无符号数进行除法,还可以选择除法的延迟。当然,延迟越小,占用的资源就越多。 虽然有IP可以直接调用,但我们还是要了解FPGA中除法的原理,手动来写一个除法器。FPGA中除法原理 两个32的无符号整数除法,被除数a除以除...原创 2020-02-15 16:56:57 · 10710 阅读 · 0 评论 -
FPGA 中的有符号数乘法
FPGA中乘法器是很稀缺的资源,但也是我们做算法必不可少的资源。7系列及之前的FPGA都是25x18的DSP,UltraScale中是27x18,我们可以通过调IP Core的方式或者原语的方式来进行乘法操作。在里面可以设置有符号还是无符号数乘法。 当然,我们也可以直接使用*符合来进行乘法,对于无符号的乘法reg [7:0] ubyte_a;reg [7:0] ubyte_...原创 2020-01-31 15:39:46 · 5438 阅读 · 1 评论 -
14 FPGA时序约束之Tcl命令的对象及属性
Vivado时序约束中Tcl命令的对象及属性 在前面的章节中,我们用了很多Tcl的指令,但有些指令并没有把所有的参数多列出来解释,这一节,我们就把约束中的Tcl指令详细讲一下。我们前面讲到过get_pins和get_ports的区别,而且我们也用过get_cells、get_clocks和get_nets这几个指令,下面就通过一张图直观展现它们的区别。get_clocks后面的对象是...原创 2020-01-29 12:47:20 · 2957 阅读 · 1 评论 -
13 FPGA时序约束之Vivado辅助工具
时序约束辅助工具 上面我们讲的都是xdc文件的方式进行时序约束,Vivado中还提供了两种图形界面的方式,帮我们进行时序约束:时序约束编辑器(Edit Timing Constraints )和时序约束向导(Constraints Wizard)。两者都可以在综合或实现后的Design中打开。1. 时序约束编辑器 打开之后就可显示出我们之前做的所有约束,当然,还可以再添加、删除或修改时序...原创 2020-01-29 12:46:39 · 2205 阅读 · 0 评论 -
12 FPGA时序约束实战篇之多周期路径约束
多周期路径约束 多周期路径,我们一般按照以下4个步骤来约束:带有使能的数据 首先来看带有使能的数据,在本工程中的Tming Report中,也提示了同一个时钟域之间的几个路径建立时间不满足要求 其实这几个路径都是带有使能的路径,使能的周期为2倍的时钟周期,本来就应该在2个时钟周期内去判断时序收敛。因此,我们添加时序约束:set_multicycle_path 2 -set...原创 2020-01-29 12:45:50 · 3749 阅读 · 4 评论 -
11 FPGA时序约束实战篇之伪路径约束
伪路径约束 在不加伪路径的时序约束时,Timing Report会提示很多的error,其中就有跨时钟域的error。我们可以直接在上面右键,然后设置两个时钟的伪路径。这样会在xdc中自动生成如下约束:set_false_path -from [get_clocks -of_objects [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_...原创 2020-01-29 12:44:52 · 4015 阅读 · 1 评论 -
10 FPGA时序约束实战篇之延迟约束
延迟约束 对于延迟约束,相信很多同学是不怎么用的,主要可能就是不熟悉这个约束,也有的是嫌麻烦,因为有时还要计算PCB上的走线延迟导致的时间差。而且不加延迟约束,Vivado也只是在Timing Report中提示warning,并不会导致时序错误,这也会让很多同学误以为这个约束可有可无。 但其实这种想法是不对的,比如在很多ADC的设计中,输出的时钟的边沿刚好是数据的中心位置,而如果我...原创 2020-01-29 12:43:55 · 3829 阅读 · 1 评论 -
9 FPGA时序约束实战篇之衍生时钟约束
约束衍生时钟 系统中有4个衍生时钟,但其中有两个是MMCM输出的,不需要我们手动约束,因此我们只需要对clk_samp和spi_clk进行约束即可。约束如下:create_generated_clock -name clk_samp -source [get_pins clk_gen_i0/clk_core_i0/clk_tx] -divide_by 32 [get_pins clk_gen...原创 2020-01-29 12:42:43 · 4275 阅读 · 1 评论