基于verilog的FPGA编程经验总结
FPGA宝贵实战经验及Verilog编程规范

规范很重要工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。
逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。
在逻辑方面,我觉得比较重要的规范有这些:1.设计必须文档化。
要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。
这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。
2.代码规范。
a.设计要参数化。
比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我们可以这么写:parameter CLK_PERIOD = 30;parameter RST_MUL_TIME = 5;parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;...rst_n = 1'b0;# RST_TIME rst_n = 1'b1;...# CLK_PERIOD/2 clk <= ~clk;如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。
b.信号命名要规范化。
1) 信号名一律小写,参数用大写。
2) 对于低电平有效的信号结尾要用_n标记,如rst_n。
3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后方便很多。
如:module a(//inputclk,rst_n, //globle signalwren,rden,avalon_din, //related to avalon bussdi, //related to serial port input//outputdata_ready,avalon_dout, //related to avalon bus...);4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。
verilog课程期末总结

verilog课程期末总结一、引言Verilog(硬件描述语言)是一种用于描述电子系统的硬件结构和行为的语言,它广泛用于设计和验证数字电路,尤其是在集成电路和FPGA设计中。
在本学期的Verilog课程中,我们学习并实践了Verilog语言的基本概念和设计技巧,通过实验和项目开发,我们对Verilog语言的使用和应用有了更深入的了解。
本文将对这门课程进行总结,包括所学内容、实践经验以及未来的发展方向。
二、课程内容回顾本学期的Verilog课程共包含以下几个部分的内容:1. Verilog的基本语法和数据类型:在这个部分,我们学习了Verilog的基本语法,如模块定义、端口声明、数据类型定义等。
我们了解了如何使用Verilog语言进行模块化设计,利用不同的数据类型来描述数字电路中的信号和寄存器。
2. Verilog建模:这个部分教授了如何使用Verilog语言来建模和设计数字电路。
我们学习了组合逻辑和时序逻辑的建模方法,掌握了常用的门级建模和行为级建模技巧。
3. Verilog仿真:通过仿真可以验证我们设计的电路是否符合功能和时序的要求。
在这个部分,我们学习了如何使用Verilog语言进行仿真,以及如何编写仿真测试平台、编写仿真测试用例等。
通过仿真,我们可以对设计进行调试和验证,同时也方便了我们对电路性能和时序约束的分析。
4. Verilog项目开发:最后一个部分是课程的项目开发,通过一个实际项目的设计和实现,我们将所学的Verilog知识应用到实践中。
这个项目的设计还涉及模块间的通信和数据处理等方面,对我们综合运用所学知识的能力提出了更高的要求。
三、实践经验总结在学习和实践Verilog语言的过程中,我积累了一些宝贵的经验。
以下是我总结的几点实践经验:1. 充分理解和熟练掌握语法规则:Verilog语言的语法规则对于我们正确理解和使用这门语言非常重要。
通过不断的练习和实践,我渐渐熟练掌握了Verilog的语法规则,如模块的定义、端口的声明、数据类型的使用等。
个人总结FPGA设计中Verilog编程的27条经验

个人总结Verilog编程27条经验1.强烈建议用同步设计;2.在设计时总是记住时序问题;3.在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问题,在所有模块中都要遵守它;4.在不同的情况下用if和case,最好少用if的多层嵌套(1层或2层比较合适,当在3层以上时,最好修改写法,因为这样不仅可以reduce area,而且可以获得好的timing);5.在锁存一个信号或总线时要小心,对于整个design,尽量避免使用latch,因为在DFT时很难test;6.确信所有的信号被复位,在DFT时,所有的FlipFlop都是controllable;7.永远不要再写入之前读取任何内部存储器(如SRAM);8.从一个时钟到另一个不同的时钟传输数据时用数据缓冲,他工作像一个双时钟FIFO(是异步的),可以用Async SRAM搭建Async FIFO;9.在VHDL中二维数组可以使用,它是非常有用的。
在VERILOG中他仅仅可以使用在测试模块中,不能被综合;10.遵守register-in register-out规则;11.像synopsys的DC的综合工具是非常稳定的,任何bugs都不会从综合工具中产生12.确保FPGA版本与ASIC的版本尽可能的相似,特别是SRAM类型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自带的SRAM,ASIC版本一般用厂商提供的SRAM;13.在嵌入式存储器中使用BIST;14.虚单元和一些修正电路是必需的;15.一些简单的测试电路也是需要的,经常在一个芯片中有许多测试模块;16.除非低功耗不要用门控时钟,强烈建议不要在design中使用gate clock;17.不要依靠脚本来保证设计。
但是在脚本中的一些好的约束能够起到更好的性能(例如前向加法器);18.如果时间充裕,通过时钟做一个多锁存器来取代用MUX;19.不要用内部tri-state, ASIC需要总线保持器来处理内部tri-state,如IOcell;20.在top level中作pad insertion;21.选择pad时要小心(如上拉能力,施密特触发器,5伏耐压等),选择合适的IO cell;22.小心由时钟偏差引起的问题;23.不要试着产生半周期信号;24.如果有很多函数要修正,请一个一个地作,修正一个函数检查一个函数;25.在一个计算等式中排列每个信号的位数是一个好习惯,即使综合工具能做;26.不要使用HDL提供的除法器;27.削减不必要的时钟。
用verilog 进行FPGA设计阶段总结

用verilog 进行FPGA设计第一阶段总结2007-08-23 21:34实习期间,老师叫我们做他的大课题中的一个小部分。
这个部分主要是将A/D采集的数字信号利用一个函数进行插值恢复,以便后面的作图中使用。
要求在每两个点中间均匀插入九个点,每个点与其前后80个点有关,用verilog 语言描述,在xilinx公司的开发环境ISE下完成。
对于verilog我们没有接触过,以前的课程设计都用的是VHDL,ISE也没用过,以前用的是Maxplus2开发环境,于是我们就从网上下载了一些教程开始学习。
在熟悉了verilog的语法和ISE之后,我们开始了设计。
思路是这样的:将要处理的数据先存在一个存储器中,然后每进来一个新的数据,所有的数据向前移动一个寄存器,在主时钟十分频之后的每个上升沿读取新的数据进来,然后计算插值,然后在每个主时钟的上升沿处输出插值后的数据,这样就能实现插值的过程了。
在具体的编写程序的时候,我们先用与每个插值点前后4个点有关进行设计,设计好之后再进行扩展。
对于插值的计算我们先不考虑,将其全部设置成常量,主要考虑看能否在两个点之间插值成功,这样的程序就简单多了。
很快我们的程序就写好了,编译仿真之后能实现插值。
接下来就是主要考虑插值的计算问题了,在这个部分我们走了一些弯路。
首先是乘法问题,这个课题相当于是一个FIR滤波器,其中要进行约720次的相乘累加,我们看资料书和一些发表的论文,上面好多都考虑用分布式算法DA来实现,但是要是考虑的点多了,这种方法就不可行了,因为那个表会造的很大。
在书上,我也没有看到直接用乘号来进行乘法运算的,大部分都是进行移位相加的,为此还认真的研究了一下乘法的原理。
到最后,老师说你可以直接用乘号的,不要管那些移位什么的,这些是综合器做的事情。
其次是verilog中有符号数的计算问题。
因为是新接触,不知道怎么做。
为了实现2*(-3)=-6,搞到了半夜两点。
我记得计算机组织与结构里面有一章是关于乘法的,里面讲的是用布斯算法,看了半天,觉得在程序中这样实现太麻烦,肯定有更简单的方法。
学习FPGAverilog的心得

学习FPGAverilog的心得一....尽量不要使用"大于""小于"这样的判断语句,这样会明显增加使用的逻辑单元数量 .看一下报告,资源使用差别很大.例程:always@(posedge clk)begincount1=count1+1;if(count1==10000000)feng=1; //no_ringelse if(count1==90000000)beginfeng=0; //ringcount1=0;endend //这么写会用107个逻辑单元// 如果把这句话if(count1==10000000)改成大于小于,报告中用了135个逻辑单元二.....一定要想尽办法减少reg寄存器的长度上次把[30:0]改到[50:0],报告里逻辑单元从100多直升到2000多太吓人了,至于为什么我就不知道了哈!三....case语句里一定要加default if一定要加else如果是组合逻辑的设计,不加default或else的话,不能保证所有的情况都有赋值,就会在内部形成一个锁存器,不再是一个纯粹的组合逻辑了,电路性能就会下降.例如:case({a,b})2'b11 e=b;2'b10 e=a;endcase//不加default,虽然只关心a=1时的结果,但是a=0的时候,e就会保存原来的值,直到a变为1//那么e要保存原来的值,就要在内部生成锁存器了.四....尽量使用Case语句而不是if--else语句复杂的if--else语句通常会生成优先级译码逻辑,这将会增加这些路径上的组合时延用来产生复杂逻辑的Case语句通常会生成不会有太多时延的并行逻辑五...组合逻辑的always块中,要注意所有的输入全部放入敏感变量表里比如:always@(a or b)beginout=(a&b&c);end此时生成的不是纯的组合逻辑,因为当C变化时, out不会立刻发生变化(需要等到a或b变化,c的变化才会显现), 所以需要生成一个寄存器来保存C的值.连续赋值语句的综合:从赋值语句右边提取出逻辑,用于驱动赋值语句左边的net过程赋值语句的综合:从赋值语句右边提取出的逻辑,用于驱动赋值语句左边的reg型变量。
学习verilog后的总结

关于这个学期学习verilog hdl语言后的小结在完成本次verilog大作业的过程中,我不仅学到了很多只靠看书本学不到的知识,而且体会到了团队协作的力量,在团队成员的合作下,经历了不少困难,终于完成了verilog的大作业,虽然过程并不是和想象中的一样,而且作业也与老师要求的有点差距,但是从中学习到了许多关于verilog的使用与仿真的基础知识,也对课上学到的语句有了更深的理解,并将其应用到了实际工程中,使自己的运用能力得到了很好的锻炼,对基本操作已经较熟练的掌握,对其中一些细节问题,如仿真时间的选取等也有了自己的理解。
实践出真知,通过在软件上反复改程序、跑程序我也学会了很多只看书本发现不了的问题,锻炼了自己的解决问题能力。
这对于今后的学习是有很大的帮助的。
以下做一下简要总结:这次的大作业是通过我们小组四个同学共同努力下完成的,其中有很多收获也有很多感受。
这次的大作业给了我们一次很好的锻炼机会,通过这次大作业,我开始熟悉用verilog设计的最基本的方法和流程,课堂上学到的东西只有自己通过应用才能加深自己的理解,课堂上学到的并不是全部,要想真正的学好这门课,只有在实践中运用才能真正的体会到这门课的精髓,这次的大作业很好的验证了。
有一个外因也是给了我们的帮助,那就是网络的强大,在这个信息的时代,互联网的作用显而易见,如果能够充分得利用网络上海量的信息,掌握一定的检索技巧,就可以获得很多有价值的东西,比如参考别人的算法和程序段,观看关于Quartus II软件的使用教程视频。
这比起关起门来自己钻研要强上不少。
对于如何使用verilog hdl写出可综合的代码真的是一件不容易的事情,而真正的可以写出可综合的代码确实还需要经过很长时间的锻炼。
而对Quartus II的使用,感觉也只会得不多,还有很多功能诸如时序分析,逻辑分析,引脚分配等都不会使用。
在完成这次大作业的过程中充分感受到自己知识的不足以及学以致用的重要性,有很多不懂的地方,要通过不断的学习来提高自己,这正验证了学海无涯这句古话。
FPGA学习总结

FPGA学习总结FPGA(现场可编程门阵列)是一种数字电路开发和实现的工具,它提供了一种灵活的方式来设计和实现各种数字电路。
在我的FPGA学习过程中,我经历了以下几个方面的学习和实践:1.FPGA基础知识:在学习FPGA之前,我首先了解了FPGA的基本概念和原理。
我学习了FPGA的架构、时序和时钟设计、数字电路设计和综合等方面的知识。
这些基础知识为我深入学习和实践FPGA打下了坚实的基础。
2. FPGA开发工具的使用:我使用了常见的FPGA开发工具,如Vivado和Quartus。
这些工具提供了一种直观而强大的方式来设计和实现FPGA。
我学习了如何创建项目、添加模块、定义信号、综合和布局布线等操作。
通过不断的实践和尝试,我逐渐掌握了这些工具的使用。
3. Verilog和VHDL的学习:Verilog和VHDL是FPGA开发中常用的硬件描述语言。
通过学习这两种语言,我能够使用它们来描述和设计各种数字电路。
我掌握了如何使用这些语言来描述寄存器、组合逻辑、状态机等部件,并能够将它们综合成FPGA可实现的电路。
4.FPGA的应用实践:在学习了FPGA的基础知识和工具使用之后,我开始进行一些实际的应用实践。
我使用FPGA设计和实现了一些简单的电路,如计数器、加法器、乘法器等。
通过实践,我加深了对FPGA的理解,并增强了自己的设计和调试能力。
5.FPGA高级特性的学习:除了基础知识和工具使用外,我还学习了一些FPGA的高级特性,如时序分析、时钟域划分、并行数据传输和高速串行数据传输等。
这些特性在设计和实现一些高性能和复杂的电路时非常重要,我通过学习和实践,学会了如何正确地使用这些特性。
总结起来,FPGA学习是一个既有理论基础又注重实践和应用的过程。
通过学习FPGA,我更好地理解了数字电路的原理和设计,增强了自己的工程能力。
我学会了使用FPGA开发工具,掌握了Verilog和VHDL等硬件描述语言,实践了FPGA的设计和实现,并学习了一些高级特性。
verilog学习经验

8. 用test bench等工具针对大的工程进行仿真,quarters用来做小的,比如计数器。
9. 站在一定的高度看:FPGA内部的问题都是小问题,而接口往往较难,比如异步时钟问题,可能与内部不一致。
10. 在写代码的时候就不要写不可综合的语句,这样前仿出来之后,后仿就并不是很费事,只是有资源的约束而已。
1. wire与reg之外的数据类型不要在verilog代码中出现。
2. assign(组合逻辑)与always之外的语句不要在verilog代码中出现。
3. 一个module最好一个always,再加若干assign,这样便于控制。
4. verilog中无函数调用及函数传递,都转化成input、output接口。
写代码之前,先找个规范看看,比如华为的,然后规规矩矩的写,后仿真就会快的多。
11. 不同模块的调用以时序来控制,且确保一个模块是以整体的形式进行工作(即并行)。换言之,用状态信号控制不同模块的启用,配合状态机加以控制。
12. 一定要采用同步处理,即在同一时钟下,所有数据要受信号控制。
17. RAM分内外,内部是指FPGA内,外部的是在板子上连接的器件。如果用外部的RAM,在做板子之前可以用数组的方式模拟外部RAM。
18. 处理输入的几种方式:
需要什么,送入什么,用时序和信号进行控制;
一个时钟送入一个,送入的先寄存下来;
也可以将总线放宽,一次传入更多的数据。
5. 不建议使用for循环,因为看不到其电路是什么样子。
For可以用状态机控制,状态机可以打圈,定义一个计数器,做为循环的索引。
动态次数的循环,用一个寄存器记录处理的次数,再加一个状态信号判结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于verilog的FPGA编程经验总结
用了半个多月的ISE,几乎全是自学起来的,碰到了很多很多让人DT好久的小问题,百度也百不到,后来还是都解决了,为了尽量方便以后的刚学ISE的童鞋不再因为一些小问题而纠结,把这几天的经验总结了一下。
好了,废话不多说,上料!
1.用ISE仿真的时候.所用变量一定要初始化. ISE默认初始量为”XXXXX”, 而Quarters是默认为”00000”的, 其实实际上, 下到FPGA里后也是默认为0的,只是可以说ISE严谨得令人DT吧.
比如说用一个累加器, result = A+B+result ,必须保证在某一刻A, B, result都为定值时, 之后的数据才不会一直为”XXXXX”;
2.所有的中间线(就是module间用来传递参数的信号)都要用wire定义一下. 这个ise一般会提醒的;
3.任何一个warning都是有用的;
4.debug时要多把中间变量设成输出,然后查看仿真波形;
5.其实,新版本还是比较好用的.虽然取消了test bench wave 功能. 但是最好学会编测试文件,后期比test bench wave好用, 而且貌似一旦测试信号太多,test bench wave就不
显示某些输出了;
6. warning: Nod is unconnected. 表明所在的模块没用被执行,一般是参数没进来, 或者进来的参数不对(“XXXX”之类)的原因引起的.
7.建立rom时候,Error: sinrom can’t be resolved. 因为在把程序挪地方的时候,sinrom.ngc文件没有一同拷过来.
8.把”XXXXX”信号处理掉的一个方法可以是: 从信号中随意选出一位if (data[0] == 0) ....; else if (data[0] == 1).... else data = 0; 就可以把”XXXX”信号给清成”0000”了. 可以很好的解决1中仿真的问题.
9.如果某一个不是时钟的信号被当作周期信号来用的话,就会出现WARNING:Route:455 - CLK Net:trn_clk_OBUF may have excessive skew. because 0 CLK pins and 1 NON_CLK pins failed to route using a CLK template 不管也行.
10. 一开始用FPGA时不要害怕,用ucf文件配好引脚,直接LOAD,先不用管什么区域约束,以后进阶了再学. .
11.暂时就记得这些,以后再补充吧.。