contador que MSB alterna cada 2 segundos [duplicar]

1

Quiero un contador que el bit más significativo alterna cada 2 segundos, y obtiene los valores 0 y 1. Así, por ejemplo, tendrá 0 por 2 segundos y luego 1 por otros 2 segundos, etc. Lo necesito así porque voy a conectar el bit más significativo a un decodificador que mostrará resultados en FPGA 3starter (50MHZ / 20ns) ¿Funcionará esto?

 library ieee ;

use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

----------------------------------------------------

entity counter is

generic(27: natural :=2);
port(   clock:  in std_logic;
    rst:    in std_logic;
    count:  in std_logic;
    Q:  out std_logic_vector(27-1 downto 0)
);
end counter;

----------------------------------------------------

architecture behv of counter is           

    signal Pre_Q: std_logic_vector(27-1 downto 0);

begin

    -- behavior describe the counter

    process(clock, count, clear)
    begin
    if clear = '1' then
        Pre_Q <= Pre_Q - Pre_Q;
    elsif (clock='1' and clock'event) then
        if count = '1' then
        Pre_Q <= Pre_Q + 1;
        end if;
    end if;
    end process;    

    -- concurrent assignment statement
    Q <= Pre_Q(27-1);

end behv;
    
pregunta user

1 respuesta

1

Estás muy cerca, así que te daré la respuesta aquí. Déjame saber si tienes más preguntas.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

----------------------------------------------------

entity counter is

generic (
  width: natural := 27;
  max_count: natural := 100_000_000     -- 50 MHz / 0.5 Hz
);
port (
  clock:  in std_logic;
  rst:    in std_logic;
  count:  in std_logic;
  Q:      out std_logic
);
end counter;

----------------------------------------------------

architecture behv of counter is           

  signal prescaler: std_logic_vector(width-1 downto 0);
  signal pre_Q : std_logic;

begin

    -- behavior describe the counter

  process (clock, count, clear)
  begin
    if clear = '1' then
      prescaler <= (others => '0');
      pre_Q <= '0';
    elsif (clock='1' and clock'event) then
      if count = '1' then
        if prescaler = max_count then
          -- This happens every 2 seconds; toggle the output flip-flop.
          prescaler <= (others => '0');
          pre_Q <= not pre_Q;
        else
          prescaler <= prescaler + 1;
        end if;
      end if;
    end if;
  end process;    

    -- concurrent assignment statement
    Q <= pre_Q;

end behv;
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas