转载--关于FPGA设计数字信号处理电路的心得
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设计数字信号处理电路的心得的更多相关文章
- FPGA与数字信号处理
过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...
- 数字逻辑实践4->面向硬件电路的设计思维--FPGA设计总述
本文是对实验课上讲解的"面向硬件电路的设计思维"的总结,结合数字逻辑课本,进行提炼和整理. 主要来源是课件与本人整理,部分参考了网络大佬的博客. 本文主要介绍不同于之前软件设计思维 ...
- FPGA设计思想与技巧(转载)
题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...
- 【转载】如何在FPGA设计环境中添加加时序约束
转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束 在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ...
- 【转载】FPGA算法设计随笔
FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...
- FPGA设计中的电源管理(转载)
过去,FPGA设计者主要关心时序和面积使用率问题.但随着FPGA不断取代ASSP和ASIC器件,设计者们现正期望能够开发低功耗设计,在设计流程早期就能对功耗进行正确估算,以及管理和对与FPGA相关的各 ...
- 《数字信号处理》课程实验2 – FIR数字滤波器设计
一.FIR数字滤波器设计原理 本实验采用窗函数法设计FIR数字低通滤波器.我们希望设计的滤波器系统函数如下: \(H_{d}\left( e^{jw} \right) = \left\{ \begi ...
- FPGA与数字图像处理技术
数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...
- FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言
FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言 2014年08月08日 14:08 看门狗 关键词: FPGA 作者:friends 从大学时代第一次接触FPGA至今已有10多 ...
随机推荐
- centos7 安装gdal2.3.1
在直接源码安装gdal2.3时报错,大概意思是说没有安装SFCGAL. 1.centos更新cmake到3.5版本: wget https://cmake.org/files/v3.5/cmake-3 ...
- SQLiteDatabase 数据库使用
0 SQLiteDatabases数据库特点 一种切入式关系型数据库,支持事务,可使用SQL语言,独立,无需服务.程序内通过类名可访问数据库,程序外不可以访问. SQLiteDatabases数据库使 ...
- MySQL 案例:计算环比
select a.day_num as "序号", a.create_time as "上架时间", a.clue_num as "上架车源量&quo ...
- jQuery插件3种类型
1.封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件. 此类插件可以发挥出jQuery选择器的强大优势,有相当一部分的jQuery方 ...
- HDU 6583 Typewriter 题解
——本题来自杭电多校第一场 题意:给定一个字符串,主角需要用打字机将字符串打出来,每次可以: 1.花费p来打出任意一个字符 2.花费q来将已经打出的某一段(子串)复制到后面去 对于这种最优化的问题,我 ...
- 批量更新:A表数据源 B表目标
update a set a.Title = b.Title from Table_A a ,Tbale_B b where a.ID_Table_B = b.ID
- Numpy Ndarray对象1
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指 针.这样为了保存一个简单的[1,2,3],需要有3个指针和三 ...
- 一键部署YApi
编写docker-compose.yml version: '2.1' services: yapi: image: mrjin/yapi:latest # build: ./ container_n ...
- 基于Opencv自有模型识别人脸与人眼
#!/usr/bin/python # -*- coding: utf-8 -*- import cv2 face_cascade = cv2.CascadeClassifier("D:/O ...
- Java疯狂讲义笔记——内部类
[定义]内部类:定义在其它类内部的类.外部类:包含内部类的类,也称 宿主类.局部内部类:定义在方法里的内部类. [接口内部类]接口中也可以定义内部类,必须为public static修饰(自动添加), ...