FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点。个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会。

(一)善用MATLAB来为设计做充分的准备和验证。

在学习EDA课程的时候,我们往往都是按照要求,直接打开QuartusII,噼里啪啦开始疯狂敲代码,然后仿真——不对——再改再仿真——还不对——再改直到仿真结果正确为止。不错,这的确是人们先入为主的一种方法。但这只是我们学习HDL语言,学习使用开发工具时候比较直接的方法,也只是适用于那个自己什么都不懂的阶段。面对大工程,复杂的数字逻辑,精确的数字信号处理,这样的方法只会让你无从下手。

MATLAB对数字信号处理而言,可以说是万能的。它基本包含了所有我们想要实现的运算,也可以完全得帮我们仿真出我们想要实现的某种算法。所以,在实际工程实现的时候,我们都会先使用MATLAB来仿真实现我们的目标,比如上几篇文中提到的FIR滤波器。

首先,我们使用MATLAB自带的函数,得到我们的理想值;

再用我们将采用的算法在MATLAB进行算法级的仿真(所谓算法级仿真,即和我们硬件实现的方法一致,如,卷积运算不能采用conv函数,而需要一步一步的进行相乘累加相乘累加……);有的人说这样是多此一举的,我也可以直接就在QuartusII里写代码,跳过这一步。其实,这是急功近利的做法,恰恰这一步是很重要的。如果设计顺利,这一步看起来的确有些多余。可当我们发现,算法仿真结果与我们的理想值(我们用函数算出来的值)不一致的时候,或者在之后进行FPGA设计时序仿真出现问题的时候,它的优势就来了,MATLAB的算法级仿真,可以很快的帮你找到并解决这个问题。例如:我们设计FIR滤波器,最后时序仿真结果和我们的算法仿真不一致!怎么办?哪里的问题?是不是设计都错了?不一定,我们的算法级仿真给了我们所有的中间过程的正确结果,我们可以通过比对他们,来确定是哪个环节出了问题。

完成了MATLAB的算法级仿真,就可以开始我们的硬件代码设计了。这个时候我们会发现,不再是无从下手了,因为我们只需要按照算法级仿真代码,按照HDL语言的语法要去,再以相应数字电路的coding style编写就可以了。随后再进行仿真,对比着算法仿真的结果,进一步修正硬件代码,这个过程将十分的轻松。

(二)经常查看RTL图。

做设计,最忌讳“想当然”。当我们做过几个设计,自认为有点经验的时候,很容易会有“想当然”的心态。老是觉得,我这么写代码,那最后出来的RTL电路就一定是这个样子的……其实不然。我们知道,从代码变换到RTL电路这个过程,叫做综合,而每个型号的芯片,综合规则都是不一样的,而且有时候我们还需要设定相应的综合规则来实现我们想要的结果。本人亲身的一次经历,做一个简单的单口RAM,首先是使用IP核设计,于是思维定势的觉得,既然是IP核生成的,那肯定是同步RAM,无需再进行设定了。可直到最后输出时序总是不理想,才又让我怀疑起了这个RAM,果不其然,查看了RTL图才发现,它不是同步RAM……有了这次教训,深刻得认识到,只有看到(RTL图),才能相信那是真的。

(三)尽量只做简单设计。

很多复杂的逻辑,实现起来很多人都想一口气用一个逻辑块来实现。这样做是很危险的……大家有空可以看看那些大牛们写的代码,再复杂的逻辑,无非多加个状态机,都不会有太多太乱的代码。一个复杂的逻辑实现,应该把它尽可能得分成简单逻辑的组合,因为如果逻辑设计得越复杂,时钟也就不能跑得很高,这对其它部分的设计带来了瓶颈,是相当不利的。

(四)遵从FPGA厂家给出的coding style。

不管是Altera还是Xilinx都给出了各自的coding style。虽然大多数情况,我们不按照那样的方式来编写代码并不会照成逻辑性的错误,但是却给设计带来了安全隐患。这样的隐患如果一旦出错,便很难通过仿真等手段来发觉。

(五)不要以为每款FPGA都是一样的。

同样的设计,换做不同的FPGA平台,其结果是不一样的!如果要深入设计FPGA,那一定要仔细阅读一款FPGA的芯片手册。个人建议是先挑一款较为大众的芯片阅读它的手册,然后可以基本掌握FPGA的结构和它工作的原理等。等熟悉了以后,就算换了芯片或者平台,也可以很快找到新的芯片的独特之处了。

转载--关于FPGA设计数字信号处理电路的心得的更多相关文章

  1. FPGA与数字信号处理

    过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...

  2. 数字逻辑实践4->面向硬件电路的设计思维--FPGA设计总述

    本文是对实验课上讲解的"面向硬件电路的设计思维"的总结,结合数字逻辑课本,进行提炼和整理. 主要来源是课件与本人整理,部分参考了网络大佬的博客. 本文主要介绍不同于之前软件设计思维 ...

  3. FPGA设计思想与技巧(转载)

    题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...

  4. 【转载】如何在FPGA设计环境中添加加时序约束

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束    在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ...

  5. 【转载】FPGA算法设计随笔

    FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...

  6. FPGA设计中的电源管理(转载)

    过去,FPGA设计者主要关心时序和面积使用率问题.但随着FPGA不断取代ASSP和ASIC器件,设计者们现正期望能够开发低功耗设计,在设计流程早期就能对功耗进行正确估算,以及管理和对与FPGA相关的各 ...

  7. 《数字信号处理》课程实验2 – FIR数字滤波器设计

    一.FIR数字滤波器设计原理  本实验采用窗函数法设计FIR数字低通滤波器.我们希望设计的滤波器系统函数如下: \(H_{d}\left( e^{jw} \right) = \left\{ \begi ...

  8. FPGA与数字图像处理技术

    数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...

  9. FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言

    FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言 2014年08月08日 14:08    看门狗 关键词: FPGA 作者:friends 从大学时代第一次接触FPGA至今已有10多 ...

随机推荐

  1. Oracle-创建索引分区

    对大数据量索引进行分区同样能够优化应用系统的性能.一般来说,如果索引所对应的表的数据量非常大,比如几百万甚至上千万条数据,则索引也会占用很大的空间,这时,建议对索引进行分区. Oracle索引分区分为 ...

  2. Hugo - 安装、设置及使用

    Hugo 官方主页:https://gohugo.io 待选主题: https://github.com/cdipaolo/gindoro https://github.com/oserz/hugo- ...

  3. 2019牛客暑期多校训练营(第三场)H Magic Line

    原题链接:H  Magic Line 题意简述: 给定n个点,要求画一条直线将n个点分成均有n / 2个点的两部分,不能有点在线上: 解题思路: 首先,先将所有的点进行以x为第一关键字,y为第二关键字 ...

  4. Recurrent Neural Network(1):Architecture

    Recurrent Neural Network是在单个神经元上,除了输入与输出外,添加了一条Recurrent回路.也就是说,节点当前的状态将会影响其未来的状态.下式可以表征此关系: st= f(s ...

  5. 【Python—参数】*arg与**kwargs参数的用法

    在python中,这两个是python中的可变参数,*arg表示任意多个无名参数,类型为tuple;**kwargs表示关键字参数,为dict. # *允许你传入0个或任意个参数,这些可变参数在函数调 ...

  6. MyBatis中的$和#,用不好,准备走人!

    作者:程序猿的内心独白 https://m.toutiaocdn.com/i6685496024770806280 这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不到出来了,问题就在于一 ...

  7. 2019牛客暑期多校训练营(第二场) - H - Second Large Rectangle - dp

    https://ac.nowcoder.com/acm/contest/882/H 正确的办法:dp1[i][j]表示以i,j为底的矩形的高.得到dp1之后,dp2[i][j]表示以dp1[i][j] ...

  8. 最小生成树,Prim算法实现

    最小生成树 所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小. 首先看看第一个例子,有下面这样一个带权图: 它的最小生成树是什么样子呢?下图绿色加粗的边可 ...

  9. Nginx 教程 (1):基本概念

      简介 嗨!分享就是关心!所以,我们愿意再跟你分享一点点知识.我们准备了这个划分为三节的<Nginx教程>.如果你对 Nginx 已经有所了解,或者你希望了解更多,这个教程将会对你非常有 ...

  10. 更新252板子代码(前端+cgi中间件)

    1.前端代码 前端的html.css.js代码,利用打包工具生成dist文件夹,放入lighttpd的指定目录. 2.cgi中间件 1)编译 1.下载代码工程V100R100C00 2.将工程代码以共 ...