TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: johnbr en 19 de Marzo de 2020, 13:33:07
-
Hola amigos estoy escribiendo un temporizador usando Quartus II.
Usaré la leds de siete segmentos para mostrar los números, pero también debo poder establecer una hora específica aumentando / disminuyendo y luego, una vez que esté configurada, con otro botón el reloj comenzará a bajar hasta llegar a 0.
la señal "lock" es para evitar que el el conteo aumente a la velocidad del reloj
"manual" es un botón,
Supongo que el conteo está bien, pero el problema es cuando quiero que baje. En la simulación, cuando pongo el "sentido" ALTO, no obtengo nada y no funciona.
Aqui dejo el codigo, gracias de antemano
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
port( clck, reset : in std_logic;
limit : in integer range 0 to 10;
manual: inout std_logic;
sentido: in std_logic;
bitcount : out std_logic_vector(3 downto 0);
clckout : out std_logic);
end counter;
architecture behavior of counter is
signal Cs : std_logic_vector(3 downto 0):="0000";
signal lock: std_logic;
begin
Count : process(clck,reset,manual,lock,sentido)
begin
if(rising_edge(clck))then
if (manual='0' and lock ='0') then
Cs<=Cs+1;
lock<='1';
elsif(manual='1' and lock='1' ) then
lock<='1';
else
lock<='0';
end if;
end if;
if sentido = '1' then
Cs<=Cs-1;
end if;
if (reset = '1') then
Cs <="0000";
end if;
if (Cs = "1010") then
Cs <= "0000";
end if;
end process Count;
bitcount <=Cs;
end behavior;
-
Por lo que veo, limit es para cargar los datos del conteo, manual para detenerlo o hacerlo correr y sentido para cambiar de conteo ascendente o descendente
Debes de saber describir bien un temporizador, yo te recomiendo una descripción de la siguiente forma
ir reset = '1' then --Reset asíncrono
cs = "0000";
elsif rising_edge(clck) then
if manual = 0 then
if sentido = '1' then
if cs <= "1010" then cs <="0000";-- si es 10 comienza en cero
else cs <= cs + 1;
end if;
else
if cs <= "1111" then cs <="1001"; --Si es menor que cero, comienza en 9
else cs <= cs - 1;
end if;
end if;
end if;
end if;
Además tendrás que definir las entradas y salidas correspondientes, en tu código utilizas reset pero no lo declaras