为了保证FPGA输入输出接口的时序,一般会要求将输入管脚首先打一拍再使用,输出接口也要打一拍再输出FPGA。
将信号打一拍的方法是将信号通过一次寄存器,而且必须在IOB里面的寄存器中打一拍。
因为,从FPGA的PAD到IOB里面的寄存器是有专用布线资源的,而到内部其他寄存器没有专用的布线资源。
使用IOB里面的寄存器可以保证每次实现的结果都一样,使用内部其他寄存器就无法保证每次用的都是同一个寄存器且采用同样的布线。
同时,为了使用输入输出延迟功能(Input / Output delay),也必须要求信号使用IOB里面的寄存器。
FPGA IOB结构,如下图:
![xilinx芯片的 IOB 以及 IOB = false - fantasy - 悠然见南山](http://img0.ph.126.net/7qHVXUSpZfjU_p_yA4G2QQ==/2263903237783906356.png)
为了让I/O使用IOB里面的寄存器,需要设定综合与MAP(对应于Xilinx的ISE工具)的相关属性。
默认情况下,综合过程和MAP过程都是根据软件的分析自动判断是否要将I/O 的寄存器放入 IOBs中。
如果需要强制指定,必须将Pack I/O Registe Into IOBs的默认属性修改成需要的值。
对于XST,可以将I/O Pack Registers Into IOB属性由默认的Auto 修改为Yes或No。
对于Snyplify,可以在Verilog代码的模块声明中添加属性:/* synthesis syn_useioff = 1 */
具体应用如下 :
module module_a(a,b,c) /* synthesis syn_useioff = 1 */ ;
MAP过程Pack I/O Registe Into IOBs属性可以设置成:Off,For Inputs On ly,For Output On ly,For Input and Output。
需要特别注意的是,如果只在MAP过程中要求将I/O放入IOBs中,而在综合过程中没有强制要求,最终实现时I/O不一样会Pack Into IOBs。
必须保证综合和MAP同时对该属性进行设定。
※ 如果将FF等放入IOB中,那么会导致该寄存器无法移动,使得该寄存器被锁定。
这样可能会出现下面的timing 问题:
![xilinx芯片的 IOB 以及 IOB = false - fantasy - 悠然见南山](http://img0.ph.126.net/YqofX38AdjE1YNw5Ded5mA==/2855282163853191330.png)
那么当出现这样的情况时,可以在UCF中,对相应PAD的寄存器进行IOB = false,将这个寄存器解锁。
实例:
![xilinx芯片的 IOB 以及 IOB = false - fantasy - 悠然见南山](http://img0.ph.126.net/Ib1luUHIVCzxlFwuWKPgdA==/4843621399337043309.png)