1

我正在为我在大学的硕士论文在 OpalKelly 实现上编写 Xilinx Spartan-6。准确地说,这是我正在研究的 FPGA(XEM6010-LX45):https ://www.opalkelly.com/products/xem6010/

它安装在必须获取多个信号 (8+)、处理它们并生成多个信号 (16+) 的板上,以根据设置关闭一些反馈回路。

正如您可以想象的那样,我需要驱动多个 DAC 和 ADC,但我正在努力寻找在 .ucf 文件中施加时序约束的正确方法。


让我们从DAC开始,如果我们弄清楚了,我们将讨论 ADC:D

4个DAC芯片,每个由4个信号驱动:时钟、复位、同步、数据。时钟在所有 DAC 中是通用的,它是来自 PLL 的 27MHz 时钟,通过 DDR 结构重新生成并与其他信号一起发送。

我已经提出了相对于外部时钟(我发送的那个)的正确时序约束,但由于那不是为数据/同步/复位触发器计时的那个,看来我必须施加约束相对于内部时钟。

我该如何处理这种情况,基本上是一个带有时钟的 BUS 结构?

时序报告很好,除了每个时序都与内部时钟相关,并且它忽略了我的 REFERENCE_PIN 指令(可能是因为我以错误的方式使用它)。

如何对输出引脚施加时序约束?毕竟,软件应该能够计算将时钟从 FPGA 发送出去的延迟(就像它对每个引脚所做的那样),所以之后只需要减法和总线偏移!

这是我编写的 .ucf 文件(仅我们感兴趣的部分):

NET "clk_dac"        TNM_NET = "TNM_clk_dac";
TIMESPEC TS_clk_dac = PERIOD "TNM_clk_dac" 27 MHz HIGH 50%; #27MHz

# DAC SLOW
NET "dac_slow_sync_pin1" TNM = "dac_slow_sync";
NET "dac_slow_sync_pin2" TNM = "dac_slow_sync";
NET "dac_slow_sync_pin3" TNM = "dac_slow_sync";
NET "dac_slow_sync_pin4" TNM = "dac_slow_sync";
NET "dac_slow_data_pin1" TNM = "dac_slow_data";
NET "dac_slow_data_pin2" TNM = "dac_slow_data";
NET "dac_slow_data_pin3" TNM = "dac_slow_data";
NET "dac_slow_data_pin4" TNM = "dac_slow_data";

OFFSET = OUT AFTER "clk_dac" REFERENCE_PIN "dac_slow_clk" RISING;
OFFSET = OUT AFTER "clk_dac" REFERENCE_PIN "dac_slow_clk" FALLING;

TIMEGRP "dac_slow_sync" OFFSET = OUT 24 ns AFTER "clk_dac" REFERENCE_PIN "dac_slow_clk" FALLING;
TIMEGRP "dac_slow_data" OFFSET = OUT 35 ns AFTER "clk_dac" REFERENCE_PIN "dac_slow_clk" RISING;
4

2 回答 2

2

在像您的 DAC(我假设 SDR ......)这样的慢速 SDR 接口上对我有用的是将所有输出放在 IOB 寄存器上并确保FPGA内部的时序。

由同一内部 BUFG 时钟提供时钟的所有 IOB 寄存器将具有非常相似的时钟到输出值(尤其是相对于 27 MHz 时钟)。尤其如此,因为时序延迟在很大程度上取决于温度,并且可以认为整个设备的温度基本上是恒定的。

通常,如果您发送时钟和数据边沿对齐或仅反转时钟,您会发现很容易满足时序要求。正如我所说,如果在 FPGA 内部满足时序,如果所有输出都注册在 IOB 中并由同一个 BUFG 提供时钟,那么外部情况仍然如此。在 DDR 接口的情况下,发送延迟 90 度的时钟(需要 PLL)通常可以工作。

在您的情况下,我不关心时间限制,只确保所有输出都在 IOB 中注册。您应该知道,约束不会影响地图或布局布线,因为它们只会被验证。确保系统满足接口时序是设计人员的工作,该工具只为您提供设计的实际价值。

最后一点,如果输出被注册,那么时间延迟将是相同的假设外部延迟是相同的。对您来说情况并非如此,因为在数据直接连接时,时钟似乎为多个 DAC 供电(因此具有更大的电容和延迟)。再说一次,您是必须进行必要调整的人。

词汇表更新

SDR:单一数据速率。数据在 1 个时钟沿传输。

DDR:双倍数据速率。数据在两个时钟沿传输。

BUFG:时钟缓冲器。你所有的时钟都应该使用BUFG,它们是为时钟设计的特殊缓冲器和低偏移线。

IOB:输入/输出块。IO 焊盘附近的特殊电路,可配置为自定义 IO 的路径。特别是,它有一个靠近焊盘的寄存器。PLL:锁相环。修改时钟(频率/相位)的电路。

IODELAY:IOB 中的一个特殊电路,用于为您的 IO 添加恒定或可编程延迟。

我建议您查看IOB 数据表。Xilinx 网站还提供大量数据表、教程和应用说明。

于 2015-03-27T04:20:40.203 回答
2

其他资源

UG612 - Timing Closure User Guide描述了如何指定时序约束。第 3 章概述了静态时序分析 (STA) 的工作原理以及评估时序应定义的内容。还有许多漂亮的图片可以显示从何处应用约束。

还有UG625 - 约束指南描述了您可以在哪里指定约束(在 ucf、xcf、ncf 文件中,在 VHDL/Verilog 中,...)。

于 2015-03-27T16:44:47.563 回答