haber me voy ha explicar mejor.
Mi intencion es hacer un reloj sincrono en una EPM3064ALC44-10N.
las entradas del reloj seran " x , clk y reset ":
X --> Sera un interruptor que cuando este activado el cronometro empezara a funcionar y cunado se baje a cero el cronometro se detiene
clk --> la señal de reloj k la tendre k ajustar para k tenga un periodo de 10ms
reset (asincrono) --> cuando se active el reset el cronometro se vuelve a cero independientemente de las otras entradas
las salidas iran a un BCD 7 segmentos para despues ir a un display
El diagrama de bloques es el siguiente:
BLOQUE_1
entradas: x,clk,reset
salidas: a0,a1,a2,a3,y1
a0,a1,a2,a3 --> son las salidas que iran a un multiplexor
y1 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero
BLOQUE_2
entradas: y1,clk,reset
salidas: b0,b1,b2,b3,y2
b0,b1,b2,b3 --> son las salidas que iran a un multiplexor
y2 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero
BLOQUE_3
entradas: y2,clk,reset
salidas: c0,c1,c2,c3,y3
c0,c1,c2,c3 --> son las salidas que iran a un multiplexor
y3 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero
BLOQUE_4
entradas: y3,clk,reset
salidas: d0,d1,d2,d3
d0,d1,d2,d3 --> son las salidas que iran a un multiplexor
MULTIPLEXOR
el multiplexor es porque solo tengo un BCD 7 segmentos
DECODIFICADOR
para elegir a que display le tiene que ir la informacion del BCD en ese momento porque al tener solo uno se necesita el decodificador k a sus salidas iran conectados a un transistor k este estara conectado a un display.
Ahora os enseño como tengo el programa despues de alguna modificacion y alguna prueba que he hecho
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY cronometro IS
PORT ( reset,clk,x : IN STD_LOGIC;
z : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
y : OUT STD_LOGIC);
END cronometro;
ARCHITECTURE cronometro_a OF cronometro IS
TYPE estados IS (a,b,c,d,e,f,g,h,i,j);
SIGNAL e_actual:estados;
BEGIN
PROCESS(reset,clk)
BEGIN
IF reset='0' THEN
e_actual <= a;
ELSIF(clk'EVENT AND clk='1')THEN
CASE e_actual IS
WHEN a =>
IF x='0' THEN e_actual<=a;
ELSE e_actual<=b;
END IF;
WHEN b =>
IF x='0' THEN e_actual<=b;
ELSE e_actual<=c;
END IF;
WHEN c =>
IF x='0' THEN e_actual<=c;
ELSE e_actual<=d;
END IF;
WHEN d =>
IF x='0' THEN e_actual<=d;
ELSE e_actual<=e;
END IF;
WHEN e =>
IF x='0' THEN e_actual<=e;
ELSE e_actual<=f;
END IF;
WHEN f =>
IF x='0' THEN e_actual<=f;
ELSE e_actual<=g;
END IF;
WHEN g =>
IF x='0' THEN e_actual<=g;
ELSE e_actual<=h;
END IF;
WHEN h =>
IF x='0' THEN e_actual<=h;
ELSE e_actual<=i;
END IF;
WHEN i =>
IF x='0' THEN e_actual<=i;
ELSE e_actual<=j;
END IF;
WHEN j =>
IF x='0' THEN e_actual<=j;
ELSE e_actual<=a;
END IF;
END CASE;
END IF;
END PROCESS;
PROCESS ( e_actual,clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
CASE e_actual IS
WHEN a =>
z <= "0000" ;
WHEN b =>
z <= "0001" ;
WHEN c =>
z <= "0010" ;
WHEN d =>
z <= "0011" ;
WHEN e =>
z <= "0100" ;
WHEN f =>
z <= "0101" ;
WHEN g =>
z <= "0110" ;
WHEN h =>
z <= "0111" ;
WHEN i =>
z <= "1000" ;
WHEN j =>
z <= "1001" ;
WHEN OTHERS =>
z <= "----";
END CASE ;
END IF;
END PROCESS;
PROCESS(e_actual,x)
BEGIN
CASE e_actual IS
WHEN a =>
y <= x;
WHEN OTHERS =>
y <= '0';
END CASE;
END PROCESS;
END cronometro_a;
espero haberme expresado bien, muchas gracias por la ayuda