Diseñar un contador en VHDL usando la instrucción de generación

0

Necesito diseñar un contador ascendente de 8 bits en VHDL usando T flip flop y generar una declaración. Sé cómo funciona el contador, pero no puedo diseñarlo en VHDL.

El problema principal es "usar generar declaración". Como puedo ver, en un contador ascendente (rizado o síncrono; cualquiera de los dos está bien; decidí usar el rizado), la salida anterior se alimenta como un reloj. Así que puedo asignar Q (i -1) para el reloj en el i'th flip flop generado. Pero ¿qué pasa con el primer flip flop? Tiene un reloj aplicado explícitamente.

Por lo tanto, si uso la declaración de generación, no puedo simplemente asignar el reloj a la salida anterior; El primer flip flop siempre creará problemas. Otro pensamiento que surgió fue inicializar explícitamente el primer contador y luego usar la declaración de generación para los 7 flip flops restantes. Pero también en este caso, creo que el primer flip flop (o, mejor dicho, el segundo) que utiliza generar sentencias planteará un problema similar (es decir, el reloj de mapeo).

¿Estoy equivocado o me falta algo importante aquí?

Aquí está el código (código planificado, no código real):

component tff is
Port ( t   : IN BIT ; 
       clk : IN BIT ;
       q   : OUT BIT );
end component

--Other irrelevant stuff

For i IN 0 TO 7 GENERATE
tffx : tff PORT MAP ( tIn , q(i-1) , q(i) ) ;
end GENERATE ;

--More irrelevant stuff

Gracias.

    

1 respuesta

2

Aquí hay una simple declaración de generación, que genera 8 TFF y conecta la entrada del reloj de la tff a la salida q del FF anterior. Debido a que está utilizando cálculos de índices (i + 1 o i-1), necesita un rango más amplio para el rango tff_clocks o debe acortar el ciclo de generación.

Estoy usando un bucle de 0 a 7, así que extendí tff_clocks en 1. El índice 0 está conectado al reloj original del sistema.

architecture ....
  signal tff_clocks : std_logic_vector(8 downto 0);

begin
  tff_clocks(0)  <= clk;   -- first tff is clock with main clock

  genTFF : for i in 0 to 7 generate
    tff_inst : tff
      port map (
        clk   => tff_clocks(i),
        t     => '1',
        q     => tff_clocks(i + 1)
      );
  end generate;

  async_counter_result <= tff_clocks(8 downto 1);
end;
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas