FreqDivider con prueba incorrecta [cerrado]

-1
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

entity FreqDivider is
port(clkIn  : in  std_logic;
    k      : in  std_logic_vector(31 downto 0);
      clkOut : out std_logic);
end FreqDivider;

architecture Behavioral of FreqDivider is

signal s_counter : unsigned(31 downto 0);
signal s_halfWay : unsigned(31 downto 0);

begin
s_halfWay <= (unsigned(k) / 2);

process(clkIn)
begin
    if (rising_edge(clkIn)) then
        s_counter <= s_counter + 1;
        if( s_counter = (unsigned(k)-1) ) then
            clkOut <= '0';
            s_counter <= to_unsigned(0,32);
        elsif( s_counter = s_halfWay-1) then
            clkOut <= '1';

        end if;
    end if;
end process;
end Behavioral;

Hola, tengo este código, pero estoy probando y el clkOut siempre es '0' ¡no importa cuál sea la entrada! ¿Puedes ayudarme, por favor?

Gracias de antemano!

    
pregunta João

1 respuesta

0

Una señal del tipo std_logic tomará un valor inicial de 'U' , a menos que indique lo contrario. unsigned es una matriz de std_logic . Tienes la línea:

s_counter <= s_counter + 1;

Si el contador comienza como "UUUUUU..." , ¿qué significa agregar uno a esto? Necesita inicializar el contador a un estado conocido, probablemente cero.

Una opción es agregar una señal de entrada reset a su lista de puertos:

reset : in std_logic;

luego cambia tu proceso a algo como esto:

if (rising_edge(clk)) then
  if (reset = '1') then  -- Synchronous reset
    s_counter <= (others => '0');
  else
    -- Do other things with the counter
  end if;
end if;

Alternativamente, podrías hacer el reinicio asíncrono; Personalmente evito los controles asíncronos. Una vez que se haya confirmado correctamente el restablecimiento, el contador estará en un estado conocido y debería poder trabajar con él cuando lo necesite.

La segunda opción es simplemente inicializar el contador en su definición:

signal s_counter : unsigned(31 downto 0) := (others => '0');
    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas