Verilog经验谈

合集下载

每天多学一点:Verilog编写技巧(一)

每天多学一点:Verilog编写技巧(一)

每天多学一点:Verilog编写技巧(一)来源:网路素材好的设计者一般都要对电路要实现的功能有清晰的认识,对数据流很清楚,知道数据如何从一个点移动到另一个点,这就是所谓的“勾划”(walk-through)。

一旦设计蓝图在脑海中变得清晰,此后釆用Verilog编写数据路径和控制逻辑就会变得思路清晰。

脑海中的模拟正如大多数人玩过的象棋游戏,我们都知道提前谋划是何等重要,要在下一次移动棋子之前考虑好此后的几步棋应该怎么走,以确保不会出错,不被对手捕捉到机会。

电路设计过程与下棋非常相似。

当设计状态机、数据路径或者控制逻辑时,我们知道它们的功能。

在进行设计仿真之前,我们需要思考代码在不同输入和边界条件下如何工作。

如果用心去做好这一步工作,并且分析可能出现的问题,验证工作将会变得非常高效。

另外,这一步也给我们建立了自信,使我们确信整个设计非常扎实,可以很好地工作。

否则很可能出现的情况是在验证阶段反复发现问题并进行电路修改,不断进行补救T.作,并且最终也不能确定设计足否还隐含着没有被发现的问题。

哪种风格—数据流或算法描述组合逻辑有两种方式—使用wire(对应数据流描述方式)或者使用reg(对应算法描述方式)。

这两种方式都能实现相同的逻辑功能,综合后得到相同的门电路,具体使用哪一种方式可以根据个人喜好。

数据流—短表达式举例wire [7:0] regl0_nxt;assign regl0_nxt = wren ? data_in : regl0;算法—短表达式举例reg [7:0] regl0_nxt;always @(*) beginreglO_nxt = reglO;if (wren)regl0_nxt = data_in;end当表达式非常简单时,一般更倾向于使用数据流风格来实现,此时代码行数很少。

然而,当表达式很长并且与很多条件有关时,数据流风格阅读起来较为费力。

此时可以使用算法风格,可以采用if-else 语句进行描述,以易于阅读和减少错误发生。

verilog课程期末总结

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条经验

个人总结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设计阶段总结

用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,搞到了半夜两点。

我记得计算机组织与结构里面有一章是关于乘法的,里面讲的是用布斯算法,看了半天,觉得在程序中这样实现太麻烦,肯定有更简单的方法。

verilog学习经验

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可以用状态机控制,状态机可以打圈,定义一个计数器,做为循环的索引。
动态次数的循环,用一个寄存器记录处理的次数,再加一个状态信号判结束。

verilog中阻塞赋值与非阻塞赋值的方法总结

verilog中阻塞赋值与非阻塞赋值的方法总结

verilog中阻塞赋值与⾮阻塞赋值的⽅法总结
今天开始写博客了。

写博客的⽬的有两点:(1)将每天学的知识进⾏总结,代替做纸质笔记,每次可以通过⼿机对以前学的知识进⾏巩固,这样效率⽐较⾼;(2)我会陆续将⾃⼰做的⼀些项⽬经验在博客中进⾏分享,与⼴⼤博友⼀起学习成长!⼤家对内容有疑问或者⾃⼰的想法请在博客下⾯留⾔,我乐意与⼤家探讨相关的问题。

原则1:时序电路建模时,⽤⾮阻塞赋值。

原则2:锁存器电路建模时,⽤⾮阻塞赋值。

原则3:⽤always块描述组合逻辑时,⽤阻塞赋值语句。

原则4:在同⼀个always块中描述时序和组合逻辑混合电路时,⽤⾮阻塞赋值。

原则5:不要在同⼀个always块中同时使⽤阻塞赋值和⾮阻塞赋值。

原则6:严禁在不同always中对同⼀个变量赋值。

//容易产⽣竞争冒险
原则7:对某⼀个变量同时采⽤⾮阻塞赋值时,只要最后那次赋值对变量有作⽤。

***********这就是阻塞赋值与⾮阻塞赋值的原则,只要把这7条理解到位了,编写verilog代码者的没有什么难度。

我个⼈是这么理解赋值原则的:1)⽤assign进⾏赋值只能是阻塞赋值 2)always中,如果只有组合逻辑电路,就⽤阻塞赋值;只要是有时序逻辑电路,全部就要⾮阻塞赋值(认真体会这段话就好了)************
今天暂时写这些,后⾯接着写⾃⼰在数字系统设计⽅⾯的⼼得体会。

初学者学习Verilog HDL的步骤和经验技巧

初学者学习Verilog HDL的步骤和经验技巧Verilog HDL是一种硬件描述语言(HDL:Hardware DiscripTIon Language),Verilog HDL语言是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

Verilog HDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。

前者由Gateway Design AutomaTIon公司(该公司于1989年被Cadence 公司收购)开发。

两种HDL均为IEEE标准Verilog HDL语言学习用途就是在最广泛的C语言的基础上发展起来的一种件描述语言,它是由GDA(Gateway Design AutomaTIon)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。

1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得Verilog HDL迅速得到推广应用。

1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。

1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995.Verilog HDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把Verilog HDL内容安排在与ASIC设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路的经验。

与之相比,VHDL的学习要困难一些。

但Verilog HDL较**的语法,也容易造成初学者犯一些错误,这一点要注意。

verilog设计经验浅谈

因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module. 比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register, 如果是,它的clock是什么? D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。

同样,Verilog中没有“编译”的概念,而只有综合的概念。

verilog设计经验浅谈1,敏感变量的描述完备性V erilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always@(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。

如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。

这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。

综合器会发出警告。

Example1:input a,b,c;reg e,d;always @(a or b or c)begine=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/d=e |c;endExample2:input a,b,c;reg e,d;always @(a or b or c or d)begine=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/d=e |c;end2, 条件的描述完备性如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。

Verilog 开发经验总结说明书

Verilog 开发经验总结●以硬件为基础的原则Verilog是硬件描述语言,所谓描述就是是在在描绘已经设计好的电路。

尤其是在刚开始学习HDL时,还没有能直接把语言对应到具体电路的能力,更不能上手直接写Verilog代码。

所以最优方案是先设计好硬件电路,再按照电路编写Verilog。

●模块化思想这个思想不仅仅是Verilog的开发了,就算是C语言甚至现在的超高级语言,也一直在强调封装的概念。

Verilog开发遵循的是自顶向下的模块化设计,思路基本是从最终功能不断细分,直到Verilog可以很直接地描述最基础的硬件单元,例如加法器,移位寄存器等等。

模块划分一定要尽量细,功能单一,且一定要留出使能、复位等接口以便于系统搭建。

说明以下,所谓Verilog可直接描述指的是按照规范描述出来的电路,开发工具能够很清晰地理解所要描述的功能,而不会发生误解等现象。

一个只使用编译器能理解的代码开发的电路,错误率会大大降低。

相反,如果功能划分不够清晰,使得一个模块的功能过于庞杂,不仅描述困难,编译器也可能产生很大的误解。

把握编译器的理解方式是有助于做Verilog的开发的,但这就需要一个长远的积累了,我在最后会给出一些例子。

●时序电路与逻辑电路完全分开Verilog中除了数据流模型和门级模型以外,最常用的是always即行为级模型描述电路。

一个always块可以理解为一个电路,或者实物上的一个芯片。

所以不要在一个always里杂糅时序电路和逻辑电路,那样很可能导致编译器综合出一些奇葩的结果。

时序always模块的敏感变量有且最多两个,一个是时钟边沿,一个是复位边沿,没有再多的敏感变量了。

组合逻辑always中敏感变量列表必须包含该模块所有涉及到的变量,或者直接用(*)代替,个人推荐后者。

●时序always块编写规范在时序always中,统一使用非阻塞赋值<=,因为时序always中在赋值号左侧的变量是真实的触发器,非阻塞赋值在触发时是同时赋值的,这很符合触发器在上升沿到来后同时将D输出到Q的实际情况。

关于verilog的学习经验简单分享

关于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、养成好的代码习惯 很多的细节,比如缩进、命名、参数化、组合逻辑和时序逻辑分离、注释等等,也就是大家说的代码风格。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变 所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。
1.通过改变走线的方式减少时延。 以altera的器件为例,我们在quartus里面的timing closure floorplan可以看 很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表1个LAB,每 有8个或者是10个LE。它们的走线时延的关系如下:同一个LAB中(最快) < 同 行 < 不同行且不同列。 我们通过给综合器加适当的约束(不可贪心,一般以加5%裕量较为合适,比如 工作在100Mhz,则加约束加到105Mhz就可以了,贪心效果反而不好,且极大增
|
|/
clk | --------
|
----
------------------------------------
10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方
,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分
复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,
...
s1:
if ...
next_state = s2;
...
...
always @(posedge clk or negedge rst_n)
...
else
a <= 1'b0;
c <= 1'b0;பைடு நூலகம்
c <= 1'b0;
//赋默认值
case(current_state)
s1:
a <= 1'b0; //由于上面赋了默认值,这里就不用再对b
间)可以将相关的逻辑在布线时尽量布的靠近一点,从而减少走线的时延。(注: 的实现不完全是通过改进布局布线方式去提高工作频率,还有其它的改进措施)
2.通过减少组合逻辑的减少时延。 上面我们讲了可以通过加约束来提高工作频率,但是我们在做设计之初可万万不 将提高工作频率的美好愿望寄托在加约束上,我们要通过合理的设计去避免出现大 合逻辑,从而提高电路的工作频率,这才能增强设计的可移植性,才可以使得我们 计在移植到另一同等速度级别的芯片时还能使用。 我们知道,目前大部分FPGA都基于4输入LUT的,如果一个输出对应的判断条 四输入的话就要由多个LUT级联才能完成,这样就引入一级组合逻辑时延,我们要 合逻辑,无非就是要输入条件尽可能的少,,这样就可以级联的LUT更少,从而减 合逻辑引起的时延。 我们平时听说的流水就是一种通过切割大的组合逻辑(在其中插入一级或多级D 器,从而使寄存器与寄存器之间的组合逻辑减少)来提高工作频率的方法。比如一 位的计数器,该计数器的进位链很长,必然会降低工作频率,我们可以将其分割成 8位的计数,每当4位的计数器计到15后触发一次8位的计数器,这样就实现了计数 割,也提高了工作频率。 在状态机中,一般也要将大的计数器移到状态机外,因为计数器这东西一般是经 是大于4输入的,如果再和其它条件一起做为状态的跳变判据的话,必然会增加LU 联,从而增大组合逻辑。以一个6输入的计数器为例,我们原希望当计数器计到1 状态跳变,现在我们将计数器放到状态机外,当计数器计到111011后产生个ena 去触发状态跳变,这样就将组合逻辑减少了。
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_PERIO 新例化就行了,从而使得代码更加易于重用。
...
end
11)状态机要写成3段式的(这是最标准的写法),即
...
always @(posedge clk or negedge rst_n)
...
current_state <= next_state;
...
always @ (current_state ...)
...
case(current_state)
上面说的都是可以通过流水的方式切割组合逻辑的情况,但是有些情况下我们是 难去切割组合逻辑的,在这些情况下我们又该怎么做呢?
状态机就是这么一个例子,我们不能通过往状态译码组合逻辑中加入流水。如果 们的设计中有一个几十个状态的状态机,它的状态译码逻辑将非常之巨大,毫无疑 这极有可能是设计中的关键路径。那我们该怎么做呢?还是老思路,减少组合逻辑 们可以对状态的输出进行分析,对它们进行重新分类,并根据这个重新定义成一组 状态机,通过对输入进行选择(case语句)并去触发相应的小状态机,从而实现了将 状态机切割成小的状态机。在ATA6的规范中(硬盘的标准),输入的命令大概有 ,每一个命令又对应很多种状态,如果用一个大的状态机(状态套状态)去做那是 想象的,我们可以通过case语句去对命令进行译码,并触发相应的状态机,这样 这一个模块的频率就可以跑得比较高了。
6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允
,比如配置寄存器就是这种类型。
7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。
所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也
是极有好处的。
9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在
我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew 。在FPGA内部如果时钟走长线的话,clock skew很小,基本上可以忽略, 在这里 单起见,我们只考虑信号的传播时延的因素。
信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样 分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作 ,我们就要在这三个时延中做文章,使其尽可能的小。
Verilog经验谈
规范很重要
工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软 还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范 话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘 更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计 果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可 性。
1xclk的速率发送数据。
不要这样做:
always (posedge rs232_1xclk or negedge rst_n)
begin
...
end
而要这样做:
always (posedge clk_25m or negedge rst_n)
begin
...
else if ( rs232_1xclk == 1'b1 )
只能波及到本一级模块,而不能影响到整个设计。记得以前在学校做设计的时候, 不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号 序也改一下,搞得人很郁闷。
在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来 ,各级模块内部是怎么实现的也基本上确定下来了。
由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计 一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。
b.信号命名要规范化。 1) 信号名一律小写,参数用大写。 2) 对于低电平有效的信号结尾要用_n标记,如rst_n。 3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来 个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:
module a( //input clk,
、c赋值了(b、c在该状态为0,不会产生锁存器,下同)
s2:
b <= 1'b1;
s3:
c <= 1'b1;
default:
...
...
3.ALTERA参考设计准则 1) Ensure Clock, Preset, and Clear configurations are free of glitc es. 2) Never use Clocks consisting of more than one level of combina al logic. 3) Carefully calculate setup times and hold times for multi-Clock stems. 4) Synchronize signals between flipflops in multi-Clock systems w the setup and hold time requirements cannot be met. 5) Ensure that Preset and Clear signals do not contain race condi ns. 6) Ensure that no other internal race conditions exist. 7) Register all glitch-sensitive outputs. Synchronize all asynchronous inputs. 9) Never rely on delay chains for pin-to-pin or internal delays. 10)Do not rely on Power-On Reset. Use a master Reset pin to cle l flipflops. 11)Remove any stuck states from state machines or synchronous
相关文档
最新文档