FPGA经验之谈汇总Word格式文档下载.docx

上传人:b****4 文档编号:6842079 上传时间:2023-05-07 格式:DOCX 页数:35 大小:48.07KB
下载 相关 举报
FPGA经验之谈汇总Word格式文档下载.docx_第1页
第1页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第2页
第2页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第3页
第3页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第4页
第4页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第5页
第5页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第6页
第6页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第7页
第7页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第8页
第8页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第9页
第9页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第10页
第10页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第11页
第11页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第12页
第12页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第13页
第13页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第14页
第14页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第15页
第15页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第16页
第16页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第17页
第17页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第18页
第18页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第19页
第19页 / 共35页
FPGA经验之谈汇总Word格式文档下载.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

FPGA经验之谈汇总Word格式文档下载.docx

《FPGA经验之谈汇总Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《FPGA经验之谈汇总Word格式文档下载.docx(35页珍藏版)》请在冰点文库上搜索。

FPGA经验之谈汇总Word格式文档下载.docx

初学者往往喜欢单进程写法,格式如下:

always 

@(posedgeclkorposedgerst)

begin

if 

(rst==1'

b1)

FSM_status<

=......;

else

case 

(FSM_status)

......;

endcase

end

简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。

优点:

1)看起来比较简单明了,写起来也不用在每个case分支或者if分支中写全对各个信号和状态信号的处理。

也可以简单在其中加入一些计数器进行计数处理。

2)所有的输出信号都已经是经过D触发器锁存了。

缺点:

1)优化效果不佳。

由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。

单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。

2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。

双进程FSM,格式如下:

if(rst==1'

FSM_status_current<

=...;

=FSM_status_next;

@(*)

(FSM_status_current)

FSM_status_next=......;

从上面可以看到,同步处理和异步处理分别放到2个always中。

其中FSM状态变量也采用2个来进行控制。

双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。

这里描述起来太费劲。

1)编译器优化效果明显,可以得到很理想的速度和资源占用率。

2)所有的输出信号(除了FSM_status_current)都是组合输出的,比单进程FSM快。

1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。

2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现

latch。

latch会导致如下问题:

1)功能仿真结果和后仿不符;

2)出现无法测试的逻辑;

3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感;

4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。

这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加载上去后,整个FPGA给炸飞了。

后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。

FPGA设计之三:

LATCH

首先回答一下:

1)stateCAD没有用过,不过我感觉用这个东东在构建大的系统的时候似乎不是很方便。

也许用systemC或者system

Verilog更好一些。

2)同步、异步的叫法是我所在公司的习惯叫法,不太对,不过已经习惯了,呵呵。

这次讲一下latch。

latch的危害已经说过了,这里不再多说,关键讲一下如何避免。

1)在组合逻辑进程中,if语句一定要有else!

并且所有的信号都要在if的所有分支中被赋值。

@(*) 

if(sig_a==1'

b1) 

sig_b=sig_c;

这个是绝对会产生latch的。

正确的应该是

else 

sig_b=sig_d;

另外需要注意,下面也会产生latch。

也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。

counter= 

32'

h00000000;

counter=counter+1;

但如果是时序逻辑进程,则不存在该问题。

2)case语句的default一定不能少!

原因和if语句相同,这里不再多说了。

需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。

3)组合逻辑进程敏感变量不能少也不能多。

这个问题倒不是太大,verilog2001语法中可以直接用*搞定了。

顺便提一句,latch有弊就一定有利。

在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。

不过在我们平时的设计中,对latch还是要尽可能的敬而远之。

到年底了,工作越来越紧了,可能后续的日志写作时间会不规律且长度不定,请大家谅解啊!

另外,有空请各位多推荐推荐,拜谢!

TONY的工作经验

在公司里的几个月,做的项目其实不多,但是收获还是有一些,我觉得收获最大的是

设计理念的改变,这也是我这段时间最想总结的,我会在后面逐渐阐述。

 

版权所有,未经作者允许,禁止用于商业性质的转载;

如对此文有疑问或想给作者提

建议请给作者发email:

wangdian@ 

1时序是设计出来的

我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑

的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。

在工作这几个月中

,给我感触最深的是华为的那句话:

时序是设计出来的,不是仿出来的,更不是湊出来

的。

在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工

作。

以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细

设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作

所占的时间要远大于编码的时间。

总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求

把接口信号的时序波形描述出来)以及将来如何测试设计。

在这一级方案中,要保证在

今后的设计中时序要收敛到一级模块(最后是在二级模块中)。

什么意思呢?

我们在做

详细设计的时候,对于一些信号的时序肯定会做一些调整的,但是这种时序的调整最多

只能波及到本一级模块,而不能影响到整个设计。

记得以前在学校做设计的时候,由于

不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号的时

序也改一下,搞得人很郁闷。

在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了

,各级模块内部是怎么实现的也基本上确定下来了。

由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计会

一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。

2规范很重要

工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件

还是硬件),不按照规范走几乎是不可实现的。

逻辑设计也是这样:

如果不按规范做的

话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,

更不要说检错了;

如果一个项目做了一半一个人走了,接班的估计得从头开始设计;

果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用

性。

在逻辑方面,我觉得比较重要的规范有这些:

1.设计必须文档化。

要将设计思路,详细实现等写入文档,然后经过严格评审通过

后才能进行下一步的工作。

这样做乍看起来很花时间,但是从整个项目过程来看,绝对

要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。

2.代码规范。

a.设计要参数化。

比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我

们可以这么写:

parameter 

CLK_PERIOD=30;

RST_MUL_TIME=5;

RST_TIME=RST_MUL_TIME*CLK_PERIOD;

...

rst_n=1'

b0;

#RST_TIMErst_n=1'

b1;

#CLK_PERIOD/2clk<

=~clk;

如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重

新例化就行了,从而使得代码更加易于重用。

b.信号命名要规范化。

1)信号名一律小写,参数用大写。

2)对于低电平有效的信号结尾要用_n标记,如rst_n。

3)端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪

个模块去的关系排列,这样在后期仿真验证找错时后 

方便很多。

如:

modulea(

//input

clk,

rst_n, 

//globlesignal

wren,

rden,

avalon_din, 

//relatedtoavalonbus

sdi, 

//relatedtoserialportinput

//output

data_ready,

avalon_dout,//relatedtoavalonbus

);

4)一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en

tity。

在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔

离。

这样做可以让综合器综合出更优的结果。

5)尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止

出现任何胶连逻辑(gluelogic),哪怕仅仅是对某个信号取反。

理由同上。

6)在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的

,比如配置寄存器就是这种类型。

7)一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。

8)所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也

是极有好处的。

9)除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要

用到门控时钟的地方,也要将门控信号用时钟的下降沿打一拍再输出与时钟相与。

clk_gate_en 

-------- 

----

-----------------|D 

Q|------------------| 

\gate_clk_out

 

---------| 

)---------

------o|>

/

clk 

-------- 

------------------------------------

10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式

,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的

复杂性。

如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_

1xclk的速率发送数据。

不要这样做:

always(posedgers232_1xclkornegedgerst_n)

begin

end

而要这样做:

always(posedgeclk_25mornegedgerst_n)

elseif(rs232_1xclk==1'

11)状态机要写成3段式的(这是最标准的写法),即

always@(posedgeclkornegedgerst_n)

current_state<

=next_state;

always@(current_state...)

case(current_state)

s1:

if...

next_state=s2;

else

a<

=1'

c<

//赋默认值

case(current_state)

//由于上面赋了默认值,这里就不用再对b、c赋值了

s2:

b<

s3:

default:

...

3.ALTERA参考设计准则

1)EnsureClock,Preset,andClearconfigurationsarefreeofglitch

es.

2)NeveruseClocksconsistingofmorethanonelevelofcombinatori

allogic.

3)Carefullycalculatesetuptimesandholdtimesformulti-Clocksy

stems.

4)Synchronizesignalsbetweenflipflopsinmulti-Clocksystemswhen

thesetupandholdtimerequirementscannotbemet.

5)EnsurethatPresetandClearsignalsdonotcontainraceconditio

ns.

6)Ensurethatnootherinternalraceconditionsexist.

7)Registerallglitch-sensitiveoutputs.

8)Synchronizeallasynchronousinputs.

9)Neverrelyondelaychainsforpin-to-pinorinternaldelays.

10)DonotrelyonPower-OnReset.UseamasterResetpintoclearal

lflipflops.

11)Removeanystuckstatesfromstatemachinesorsynchronouslogic.

其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。

3/如何提高电路工作频率

对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明

,工作频率指FPGA片内的工作频率)尽量高。

我们也经常听说用资源换速度,用流水的

方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提

高电路的工作频率。

我们先来分析下是什么影响了电路的工作频率。

我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clockskew有关

在FPGA内部如果时钟走长线的话,clockskew很小,基本上可以忽略,在这里为了简

单起见,我们只考虑信号的传播时延的因素。

信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划

分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率

,我们就要在这三个时延中做文章,使其尽可能的小。

我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,

所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。

1.通过改变走线的方式减少时延。

以altera的器件为例,我们在quartus

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2