Empacadora
Este proyecto funciona así: Existe una máquina empacadora de muñecas; para indicar cuántas muñecas deben ser empacadas por caja, debe haber un teclado y sólo se permite un máximo de nueve muñecas por caja. Una vez se ha digitado el número deseado, se activa la banda transportadora y un sensor envía una señal por cada muñeca detectada. Cuando elsensor ha indicado el número establecido de muñecas, la banda debe parar. Con esta breve descripción, se aprecia que se va a utilizar los proyectos anteriores. Se ha querido plasmar en un solo programa todo la operación, pero vamos a apreciar la evolución del trabajo. El diagrama de bloques para esta implementación es el siguiente:
La carta ASM para este diseño contiene dos estadosrelacionados de la siguiente manera:
De esta manera, el programa final es:
LIBRARY ieee ; USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all; --esta librería es indispensable para poder utilizar la suma en el contador con std_logic
architecture gabriel of codif_gab is
ENTITY visual IS
PORT(
clk : IN std_logic ;
igual : out std_logic ;
enter : IN std_logic ;
sensor : IN std_logic ;
cuenta : out std_logic_vector(3 downto 0);
teclado : IN std_logic_vector(9 downto 0);
banda : out std_logic ;
al_disp : out std_logic_vector(6 DOWNTO 0)
);
END visual;
ARCHITECTURE gabriel OF visual IS
SIGNAL al_reg : std_logic_vector(3 downto 0); --señales intermedias
SIGNAL del_reg: std_logic_vector(3 downto 0);
SIGNAL test : std_logic;
SIGNAL cnt : std_logic_vector(3 downto 0);
BEGIN --con test me aseguro que se mantenga la señal en el registro y que no cambie cuando la tecla se suelta
test <= teclado(9) or teclado(8)or teclado(7) or teclado(6) or teclado(5)
or teclado(4) or teclado(3) orteclado(2)or teclado(1) or teclado(0);
------------------------------------------------------------------
-- codificador
------------------------------------------------------------------
codif_gab: process (teclado)
begin
if test = '1' then
case teclado is
when "0000000001" => al_reg <= "0000"; ---el cero
when "0000000010" => al_reg <= "0001"; ---el uno
when "0000000100" => al_reg <= "0010"; ---el dos
when "0000001000" => al_reg <= "0011"; ---el tres
when "0000010000" => al_reg <= "0100"; ---el cuatro
when "0000100000" => al_reg <= "0101"; ---el cinco
when "0001000000" => al_reg <= "0110"; ---el seis
when "0010000000" => al_reg <= "0111"; ---el siete
when "0100000000" =>al_reg <= "1000"; ---el ocho
when "1000000000" => al_reg <= "1001"; ---el nueve
when others => al_reg <= "1111";
end case;
end if;
end process;
------------------------------------------------------------------
-- registro
------------------------------------------------------------------
reg_gab: PROCESS(al_reg)
BEGIN
WAIT UNTILclk = '1';
if test = '1' then
del_reg <= al_reg;
end if;
END PROCESS;
------------------------------------------------------------------
-- decodificador
------------------------------------------------------------------
decodif_gab: process (del_reg)
begin
if enter = '1' then --con el enter del teclado se puede corregir un número errado hasta que éste
banda<='1'; -- no se presione y solo cambia la señal en el display cuando
case del_reg is --se presiona un nuevo número y no cuando cambia a cero al soltarse
when "0000" => al_disp <= "1111110"; ---el cero
when "0001" => al_disp <= "0110000"; ---el uno
...
Regístrate para leer el documento completo.