hola amigos
estoy inetentando hacer un programa para indicar cuántas pelotas deben ser empacadas por caja, debe haber un teclado (switches) 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 pelota detectada. Cuando el sensor ha indicado el número establecido de pelotas, la banda debe parar y se debe mostrar el numero de pelotas contadas por el sensor en la lcd de la spartan 3e.
yo ya he utlizado la lcd de la spartan para escribir mi nombre y ps use ese mismo programa para q me muetre el nuemor de pelotas ingrsadas pero me aprece un error q no entiendo....por favor necesito que me colaboren
estoy inetentando hacer un programa para indicar cuántas pelotas deben ser empacadas por caja, debe haber un teclado (switches) 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 pelota detectada. Cuando el sensor ha indicado el número establecido de pelotas, la banda debe parar y se debe mostrar el numero de pelotas contadas por el sensor en la lcd de la spartan 3e.
yo ya he utlizado la lcd de la spartan para escribir mi nombre y ps use ese mismo programa para q me muetre el nuemor de pelotas ingrsadas pero me aprece un error q no entiendo....por favor necesito que me colaboren
Código:
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
entity packed is
GENERIC(CLK_DIVIDE:INTEGER:=50000);
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(3 downto 0);
banda : out std_logic ;
RST: IN BIT;
---salidas de la spartan 3e (pines)
RS,RW,SF_CEO: out BIT;
E:BUFFER BIT;
DB:out BIT_VECTOR(3 downto 0)
);
end packed;
architecture Behavioral of packed is
SIGNAL db1 : bit_vector(3 downto 0); --señales intermedias
SIGNAL db2: bit_vector(3 downto 0);
SIGNAL cnt : std_logic_vector(3 downto 0);
signal test: std_logic;
TYPE Estados IS (F_INIT_1A,F_INIT_1B,F_INIT_2A,
F_INIT_2B,F_INIT_3A,F_INIT_3B,BORRAR1,BORRAR2,
Control1,Control2,Modo1,Modo2,s1,s2,R3,R4);
SIGNAL pr_estado, nx_estado:Estados;
BEGIN
test <=teclado(3) or teclado(2) or teclado(1) or teclado(0);
------------------------------------------------------------------
-- codificador
------------------------------------------------------------------
codif: process (teclado)
begin
if test = '1' then
case teclado is
when "0000" => db1 <= "0011"; ---el cero
when "0001" => db1 <= "0011"; ---el uno
when "0010" => db1 <= "0011"; ---el dos
when "0011" => db1 <= "0011"; ---el tres
when "0100" => db1 <= "0011"; ---el cuatro
when "0101" => db1 <= "0011"; ---el cinco
when "0110" => db1 <= "0011"; ---el seis
when "0111" => db1 <= "0011"; ---el siete
when "1000" => db1 <= "0011"; ---el ocho
when "1001" => db1 <= "0011"; ---el nueve
when others => db1 <= "0011";
end case;
end if;
end process;
------------------------------------------------------------------
-- registro
------------------------------------------------------------------
reg_gab: PROCESS(db1,clk)
BEGIN
if clk = '1' then
if test = '1' then
DB <= db1;
end if;
end if;
END PROCESS;
------------------------------------------------------------------
-- decodificador
------------------------------------------------------------------
decodif_gab: process (teclado)
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 teclado is --se presiona un nuevo número y no cuando cambia a cero al soltarse
when "0000" => db2 <= "0000"; ---el cero
when "0001" => db2 <= "0001"; ---el uno
when "0010" => db2 <= "0010"; ---el dos
when "0011" => db2 <= "0011"; ---el tres
when "0100" => db2 <= "0100"; ---el cuatro
when "0101" => db2 <= "0101"; ---el cinco
when "0110" => db2 <= "0110"; ---el seis
when "0111" => db2 <= "0111"; ---el siete
when "1000" => db2 <= "1000"; ---el ocho
when "1001" => db2 <= "1001"; ---el nueve
when others => db2 <= "0000";
end case;
else
banda <= '0';
end if;
end process;
------------------------------------------------------------------
---------------lcd inicializacion---------------------------------
------------------------------------------------------------------
SF_CEO<='1';
RELOJ_500Hz: PROCESS(CLK)
VARIABLE Cuenta: INTEGER RANGE 0 TO CLK_DIVIDE;
begin
IF(CLK'EVENT AND CLK='1')THEN
Cuenta:=Cuenta+1;
IF(Cuenta=CLK_DIVIDE)THEN
E<=NOT E;
Cuenta:=0;
END IF;
END IF;
END PROCESS;
MAQUINA: PROCESS(E)
BEGIN
IF(E'EVENT AND E='1')THEN
IF(RST='1')THEN
pr_estado<=F_INIT_1A;
ELSE
pr_estado<=nx_estado;
END IF;
END IF;
END PROCESS;
FSM: PROCESS(pr_estado)
BEGIN
CASE pr_estado IS
WHEN F_INIT_1A =>
RS<='0';RW<='0';
DB<="0010";
nx_estado<=F_INIT_1B;
WHEN F_INIT_1B =>
RS<='0';RW<='0';
DB<="1000";
nx_estado<=F_INIT_2A;
WHEN F_INIT_2A =>
RS<='0';RW<='0';
DB<="0010";
nx_estado<=F_INIT_2B;
WHEN F_INIT_2B =>
RS<='0';RW<='0';
DB<="1000";
nx_estado<=F_INIT_3A;
WHEN F_INIT_3A =>
RS<='0';RW<='0';
DB<="0010";
nx_estado<=F_INIT_3B;
WHEN F_INIT_3B =>
RS<='0';RW<='0';
DB<="1000";
nx_estado<=BORRAR1;
----------------------------------------------------------------------------------
WHEN BORRAR1 =>
RS<='0';RW<='0';
DB<="0000";
nx_estado<=BORRAR2;
WHEN BORRAR2 =>
RS<='0';RW<='0';
DB<="0001";
nx_estado<=Control1;
----------------------------------------------------------------------------------
WHEN Control1 =>
RS<='0';RW<='0';
DB<="0000";
nx_estado<=Control2;
WHEN Control2 =>
RS<='0';RW<='0';
DB<="1100";
nx_estado<=Modo1;
----------------------------------------------------------------------------------
WHEN Modo1 =>
RS<='0';RW<='0';
DB<="0000";
nx_estado<=Modo2;
WHEN Modo2 =>
RS<='0';RW<='0';
DB<="0110";
nx_estado<=s1;
----------------------------------------------------------------------------------
WHEN s1 =>
RS<='0';RW<='0';
DB<=db1;
nx_estado<=s2;
WHEN s2 =>
RS<='0';RW<='0';
DB<=db2;
nx_estado<=R3;
WHEN R3 =>
RS<='0';RW<='0';
DB<="1000";
nx_estado<=R4;
WHEN R4 =>
RS<='0';RW<='0';
DB<="0000";
nx_estado<=R3;
END CASE;
END PROCESS;
--------------------------------------------------------------------------------
------------------------------------------------------------------
-- contador
------------------------------------------------------------------
conta_gab: PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk = '1') THEN
IF sensor = '1' THEN
cnt <= cnt + 1;
ELSIF db2 = cnt then
cnt <= "0000";
END IF;
END IF;
cuenta <= cnt;
END PROCESS;
---------------------------------------------------------------
-- comparador
------------------------------------------------------------------
--la desactivación de la banda transportadora se hace con esta señal, la cual se
--genera de la comparación del valor almacenado inicial con el del contador
IGUAL <= '1' WHEN (db2=cnt ) ELSE '0';
end Behavioral;