Diseñe un flip-flop T en VHDL usando Modelsim, los valores de la señal no cambian como se esperaba

3

Estaba intentando diseñar un TFF en VHDL. Escribí el siguiente código

library ieee;
use ieee.std_logic_1164.all;

entity TFF is
  port(
    T: in std_logic;
    clk: in std_logic;
    Q, Qn: out std_logic
  );
end entity;

architecture behavior of TFF is
signal q_state: std_logic := '0';
begin
  process(clk)
  begin
    if clk'event and clk = '1' then
      if T = '1' then
        Qn <= q_state;
        q_state <= not q_state;
        Q <= q_state;
      end if;
    end if;
  end process;
end behavior;

Luego usé Modelsim para simular el código. Durante la prueba noté que Q y Qn son iguales. Me pregunto por qué sucedió esto.

    
pregunta Farbod Shahinfar

2 respuestas

0
  

q_state < = no q_state;

     

Q < = q_state;

Usted codificó esto, asumiendo que q_state se complementa de inmediato y se asignará a Q. Pero en realidad en VHDL, todas las señales están programadas para actualizarse solo al final del proceso (conocido como retraso delta) y los cambios se reflejará solo en el siguiente ciclo de ejecución o simulación del proceso.

Aquí q_state era 0 inicialmente. q_state < = no q_state la declaración programa q_state como 1 para el próximo ciclo de simulación. El valor actual se mantiene en 0 en sí. Por lo tanto, cuando se ejecuta Q < = q_state , se copia 0 a Q, no 1. En el siguiente flanco de reloj, el nuevo valor de q_state está disponible. Ahora, si analiza, puede ver que tanto Q como Qn continuarán manteniendo el mismo valor en cada ciclo de reloj.

    
respondido por el MITU RAJ
0

Una implementación más simple y directa sería:

library ieee;
use ieee.std_logic_1164.all;

entity TFF is
  port(
    CLK     : in  std_logic;
    RST     : in  std_logic;
    T       : in  std_logic;
    Q       : out std_logic;
    Q_N     : out std_logic
  );
end entity TFF;

architecture behaviour of TFF is

  signal tState      : std_logic;

begin

  pFlipFlop : process(RST, CLK) is
  begin
    if (RST = '1') then
      tState  <=  '0';

    elsif (CLK'event and CLK = '1') then

      if (T = '1') then
        tState  <=  not tState;
      end if;

    end if;

  end process pFlipFlop;

  Q    <=      tState;
  Q_N  <=  not tState;

end behaviour;

pero esto introduce un retraso delta en Q_N que puede ser un problema si alimenta otra entrada CLKed flip-flop.

Alternativamente, puede usar lo siguiente, pero puede implementar más de un flip-flop, aunque la optimización de síntesis debería reducirlo a uno.

library ieee;
use ieee.std_logic_1164.all;

entity TFF is
  port(
    CLK     : in  std_logic;
    RST     : in  std_logic;
    T       : in  std_logic;
    Q       : out std_logic;
    Q_N     : out std_logic
  );
end entity TFF;

architecture behaviour of TFF is

  signal tState      : std_logic;

begin

  pFlipFlop : process(RST, CLK) is
  begin
    if (RST = '1') then
      tState  <=  '1';
      Q       <=  '0';
      Q_N     <=  '1';

    elsif (CLK'event and CLK = '1') then

      if (T = '1') then
        tState  <=  not tState;
        Q       <=      tState;
        Q_N     <=  not tState;
      end if;

    end if;

  end process pFlipFlop;

end behaviour;
    
respondido por el TonyM

Lea otras preguntas en las etiquetas