VIVADO-IO/IOBUF时序问题-1

Vivado-IO与IOBUF

Q:我们学校FPGA的实验课用的是Xilinx的Artix-7系列FPGA,外设是EGO1系列。不算特别垃圾,不过也就几百块钱。根据EGO1公司给的LAB做还可以。这次想说的是对于LAB1流水灯的模式转换,小灯输出发生时序问题怎么办?

A:其实这个问题很容易解决。首先这个问题的症结在于流水灯作为IO外设,其驱动能力受到限制。在一个周期内(100MHz),从板上信号到IO需要绕过很长的线(这部分可以从综合报告中的DEVICE放大看)。这部分连线会来带很大的延时。虽然实际上,这个问题并不多见。

解决这个问题大致有两个途径:
第一种:添加时序约束(无代码,下面有一些分析)
第二种:给输出端加reg,提高输出能力(Code_1)

我更偏向于第二种,因为简单明了,在不太复杂的工程里使用很方便。
当然第一种也可以,这里稍作分析,但是我也没有太搞懂。

方法一:时序约束

出现时序约束的场合:

VIVADO会自动提醒你是否需要时序约束,尤其是在经过综合之后,如果打开时序约束助手,就会自动提示你那一部分需要约束。

做法:

直接根据VIVADO提示做就可以。其中一般CLK=100MHz。里面的参数设置与建立时间、保持时间、块间延时等四种延时(还有一种我忘了,可能没记清楚,建立时间和保持时间是最重要的)。
- 如果不理解这些延时都应该设置什么样的值,就设置为0就可以了。
- 对于IO管脚的时序约束也是默认。

效果:

我也不太了解时序约束。不过有了时序约束,我猜测应该对板上连线等有优化。就像管脚约束一样是一种物理约束。加了时序约束后可以发现,在DEVICE上IO管脚旁边的IOBUF(iobuffer输入/输出缓冲器)就启动了(通常单端输出,只会启动OBUF)。这个OBUF就对管脚有缓冲的作用,缓解时钟。
但是,这种方法我不确定次次有效,因为我还不太了解。

方法二:添加输出reg或者IOBUF

这种方法我觉得是最好的。
通过分析DEVICE电路可以看到,IO通过IOBUF,通常会连接到LUT上,这就是为什么直接写代码输出的弊端。
直接加一句下面代码Code_1就OK了。这个实际上就是又在IOBUF前加了一个REG作为时序的缓冲,相当于把一个周期干的事(计算LUT+长线传输)分给两个周期,自然就大大缓解了时序问题。这种真得很简单。
一旦遇到像是Code_2这样的代码,一定要小心。OUTPORT输出端口很可能会发生时序问题。
对比Code_2和Code_3可能你就可以看出区别了。
// Code_1
wire buffer; 
reg outport;
always@(posedge clk)
begin
    outport <= buffer ;
end
// Code_2
output [1:0] data;
// Code_3
output reg [1:0] data;

你可能感兴趣的:(vivado)