我正在为我在大学的硕士论文在 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;