以下 HPS 外设时钟可路由至FPGA逻辑:
- emac0_md_clk
- emac0_gtx_clk
- emac1_md_clk
- emac1_gtx_clk
- qspi_sclk_out
- spim0_sclk_out
- spim1_sclk_out
- i2c0_clk
- i2c1_clk
- i2c2_clk
- i2c3_clk
由于 Quartus II 软件版本 13.0 及更高版本存在问题,如果这些时钟直接连接到外部FPGA引脚,Quartus® fit 可能会生成错误消息。以下是连接到外部引脚的spim1_sclk_out信号的示例:
错误 (14566):由于与现有约束冲突,无法放置 1 个外设组件(1 个自动升级的时钟驱动程序)
错误 (175020):非法约束作为Arria V/Cyclone V 硬处理器系统一部分的自动升级时钟驱动程序 ghrd_hps_0到区域 (92, 67) 至 (183, 137):区域中没有有效位置
信息 (14596):有关故障组件的信息:
信息 (175028):自动升级的时钟驱动程序名称:ghrd:soc_inst|ghrd_hps_0:hps_0|ghrd_hps_0_fpga_interfaces:fpga_interfaces|spim1_sclk_out[0]~CLKENA
有关这些时钟的更多信息,请参见《Cyclone® V 或 Arria® V 器件手册第 3 卷:硬处理器系统技术参考手册》(http://www.altera.com/literature/hb/cyclone-v/cv_5v4.pdf,第 27-12 页)的“外设 FPGA 时钟”部分。
为了避免这些错误消息,时钟信号必须首先通过LUT路由。这可以通过实例化适合您的设备家族的lcell_comb基元来实现。下面举例说明了Arria® V SoC spim1_sclk_out时钟lcell_comb Verilog 实例化:
arriav_lcell_comb wirelut( .dataa(spim1_sclk_from_hps), .combout(spim1_sclk_to_pin) );
defparam wirelut.lut_mask = 64\'hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
defparam wirelut.dont_touch = “on”;
在上面的示例中,spim1_sclk_from_hps信号连接到 HPS 实例的 spim1_sclk_out 输出端口。spim1_sclk_to_pin信号可以连接到顶层输出端口,并分配给FPGA引脚。
使用 lcell_comb 基元将最大限度减少资源。使用一个小的推断布尔组合函数也可以避免此错误。使用布尔函数可以避免实例化基元,但可能会导致资源使用率略高。
以下是一个示例 Verilog 代码,显示了推断的布尔值,该值还可以通过使用有效低电平复位信号对时钟进行 AND来避免错误(导致推理 LUT 实例):
分配 spim1_sclk_to_pin = spim1_sclk_from_hps & 重置;
从 Quartus® II 软件 15.1 版开始修复该问题。