Programación básica de contador con GAL22V10B.

Hola, buen día.
Saludos a todos.
Me podrían ayudar por favor con la programación para una GAL22V10B, en el cual debo contar hasta 16 y mostrar la salida en un display de 7 segmentos, despues del 9 mostrare A, despues B, hasta la F.
algo asi:

entity (clk: in std_logic;
salida: out std_logic 6 downto 0 ));

when cuenta=0 then
salida<="1111110" else -- mostrando 0 en display
when cuenta=1 then
salida<="1100000" else -- mostrando 1 en display
etc etc...
when cuenta=16 then -- mostrando F en display
salida<="1111000"else;

PD: cuando en la salida repito el mismo valor en todos los valores de cuenta me corre sin errores, pero cuando le cambio los valores a las salidas empieza con error.
parece que solo puedo contar hasta 9.
?=(

Saludos y muchas gracias. ...
 
Hola. Buen día.
Lo realicé en galaxy, es vhdl.
Saludos.



Cuando cambio los valores a la salida me da error cuando cuenta=4.
Aquí está el programa:
Código:
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;

entity cont4bits is
port (CLK : in std_logic;
       sal: out std_logic_vector(6 downto 0));
end cont4bits;

architecture arqcont4 of cont4bits is
signal cuenta:integer range 0 to 16;
begin

process (CLK)
begin
if (Clk' Event and Clk='1')then
    if (cuenta<15) then
    cuenta<=cuenta+1;
    else
    cuenta<=0;
    end if;
end if;
end process;

sal<= "0000000" when cuenta=0 else
    "0000001" when cuenta=1 else
    "0010000" when cuenta=2 else
    "0011000" when cuenta=3 else
    "0100000" when cuenta=4 else -- aqui me da error y no puedo copilar.
    "0101000" when cuenta=5 else
    "0110000" when cuenta=6 else
    "0111000" when cuenta=7 else
    "0100000" when cuenta=8 else
    "1001000" when cuenta=9 else
    "1010000" when cuenta=10 else
    "1011000" when cuenta=11 else
    "1100000" when cuenta=12 else
    "1101000" when cuenta=13 else
    "1110000" when cuenta=14 else
    "1111000" when cuenta=15 else
    "0010000";


end arqcont4;
 
Última edición por un moderador:
Aqui te pongo mi version. No son muchos los cambios

Use la libreria numeric_std, hoy en dia mas aceptada, agregue una señal de reset que conviene siempre que este en todo diseño, y con esos cambios y alguna cosa mas, a mi me anda

Código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.ALL;

entity cont4bits is
port (
      rst_n : in std_logic;
      clk : in std_logic;
      sal: out std_logic_vector(6 downto 0)
);
end cont4bits;

architecture arqcont4 of cont4bits is
signal cuenta:integer range 0 to 15;
begin

process (rst_n, clk)
begin
	if (rst_n = '0') then
		cuenta <= 0;
	elsif (clk'event and clk='1') then
		if (cuenta < 15) then
			cuenta <= cuenta+1;
		else
			cuenta <= 0;
		end if;
	end if;
end process;

sal<= "0000000" when cuenta=0 else
	"0000001" when cuenta=1 else
    "0010000" when cuenta=2 else
    "0011000" when cuenta=3 else
    "0100000" when cuenta=4 else 
    "0101000" when cuenta=5 else
    "0110000" when cuenta=6 else
    "0111000" when cuenta=7 else
    "0100000" when cuenta=8 else
    "1001000" when cuenta=9 else
    "1010000" when cuenta=10 else
    "1011000" when cuenta=11 else
    "1100000" when cuenta=12 else
    "1101000" when cuenta=13 else
    "1110000" when cuenta=14 else
    "1111000" when cuenta=15 else
    "0010000";


end arqcont4;
 
Hola. Buen día.
Intenta correr este y mirarás el problema que me arroja.
A este programa le hice el cambio cuando cuenta es igual a 4 (when cuenta=4 then) y me dice ERROR SIGNAL CUENTA_IBV_0 CAN NOT BE PLACED ON DEVICE.

Código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.ALL;

entity cont4bits is
port (
      reset: in std_logic;
      clk : in std_logic;
      sal: out std_logic_vector(6 downto 0)
);
end cont4bits;

architecture arqcont4 of cont4bits is
signal cuenta:integer range 0 to 15;
begin

process (reset, clk)
begin
    if (reset = '0') then
        cuenta <= 0;
    elsif (clk'event and clk='1') then
        if (cuenta < 15) then
            cuenta <= cuenta+1;
        else
            cuenta <= 0;
        end if;
    end if;
end process;

sal<=     "1111110" when cuenta=0 else
        "0000001" when cuenta=1 else
            "0011111" when cuenta=2 else
        "0011111" when cuenta=3 else
        "0111111" when cuenta=4 else 
        "0101111" when cuenta=5 else
        "0110000" when cuenta=6 else
        "0111000" when cuenta=7 else
        "0100000" when cuenta=8 else
        "1001000" when cuenta=9 else
        "1010000" when cuenta=10 else
        "1011000" when cuenta=11 else
        "1100000" when cuenta=12 else
        "1101000" when cuenta=13 else
        "1110000" when cuenta=14 else
        "1111000" when cuenta=15 else
        "0010000";


end arqcont4;
 
Última edición por un moderador:
Parece un error especifico de la implementacion usando ese dispositivo. No consegui la instalacion de esa herramienta, Galaxy de Cypress, es obsoleta. Intente con Lattice pero no me anda en Windows 8 :(

El hecho de que las GAL22V10 ya sean tambien oficialmente obsoletas desde hace varios años ciertamente no ayuda...
 
Última edición:
Yo sugiero que lo implementes en una FPGA, de ser así hay que tener en cuenta el reloj al que ésta trabaja, que es de 50 MHz. Esto requiere que el contador se haga a partir de un divisor de frecuencia

Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity counter is
    Port ( CLK : in  STD_LOGIC;
           DISPLAY : out  STD_LOGIC_VECTOR (6 downto 0));
end counter;

architecture Behavioral of counter is

signal conta: std_logic_vector (3 downto 0):="0000";
signal divisor: integer range 0 to 25000000;

begin

process(CLK)
	begin
		if rising_edge(CLK) then
			if divisor = 25000000 then
				conta<=conta+'1';
				divisor<=0;
			else
				divisor<=divisor+1;
			end if;
		end if;
end process;

with conta select
DISPLAY<= "0000001"  when "0000",	--0
			 "1001111"	when "0001",	--1
			 "0010010"	when "0010",	--2
			 "0000110"	when "0011",	--3
			 "1001100"	when "0100",	--4
			 "0100000"	when "0101",	--5
			 "0001000"	when "0110",	--6
			 "0000000"	when "0111",	--7
			 "0010000"	when "1000",	--8
			 "0110000"	when "1001",	--9
			 "0100010"	when "1010",	--A
			 "0010000"	when "1011",	--B
			 "0001000"	when "1100",	--C
			 "1000000"  when "1101",	--D
			 "1010101"	when "1110",	--E
			 "1111111"	when others;	--F


end Behavioral;
Este código soluciona el problema. La decodificación no está bien hecha porque me dio pereza hacerla pero esa es la idea
 
Yo lo haria con una tabla en wincupl.

Dicho esto, si necesitas contar los pulsos de la entrada de clock, creo que podrias estar en un problema. Si mal no recuerdo esa GAL tiene 10 registros de salida y vos necesitarias 11: 7 para el display + 4 para el contador.

-----------------------------------

Me corrijo: con 4 registros para el contador te alcanza y luego seria logica combinacional para el display.

En 4 bits de salida implementas un contador binario comun, y usas esos bits como entrada para una tabla.
 
Parece un error especifico de la implementacion usando ese dispositivo. No consegui la instalacion de esa herramienta, Galaxy de Cypress, es obsoleta. Intente con Lattice pero no me anda en Windows 8 :(

El hecho de que las GAL22V10 ya sean tambien oficialmente obsoletas desde hace varios años ciertamente no ayuda...

Tienes razon... abriendo el archivo .jed con notepad se puede apreciar que la salida se satura y no puede hacer mas puesto que se llena la salida con ceros y unos.

Yo sugiero que lo implementes en una FPGA, de ser así hay que tener en cuenta el reloj al que ésta trabaja, que es de 50 MHz. Esto requiere que el contador se haga a partir de un divisor de frecuencia

Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity counter is
    Port ( CLK : in  STD_LOGIC;
           DISPLAY : out  STD_LOGIC_VECTOR (6 downto 0));
end counter;

architecture Behavioral of counter is

signal conta: std_logic_vector (3 downto 0):="0000";
signal divisor: integer range 0 to 25000000;

begin

process(CLK)
	begin
		if rising_edge(CLK) then
			if divisor = 25000000 then
				conta<=conta+'1';
				divisor<=0;
			else
				divisor<=divisor+1;
			end if;
		end if;
end process;

with conta select
DISPLAY<= "0000001"  when "0000",	--0
			 "1001111"	when "0001",	--1
			 "0010010"	when "0010",	--2
			 "0000110"	when "0011",	--3
			 "1001100"	when "0100",	--4
			 "0100000"	when "0101",	--5
			 "0001000"	when "0110",	--6
			 "0000000"	when "0111",	--7
			 "0010000"	when "1000",	--8
			 "0110000"	when "1001",	--9
			 "0100010"	when "1010",	--A
			 "0010000"	when "1011",	--B
			 "0001000"	when "1100",	--C
			 "1000000"  when "1101",	--D
			 "1010101"	when "1110",	--E
			 "1111111"	when others;	--F


end Behavioral;
Este código soluciona el problema. La decodificación no está bien hecha porque me dio pereza hacerla pero esa es la idea


Hola, buen día.
No puedo usar otra memoria, solo la gal, fue lo primero que me pareció incorrecto, usar esta gal.



Yo lo haria con una tabla en wincupl.

Dicho esto, si necesitas contar los pulsos de la entrada de clock, creo que podrias estar en un problema. Si mal no recuerdo esa GAL tiene 10 registros de salida y vos necesitarias 11: 7 para el display + 4 para el contador.

-----------------------------------

Me corrijo: con 4 registros para el contador te alcanza y luego seria logica combinacional para el display.

En 4 bits de salida implementas un contador binario comun, y usas esos bits como entrada para una tabla.

Estas en lo correcto, usa gal tiene 10 salidas y necesito 11 salidas, 7 para display y 4 para contador... gracias por el consejo, ya tengo un programa de un contador de 4 bits, esta seria mi ultima opción y lo tomaría como binario.





Hola, buen día.
Solucionado, quite el contador del programa por que con este saturo las salidas y tome el evento del clock para el when del case...
saludos.

si quieren el programa lo suvire pero hasta que se termine el cuatrimestre... hahaha... :p
 
Última edición:
Programa que cuenta hasta 16 en display 7 segmentos solo ascendente:

library ieee;
use ieee.std_logic_1164.all;

entity contdisp is
port( Clk: in std_logic;
D: out std_logic_vector(6 downto 0));

attribute pin_numbers of contdisp: entity is
" D(6):21 D(5):20 D(4):19 D(3):18 D(2):17 D(1):16 D(0):15 ";

end contdisp;

architecture arqcont of contdisp is begin
process (clk) begin
if(clk'event and clk = '1') then
case D is
when "0000001" => D <= "1001111"; --0
when "1001111" => D <= "0010010"; --1
when "0010010" => D <= "0000110"; --2
when "0000110" => D <= "1001100"; --3
when "1001100" => D <= "0100100"; --4
when "0100100" => D <= "0100000"; --5
when "0100000" => D <= "0001111"; --6
when "0001111" => D <= "0000000"; --7
when "0000000" => D <= "0000100"; --8
when "0000100" => D <= "0000010"; --9
when "0000010" => D <= "1100000"; --a
when "1100000" => D <= "0110001"; --b
when "0110001" => D <= "1000010"; --c
when "1000010" => D <= "0010000"; --d
when "0010000" => D <= "0111000"; --e
when "0111000" => D <= "0000001"; --f
when others => D <= "0000001";
end case;
else
end if;
end process;
end arqcont;


Muchas gracias a todos.
programado en Galaxy y grabado en GAL22V10 con BK PRESICION.
 
Atrás
Arriba