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;