FPGA学习心得_fpga学习心得
FPGA学习心得由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“fpga学习心得”。
回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。
废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:
①、Verilog语言的学习,熟悉Verilog语言的各种语法。
②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA板子。
③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。
先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。
其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,aign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍:
①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。
②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。
学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。
Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。
刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好:
①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。
②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。
③、《FPGA设计指南--器件,工具和流程》:这本书看了他的目录忍不住就买了,这本书讲述了FPGA设计的各个方面,虽然每个方面都是点到为止,但能让你有个整体的概念,了解FPGA的所有设计功能,了解FPGA开发的整个流程。
④、在这里也推荐几个学习FPGA比较好的论坛
http://www.daodoc.comt信号控制着w_fifo_rden、aes_ready等信号,是该模块的关键信号,通过将它们之间的时序关系通过时序图反应出来,写代码时就可以做到胸有成竹,减少出现逻辑混乱的情况。
听起来似乎很简单,但是执行起来却不容易,因为画波形图是一件很烦锁的事(有一次一个模块因为操作比较多我画了8张时序图)。但是请相信我,如果不这样做,因为时序关系没有处理好引起设计多次迭代所花的时间远多于画波形图的时间。
时序设计好之后,模块内部各个信号之间的关系就理得差不多了,之后就是将它翻译成代码了,这个过程以体力劳动为主,我就不多说了。
补充一下,画波形图推荐用TimingDesigner这个软件,如果有更好的,请告诉我,我也不喜欢TimingDesigner:)。
另一个就是约束。
这里的约束是针对综合软件和布局布线软件而言的。
为什么会有约束这个东西出现呢?主要原因是EDA软件比较笨,难以明白我们的心思,如果我们不把更详细的信息告诉它的话它就干不好活,比如需要将输出寄存器放的与输出管脚近一点,如果不加约束,EDA软件可能布通之后就不管了,导致Tco狂大,一点也不善解人意。所以我们需要约束这个东西,告诉EDA软件要怎么干活,工程验收的标准又是什么。
在加约束之前,我们首先要定义一些术语好告诉EDA软件我们想干什么,这些术语便是Fmax、Tsu、Tco等等这些东西。这些东西的含义这里就不多说了,网上的讨论已经很多了。
有了术语,还要有一种通信方式与EDA软件通信,脚本语言充当了这一角色。不过现在像quartus这类软件做的比较智能化了,提供了图形化界面,但是这背后支撑的还是些脚本语言,大家可以用UltraEdit打加*.qsf文件去看看我们加的约束用脚本语言是怎么写的。在加了约束之后,EDA工具就可以更好地按照我们的意愿去干活了,比较我们加了Fmax的约束,它就会尽可能地将关键路径放的靠近一些,以提高电路工作频率。当然,这是有代价的,寻找路径是需要时间的,要求越苛刻,时间花的越多,因此加约束的原则的适用就行。如果约束加的过高,就相当于让EDA工具去做一件不可能完成的事,找更短的路径的时候说不定找着找着就掉下悬崖了,效果反而更差。
虽然有约束这个好东西,不过提醒一下,在项目之前千万对它抱有太多的幻想,把希望寄托在别人的身上并不是每一次都很可靠的,出了问题还是要麻烦自己,加约束只能做一些锦上添花的事情。所以,我们在做方案的时候就需要对关键路径进行预估,要通过设计而不是约束解决这些问题。