FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢_第1页
FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢_第2页
FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢_第3页
FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢_第4页
FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢?今天有个小伙伴遇到一个问题,就是在viv(ad)o里面综合后看到的建立时间和保持时间裕量都是inf,我们来看看怎么解决这个问题。

实验一:

module(te)stMem(inputclk,input[9:0]addr,inputwe,input[7:0]wdata,outputreg[7:0]rdata);reg[7:0]mem[1023:0];reg[7:0]data;reg[7:0]data1;reg[7:0]data2;reg[7:0]data3;always@(posedgeclk)beginif(we)beginmem[addr]

时序约束如下:

create_clock-period5.000-namesys_clk[get_portsclk]set_property-dict{PACKAGE_(PI)NU18(IOS)TANDARDLVCMOS33}[get_portsclk]

代码非常简单,大家一看就可以知道,这段代码会被映射到一个Bram上。综合后的资源报告也印证了我们的想法:

但是看时序分析:

是不是感觉很奇怪明明我们约束(时钟)了,为什么时序分析后是inf呢,我们来看一下他综合后的框图就明白了。

可以看到在上图里面,clk只和bram的时钟管脚相连,这种情况下怎么做时序分析嘛,一般我们在片内做的时序分析都是一个(寄存器)到另一个寄存器的。

时序分析一共四种模型,可以参考下面四张图,分别是InputtoFlip-flopPath,Flip-floptoOutputPath,Flip-floptoFlip-flopPath,InputtoOutputPath图片来源于Stat(ic)(Ti)mingAnalysisf(or)

NanometerDesigns也就是静态时序分析圣经,这本必读哦。

实验二:

那怎么改变,vivado计算出来是inf呢,首先给输入输出加上

(*DONT_TOUCH="yes"*)

这个约束看看,代码就变成了下面这个样子

moduletestMem(

input

clk,(*DONT_TOUCH="yes"*)input[9:0]addr,(*DONT_TOUCH="yes"*)inputwe,(*DONT_TOUCH="yes"*)input[7:0]wdata,(*DONT_TOUCH="yes"*)outputreg[7:0]rdata);

reg

[7:0]

mem

[1023:0];always@(posedgeclk)beginif(we)beginmem[addr]

这次呢时序分析对了,我们来看一下综合后的结果,可以看到不再是孤零零的一个bram的ip了,这个就是典型的Flip-floptoFlip-flopPath的时序分析了。

但是注意到没有,实现的资源从bram变成lut和FF了,这个是因为在xilinx的器件里面,bram必须至少要有一级寄存器,那你可能又要问了,我们不是在代码里面rdata有一级寄存器吗,为啥没有被综合成bram呢,这个是因为加了donttouch的约束之后,vivado就不会再去优化这个寄存器,这样这个寄存器就不能被优化到bram里面了,这样自然就不会使用bram资源来实现上面的代码了。

实验三:

我们可以通过手动再加一级寄存器的方案,来让他使用bram资源,代码如下:

moduletestMem(

input

clk,a(*DONT_TOUCH="yes"*)input[9:0]addr,(*DONT_TOUCH="yes"*)inputwe,(*DONT_TOUCH="yes"*)input[7:0]wdata,(*DONT_TOUCH="yes"*)outputreg[7:0]rdata);reg[7:0]mem[1023:0];

reg

[7:0]

data;always@(posedgeclk)beginif(we)beginmem[addr]

可以看到时序分析,资源分析和我们预期是一致的。

综合后的结果也和我们预期一致,可以和实验一做对比,这次在bram后面多了一级寄存器哦。

实验四:

那么我们在上面的代码里面继续去掉donttouch约束看看会发生什么。

moduletestMem(inputclk,ainput[9:0]addr,inputwe,

input

[7:0]

wdata,outputreg[7:0]rdata);reg[7:0]mem[1023:0];reg[7:0]data;always@(posedgeclk)beginif(we)beginmem[addr]

可以看到又变成了inf,再来看一下综合后的框图,和实验一一样,你可能会问,我们不是加了两级寄存器了吗,怎么bram的输出一个都没有呢,这是因为这两级寄存器都被bram给吸收了呢。

小提示,这样两级寄存器的方式比一级的时序会好很多哦,当然如果如果寄存器不少纯打拍的话,他是不会被吸收进去的。

实验五:

既然打两拍不行,那就多打几拍咯。

代码变成下面的样子:

moduletestMem(inputclk,input[9:0]addr,inputwe,input[7:0]wdata,

output

reg

[7:0]

rdata);reg[7:0]mem[1023:0];reg[7:0]data;reg[7:0]data1;reg[7:0]data2;reg[7:0]data3;always@(posed

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论