ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:48.07KB ,
资源ID:10880252      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10880252.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FPGA经验之谈汇总.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

FPGA经验之谈汇总.docx

1、FPGA经验之谈汇总FPGA设计要点之一:时钟树对于FPGA来说,要尽可能避免异步设计,尽可能采用同步设计。 同步设计的第一个关键,也是关键中的关键,就是时钟树。 一个糟糕的时钟树,对FPGA设计来说,是一场无法弥补的灾难,是一个没有打好地基的大楼,崩溃是必然的。 具体一些的设计细则: 1)尽可能采用单一时钟; 2)如果有多个时钟域,一定要仔细划分,千万小心; 3)跨时钟域的信号一定要做同步处理。对于控制信号,可以采用双采样;对于数据信号,可以采用异步fifo。需要注意的是,异步fifo不是万能的,一个异步fifo也只能解决一定范围内的频差问题。 4)尽可能将FPGA内部的PLL、DLL利用起

2、来,这会给你的设计带来大量的好处。 5)对于特殊的IO接口,需要仔细计算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管脚可设置的delay等多种工具来实现。简单对管脚进行Tsu、Tco、Th的约束往往是不行的。FPGA设计要点之二:FSM关于上期的时钟树,可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。 FSM:有限状态机。这个可以说时逻辑设计的基础。几乎稍微大一

3、点的逻辑设计,几乎都能看得到FSM。 FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。实际使用中大部分都采用merly型。 FSM通常有2种写法:单进程、双进程。 初学者往往喜欢单进程写法,格式如下: always ( posedge clk or posedge rst ) begin if ( rst = 1b1 ) FSM_status = .; else case ( FSM_status ) .; endcase end 简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。 优点: 1)看起来比较简单明了,写起来也不用

4、在每个case分支或者if分支中写全对各个信号和状态信号的处理。也可以简单在其中加入一些计数器进行计数处理。 2)所有的输出信号都已经是经过D触发器锁存了。 缺点: 1)优化效果不佳。由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。 2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。 双进程FSM,格式如下: always ( posedge clk or posedge rst ) begin if ( rst = 1b1 ) FSM_stat

5、us_current = .; else FSM_status_current = FSM_status_next; always (*) begin case ( FSM_status_current ) FSM_status_next = .; endcase end 从上面可以看到,同步处理和异步处理分别放到2个always中。其中FSM状态变量也采用2个来进行控制。双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。这里描述起来太费劲。 优点: 1)编译器优化效果明显,可以得到很理想的速度和资源占用率。 2)所有的输出信号(除了FSM_status_current)都是组合

6、输出的,比单进程FSM快。 缺点: 1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。 2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现 latch。 latch会导致如下问题: 1)功能仿真结果和后仿不符; 2)出现无法测试的逻辑; 3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感; 4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。 这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加

7、载上去后,整个FPGA给炸飞了。后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。FPGA设计之三:LATCH首先回答一下: 1)stateCAD没有用过,不过我感觉用这个东东在构建大的系统的时候似乎不是很方便。也许用system C或者system Verilog更好一些。 2)同步、异步的叫法是我所在公司的习惯叫法,不太对,不过已经习惯了,呵呵。 这次讲一下latch。 latch的危害已经说过了,这里不再多说,关键讲一下如何避免。 1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。 always ( *

8、 ) begin if ( sig_a = 1b1 ) sig_b = sig_c; end 这个是绝对会产生latch的。 正确的应该是 always ( * ) begin if ( sig_a = 1b1 ) sig_b = sig_c; else sig_b = sig_d; end 另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。 always ( * ) begin if ( rst = 1b1 ) counter = 32h00000000; else counter = counter + 1; end 但如

9、果是时序逻辑进程,则不存在该问题。 2)case语句的default一定不能少! 原因和if语句相同,这里不再多说了。 需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。 3)组合逻辑进程敏感变量不能少也不能多。 这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。 顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。 到年底了,工作越来越紧了,可能后续的日志写作时间会不

10、规律且长度不定,请大家谅解啊! 另外,有空请各位多推荐推荐,拜谢!TONY的工作经验在公司里的几个月,做的项目其实不多,但是收获还是有一些,我觉得收获最大的是设计理念的改变,这也是我这段时间最想总结的,我会在后面逐渐阐述。 版权所有,未经作者允许,禁止用于商业性质的转载;如对此文有疑问或想给作者提建议请给作者发email:wangdian 时序是设计出来的 我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中,给我感触最深的是华为的那句话:时序是设计出来的,不是仿出来的,更不是湊出来的。

11、在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工作。以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作所占的时间要远大于编码的时间。 总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求把接口信号的时序波形描述出来)以及将来如何测试设计。在这一级方案中,要保证在今后的设计中时序要收敛到一级模块(最后是在二级模块中)。什么意思呢?我们在做详细设计的时候,对于一些信号的时序肯定会做一些调整的,但是这种时序的调整最多只能波及到本一级模块,而不能影响到整个设计。

12、记得以前在学校做设计的时候,由于不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号的时序也改一下,搞得人很郁闷。 在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了,各级模块内部是怎么实现的也基本上确定下来了。 由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计会一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。规范很重要 工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码

13、,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。 在逻辑方面,我觉得比较重要的规范有这些: 1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。 2.代码规范。 a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我们可以这么写: parameterCLK_PERIO

14、D = 30; parameterRST_MUL_TIME = 5; parameterRST_TIME = RST_MUL_TIME * CLK_PERIOD; . rst_n = 1b0; # RST_TIME rst_n = 1b1; . # CLK_PERIOD/2 clk | | | / clk | - | - - 10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_1xclk的速率发送数据。

15、不要这样做: always (posedge rs232_1xclk or negedge rst_n) begin . end 而要这样做: always (posedge clk_25m or negedge rst_n) begin . else if ( rs232_1xclk = 1b1 ) . end 11)状态机要写成3段式的(这是最标准的写法),即 . always (posedge clk or negedge rst_n) . current_state = next_state; . always (current_state .) . case(current_stat

16、e) . s1: if . next_state = s2; . . always (posedge clk or negedge rst_n) . else a = 1b0; c = 1b0; c = 1b0; /赋默认值 case(current_state) s1: a = 1b0; /由于上面赋了默认值,这里就不用再对b、c赋值了 s2: b = 1b1; s3: c = 1b1; default: . . 3.ALTERA参考设计准则 1) Ensure Clock, Preset, and Clear configurations are free of glitches. 2)

17、Never use Clocks consisting of more than one level of combinatorial logic. 3) Carefully calculate setup times and hold times for multi-Clock systems. 4) Synchronize signals between flipflops in multi-Clock systems whenthe setup and hold time requirements cannot be met. 5) Ensure that Preset and Clea

18、r signals do not contain race conditions. 6) Ensure that no other internal race conditions exist. 7) Register all glitch-sensitive outputs. 8) 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 pi

19、n to clear all flipflops. 11)Remove any stuck states from state machines or synchronous logic. 其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。如何提高电路工作频率 对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率指FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提高电路的工作频率。 我们先来分析下是什么影响了电路的工作频率。 我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew有关。在FPGA内部如果时钟走长线的话,clock skew很小,基本上可以忽略, 在这里为了简单起见,我们只考虑信号的传播时延的因素。 信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率,我们就要在这三个时延中做文章,使其尽可能的小。 我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。 1.通过改变走线的方式减少时延。 以altera的器件为例,我们在quartus

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1