Problemas al dividir un reloj con 2 bits de comando

1

Estoy tratando de hacer un divisor de reloj comandado por 2 bits: DTPS. Por ejemplo, si DTPS es:

  • "00" obtenemos el reloj como salida (2 ^ 0)
  • "01" dividimos el reloj por 2 (2 ^ 1)
  • "10" dividimos el reloj por 4 (2 ^ 2)
  • "11" dividimos el reloj por 8 (2 ^ 3)

Entonces tuve 2 problemas, el primero es cuando DTPS es la división "10" se convierte en 11111111111111111111111111100 No sé por qué. y el segundo problema es que logré obtener un impulso cuando DTPS="01" pero no pude hacer una señal completa de la división de clk.

Por favor revise mi código y dígame qué hice mal y cómo pude mejorar lo correcto y mi estilo de codificación.

Muchas gracias.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Use ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

entity diviseur2n is
     Generic (Nbits : integer := 8);
    Port ( rst : in STD_LOGIC;
           clk : in  STD_LOGIC;
           DTPS : in STD_LOGIC_VECTOR(1 downto 0);
           tc : out STD_LOGIC);
end diviseur2n;

architecture architecture_diviseur of diviseur2n is

signal cpt : std_logic_vector(Nbits-1 downto 0);
signal division : integer;
signal cpt_full : std_logic;

begin
    process(clk)
      begin
        if DTPS="00" then
            division <= 1;
        else
            division <= to_integer(signed(DTPS))*2;-- value of DTPS into decimal then *2 to get 2^n= divison
        end if;
    end process;

  -- compteur 0 a division
  comptage: process(clk,rst,division)
  begin
  --cpt_full <= '0';give this error: Signal cpt_full cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.

   if rst = '1' then
     cpt <= (others => '0');
      cpt_full <= '0';
   elsif rising_edge(clk) then     
    if cpt < division then
        cpt <= cpt + 1;
     else   
        cpt <= (others => '0');
          cpt_full <= '1';
     end if;
    end if;
  end process comptage;

  -- impulsion de sortie a division
  retenue: process(cpt_full)
    begin
        if cpt_full='1' then
            tc <= '1';
        else 
            tc <= '0';
        end if;
    end process retenue;  

end architecture_diviseur;
    
pregunta Ryan

1 respuesta

0

Tienes,

if cpt < division then

¿Qué esperas que pase aquí si division es 0?

En cualquier caso, hay un enfoque mucho más simple para este tipo de problema.

Puedes hacer un contador modulo-8.

Ahora, 1 bit de la variable de conteo será igual a un contador de módulo 2, un bit será igual a un contador de módulo 4 y el bit de orden más alto será el contador de módulo 8.

Un multiplexor combinatorio puede conectar cualquiera de estos tres bits (o el propio reloj de entrada original) a la salida.

Si tiene algunos requisitos adicionales, como poder cambiar el divisor sin crear un error de salida, es posible que necesite cierta lógica adicional para que se actualicen los bits de selección del multiplexor.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas