针对赛灵思ISE工具的verilog编程经验小结
- 格式:pdf
- 大小:196.48 KB
- 文档页数:2
vivado工具与verilog语言的使用实验总结文章标题:深入探讨vivado工具与verilog语言的使用实验总结导言:在数字电路设计与实现的过程中,vivado工具与verilog语言的使用至关重要。
通过一系列的实验,我们能够全面地了解这两者在数字电路设计中的应用,并掌握它们的使用技巧。
本文将以从简到繁、由浅入深的方式,深入探讨vivado工具与verilog语言的使用实验总结,帮助读者全面理解这一主题。
一、vivado工具的基本介绍在数字电路设计中,vivado工具是一款由Xilinx公司推出的集成化开发环境。
它拥有丰富的功能和强大的性能,能够帮助设计者完成从设计到验证的全流程。
在实验中,我们首先对vivado工具的基本操作进行了学习,包括创建工程、添加设计文件、进行综合与实现等一系列步骤。
通过实践,我们能更加熟练地运用vivado工具进行数字电路设计。
二、verilog语言的基础知识verilog语言是一种硬件描述语言,广泛应用于数字电路的设计与验证。
在实验中,我们深入学习了verilog语言的基础知识,包括模块化的设计思想、信号的赋值与传输、行为级建模和结构级建模等内容。
通过对verilog语言的学习,我们能够更好地理解数字电路的工作原理,提高设计的效率和准确性。
三、vivado工具与verilog语言的综合应用在实验的进阶阶段,我们将vivado工具与verilog语言相结合,进行了一系列的综合应用实验。
通过实际的案例学习,我们掌握了如何利用vivado工具进行综合、仿真和验证,并通过verilog语言实现各种功能模块。
这些实验不仅加深了我们对vivado工具和verilog语言的理解,同时也提高了我们的综合应用能力。
总结与回顾:通过以上的实验学习,我们对vivado工具与verilog语言的使用有了更深入的了解。
vivado工具作为一款集成化开发环境,能够为数字电路设计者提供全方位的支持;而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的语法规则,如模块的定义、端口的声明、数据类型的使用等。
在逻辑方面,我觉得比较重要的规范有这些: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编程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 hdl语言后的小结在完成本次verilog大作业的过程中,我不仅学到了很多只靠看书本学不到的知识,而且体会到了团队协作的力量,在团队成员的合作下,经历了不少困难,终于完成了verilog的大作业,虽然过程并不是和想象中的一样,而且作业也与老师要求的有点差距,但是从中学习到了许多关于verilog的使用与仿真的基础知识,也对课上学到的语句有了更深的理解,并将其应用到了实际工程中,使自己的运用能力得到了很好的锻炼,对基本操作已经较熟练的掌握,对其中一些细节问题,如仿真时间的选取等也有了自己的理解。
实践出真知,通过在软件上反复改程序、跑程序我也学会了很多只看书本发现不了的问题,锻炼了自己的解决问题能力。
这对于今后的学习是有很大的帮助的。
以下做一下简要总结:这次的大作业是通过我们小组四个同学共同努力下完成的,其中有很多收获也有很多感受。
这次的大作业给了我们一次很好的锻炼机会,通过这次大作业,我开始熟悉用verilog设计的最基本的方法和流程,课堂上学到的东西只有自己通过应用才能加深自己的理解,课堂上学到的并不是全部,要想真正的学好这门课,只有在实践中运用才能真正的体会到这门课的精髓,这次的大作业很好的验证了。
有一个外因也是给了我们的帮助,那就是网络的强大,在这个信息的时代,互联网的作用显而易见,如果能够充分得利用网络上海量的信息,掌握一定的检索技巧,就可以获得很多有价值的东西,比如参考别人的算法和程序段,观看关于Quartus II软件的使用教程视频。
这比起关起门来自己钻研要强上不少。
对于如何使用verilog hdl写出可综合的代码真的是一件不容易的事情,而真正的可以写出可综合的代码确实还需要经过很长时间的锻炼。
而对Quartus II的使用,感觉也只会得不多,还有很多功能诸如时序分析,逻辑分析,引脚分配等都不会使用。
在完成这次大作业的过程中充分感受到自己知识的不足以及学以致用的重要性,有很多不懂的地方,要通过不断的学习来提高自己,这正验证了学海无涯这句古话。
使用Verilog语言进行FPGA设计的总结1.在使用case或casex结构进行同步状态机构建时,最后一定要有default状态,在这个状态中主要设计的是纠错程序,这个非常重要,通过这个状态可以把状态机因状态位错误而进入无效或错误的状态中拉回来,或跳出这次操作强制进入下一次操作的初始状态。
2.在使用else-else if ……-else结构时,各个条件之间必须完全是明确地互斥,任何两条件在任何时候都必须不能同时满足。
这个很重要,此重要性,虽在仿真阶段没什么大问题,但当综合成门电路以后在现实的硬件上进行运行时,就会暴露出很多缺陷,影响稳定性问题以及兼容性问题。
3.①在进行同步时序逻辑设计时,对由其他非主时钟信号沿触发的事件,采用信号沿跟踪寄存器,来及时判断沿的发生,当然这样会产生误差,最大会有一个主时钟周期;②判断沿发生的另一种方法是,使用主时钟发生两个一个周期相同的时钟信号,第二个时钟要落后于第一个时钟一个周期,当第一个时钟为高而第一个时钟为低时,说明在此之前第一个时钟有一个上升沿,第二种方法依然会有一个主时钟周期的误差。
4.在把测试模块包括在内的顶层模块的编写中,需要使用“include”来把各个子模块包含进来(被包含的文件名要写完全路径),不需要有输入输出端口列表,也不需要在模块中使用input和output进行声明,但在模块中,必须对需要引用的下层模块的输入输出变量进行声明,不管输入还是输出变量都声明成wire类型,如果不声明则均默认成位宽为1位的变量;在不包括测试模块的顶层模块中,要有输入输出列表,把所有子模块的对外输入输出在列表中体现,并且使用input和output进行声明,其中output也必须默认成wire类型的,而子模块间的输入输出变量使用wire进行一下声明就可以了,但必须要有。
5.在同步状态机设计中,要在前一状态为下一状态的关键变量进行赋值,以使在进入下一状态时,获得稳定的条件。
解读verilog代码的一点经验学习其实也不算久,开头的时候参考别人的代码并不多,大多是自己写的,那时候做时序规律多一些。
参与了中嵌的培训班,一个多月的时光在认识ISE软件的用法以及verilog语法方面下了苦功,也参考了不少书,算是为自己打下了比较好的基础。
由于那时候培训的方向是软件方面的,所以做了无数有关的模块程序,之前的日志里也发表了无数,关键是一个爱好,感觉后看到自己的一个个算法思想得到实现真有成就感。
后来停了一段时光,由于实在没有比较故意思的活干了。
直到前段时光开头用法SP306的开发板,然后会参考它们的代码,受益匪浅吧。
现在组长已经给正活干了,跟的大项目我是基本都有所认识了,然后那个里面做总控的FPGA的代码开头举行总攻了,要把前辈们的代码都消化了,然后更好的为下一代升级版的产品服务。
这个看verilog 程序估量是大家都比较头疼的事,小的模块都没问题,大模块大项目,有时候就比较难以入手了,由于HDL的设计是不同于软件编程的,软件其实无非一个大while或者再有一些中断,大多是挨次执行的,渐渐一步一步往下走总会弄明了。
HDL的并行性很强,要是你根据软件的思路来那绝对行不通,那么该怎么办呢?我就班门弄斧说点自己的一点迅速进阶的小窍门吧。
既然HDL设计是并行的,那么就只能各个击破了。
我的习惯是先抓几个重要端口,比如时钟(CLK)、复位(RESET)等浮现频率比较高的端口,把它先弄清晰,比如时钟是什么频率的?复位是高有效还是低有效? 然后呢,最好是对比原理图来理解程序。
这就需要你有一定功底的硬件常识了,一些常用器件的操作时序什么的一定要做到胸有成竹,起码要知其一二吧,这样在读程序时才会达到事半功倍的效果。
比例说你要先读懂FPGA与AD芯片的程序,那么你先把AD的各个端口(如片选,读写,转换,转换完成中断等端口)在verilog程序中浮现的地方多做一下分析,比如我找CS信号,看看什么时候它拉低有效,那么你可以在Find in file窗口中输入CS,然后ENTER,这样ISE就会在底层的信息窗口中排列出全部用法了CS信号的语句便利你的查找分析,你把每个浮现CS的地方分析到了,那么你就明了verilog在硬件上是如何操作CS信号的。
ISE14.7调试心得第一次做软件一般都是从“hello world”开始的。
第一次做硬件一般都是从LED开始的。
先做个跑马灯,熟悉一下板子和xilinx芯片以及ISE软件的使用方法。
真是悲剧~写个跑马灯,我都感觉verilog HDL编程生疏了,出现了不少问题,在此记下,希望以后不要再范了。
不过,就拿如何写testbench来说,我是会了忘忘了学学了又不会了。
这次又复习了一遍。
真的希望以后可以将自己的知识和技能的基础打牢固。
不要再有那么多琐碎和烦心的事情。
第一个程序的错误:1、posedge clk and negedge rst_n应该写为posedge clk or negedge rst_n2、posedge clk or nedge rst_n应该写为posedge clk or negedge rst_n3、module LED8(input clk_100M;input rst_n;output [0:7] LED);应该定义为:module LED8(input clk_100M,input rst_n,output [0:7] LED);将端口定义包括类型定义一起放在module后的括号内的时候,之间用逗号隔开。
4、数组假设abc[0:7],单个元素写成abc[0]而不是abc(0)。
5、100MHz分频成1Hz。
计数为1042*1024*100(27'h640_0000)。
6、两种方式定义信号端口第一种:module LED8(clk_100M,rst_n,LED);input clk_100M;input rst_n;output [0:7] LED;reg [0:7] LED;reg [0:7] choose; //Choose the LED to highlightreg [0:26] count;没错误。
第二种:module LED8(input clk_100M,input rst_n,output [0:7] LED);reg [0:7] LED;reg [0:7] choose; //Choose the LED to highlightreg [0:26] count;提示错误:ISE软件是:ERROR:HDLCompilers:27 - "LED8.v" line 34 Illegal redeclaration of 'LED'Quartus软件是:Error (10759): Verilog HDL error at LED8.v(34): object LED declared in a list of port declarations cannot be redeclared within the module body。
Verilog 开发经验总结●以硬件为基础的原则Verilog是硬件描述语言,所谓描述就是是在在描绘已经设计好的电路。
尤其是在刚开始学习HDL时,还没有能直接把语言对应到具体电路的能力,更不能上手直接写Verilog代码。
所以最优方案是先设计好硬件电路,再按照电路编写Verilog。
●模块化思想这个思想不仅仅是Verilog的开发了,就算是C语言甚至现在的超高级语言,也一直在强调封装的概念。
Verilog开发遵循的是自顶向下的模块化设计,思路基本是从最终功能不断细分,直到Verilog可以很直接地描述最基础的硬件单元,例如加法器,移位寄存器等等。
模块划分一定要尽量细,功能单一,且一定要留出使能、复位等接口以便于系统搭建。
说明以下,所谓Verilog可直接描述指的是按照规范描述出来的电路,开发工具能够很清晰地理解所要描述的功能,而不会发生误解等现象。
一个只使用编译器能理解的代码开发的电路,错误率会大大降低。
相反,如果功能划分不够清晰,使得一个模块的功能过于庞杂,不仅描述困难,编译器也可能产生很大的误解。
把握编译器的理解方式是有助于做Verilog的开发的,但这就需要一个长远的积累了,我在最后会给出一些例子。
●时序电路与逻辑电路完全分开Verilog中除了数据流模型和门级模型以外,最常用的是always即行为级模型描述电路。
一个always块可以理解为一个电路,或者实物上的一个芯片。
所以不要在一个always里杂糅时序电路和逻辑电路,那样很可能导致编译器综合出一些奇葩的结果。
时序always模块的敏感变量有且最多两个,一个是时钟边沿,一个是复位边沿,没有再多的敏感变量了。
组合逻辑always中敏感变量列表必须包含该模块所有涉及到的变量,或者直接用(*)代替,个人推荐后者。
●时序always块编写规范在时序always中,统一使用非阻塞赋值<=,因为时序always中在赋值号左侧的变量是真实的触发器,非阻塞赋值在触发时是同时赋值的,这很符合触发器在上升沿到来后同时将D输出到Q的实际情况。
ise中的verilog编译过程Verilog编译过程是将Verilog硬件描述语言转化为可执行的硬件电路的一系列步骤。
在编译过程中,Verilog代码经过词法分析、语法分析、语义分析、优化和综合等阶段的处理,最终生成硬件电路的门级表示。
首先是词法分析阶段。
这个阶段的主要任务是将Verilog代码分解为不同的词法单元,例如关键字、标识符、常量和运算符等等。
词法分析器会根据事先定义好的语法规则将代码分解,并创建相应的词法单元表供后续处理使用。
然后是语法分析阶段。
在这个阶段中,语法分析器会基于词法单元表创建语法树,用于描述代码的结构以及语法间的关系。
语法分析器会通过检查语法规则来验证代码的正确性,并生成相应的语法树。
接下来是语义分析阶段。
在这个阶段中,语义分析器会检查语法树中的语义错误,并对其进行修正。
语义分析器会验证变量的声明和使用是否一致,检查运算符的类型是否匹配,以及检查是否存在未定义的标识符等等。
如果发现错误,语义分析器会生成错误消息来帮助开发人员进行调试和修复。
完成语义分析后,接下来是优化阶段。
这个阶段的目标是对Verilog代码进行优化,以提高电路的性能和效率。
优化器会根据设定的优化策略对代码进行重组和改写,以降低功耗、提高速度和减少面积等。
最后是综合阶段。
在这个阶段中,综合器会将经过优化的Verilog 代码转换为硬件电路的门级表示。
综合器会根据目标芯片的库文件,将高级的Verilog代码映射到目标芯片的特定门级元件上。
此阶段的输出是一个电路网表,其中包含了一系列标准的逻辑门、寄存器和电气连接等信息。
综合后的电路网表可以传递给布局设计工具,用于生成芯片的物理排列和布线。
接下来是物理验证阶段,其中将进行时序分析、功耗分析和电磁兼容性分析等。
最终,完成物理验证后,可以生成该芯片的Bitstream文件,用于配置FPGA或CPLD芯片,并进行硬件验证。
需要注意的是,Verilog编译过程涉及的具体工具和步骤可能会因硬件平台、综合工具和设计需求的不同而有所变化。
基于verilog的FPGA编程经验总结(XILINXISE工具)用了半个多月的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,先不用管什么区域约束,以后进阶了再学. .。
个人总结Verilog代码编写的25条经验1、对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;2、使用有意义的信号名、端口名、函数名和参数名;3、信号名长度不要太长;4、对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;5、对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;6、对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。
注意在同一个设计中要使用同一个小写字母表示低电平有效;7、对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;8、当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示;9、尽量遵循业界已经习惯的一些约定。
如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;10、在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;11、使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。
注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;12、每一行语句独立成行。
尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。
同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;13、建议采用缩进提高续行和嵌套语句得可读性。
缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。
关于verilog的学习经验简单分享 我学verilog语言进行FPGA设计也就半年时间,很多的东西就是在网上学到的,现在想说说自己对使用verilog进行FPGA设计的一些体会,我水平不高,主要是为新手朋友们介绍自己的一点经验少走点弯路。
1、verilog语言 学习verilog最重要的不是语法,因为10%的语法就能完成90%的工作,verilog语言常用语言就是always@(),if~else,case,assign这几个了,不用去专研繁杂的语法,有些问题等你碰到了查查书就好了。
这里推荐夏雨闻老师的《verilog数字系统设计教程》,一本很适合新手的好书。
2、硬件原则 虽然verilog语言很象c语言,但它和c语言还是有本质的区别的,因为verilog进行的是硬件设计,你写出来的东西是实实在在电路,所以要有数字电路的知识是肯定的。
数字电路就是由时序电路(触发器)和组合逻辑电路(各种逻辑门)构成的,用verilog写的程序在FPGA实现就是触发器和逻辑门,所以最重要的就是你对你写的语言生成的电路心中有数,做到这一点你就不会有写出来的程序不能综合的麻烦,电路的冗余逻辑肯定也是最少的。
还要注意一点就是verilog程序是并行的,不是象c那样是顺序执行的,这是因为fpga硬件可配置,可形成不同的任务单元同时工作;而单片机这种基于通用目的,硬件结构也固定了,它处理任务只能一件一件顺序的进行。
3、同步原则 在进行FPGA设计的时候,同步原则应该是最重要的原则之一了,因为异步电路的不可控性,很可能有毛刺产生,而在芯片内部的任何一点毛刺都会一级一级的传递下去,最终影响系统的稳定性。
同步原则用一句话来总结就是不要试图产生自己的时钟,最好一个设计或者一个模块只使用同一个时钟,这样所有的触发器都在同一个时钟沿跳变,当然最稳定了,系统也能跑到很高的速度。
一个小技巧就是多使用触发器的使能端和取沿电路。
4、养成好的代码习惯 很多的细节,比如缩进、命名、参数化、组合逻辑和时序逻辑分离、注释等等,也就是大家说的代码风格。
在Xilinx ISE(集成开发环境)中,Verilog编译过程大致如下:
输入文件准备:首先,你需要准备好你的Verilog源代码文件。
这些文件通常以.v为扩展名。
打开Xilinx ISE:启动Xilinx ISE软件。
创建新项目或打开现有项目:在ISE中,你可以选择创建一个新项目,或者打开一个已存在的项目。
添加源文件:在项目设置中,将你的Verilog源文件添加到项目中。
你可以通过点击“添加源文件”按钮来添加文件,或者直接将文件拖放到项目浏览器中。
配置设置:进行必要的配置设置,包括目标FPGA设备、时钟设置等。
编译过程:点击“构建”按钮开始编译过程。
这个过程可能会花费一些时间,具体取决于你的源代码的大
小和复杂性,以及你的硬件设备。
查看编译结果:编译完成后,你可以在ISE的“日志”窗口中查看编译结果。
如果没有错误或警告,说明编译成功。
如果有错误,你需要检查源代码,修改后重新编译。
下载到FPGA:如果编译成功,你可以将生成的比特流(bitstream)下载到FPGA设备中。
你可以通过JTAG或其他接口来完成这个过程。
测试和验证:最后,你需要测试和验证FPGA上的功能是否正确。
你可以使用仿真工具,或者实际测试硬件设备的行为。
请注意,这是一个非常基础的概述,实际的编译过程可能会根据具体的项目需求和硬件设备有所不同。
如果你在编译过程中遇到问题,可以参考Xilinx的官方文档或者寻求更具体的帮助。
学verilog小结第一篇:学verilog小结学习verilog一段时间小结学习verilog, verilog, verilog小结一:基本Verilog中的变量有线网类型和寄存器类型。
线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。
二:verilog语句结构到门级的映射1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。
因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。
Assign语句中的延时综合时都将忽视。
2、过程性赋值:过程性赋值只出现在always语句中。
阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。
建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。
过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。
如,时钟控制下的非阻塞赋值综合成flip-flop。
过程性赋值语句中的任何延时在综合时都将忽略。
建议同一个变量单一地使用阻塞或者非阻塞赋值。
3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门4、算术操作符:Verilog中将reg视为无符号数,而integer视为有符号数。
因此,进行有符号操作时使用integer,使用无符号操作时使用reg。
5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。
如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。
6、关系运算符:关系运算符:,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。
7、相等运算符:==,!= 注意:===和!==是不可综合的。
可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。
verilog语法学习心得
1.数字电路基础知识:布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计
2.数字系统的构成:传感器 AD 数字处理器 DA 执行部件
3.程序通在硬件上的执行过程:
C语言(经过编译)--﹥该处理器的机器语言(放入存储器)--﹥按时钟的节拍,逐条取出指令、分析指令、执行指令
4.DSP处理是个广泛概念,统指在数字系统中做的变换(DFT)、滤波、编码解码、加密解密、压缩解压等处理
5.数字处理器包括两部分:高速数据通道接口逻辑、高速算法电路逻辑
6.当前,IC产业包括IC制造和IC设计两部分,IC设计技术发展速度高于IC设计
7.FPGA设计的前续课程:数值分析、DSP、C语言、算法与数据结构、数字电路、HDL语言计算机微体系结构
8.数字处理器处理性能的提高:软件算法的优化、微体系结构的优化
......。
赛灵思Verilog(FPGA/CPLD)设计技巧以下是一个在设计中常犯的错误列表这些错误常使得你的设计不可靠或速度较慢为了提高你的设计性能和提高速度的可靠性你必须确定你的设计通过所有的这些检查。
可靠性为时钟信号选用全局时钟缓冲器BUFG不选用全局时钟缓冲器的时钟将会引入偏差。
只用一个时钟沿来寄存数据使用时钟的两个沿是不可靠的因为时钟的某沿或者两个沿会漂移; 如果时钟有漂移而且你只使用了时钟的一个沿你就降低了时钟边沿漂移的风险。
这个问题可以这样来解决就是允许CLKDLL自动纠正时钟的占空比以达百分之五十的占空比否则强烈建议你只使用一个时钟沿除了用CLKDLL或DCM产生的时钟外不要在内部产生时钟.这包括产生门控时钟和分频时钟作为替代可以建立时钟使能或使用CLKDLL或DCM来产生不同的时钟信号。
对于一个纯同步设计建议你在任何可能的情况下只使用一个时钟可靠性为时钟信号选用全局时钟缓冲器BUFG不选用全局时钟缓冲器的时钟将会引入偏差。
只用一个时钟沿来寄存数据使用时钟的两个沿是不可靠的因为时钟的某沿或者两个沿会漂移; 如果时钟有漂移而且你只使用了时钟的一个沿你就降低了时钟边沿漂移的风险。
这个问题可以这样来解决就是允许CLKDLL自动纠正时钟的占空比以达百分之五十的占空比否则强烈建议你只使用一个时钟沿除了用CLKDLL或DCM产生的时钟外不要在内部产生时钟.这包括产生门控时钟和分频时钟作为替代可以建立时钟使能或使用CLKDLL或DCM来产生不同的时钟信号。
对于一个纯同步设计建议你在任何可能的情况下只使用一个时钟不要在内部产生异步的控制信号例如复位信号或者置位信号内部产生的异步控制信号会产生毛刺作为替代可以产生一个同步的复位/置位信号这个信号的译码要比需要作用的时刻提前一个时钟周期不要使用没有相位关系的多个时钟你也许并不总能避免这个条件在这些情况下确定你已。
verilog教程--------关键路径的选取!, 我的编程经历!这是一篇我的心得,写verilog的心得,啊,对于学习verilog设计FPGA的同学一定会有帮助的啊!本人就例子来教大家怎样提取关键路径:先解释一下什么叫关键路径所谓关键路径就是,在电路中频繁调用,而且延迟过长,或者产生意外的几率比较大的线路。
1:组合电路中的关键路径提取:q=a&b&c|d&e&b;这个很简单了,估计大家都会的,因为b的传输要两级,可以简单的提取b作为一级的:q=(a&c|d&e)&b2: always——block中的关键路径提取:always中关键路径的提取一般用分步法提取,请看下面一个always——block,always@(in)beginif(!a)if(c&&(!b&&e))out=out1;else out=out2;else if(b&&e) out =out1;end这里面e是关键路径,我们可以分两个步骤提取关键路径(1)当e=1的时候有:if(!a)if(c&&(!b))out=out1;else out=out2;(2)当e=0的时候有:if(!a) out=out2;因此这个always可以写成这个样子:always@(in)beginif(e)if(!a)if(c&&(!b))out=out1;else out=out2;else if(!a) out=out2;end这是中间形式,还要写成最终形式:定义两个临时变量,为了在综合时候,被综合掉,要定义他们为输出端口(output)——切记!!!output out_temp1,out_temp2;out_temp1=a?out:(c&&(!b))?out1:out2;out_temp2=a?out:out2;assign out=e?out_temp1:out_temp2;好了,这个已经提取成功!~再来看第三个例子,在应用中经常用到的啊3。
针对赛灵思ISE工具的verilog编程经验小结
用了半个多月的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好用, 而且貌似一旦测试信号太。