平台:xc4vsx55 ise10.1
设计过fpga的原理图,看fpga的手册,说管脚的分配问题,如时钟管脚要用gc类管脚,而且单端时钟输入时要用p类型的管脚,不能用n类型管脚等等。
一直以来都没有试验过,今天试验一把,以求各种验证。
1)gc类全局时钟管脚是否可用作普通io使用?
所谓gc类管脚,就是在管脚的称是诸如io_l1p_gc_lc等带有gc的管脚。其实手册中说的是gc类管脚可以用作io的,但在《xilinx fpga开发实用教程》(清华出版社)574页倒数第八行提到:“所有从全局时钟管脚输入的信号必须经过ibuf元,否则在布局布线时会报错”,于是今天我试了一下,将某一gc类管脚分配给一个普通的输入口(也试验了分配给一个普通的输出口),经布局布线后,未出错。
因此得出结论:gc类全局时钟管脚可以作为普通io使用。(不知道是不是我对书中提到的全局时钟管脚理解有误,如果是,请网友别拍我,敬请留言指正)
2)非gc类全局时钟管脚是否可以作时钟使用?
其实至于说能否作为时钟使用,这里有另一层函义。当然,如果你把一个普通io口配置成输入口,就把它的输入信号作为时钟,那是没问题的。但我们一般不这么做,因为时钟信号对于我们来说是一个很重要的信号,因此fpga在内部会有特殊照顾,如果你使用fpga传门为时钟预留的管脚,并作一些处理,那么你的时钟对于各种模块的时延是可以忽略的,因为时钟在布线时是单独走的一层,而如果你就仅用普通io的话,经过fpga内部布局布线后,从它的输到,再到各个使用时钟的地方,有的线长,有的线短,它的时延将是不一样的。这些东西还是看一些fpga结构的内容吧。
在xilinx里有专门的dcm ip核可供调用,在ise中执行project——>new source——>ip(core generator & architecture wizard)——>fpga features and design——>clocking——>virtex-4——>single dcm adv v9.1i,可得如下界面:
需要特别注意的是clkin source需要选择是external还是internal,各自生成的源文件如下:
==========================选择external=========================
`timescale 1ns / 1ps
module clk_test(clkin_in,
clkin_ibufg_out,
clk0_out,
locked_out);
input clkin_in;
output clkin_ibufg_out;
output clk0_out;
output locked_out;
wire clkfb_in;
wire clkin_ibufg;
wire clk0_buf;
wire gnd_bit;
wire [6:0] gnd_bus_7;
wire [15:0] gnd_bus_16;
assign gnd_bit = 0;
assign gnd_bus_7 = 7'b0000000;
assign gnd_bus_16 = 16'b0000000000000000;
assign clkin_ibufg_out = clkin_ibufg;
assign clk0_out = clkfb_in;
ibufg clkin_ibufg_inst (.i(clkin_in),
.o(clkin_ibufg));
bufg clk0_bufg_inst (.i(clk0_buf),
.o(clkfb_in));
dcm_adv dcm_adv_inst (.clkfb(clkfb_in),
.clkin(clkin_ibufg),
.daddr(gnd_bus_7[6:0]),
.dclk(gnd_bit),
.den(gnd_bit),
.di(gnd_bus_16[15:0]),
.dwe(gnd_bit),
.psclk(gnd_bit),
.psen(gnd_bit),
.psincdec(gnd_bit),
.rst(gnd_bit),
.clkdv(),
.clkfx(),
.clkfx180(),
.clk0(clk0_buf),
.clk2x(),
.clk2x180(),
.clk90(),
.clk180(),
.clk270(),
.do(),
.drdy(),
.locked(locked_out),
.psdone());
defparam dcm_adv_inst.clk_feedback = 1x;
defparam dcm_adv_inst.clkdv_divide = 2.0;
defparam dcm_adv_inst.clkfx_divide = 1;
defparam dcm_adv_inst.clkfx_multiply = 4;
defparam dcm_adv_inst.clkin_divide_by_2 = false;
defparam dcm_adv_inst.clkin_period = 16.129;
defparam dcm_adv_inst.clkout_phase_shift = none;
defparam dcm_adv_inst.dcm_autocalibration = true;
defparam dcm_adv_inst.dcm_performance_mode = max_speed;
defparam dcm_adv_inst.deskew_adjust = system_synchronous;
defparam dcm_adv_inst.dfs_frequency_mode = low;
defparam dcm_adv_inst.dll_frequency_mode = low;
defparam dcm_adv_inst.duty_cycle_correction = true;
defparam dcm_adv_inst.factory_jf = 16'hf0f0;
defparam dcm_adv_inst.phase_shift = 0;
defparam dcm_adv_inst.startup_wait = false;
endmodule
==========================选择internal=========================
`timescale 1ns / 1ps
module clk1_test(clkin_in,
clk0_out,
locked_out);
input clkin_in;
output clk0_out;
output locked_out;
wire clkfb_in;
wire clk0_buf;
wire gnd_bit;
wire [6:0] gnd_bus_7;
wire [15:0] gnd_bus_16;
assign gnd_bit = 0;
assign gnd_bus_7 = 7'b0000000;
assign gnd_bus_16 = 16'b0000000000000000;
assign clk0_out = clkfb_in;
bufg clk0_bufg_inst (.i(clk0_buf),
.o(clkfb_in));
dcm_adv dcm_adv_inst (.clkfb(clkfb_in),
.clkin(clkin_in),
.daddr(gnd_bus_7[6:0]),
.dclk(gnd_bit),
.den(gnd_bit),
.di(gnd_bus_16[15:0]),
.dwe(gnd_bit),
.psclk(gnd_bit),
.psen(gnd_bit),
.psincdec(gnd_bit),
.rst(gnd_bit),
.clkdv(),
.clkfx(),
.clkfx180(),
.clk0(clk0_buf),
.clk2x(),
.clk2x180(),
.clk90(),
.clk180(),
.clk270(),
.do(),
.drdy(),
.locked(locked_out),
.psdone());
defparam dcm_adv_inst.clk_feedback = 1x;
defparam dcm_adv_inst.clkdv_divide = 2.0;
defparam dcm_adv_inst.clkfx_divide = 1;
defparam dcm_adv_inst.clkfx_multiply = 4;
defparam dcm_adv_inst.clkin_divide_by_2 = false;
defparam dcm_adv_inst.clkin_period = 16.129;
defparam dcm_adv_inst.clkout_phase_shift = none;
defparam dcm_adv_inst.dcm_autocalibration = true;
defparam dcm_adv_inst.dcm_performance_mode = max_speed;
defparam dcm_adv_inst.deskew_adjust = system_synchronous;
defparam dcm_adv_inst.dfs_frequency_mode = low;
defparam dcm_adv_inst.dll_frequency_mode = low;
defparam dcm_adv_inst.duty_cycle_correction = true;
defparam dcm_adv_inst.factory_jf = 16'hf0f0;
defparam dcm_adv_inst.phase_shift = 0;
defparam dcm_adv_inst.startup_wait = false;
endmodule
比较以上两段代码,区别在于选择是external时clkin经过了ibufg才到的dcm_adv,而选择internal的clkin则直接到了dcm_av,而ibufg就是原语“全局时钟缓冲”单元,我们使用时要选择external,只有当我们的级联两个dcm模块时,直接与外面相连的选external,而另一个选择internal。
这也是本文的一个知识点吧:两个dcm级联时,直接与外面相连的选external,而另一个选择internal。
所以本段的主题是“非gc类全局时钟管脚是否可以作时钟使用?”其实更多应该指的是“非gc类全局时钟管脚是否可以接到ibufg?”
试验中,我们将external的dcm的输入clkin输入引脚配置成一个普通的io口,即非gc类全局时钟管脚,布局布线阶段出现以下错误:
error:place:645 - a clock iob clock component is not placed at an optimal clock iob site. the clock iob component
因此得出结论:非gc类全局时钟管脚不可以作时钟使用(其实是不可以接到ibufg的输入端)。
3)在xilinx手册中提到,如果使用单端输入时钟,要使用p类型gc全局时钟管脚,那么空间n类型的管脚是否可以么?
所谓p类型还是n类型其实指的是io_l1p_gc_lc或io_l1n_gc_lc,注意这里的l1p和l1n,这就标识这个管脚是p类型还是n类型。
试验中,我们将n类型全局时钟管脚配置给clkin,结果布局布线时出现与(2)中一样的错误。
因此得出结论:gc类全局时钟管脚n类型管脚不可以作为单端时钟输入管脚(其实也是不能作为ibufg的输入端)
4)差分时钟输入时钟管脚能否配置普通io?n类型管脚和p类型管脚必须分别给配置p类型gc全局时钟管脚和n类型gc全局时钟管脚?
使用了一对普通io配置给dcm的clkin_n_in和clkin_p_in,并且将这对普通的io的p型分配给dcm的clkin_n_in型输入,io的n型分配给dcm的clkin_p_in型输入,出现如下错误:
error:place:604 - the i/o components clkp and clkn are the p- and n-sides of a differental i/o pair. the component
使用了一对普通io配置给dcm的clkin_n_in和clkin_p_in,并且对应地将这对普通的io的p型分配给dcm的clkin_p_in型输入,io的n型分配给dcm的clkin_n_in型输入,出现如下错误:
error:place:645 - a clock iob clock component is not placed at an optimal clock iob site. the clock iob component
使用一对gc类全局时钟io管脚配置给dcm的clkin_n_in和clkin_p_in,并且将这对普通的io的p型分配给dcm的clkin_n_in型输入,io的n型分配给dcm的clkin_p_in型输入,出现与4.1中相同的错误。
正常配置,即使用了一对gc类全局时钟io管脚配置给dcm的clkin_n_in和clkin_p_in,并且对应地将这对普通的io的p型分配给dcm的clkin_p_in型输入,io的n型分配给dcm的clkin_n_in型输入,则完全正确。
因此得出结论:差分时钟输入时必须使用一对gc类全局时钟io管脚配置给dcm的clkin_n_in和clkin_p_in,且n类型和p类型要匹配。
其实这个归根到底还是原语ibufgds在作怪,查看一下差分输入dcm的原文件就行了:
ibufgds clkin_ibufgds_inst (.i(clkin_p_in),
.ib(clkin_n_in),
.o(clkin_ibufgds));
5)那么如果将输入输出口配置成非io管脚会怎么样呢?
在试验中,将某一vcco配置成了给了输出口,结果在映射阶段出现如下错误:
error:maplib:30 - loc constraint af17 on q is invalid: no such site on the
因此,不能将输入输出口配置成非io管脚,当然这样配置本身也是不合理的。
开车给手机充电,你遇到过这样的问题吗?
一男子认为5G能监控,炸弹袭击AT&T大楼
智能家居是如何改变我们的生活?能为我们的日常生活带来什么?
如何使用相移时间延迟将DC/DC 降压稳压器的噪声性能
厉害了我的哥!S7 edge成功移植魅族Flyme 6系统
FPGA管脚分配时需注意的一些事项
国家出手了!前国开行行长带队,誓言打通交易所,实现币圈实名制
浅析物联网三大技术的未来争夺战
KUKA机器人系统函数:VARSTATE()
4月22日,云数据库技术沙龙「杭州站」来了
探析中国半导体产业投资的浮夸与不足
高频变压器与EMI之间的关系是怎样的
我国新能源汽车换电行业第一个并购案例落地了
嵌入式软件时序设计相关的问题
下一代互联网发展的新机遇和新图景
XX2502PCP+XX2005VKC 替代对比报告最新出炉
利用DDR3数据眼图测试来实现快速检查信号质量
史上最贵iPhone8发布会前瞻:iphone8外观、配置、价格汇总,还有炫酷的黑科技,买买买!
光刻技术概述及其分类
世界最大逆变器公司SMA裁员1000人