- 博客(36)
- 资源 (10)
- 问答 (1)
- 收藏
- 关注
转载 关于non-project模式的点滴记录1——别忘了创建工程
在non-project模式下,未指定器件时,Vivado将使用默认器件。这可能导致IP的器件和synth_design所指定的器件不一致。
2023-01-30 12:24:17
374
原创 Block Design内部BRAM控制器与外部BRAM的连接
在最近的一个设计中遇到了这样一个问题。我在Block Design中例化了XDMA,并通过interconnect连接了3个BRAM控制器,3个BRAM控制器的端口引出到Block Design外部。XDMA通过C2H接口对前两个RAM只进行读操作,通过C2H和H2C接口对第三个RAM进行读写操作。三个RAM都在Block Design外部(即HDL代码部分)例化。 验证时,前两个RAM的读数据正常,第三个RAM的读数据比对错误。由于个人疏忽,解决该问题花了四五个小时。首...
2022-05-13 17:18:21
1083
原创 TCL练习7:switch
TCL中switch有两种结构。 switch ?options? string pattern body ?pattern body ...? switch ?options? string {pattern body ?pattern body ...?}第一种和第二种之间的差别仅仅是一对大括号。正是由于这个区别,应用是要特别注意,否则程序无法输出正确结果。第一次使用switch时我写了下面这段程序。 switch $cmd { $::CMD_REPEAT..
2021-04-22 00:31:09
1633
原创 TCL练习6:通过递归方法搜索文件夹并返回指定后缀文件(包含子目录)
写这个TCL脚本的主要目的是搜索目标文件夹及其子文件夹下的所有文件,然后记录在指定的文件中。可以指定目标文件夹名称、信息记录位置和文件后缀等3种参数。该脚本将用于Vivado的non-project编译过程,被综合和布线脚本调用。define.tcl中定义了目标文件夹名称、信息记录位置、文件后缀类型、器件part等信息。findAllFiles.tcl脚本根据define.tcl中的参数搜索目标文件夹,当文件后缀类型参数(ext)为.hdl时,会搜索.v、.vh、.vhd、.sv等文件的路径和名称,
2021-04-13 14:41:42
3599
1
原创 TCL练习5:string、变量$的使用以及转义符何时发挥作用
目录练习string用法说明string compare ?-nocase? ?-length n? string1 string2string equal ?-nocase? ?-length n? string1 string2string first string1 string2 ?startindex?string index string charIndexstring last string1 string2 ?startinde...
2021-04-08 22:14:16
3233
原创 TCL练习4:递归和return
练习递归实现阶乘计算以及return的使用方法。proc recurrence { n } { if { ![string is integer $n] } { return -code error "This is not an integer!" } if { $n<=2 } { return $n } else { set val [expr $n*[recurrence [expr $n-1]]]
2021-04-07 10:51:43
1793
原创 TCL练习2:文件I/O
练习进行文件操作,包括打开文件、创建文件、读写文件等。set path [pwd]/Desktop/FileIO/set name "dont_touch.xdc"set newName "dont_touch_new.xdc"set optr "r"set optw "w+"set rdFile ""set retval [eval catch {{set fdr [eval open [append rdFile $path $name] $optr]}} msg]if { $re
2021-04-06 16:05:39
568
原创 TCL练习3:append、lappend
append将多个变元按顺序组合起来,并形成一个新的字符串。lappend将多个变元按顺序组合起来,形成一个新的List。set myCurrentLogVar1 ""set myCurrentLogVar2 ""set script1 { puts "logging now" lappend myCurrentLogVar1 "Say: "}set script2 { puts "logging out" append myCurrentLogVar2
2021-04-06 09:56:39
5572
原创 TCL练习1:open、eval和proc
简单使用open、eval和proc。open可用于打开、创建文件。eval带一个或多个变元,可以由一个或多个命令组成,eval采用concat命令的风格连接所有变元,执行命令并且返回执行结果。proc可以创建一个过程,以便在程序其他地方重复调用。proc create_report { reportName command } { set status "." append status $reportName ".fail" if { ![file exists $stat
2021-04-06 09:54:55
3354
原创 JESD204B SUBCLASS1确定性延时参数的计算
目录1. 时序参数1.1 ADC1.2 FPGA2. 延时计算2.1 计算延时所需的LMFC周期数前几天又重新复习了以下通过JESD204B SUBCLASS1实现确定性延时的过程。以前对部分参数的计算过程不甚理解,这次算是搞清楚了。学习JESD204B的时候阅读的是“Serial Interface for Data Converters” JESD204B的JULY 2011版本。该文档毕竟是一个标准文件,实现过程写的比较粗略,而且是指导性的,在实际工程实现过程中作用有限。当
2021-01-26 15:25:25
4486
原创 SystemVerilog/Verilog的testbench中文件的写入和读取操作
在Testbench中很可能需要文件的读写操作,在可综合的设计中也可能会用到文件写入。SystemVerilog/Verilog提供的文件写入读取方法并不多,主要有两类。第一类是writememb/writememh/readmemb/readmemh,第二类是$fscanf/$fwrite。第一类用法简单,但是功能弱,文件读取也不支持多维数组;第二类用法复杂一点,功能相对强大,配合循环语句可以处理多维数组。1. writemem[b|h]/readmem[b|h]writemem[b|h]主要
2021-01-11 23:34:24
20787
原创 同样的FIFO,不同的Data Order
在使用Xilinx FPGA时常用的两种FIFO例化方法包括使用IP Catalog和使用XPM。两种方法各有优缺点,个人更倾向于使用XPM的方式。使用这种方式可以非常方便的传递参数,修改设计时不像IP Catalog生成的FIFO那样繁琐。当FIFO的WRITE_WIDTH和READ_WIDTH相同时,两者使用时没有任何不同。但是当FIFO的输入输出端口位宽为非对称时,两者具有非常显著的区别,使用时要格外注意。以WRITE_WIDTH : READ_WIDTH = 1 : 4为例,向IP Cata
2021-01-09 21:43:44
491
1
原创 Spinal HDL学习资源
最近开始接触SpinalHDL,所以收集了一些不错的学习资源,可供大家参考。SpinalHDL是基于Scala语言开发的设计语言,使用SpinalHDL需要对Scala有一定了解。下面的两篇博文非常全面而又简洁的介绍了Scala,对上手非常有帮助。https://vvviy.github.io/2018/12/01/Learning-Chisel-and-Scala-Part-I/https://vvviy.github.io/2018/12/12/Learning-Chisel-and-Sca
2020-12-24 16:02:19
2874
1
原创 Systemverilog中的iff事件控制
使用systemverilog已经有一段时间了,主要是其中的部分新特性能够简化代码的编写,比如interface、支持多维端口等。为了进一步深入学习systemverilog,最近抽空更广泛的学习了一些systemverilog的内容。本文记录一下Systemverilog中的事件控制和sequence控制相关内容的学习情况。1. 事件控制1.1 iffSystemverilog在@事件控制中添加了iff修饰词,只有当iff后的条件为真时,@事件才会触发。注意,iff可以在always和alwa
2020-12-14 10:59:09
13657
3
原创 48bits进位选择补码加法器的两种实现方法的性能对比
本文使用进位选择的结构实现补码加法器,并且对比了使用内部逻辑实现和使用专用DSP单元实现时的性能差别。当然Xilinx FPGA中的DSP单元可以直接实现48位的运算,本文主要目的是验证进位选择结构加法器的实现和性能对比,这种结构可以运用到更大位宽的加法中。...
2020-06-14 22:28:14
753
原创 在Verilog/SystemVerilog中使用fork/join的注意事项
fork/join是Verilog中常用的语句。该语法在SystemVerilog中添加了join_any和join_none两个关键字,使fork的行为发生了变化。本文将比较全面的介绍fork的用法,其中不使用join_any和join_none关键字的时候,其用法和Verilog中一致。1. fork块中的begin/end块 在fork块中,begin和end之间的语句会顺序执行,如果没有begin和end,则各条语句会并发执行。看下面的例子。在fork块中有A、B两个任务,由于...
2020-06-08 18:25:44
12972
原创 正则表达式在Vivado约束文件(xdc)中的应用
使用xdc文件进行管脚、位置、时序和属性等约束的时候,经常会使用各种get命令。Vivado提供了很丰富的匹配表达式,比如等于==、不等于!=、匹配=~、不匹配!~、<、>、<=、>=等等,这些表达式可以通过&&和||进行组合;同时还有大量的状态、属性和单元名称可用,比如DIRECTION、IN、IS_LOC_FIXED、IS_PRIMITIVE、NAME等等。 我在xdc文件中匹配目标的时候,在可行的情况下更倾向于使用正则表达式。本文就介绍一下我常...
2020-05-29 23:00:25
2534
原创 如何读FPGA工程的编译报告?
1. 一定要逐条阅读编译报告 规模稍微大一点的FPGA工程的警告和critical warning动辄两三千条,虽然其中包含大量的“无威胁”警告和重复警告,但是我觉得至少95%的程序隐患和设计问题都可以从这些报告中找到蛛丝马迹。 工作中有不少人问过我这些问题:这么多警告怎么看的过来呀?这个警告、还有那个到底是什么意思啊?这个警告我该怎么去掉?........我能够理解问出这些问题的人的心情,因为我当初也被这些警告吓懵了,也退缩了一段时间。但是我不能够理解的是,为什么春天问过我,到了秋天还...
2020-05-24 21:15:20
3751
原创 第四章(2):通过SYSREF实现确定性延时(subclass 1)
2.通过SYSREF实现确定性延时(subclass 1) subclass 1主要通过SYSREF信号实现TX和RX设备之间LMFC的对齐,SYSREF信号必须被分配到所有的转换设备和逻辑设备。 通过使用高准确度的device clock和SYSREF信号,可以最小化延时的不确定度。规范强烈建议所有TX和RX设备的SYSREF信号都来自于同一个芯片。关于SYSREF和本地时钟的性能要求和调整能力在前面的文章中已经描述过了。 由于SYSREF有多种格式,比如周期的、单脉冲和多...
2020-05-19 11:48:33
6173
原创 第四章(1):确定性延时介绍
1. 简介 在JESD204系统中可能存在多个数据处理单元,这些单元分布在不同的时钟域,没有明确的延时关系。从而导致每次上电后、或重新建立连接后,各link之间的延时都可能不同。为了解决上述问题,JESD204B提供了两种途径,即SUBCLASS1和SUBCLASS2。 确定性延时是指:从TX端的基于帧的数据输入开始,到RX端接收并输出帧数据为止的延时,在每次上电后、或重新建立连接后都是一致的。该延时都是以frame clock为单位进行衡量的。规范要求该确定性延时是可编程的,其调整分辨...
2020-05-18 00:29:09
3950
1
原创 Verilog应用浅见之一——关于代码风格
我应该算是一个硬件工程师,涉及比较底层的技术。从原理图上放电阻,到设计PCB和写PCB设计任务书,到焊接调试电路板,再到写设备驱动,写FPGA程序,写各类文档,写项目申请书,所有的事情都干过。使用Verilog也有一些年头了,虽然只占整个工作的一部分,但是相对于其他事情,写Verilog程序、仿真和在FPGA中跑起来应该是我更喜欢做的事情。在这个过程中也积累了不少经验,有了一些个人的见解。...
2020-05-02 21:44:14
1487
原创 第二章(2):时钟与同步接口
4. SYSREF信号 在使用subclass1,且需要确定性延时的系统中,SYSREF信号应该接入到每个设备。每个设备都使用SYSREF信号来识别一个device clock的边沿,所有LMFC和frame clock都和该边沿对齐。由于LMFC和frame clock通常和character clock对齐,所以在调整LMFC和frame clock相位的同时,也应该调整charac...
2020-04-27 22:09:53
4411
原创 第二章(1):时钟与同步接口
1. Device Clock Device clock是JESD204系统中每个单元的时间参考。每个设备需要通过该时钟产生frame clock和multiframe clock。2. Frame clock和Local Multiframe Clock Frame clock时钟域作用于应用层和JESD204的链路层。 对于需要实现确定性延时的应用,或者使用多...
2020-04-25 21:01:34
3358
原创 第一章:JESD204概述
第一章:JESD204概述1. JESD204版本 JESD204接口是一种新的,用于连接逻辑器件和AD/DA转换器的串行接口,他有多个版本。 原始版本中,每个CONVERTER设备支持1个link,每个link一个lane。 版本A中,每个CONVERTER设备的串行接口可以包含一个或者多个lane,所有并行运行的,且使用相同数据格式的设备可以同步运行。 ...
2020-04-25 10:39:54
2838
原创 慎用systemverilog的语法新特性——“++”、“--”等操作符
SystemVerilog相对于Verilog添加了很多新特性,比如使用起来非常方便的累加++或递减--操作符。有这么好的变化,再也不用傻傻的写cnt <= cnt + 1了。在一个新项目中毫不犹豫的用了起来。always_ff @ (posedge clk) begin if( rst ) cnt <= 4'h0; else if( wr_tran...
2020-04-20 11:10:32
1757
原创 阻塞/非阻塞——纸上得来终觉浅,绝知此事要躬行
阻塞赋值和非阻塞赋值在可综合的代码中不需要严格的区分,但是在仿真文件中就尤为重要。阻塞赋值是指,只有当前赋值操作完成之后,后面的赋值操作才会发生;非阻塞赋值是指,当前块中的所有赋值操作完成后再计算各个变量的值,后续的赋值操作会覆盖之前的值。举个例子。 a、b和c的值分别为a=1, b=2, c=3。 a=b; a=c; b=a; 以上操作后...
2020-04-18 22:09:02
286
1
原创 变量拼接中遇到的奇怪问题——使用运算符导致实际位宽与期望位宽不符
以下方式是仿真中常常用到的数据拼接定义方式。 data = {`TC'h01,`FIX'h0, `FINE'h0, `COARSE'h01}; 其中TC/FIX/FINE/COARSE是通过`define定义的。在我最近的项目中,有一个变量需要拆分,我使用了下面的定义方式。 data = {`TC'h01, `CMP_MODE/2'h0, `FIX'h0, `...
2020-04-18 17:31:57
479
原创 ISERDESE3新变化——对小众应用不再友好的FPGA
现在FPGA在人工智能、机器学习、大数据、异构计算等方面应用广、发展势头猛,当然也更赚钱,毕竟是未来的发展方向,也能卖的上量。相比当下红红火火的应用,传统领域就显得可怜巴巴了。一些以前在小众应用中很有用的设计,随着器件的升级逐渐被舍弃掉了。在我以前的应用中常使用IDELAY、ISERDES、OSERDES等,主要用于源同步数据传输和高速采样。在7系列器件中,ISERDESE2有一个O端口,被称...
2020-03-13 21:54:37
3541
2
原创 JESD204接口应用笔记——时钟
近期有个新项目接触了JESD204B接口。总体来说,这东西非常好用,也挺简单。使用过程中在时钟配置方面遇到一点小问题,顺便记录一下。
2020-03-02 23:47:00
5497
3
原创 Xilinx文档编号及其内容索引
Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文档,及其主要内容。如果有新的会随时补录进来。以下按照个人理解对文档进行了分类,不一定恰当,也会有重叠的情况,欢迎提出意见。器件概述7系列器件ds180:7系列器件概述,介绍不同器件的资源、...
2020-02-29 21:18:53
5614
5
原创 RAM的多种例化和初始化方法
目录RAM的例化RAM的初始化IP Catalog例化的RAM的初始化自定义数组和XPM RAM的初始化初始化数据的可读性本文所述的内容均以使用Xilinx器件为前提,不需要进行修改,或者做出少量修改就可以在Altera器件上应用。RAM的例化我常使用的例化方法主要有三种。使用IP Catalog例化 通过代码让编译器推断出RAM 调用原语上述方法各...
2020-02-28 14:39:41
6273
原创 使用BRAM实现数据延迟
目录为何使用BRAM实现延时实现与仿真为何使用BRAM实现延时在一些设计中需要对数据进行多个周期的延时。延时方法有多种,比如使用SLICEM生成移位寄存器,或者使用FF。但是对于大位宽、深延时的数据,使用上述方法会消耗过多资源,功耗也较大。此时使用BRAM进行延时将是更优的选择。实现与仿真...
2020-02-26 23:58:55
2325
在FPGA上使用SystemVerilog实现12小时制时钟(可实现24小时制)
2020-06-16
CarrySelAdder.rar
2020-06-14
General.rar
2020-05-19
UG912 Vivado Design Suite Properties Reference Guide笔记
2020-04-22
UG905 Notes.docx
2020-04-22
UG903 Notes(有关于DDR约束和位置约束).docx
2020-04-22
FPGA封装及内部电路时序参数分析.docx
2020-04-22
请问有没有windows系统函数用于提高pcie中断的优先级
2016-01-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人