FPGA 基础知识
文章平均质量分 86
FPGA基础知识部分,层层深入,对后期的提高、进阶有非常重要的意义
青青豌豆
豌豆FPGA & STM32开发板,谢绝白嫖
展开
-
数字信号处理基础知识(二)
再来看一个例子y(n) = x2 (n),还是用大家熟知的三角函数进行推算验证,假设x(n)用来描述一个频率f0等于1Hz的正弦波序列即x(n) = sin (2π*f0*n*ts) = sin (2π*1*n*ts),若x(n)是输入序列,则系统的输出序列y(n)是1Hz正弦波的平方,即y(n) = x2 (n) = sin (2π*1*n*ts)* sin (2π*1*n*ts)。图3 matlab绘制x1(n)、x2(n)、y(n) = -0.5*(x1(n)+x2(n))正弦采样图形。原创 2024-07-23 20:48:49 · 588 阅读 · 0 评论 -
数字信号处理基础知识(一)
序列的移位运算如图6所示,设有一序列 x(n),当m > 0时,x(n-m) 表示序列x(n)逐项依次右移m位后得到的序列,x(n+m)表示序列x(n)逐项依次左移m位后得到的序列,为了方便记忆即“左加右减”原则。对于序列x(n+1) = x(2) = 3,相对于x(n)左移了一位,相当于产生了超前。序列的反折运算如图7所示,也有的教科书中称为反褶,即设有序列x(n),则x(-n)是以n=0为纵轴将x(n)反折后的序列,这里需要特别强调的是在序列反折运算的前后x(0)的值要保持不变。图7 序列的反折运算。原创 2024-07-15 16:07:02 · 654 阅读 · 0 评论 -
FPGA数字信号处理前沿
最后想整理一个数字信号处理的软件框架供,具有较强的通用性供大家项目参考,为了还原整个软件的实施,硬件上正在去绘制一个接口插件板,板载AD9220的ADC芯片和相关运放调节电路、配有低端MCU的STM32F103CBT6芯片和编码器按键、一个OLED屏幕,直插到现有的豌豆开发板CMOS摄像头端子上,MCU和FPGA间串口TTL电平通信,用户通过按键编码器在OLED屏幕上设定FPGA驱动AD9708的DAC芯片输出不同频率叠加的波形,硬件上通过SMA端子连接到AD9220的ADC芯片。原创 2024-03-24 14:11:14 · 1198 阅读 · 1 评论 -
Vivado时序约束基础
首先时钟约束必须最早创建,对于7系列FPGA来说,端口进来的时钟和GT的输出RXCLK/TXCLK都必须用create_clock自主创建为主时钟,如果是差分输入的时钟,可以仅仅在差分对的P侧用get_ports获取端口,并使用create_clock创建。这就决定了XDC也具有Tcl命 令的特点,即后面输入的约束在有冲突的情况下会覆盖之前输入的约束。• XDC恰恰相反,ASIC世界的血缘背景决定了在其中,所有的时钟缺省视作全同步,在没有时序例外的情况下,工具会主动分析每一条跨时钟域的路径。原创 2023-06-04 22:34:05 · 2972 阅读 · 0 评论 -
FPGA 基础知识专栏后续预告
低档的项目可能SPI接口或者并口ADC等,数据采集以后需要一个系统FPGA做什么,ARM、DSP做什么,FPGA只是单纯做ADC采集还是需要后续FFT、FIR等数字信号处理,ARM和DSP需要做数字信号处理、还是收到FPGA做完的中间结果再带入校准表等进行ADC数据校准等,包括选不同的ADC接口需要的硬件支持是不同的,JESD204B接口需要GTX的支持,LVDS需要把FPGA一个BANK都做成1.8V电平,吞吐位宽也决定了板载DDR3内存颗粒的数量等等;原创 2023-01-31 16:31:16 · 2190 阅读 · 3 评论 -
FPGA代码设计规范一些探讨
可事实上却不是这样的,当项目复杂度越来越高,代码都需要经过多轮的审核等才能被应用在项目工程里,如果大家写得代码都非常复杂繁琐,那么后期带来重用的工作量是非常巨大的,也非常不容易理解当事人的想法,所以请大家编程的时候,尽量去使用常见的基本语法,也有利于工具的资源优化,对于复杂功能的模块理清楚逻辑,可以先用前面学习到的TimeGen绘制各个信号的波形图,分析明白后再动手编程,从而减少了语句之间的耦合带来程序设计上的二义性。请多去对需求分析,多去画设计图纸,前期增加方案时间,后期减少返工时间。原创 2022-11-05 18:23:32 · 3206 阅读 · 7 评论 -
Gvim计数器模板经典练习
这个练习结合上面的各个练习的思想,也算是比较复杂的一个了,大家可以试着写一写,找到一些写FPGA时序逻辑的感觉,当然这本身也是一个很好的模型,这里面涉及到了计数器嵌套,flag_add和flag_sel,en信号的接收,dout_vld和dout信号的处理等等,如果这个练习也能顺利地写出对应的Verilog程序,那么对于Gvim编辑器下计数器的模板就可以说已经大概掌握了,相比而言只是缺少后期的实战磨练,其中图7-23为练习6中各个信号的波形图,图7-24为练习6的代码设计。......原创 2022-08-30 17:45:55 · 2571 阅读 · 0 评论 -
安装TimeGen波形绘图软件
为了让大家更快上手TimeGen这个软件,在这里也简单的说明下几个勾选项的意思,IdealTransit代表勾选该选项,那么波形上升沿和下降沿都是理想化的方波;笔者也用过Visio和VSCode编辑工具中的DrawIO插件来绘制预期的波形时序逻辑图,但是说真的比较起来,TimeGen软件可以说就是为专门绘制FPGA时序波形而生的,因为它画图高效准确,简单容易上手,所以笔者把这款软件推荐给大家,这里简单为大家介绍一下这个绘图软件的使用方法,我们按照图4中的标号逐一介绍。1.绘制一个时钟clk信号波形;....原创 2022-07-31 13:40:34 · 6764 阅读 · 0 评论 -
关于FPGA底层资源的细节问题
这篇博客,我们来回归FPGA设计的最中心问题即对底层资源使用的细节性问题,在FPGA设计中经常会采用存储、计算,再存储、再计算等类似的设计理念,而这也会很好地映射在FPGA内部架构上,即映射在对应的存储单元Block RAM、可配置逻辑单元LUT、基本逻辑单元LATCH和FF、计算单元DSP48E1等,博客的最后将重点分析Xilinx 7系列的FPGA底层重要单元,从而印证底层资源对FPGA项目工程的系统性能起到决定性作用,帮助大家建立一个整体性的概念,这也将对未来的成长提高有着深远的意义。 下面原创 2022-07-03 10:12:19 · 3646 阅读 · 0 评论 -
Testbench编写详解
Testbench的编写说难也难,说易也易。之前有朋友私信留言谈到想系统学习下Testbench,今早五点早起写下这篇博客,算是一个Testbench编写专题的开场白吧,整个其实说到底透过现象看本质,不同于功能模块的编写,Testbench核心任务在于验证功能模块的设计是否符合预期,所以围绕着这个目标,为了更方便理解,笔者将其简单地归纳为3个步骤:1.对被测试功能模块的顶层接口进行信号例化;2.向被测试功能模块的输入接口添加激励;3.判断被测试功能模块的输出是否满足设计预期。所以说到这里...原创 2022-05-18 07:47:31 · 20614 阅读 · 6 评论 -
FPGA的几种经典模块划分架构
今天更新这篇博客主要介绍几种经典的模块划分架构,工作日下班更新博客言简意赅,这些也是在FPGA工程开发中常用到的,其广泛应用在FPGA对通信领域、高速接口、图像视频、数字信号、人工智能处理等多个方面,虽然应用场景在变换、实际需求在增加、项目工程在迭代,但是对于模块划分的理念和核心设计的思想依然是相通的,所以希望大家学习后得到更多的收获吧。一、直接交互架构 如图1所示,直接交互架构是最简单易行的模块划分架构,上游模块A直接把数据扔给下游模块B,下游模块B在对数据进行处理...原创 2022-05-10 22:08:48 · 5386 阅读 · 3 评论 -
FPGA之ROM详解,单口ROM的使用
单口ROM IP练习 在FPGA基础专题里,介绍过了FIFO、RAM、PLL等常用IP核的使用配置,这篇博客来介绍ROM IP核,ROM IP核类似RAM IP核有单口和双口之分,但是实际项目中多使用单口ROM,实际双口ROM使用也大同小异,我们做一个简单的仿真测试,来搞清楚单口ROM IP核的具体功能,实际上在前面大家也看到了BMG IP核有单口ROM和双口ROM两个配置选项,但是在项目工程中基本都去使用单口ROM而双口ROM很少用到,其实双口ROM的使用和单口ROM很类似,只不过多一个....原创 2022-05-01 10:01:37 · 8416 阅读 · 0 评论 -
FPGA之PLL详解
在前面的博客里详细介绍了FIFO、RAM两个常用的IP核,而这些IP核在FPGA当中应用非常广泛,很多书籍教程、培训机构也都会蜻蜓点水提起些,但往往不作为重点,而更偏重讲解例程的具体设计。笔者编写FPGA基础知识篇的初衷就是把FPGA学习路上细枝末节、模糊不清的知识点尽力说明白、讲清楚,帮助大家快速走在提高晋级的路上。 在这篇博客里围绕PLL IP核展开说明,之所以在这里要花费很多的笔墨去详细介绍、说明这些IP核,是因为笔者也是从一个新手一点点在工作中摸索学习提高的,最初在...原创 2022-04-25 20:52:02 · 9162 阅读 · 5 评论 -
Testbench编写常用语法和必备知识
Testbench简介 仿真测试是FPGA设计流程中必不可缺的流程,尤其在FPGA设计规模和复杂度与日俱增的今天,简简单单写两三个模块的Verilog代码,直接上板调试的工作,现实当中几乎已经不存在了。从笔者实际工作经验来看,如果一个项目中大家讨论到最后决定去起用FPGA,那么在设计当中基本或多或少都会有其他soc芯片如MCU、ARM、DSP不易实现的难点。一个落地转产的设计要在验证上花费的工作量往往可以占到整个项目开发流程的70%左右,仿真验证可以尽快发现设计当中存在的各种大大小小的逻辑b...原创 2022-02-15 23:01:35 · 9135 阅读 · 0 评论 -
FPGA经典设计思想
在这篇博客里笔者为大家简单梳理下,在FPGA工程当中经常用到几个经典的设计思想,通过了解学习这些基本设计思想并灵活应用,对后期的理解代码、实际编程、模块划分、定位错误、分析问题将会起到比较大的帮助。一、跨时钟域的数据同步 跨时钟域的数据同步是FPGA设计当中的经常遇到的问题,也是一个难点和重点,很多工程当中实际测试存在不稳定性,更多时候是因为跨时钟域的数据接口部分没有处理好,对于一个FPGA项目工程来说,优秀的时序逻辑是通过设计出来的,而不是迭代仿真反复修改出来的,更不是人...原创 2022-01-15 20:48:18 · 4845 阅读 · 3 评论 -
FPGA之FIFO详解,初识FIFO
FIFO IP介绍 在篇博客里引入FIFO IP核的概念,FIFO是FPGA中最常用的IP核,经常用在接口模块、串并转换、协议处理、数据缓存等很多场合,所以活学活用这个IP核对于后期项目开发很重要,并且灵活掌握FIFO,也是一名合格的FPGA工程师的一项基本功。 FIFO顾名思义就是First In First Out的简称,相信学过严蔚敏版数据结构的同学都有队列和堆栈的概念吧。而这里FPGA中FIFO IP核,其本质就和数据结构中的队列很相似,先进先出起到暂缓数据的作用...原创 2022-02-06 15:04:37 · 42674 阅读 · 26 评论 -
FPGA之FIFO详解,缓冲不定长报文
在项目开发中经常会遇到不定长报文的处理,典型的有modbus rtu等等,对于STM32端,有过工作经验的朋友,基本都会去选择比如空闲中断+dma,因为非常适合实现不定长报文的接收,如果本身带有freertos等轻型操作系统,那么在实际项目工作中则需要考虑到消息队列的设计和缓存,那么对于FPGA端,我们应该如果去如何去缓存一帧不定长的报文呢,在这篇博客里,笔者通过一个练习举例为大家说明,在FPGA设计中常用到的缓存不定长报文的方法,其本身也具有一定的普遍性。 设计一个模块包含...原创 2022-02-12 09:50:15 · 4170 阅读 · 2 评论 -
简单聊一聊FPGA的应用领域和提高方法吧
开始撰写FPGA技术博客,那么就先简单地写一写FPGA我们能用它做什么,目前FPGA的应用领域主要在哪里,学会了FPGA可以去从事哪些方面的工作等等。FPGA所能应用的领域可以大概分为以下六大类,一些其他领域也可以看成是在此基础上的延伸和扩展。一、通信领域 FPGA在通信领域的应用可以说是非常广泛的,同时也可以说是FPGA最早被开发的方向,这主要取决于其芯片内部的特俗构造,在无线通信领域很多模块需要做滤波处理,然而这些滤波函数通常背后涉及到大量的乘除和累加运算操作,FPG...原创 2022-01-02 11:52:48 · 6275 阅读 · 2 评论 -
FPGA之RAM详解,单口RAM的使用
单口RAM IP练习 RAM在FPGA设计当中应用非常广泛,其种类有单口RAM、伪双口RAM、真双口RAM,但就实际项目开发而言,伪双口RAM应该是使用频率最多的。大家在学习实践的时候,也完全可以多做些对比,这样有更助于消化理解后加以灵活应用。 单口RAM顾名思义只有一个端口,显然这个端口只能在同一时刻进行读操作或者写操作,所以这就使得其在应用开发中具有很大的局限性,因为模块中读RAM数据和写RAM数据,本身是彼此独立的,很多情况下是需要同时去读写RAM的,单口RAM就很难...原创 2022-02-27 08:08:52 · 7902 阅读 · 0 评论 -
FPGA之RAM详解,伪双口RAM的使用
伪双口RAM从灵活度上来说,刚好介于单口RAM和真双口RAM之间,但是不得不说它是RAM中应用最广的配置类型,其难能可贵地兼顾了真双口RAM的读写灵活性,也兼顾了单口RAM的设计稳定性。因为伪双口RAM只有一个端口可以向地址中写入数据,而另外一个端口只可以从地址中读出数据,所以这既避免了真双口RAM的大概率性读写冲突的窘境,也完善了单口RAM无法同时读写地址的缺陷。 在这个练习中去用伪双口RAM IP来实现异步时钟FIFO的功能,用RAM来实现FIFO,这也是RAM在工程项目当中非...原创 2022-03-11 18:11:10 · 6970 阅读 · 4 评论 -
Testbench的激励添加和书写技巧
Testbench平台搭建详解 Testbench的编写说难也难,说易也易。其实说到底透过现象看本质,不同于功能模块的编写,Testbench核心任务在于验证功能模块的设计是否符合预期,所以围绕着这个目标,为了更方便理解,笔者将其简单地归纳为3个步骤:1.对被测试功能模块的顶层接口进行信号例化;2.向被测试功能模块的输入接口添加激励;3.判断被测试功能模块的输出是否满足设计预期。所以说到这里大家回头去思考下在上面3个步骤中,其中步骤1是通用性的书写规则,那么Testbench的核心设计就在步骤...原创 2022-02-20 16:26:07 · 4612 阅读 · 0 评论 -
FPGA开发常用软件的安装
Vivado软件的安装我们一起去安装开发FPGA必备的软件包括:Vivado、Modelsim、Gvim,并附上详细的安装步骤和配套说明,正常来说安装配置好这些软件可能也需要花费2-3小时,所以需要大家在这里多些耐心。工欲善其事必先利其器,选择合适版本的开发软件和工具,也是往后快乐学习工作的先决条件。目前市场上主流的FPGA器件供应商主要分为Xilinx和Altera,其中Altera公司推出的FPGA软件环境为Quartus,Xilinx公司推出的FPGA软件环境为ISE和Vivado,其图标如图1所原创 2022-01-09 15:05:19 · 19560 阅读 · 2 评论 -
FPGA之FIFO详解,读写位宽不同
这篇博客里,通过两个练习来总结在FPGA设计中FIFO读写位宽不同的情况下,我们应该去如何设计时序逻辑,因为在现实工程中FIFO读写位宽不同也是经常出现的情况。练习1 设计一个模块包含读写位宽是32bit、读写深度是64的异步时钟FIFO,其中输入数据信号din和输入 数据指示信号din_vld是属于clk_in时钟域的,上游模块会负责写数据到本模块的FIFO中,当本模块FIFO写端口已写入了60个数据,也就是FIFO快要写满溢出的时候,这时上游模块仍有数据要写入FIFO...原创 2022-02-09 22:21:52 · 11471 阅读 · 9 评论 -
FPGA之RAM详解,真双口RAM的使用
真双口RAM IP练习 真双口RAM可以说是灵活性最大的RAM IP核,因为它赋予了用户最大的设计空间,两个可以独立读写地址空间的端口,充分释放了FPGA程序设计上的可能。 但是实际上真双口RAM在工程项目中还是和单双口RAM一样使用频率比较低的,因为其太过灵活自由了,就导致了用户在设计程序的过程中,比较难以驾驭,最大的苦恼即来自于两个独立读写端口的不可避免的读写冲突,当然也有一些FPGA工程师单独做了一个相对复杂的读写状态机,在程序设计上可以规避读写冲突,但是笔者也和大部分朋友们一样,比...原创 2022-03-03 20:57:00 · 17106 阅读 · 5 评论 -
移位寄存器SHIFT RAM IP之模拟图像卷积
SHIFT RAM IP核,FPGA工程师们也通常称之为移位寄存器,它是一种特殊的RAM,并且在FPGA图像视频加速领域有着非常广泛的应用,甚至被人们称为专门为图像卷积运算而生的IP核。 在这篇博客里笔者和大家一起去学习实践这个经典的IP核,pg122-c-shift-ram是IP核的官方说明手册,如果朋友们在使用过程中有一些不清楚的细枝末节,可以去及时查阅该手册,以扫清工作中存在的疑问。 其实大家想想看,在对数字信号处理也好,图像视频加速也好,是不是经常...原创 2022-01-27 10:05:27 · 7837 阅读 · 9 评论 -
Verilog基础知识和工作中常用到的关键知识点
计数器简介 通过前面博客的介绍,已经学习到了Verilog常用的基础和高级语法、模块例化的方法以及FPGA模块设计理念,在今天这个博客里,主要讲述计数器和状态机的使用方法、FPGA的开发流程、FPGA经典设计思想同时简单聊聊Verilog编程书写规范,因为在实际工作中,大家可能会遇到各种书写风格的Verilog代码,良好的Verilog代码书写对未来团队的开发效率和维护有着非常重要的意义。 那什么是计数器呢?顾名思义就是用来实现数数、计数的东西,因为在FPGA设计当中存在...原创 2022-01-11 22:45:32 · 2611 阅读 · 0 评论 -
来聊一聊FPGA设计中的数据的组包和拆包吧
数据的组包和拆包是FPGA设计中经常会遇到的应用场景,大家可以回顾下,上游模块发送来的数据,在本模块如果需要接收或者解析,这里就或多或少地会需要数据的拆包,然后才能获取有效信息,同时本模块如果想把数据发送到下游模块,这里也就不可避免地需要数据的组包,接着把组包后的数据逐一发送下去,因此不夸张地说数据的组包和拆包几乎伴随了整个FPGA工程。 下面先来介绍数据的拆包吧,即通俗地说就是把接收到的数据通过一定时序逻辑去赋值给其对应的信号量,从而提取出有效的数据信息。仅仅从书写形式上来讲...原创 2022-01-29 20:21:06 · 4736 阅读 · 0 评论 -
Verilog基础知识点
围绕Verilog基础知识和工作中常用到的关键知识点展开,可是笔者并不打算在这里过分叙述FPGA底层结构和穷举Verilog语法。大家不妨可以回忆下读书时候学习谭浩强版C语言和严蔚敏版数据结构,这两本书是计科、软工、通信、电控等专业的必修课,当时是不是只记得书很厚,然后似乎把C语言每个语法都好像讲了一遍,一到笔试和机试,虽然很辛辛苦苦地刷题突击,但是到头来还是感觉没有学会C语言,很多东西依然感觉是云里雾里,接着上完C语言的课,再看看数据结构又有很多生僻深奥的知识点,配上书中晦涩难懂的伪代码,这完...原创 2022-01-03 14:02:55 · 4185 阅读 · 3 评论 -
Verilog高级知识点
一、阻塞和非阻塞 阻塞和非阻塞也是FPGA经常会遇到的概念,不仅仅在信号的赋值时候会出现,也经常在Xilinx IP核配置中出现,所以笔者想在这里把这个概念阐述清楚,方便大家对后续程序编写和IP核配置上的理解。阻塞赋值(Blocking) 阻塞顾名思义,就是说后面的语句会受到前面的语句的影响,通俗的说就是如果在一条阻塞赋值语句还没有被执行,那么该语句后面的语句也不能被执行即被阻塞了,换而言之就是说在同一个always块内的语句有着串行顺序执行的特点,这点和C语言有点相似...原创 2022-01-06 20:58:24 · 3506 阅读 · 0 评论