Tengo un componente divisor de reloj basado en registro simple que puedo colocar cuando no tengo un PLL de repuesto:
library IEEE;
use IEEE.std_logic_1164.ALL;
use IEEE.numeric_std.ALL;
entity div128 is
port(
inclk0 : in std_logic;
locked : out std_logic;
c0 : out std_logic
);
end entity;
architecture syn of div128 is
begin
div : process(inclk0) is
variable counter : unsigned(6 downto 0);
begin
if(rising_edge(inclk0)) then
counter := counter + 1;
c0 <= counter(6);
end if;
end process;
locked <= '1';
end architecture;
Ahora me gustaría reutilizar este componente en varios lugares, en diferentes dominios de reloj, sin repetirme más de lo estrictamente necesario.
¿Necesito crear una create_generated_clock
declaración para cada instancia o puedo especificar una vez que cada instancia genere un -divide_by 128
reloj a partir de su entrada?
¿Podría también sacar el divisor de un generic
parámetro y llevarlo a las restricciones de tiempo?
¿Tendría sentido usar atributos aquí en lugar de un archivo SDC?
Puede especificar comandos SDC dentro de su código VHDL con atributos ALTERA. La biblioteca PoC está utilizando esto para aplicar restricciones de tiempo relativas para sincronizadores:
architecture rtl of sync_Bits_Altera is
attribute ALTERA_ATTRIBUTE : string;
-- Apply a SDC constraint to meta stable flip flop
attribute ALTERA_ATTRIBUTE of rtl : architecture is "-name SDC_STATEMENT ""set_false_path -to [get_registers {*|sync_Bits_Altera:*|\gen:*:Data_meta}] """;
begin
Fuente: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/sync/sync_Bits_Altera.vhdl?ts=2
Creo que podría hacer un enfoque similar para su reloj generado.
Tenga en cuenta que c0
no cumple con todos los requisitos para ser una señal de reloj .
Simón Richter
c0
no está definida como un reloj, aunque se usa como tal. Probablemente ya no se pueda usar como una entrada PLL (pero tampoco lo escoreclk_out
desde el bloque PCIe, razón por la cual tengo tantos dominios de reloj en primer lugar.