Los siguientes relojes periféricos HPS se pueden enrutar a la lógica 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
Debido a un problema en las versiones 13.0 y posteriores del software Quartus®, Quartus® fit puede generar un mensaje de error si estos relojes están conectados directamente a un pin de FPGA externo. El siguiente es un ejemplo de la señal de spim1_sclk_out conectada a un pin externo:
Error (14566): No se pudo colocar 1 componente(s) periférico(s) debido a conflictos con restricciones existentes (1 controlador(es) de reloj autopromocionado(s))
Error (175020): Restricción ilegal del controlador de reloj promocionado automáticamente que forma parte del sistema de procesador duro Arria V/Cyclone V ghrd_hps_0 a la región (92, 67) a (183, 137): no hay ubicaciones válidas en la región
Información (14596): Información sobre el componente que falla:
Información (175028): El nombre del controlador de reloj promocionado automáticamente: ghrd:soc_inst|ghrd_hps_0:hps_0|ghrd_hps_0_fpga_interfaces:fpga_interfaces|spim1_sclk_out[0]~CLKENA
Puede encontrar más información sobre estos relojes en la sección "Relojes de FPGA periféricos" del Manual del dispositivo Cyclone® V o Arria® V, Volumen 3: Manual de referencia técnica del sistema de procesador duro (http://www.altera.com/literature/hb/cyclone-v/cv_5v4.pdf, páginas 27-12).
Para evitar estos mensajes de error, la señal de reloj primero debe enrutarse a través de una LUT. Esto se puede lograr mediante la creación de instancias de una primitiva lcell_comb apropiada para la familia de dispositivos. A continuación se muestra un ejemplo de lcell_comb instanciación de Verilog para el reloj de spim1_sclk_out del SoC de Arria® V:
arriav_lcell_comb wirelut( .dataa(spim1_sclk_from_hps), .combout(spim1_sclk_to_pin) );
defparam wirelut.lut_mask = 64\'hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
defparam wirelut.dont_touch = "on";
En el ejemplo anterior, la señal de spim1_sclk_from_hps se conecta al puerto de salida spim1_sclk_out desde la instancia HPS. La señal spim1_sclk_to_pin puede conectarse al puerto de salida de nivel superior y asignarse a un pin de FPGA.
El uso de una primitiva lcell_comb minimizará los recursos. El uso de una pequeña función combinatoria booleana inferida también evitará este error. El uso de la función booleana evitará tener que instanciar una primitiva, pero puede resultar en un uso de recursos ligeramente mayor.
El siguiente es un ejemplo de código Verilog que muestra un booleano inferido que también evita un error al marcar el reloj con una señal de restablecimiento bajo activa (lo que provoca una instancia de LUT inferida):
asignar spim1_sclk_to_pin = spim1_sclk_from_hps & reiniciar;
Este problema se solucionó a partir de la versión 15.1 del software Quartus® II.