# Dudas sobre Programación en VHDL



## RicardoZ

Realmente soy muy nuevo con esto de las FPGA's. Sin embargo, he estado probando cada dispositivo extra. Sin embargo, no he logrado satisfactoriamente una señal variable (con un potenciómetro). Mi salida, la cual está a los 8 LED's, siempre me muestra números sin sentido. Después de varias pruebas, me recomendaron que programara al preamplificador y al ADC en un programa como máquina de estados, sin embargo, aún sigo teniendo el mismo problema. El programa lo adjunto más adelante, el cual escribe la ganancia al preamplificador, luego activa al ADC, esperando los 34 pulsos de reloj. Si se quiere tomar otra muestra, se tiene que presionar un pushbutton, el cual solo repite los estados del ADC. También posee una activación externa del preamplificador.

Aquí está el ucf de mi programa:



		Código:
	

#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "ad_conv"  LOC = "p11" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "amp_cs"  LOC = "n7" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "amp_shdn"  LOC = "p7" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "clk50"  LOC = "c9" | IOSTANDARD = LVCMOS33 ; 
NET "DAC_CS"  LOC = "n8" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 8 ; 
NET "data<0>"  LOC = "f12" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<1>"  LOC = "e12" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<2>"  LOC = "e11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<3>"  LOC = "f11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<4>"  LOC = "c11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<5>"  LOC = "d11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<6>"  LOC = "e9" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<7>"  LOC = "f9" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "FPGA_INIT_B"  LOC = "t3" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 4 ; 
NET "onpre"  LOC = "l13" | IOSTANDARD = LVTTL  | PULLUP ; 
NET "rstadc"  LOC = "k17" | IOSTANDARD = LVTTL  | PULLDOWN ; 
NET "rstpre"  LOC = "d18" | IOSTANDARD = LVTTL  | PULLDOWN ; 
NET "sel"  LOC = "l14" | IOSTANDARD = LVTTL | PULLUP ;
NET "SF_CE0"  LOC = "d16" | IOSTANDARD = LVCMOS33  | DRIVE = 4  | SLEW = SLOW ; 
NET "spi_clk"  LOC = "u16" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "spi_miso"  LOC = "n10" | IOSTANDARD = LVCMOS33 ; 
NET "spi_mosi"  LOC = "t4" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "SPI_SS_B"  LOC = "u3" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 

#PACE: Start of PACE Area Constraints

#PACE: Start of PACE Prohibit Constraints

#PACE: End of Constraints generated by PACE


Dejo el programa en el archivo adjunto
De antemano, gracias


----------



## camilo*andres*luna

tengo que hacer un multiplexor 3 a 8 con enable activo en bajo (lm 74251) en vhdl  con arquitectura estrutural, cuando el enable esta en '1' la salidad tiene que ser alta impedancia, el problema es que no como hacer la compuerta para que cuando el anable sea '1' obtener la salida deseada


----------



## darkcomet

hola es sencillo suponiendo que enable sea una señal de entrada tipo bit  como es en realizad y suponiendo que mi salida es un std_logic_vector(7 downto 0) y se llama sal, entonces se puede implementar asi:

if enable='1' then
sal<="zzzzzzzz";
end if;

y listo claro que depende de como declares las señales


----------



## ThaConectted

hola pues miren basicamente lo que quiero hacer en realizar
en vhdl el desarrollo de un contador modulo 10 alguna
buena aportación?

y pues de ahi desarrollar otros contadores como le modifico?
gracias


----------



## cesaritox09

Hola soy nuevo en el foro, y pues tengo una especie de tarea y es crear, a partir de un circuito secuencial, un dado digital; empleando el concepto de maquina de moore y usando flip flops tipo D y que se pueda visualizar en un display 7 segmento de la Spartan 3.
Pero tengo un problema, por alguna razón solo visualizo la secuencia 1,4,5,6... en verdad necesito que alguien me ayude, he revisado las tablas de exitación y los mapas K pero no he encontrado errores algunos, ni siquiera en la conexión del circuito. Ahi he adjuntado las tablas espero que puedan ayudarme...
Gracias


----------



## Ardogan

Me costó entenderlo al principio porque no incluiste un diagrama de flujo, ni aclaraste bien cuales eran las entradas/salidas del circuito.
Viendo la tabla de excitación, el estado no cambia cuando X=0, solo cuando X=1. Supongo que la idea es que al presionar X (X=1) un cierto tiempo el dado "ruede" hasta que se suelte X (X=0).
Las salidas S1,S2,S3 más una más que estaría siempre a 0 formarían una salida BCD que después la Spartan la utilizará para visualizar el valor en un display 7 segmentos.

Por otra parte, me alegra ver que un nuevo participante tiene el buen criterio de elegir un buen título, y postear algo hecho sin esperar que se lo resuelvan desde 0 acá. Así que va mi bienvenida a alguien que primero lo intenta y después si no sale pide ayuda!.

Bueno, encontré un error, es la 1ra vez que veo plantear las tablas de Karnaugh de esa manera así que lo tuve que hacer por mi parte.
El error está en la ecuación de D2 que queda:
D2 = /X Q2 + /Q1 Q2 + X Q1 /Q2 /Q3
La diferencia está en el último término, Q1 va sin negar.

Fijate que tu ecuación de D2 no se cumple para la fila 4 de la tabla.

Las ecuaciones de las salidas no las ví, si corrigiendo eso sigue sin salir volvé por acá que te damos una mano.

Saludos


----------



## cesaritox09

ah discúlpame, no se como pude olvidar lo del diagrama de estados jaja, es que ayer estaba tan desesperado porque llevo 1 semana en esto y es para entregar el jueves.  Y si con un botón de la Spartan el dado debe girar mientras el botón se mantenga presionado (X=1) y detenerse cuando se suelte (X=0).

Por otra parte las ecuaciones de salidas S3 S2 S1 estaban en el archivo "2.jpg".  Se que hay otra forma de hacer el mapa de Karnaugh, pero jamás llegue a entenderla bien jeje y por eso empleo esta otra forma.

Y ya vi mi error tienes razón con lo de la ecuación D2, lo que pasa es que cuando hice el mapa de Karnaugh, del lado izquierdo puse dos veces en la tabla: /Q1 y /Q1, y debía ser /Q1 y Q1.

Muchísima gracias en verdad, no sabes cuanto te lo agradezco, ya por fin el dado funciona simulado en circuit maker, ahora solo debo pasarlo a Xilinx y listo...

MIL GRACIAS! de nuevo....


----------



## Ardogan

Ok cesaritox09, me alegra haber podido ayudar.
Otra cosa destacable es que respondiste comentando como te fué, muchas veces uno da una respuesta o propone una solución y el que hizo la pregunta desaparece.
Así que bienvenido colega a la comunidad, comenzaste con el pie derecho, jaja.

Saludos


----------



## kikinzet

El problema que tengo es que  al hacer  un sumador BCD en VHDL cuando compilo me marca 2 errores ya he intentado de todo y nada, ademas de todo estoy desesperado por que el proyecto es para mañana  y no me queda espero me puedan ayudar les anexo el codigo que  tengo.



> -- Librerias aUtilizar --
> LIBRARY ieee;
> USE ieee.std_logic_1164.all;
> USE ieee.std_logic_arith.all;
> USE ieee.std_logic_unsigned.all;
> -- Definiendo Suma (bcd1+bcd2) --
> entity SumBCD is
> Port ( 	bcd1 : in std_logic_vector(3 downto 0);
> bcd2 : in std_logic_vector(3 downto 0);
> cibcd: in std_logic;
> bcdsum : out std_logic_vector(3 downto 0);
> cobcd : out std_logic);
> end SumBCD;
> -- Comportamiento de SumBCD --
> architecture uno of SumBCD is
> component sum4bit is
> Port ( a : in std_logic_vector(3 downto 0);
> b : in std_logic_vector(3 downto 0);
> cin : in std_logic;
> sum : out std_logic_vector(3 downto 0);
> cout : out std_logic);
> end component sum4bit;
> signal s,x: std_logic_vector(3 Downto 0);
> signal c,K : std_logic;
> begin
> u1: sum4bit port
> map(a(3)=>bcd1(3),a(2)=>bcd1(2),a(1)=>bcd1(1),a(0)=>bcd1(0),
> b(3)=>bcd2(3),b(2)=>bcd2(2),b(1)=>bcd2(1),b(0)=>bcd2(0),
> cin=>cibcd,sum(3)=>s(3),sum(2)=>s(2),sum(1)=>s(1),sum(0)=>s(0),cout=>c);
> K <= (s(3)and s(2))or(s(3)and s(1))or(c);
> x <= "0110" when k ='1' else
> "0000";
> u2: sum4bit port
> map(a(3)=>s(3),a(2)=>s(2),a(1)=>s(1),a(0)=>s(0),b(3)=>x(3),b(2)=>x(2),b(1)=>x(1),b(0)=>x(0),
> cin=>'0',sum(3)=>bcdsum(3),sum(2)=>bcdsum(2),sum(1)=>bcdsum(1),sum(0)=>bcdsum(0),
> cout=>cobcd);
> 
> end uno;



y este es el error que  me arroja el compilador 





> Error: Node instance "u1" instantiates undefined entity "sum4bit"


, 





> Error: Node instance "u2" instantiates undefined entity "sum4bit"


.

Espero de su valiosa ayuda ya que  si no entrego esto  voy a reprobar la asignatura!


----------



## Elvic

saludos

asegura te de agregar en el espacio de trabajo el archivo con nombre sum4bit, con su respectivo codigo
cuando haces la compilación es necesario que este adjunto al proyecto...

asi no te marcara ese error.


----------



## kikinzet

trabajando en eso  gracias


----------



## BraveHeart

Bueno disculpen que después de tanto tiempo me conecte al foro, pero estuve haciendo algunos trabajos con mi spartan. Respecto al adc de la spartan el código de arriba esta bueno, solo falta hacerle unos ajustes respecto a la señal de muestreo del adc, ya que para que pueda trabajar debe pasarse al estado bajo, por otro lado si se encuentra en estado alto mientras algún dispositivo trata de acceder al bus spi se pueden generar conflictos, por eso es mejor dejarlo en estado bajo mientras se escribe en el amplificador. Les dejo el código modificado y funcionando.


----------



## ___

Hola,
Estoy interesado en hacer un contador básico con dos entradas, y que éstas sean sin signo, es decir, que el contador me de A+B O A-B (con un multiplexor poder seleccionar si es la suma o la resta). El código vhdl no me da ningún error, pero al querer simularlo con ISE, me sale lo siguiente:



> Multiple declarations of unsigned included via multiple use clauses; none are made directly visible
> 
> Unit contador ignored due to previous errors
> 
> Entity contador is not yet compiled
> 
> unsigned is not declared



El código es el siguiente:



		PHP:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

entity contador is
    Port ( entrada1 : in unsigned (3 downto 0);
             entrada2 : in  unsigned (3 downto 0);
             operacion : in  STD_LOGIC;
             salida : out  STD_LOGIC_VECTOR (3 downto 0));
end contador;

architecture Behavioral of contador is

signal numero: unsigned (3 downto 0);

begin

numero<=(a+b) when operacion='0' else (a-b)
salida<=std_logic_vector(numero)

end Behavioral;



Muchas gracias.


----------



## ituarte

Hola estoy haciendo un sumador en el cual tengo dos entradas A y B, en funcion de un selecctor puedo hacer A+B ; A-B, A+1; A-1. la cuestion es que solo puedo usar un sumador, por lo que he hecho lo siguiente: 



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sumador2 is
    Port ( a : in  unsigned (15 downto 0);
           b : in  unsigned (15 downto 0);
           ctrl : in  unsigned (1 downto 0);
           result : out  unsigned (15 downto 0));
end sumador2;

architecture Behavioral of sumador2 is
signal aux: unsigned (15 downto 0);
begin
[COLOR=YellowGreen]--Multiplexador[/COLOR]
with ctrl select
aux<= b when "00",
[COLOR=Red]-b[/COLOR] when "01",
"0000000000000001" when "10",
"1111111111111111" when others;
[COLOR=YellowGreen]-- Sumador[/COLOR]
result<= a+aux;

end Behavioral;

la cuestion es que no se como hacer A-B, para hacer el -1 lo e pasado a complemento A2

Gracias y un saludo


----------



## jaimepsantos

hola que tal mira solo consiste en invertir todo y sumarle uno te puede quedar de la siguiente manera, a ademas le agregue un bit mas a la salida para que veas tu suma  completa.



		PHP:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sumador2 is
    Port ( a : in  std_logic_vector (15 downto 0);
           b : in  std_logic_vector (15 downto 0);
           ctrl : in  std_logic_vector(1 downto 0);
           result : out  std_logic_vector (16 downto 0));
end sumador2;

architecture Behavioral of sumador2 is
signal aux: std_logic_vector (15 downto 0);
begin
--Multiplexador
aux<=
    b when (ctrl ="00")else--sumas b
    ((not b)+'1') when (ctrl ="01")else--restas b por complemento a 2
    "0000000000000001" when (ctrl ="01")else--sumas 1
    "1111111111111111" when (ctrl ="11");--restas 1
-- Sumador
result<= '0'&(a+aux);

end Behavioral;


----------



## jaimepsantos

___ dijo:


> Hola,
> Estoy interesado en hacer un contador básico con dos entradas, y que éstas sean sin signo, es decir, que el contador me de A+B O A-B (con un multiplexor poder seleccionar si es la suma o la resta). El código vhdl no me da ningún error, pero al querer simularlo con ISE, me sale lo siguiente:
> 
> Multiple declarations of unsigned included via multiple use clauses; none are made directly visible
> 
> Unit contador ignored due to previous errors
> 
> Entity contador is not yet compiled
> 
> unsigned is not declared
> 
> 
> 
> El código es el siguiente:
> 
> 
> 
> PHP:
> 
> 
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> use IEEE.NUMERIC_STD.ALL;
> 
> entity contador is
> Port ( entrada1 : in unsigned (3 downto 0);
> entrada2 : in  unsigned (3 downto 0);
> operacion : in  STD_LOGIC;
> salida : out  STD_LOGIC_VECTOR (3 downto 0));
> end contador;
> 
> architecture Behavioral of contador is
> 
> signal numero: unsigned (3 downto 0);
> 
> begin
> 
> numero<=(a+b) when operacion='0' else (a-b)
> salida<=std_logic_vector(numero)
> 
> end Behavioral;
> 
> 
> 
> Muchas gracias.



Oye por que pusiste a+b y a-b si tus entradas se llaman entrada1 y entrada2 ??????


----------



## jaimepsantos

darkcomet dijo:


> if enable='1' then
> sal<="zzzzzzzz";
> end if;


Con mayusculas

sal<="ZZZZZZZZ"


----------



## jaimepsantos

ThaConectted dijo:


> hola pues miren basicamente lo que quiero hacer en realizar
> en vhdl el desarrollo de un contador modulo 10 alguna
> buena aportación?
> 
> y pues de ahi desarrollar otros contadores como le modifico?
> gracias



Este es el codigo de un contador ascendente y/o descente un poco tarde pero aqui esta


		Código:
	

Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity count_5 is
port
( clk,ad,reset: in std_logic;--ad es ascendente o descendente
out_data : buffer std_logic_vector (4 downto 0)
);
end count_5;

Architecture func of count_5 is
    begin
        process(clk,reset)
            begin
            if(reset='1') then
                out_data<="00000";
            elsif(clk' event and clk='1') then
                if (ad='0') then
                    out_data <= out_data + '1';
                else
                    out_data <= out_data - '1';
                end if;
            end if;
        end process;
end func;


----------



## dmedina84

Buenos dias, estoy buscando alguien que me informe donde puedo encontrar el codigo VHDL de un *covertidor BCD (8421) a BCD exceso 3*.... pues no se de programacion en este lenguaje...agradezco la ayuda....saludos.


----------



## jaimepsantos

Hay dos formas de hacerlo. aqui te las pongo ambas:



		Código:
	

Library IEEE;
use ieee.std_logic_1164.all;

Entity BCD_EX3 is
port
(
BCD: in std_logic_vector (3 downto 0);
BCD_3 : out std_logic_vector (3 downto 0)
);
end BCD_EX3;

Architecture flujo of BCD_EX3 is
begin
BCD_3<= "0011" when (BCD="0000")else--0
        "0100" when (BCD="0001")else--1
        "0101" when (BCD="0010")else--2
        "0110" when (BCD="0011")else--3
        "0111" when (BCD="0100")else--4
        "1000" when (BCD="0101")else--5
        "1001" when (BCD="0110")else--6
        "1010" when (BCD="0111")else--7
        "1011" when (BCD="1000")else--8
        "1100" when (BCD="1001")else--9
        "0000000"  ;
end flujo;




		Código:
	

Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity BCD_EX3 is
port
(
BCD: in std_logic_vector (3 downto 0);
BCD_3 : out std_logic_vector (3 downto 0)
);
end BCD_EX3;

Architecture flujo of BCD_EX3 is
begin

BCD_3<= BCD + "11";

end flujo;


----------



## dmedina84

Hombre muchas gracias...eres muy amable... no pense que fueran a responder tan rapido... de verdad te lo agradezco mucho.


----------



## SLIM00ING

buenas tardes colegas despues de un año ahora ingreso a esta comunidad pidiendoles ayuda al respecto del miniproyecto este de hacer un dado electronico digital y requiero de su ayuda cesaritox no tendras de casualidad el proyecto hecho en xilinx aun ?? si lo subes te lo agradecere mucho igual a ti ardogan


----------



## dmedina84

jaimepsantos dijo:


> Hay dos formas de hacerlo. aqui te las pongo ambas:
> 
> 
> 
> Código:
> 
> 
> Library IEEE;
> use ieee.std_logic_1164.all;
> 
> Entity BCD_EX3 is
> port
> (
> BCD: in std_logic_vector (3 downto 0);
> BCD_3 : out std_logic_vector (3 downto 0)
> );
> end BCD_EX3;
> 
> Architecture flujo of BCD_EX3 is
> begin
> BCD_3<= "0011" when (BCD="0000")else--0
> "0100" when (BCD="0001")else--1
> "0101" when (BCD="0010")else--2
> "0110" when (BCD="0011")else--3
> "0111" when (BCD="0100")else--4
> "1000" when (BCD="0101")else--5
> "1001" when (BCD="0110")else--6
> "1010" when (BCD="0111")else--7
> "1011" when (BCD="1000")else--8
> "1100" when (BCD="1001")else--9
> "0000000"  ;
> end flujo;
> 
> 
> 
> 
> Código:
> 
> 
> Library IEEE;
> use ieee.std_logic_1164.all;
> use ieee.std_logic_unsigned.all;
> 
> Entity BCD_EX3 is
> port
> (
> BCD: in std_logic_vector (3 downto 0);
> BCD_3 : out std_logic_vector (3 downto 0)
> );
> end BCD_EX3;
> 
> Architecture flujo of BCD_EX3 is
> begin
> 
> BCD_3<= BCD + "11";
> 
> end flujo;


Hola jaimepsantos, estuve probando el codigo que me sugeriste sobre BCD a BCD3 (el primero de ellos).... en la parte *"0000000"  ;* me sale un error en el ISE xilinx.... y no me compila.... le hace falta algo alli???...gracias


----------



## jaimepsantos

aqui te dejo una idea, consiste en un conteo de alta velocidad demanera que cuando tu presionas el boton este se muestra en display de 7 segmentos, el conteo se resetea cuando es seis, de ahi lo decodoficamos a 7 segmentos, asi tenemos una secuencia de velocidad muy alta diciendo que es imposible elegir un valor es decir es al azar



		Código:
	

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity dado is
    port
    (
    clk_50, env_data: in std_logic;--al cristal de 50MHZ y env data es el boton
    salida7s: out std_logic_vector(6 downto 0)
    );
end dado;

Architecture special of dado is
   signal conteo: std_logic_vector(2 downto 0);
   signal conteo_deco: std_logic_vector(6 downto 0);
      begin
        process(clk_50)
            begin
            if(clk_50' event and clk_50='1')then
            conteo<=conteo+'1';
                if(conteo="110")then
                conteo<=0;
                end if;
            end if;    
        end process;    
    conteo_deco <=
        "1111110" when (conteo="000")else--0
        "0110000" when (conteo="001")else--1
        "1101101" when (conteo="010")else--2
        "1111001" when (conteo="011")else--3
        "0110011" when (conteo="100")else--4
        "1011011" when (conteo="101")else--5
        "1011111" when (conteo="110")else--6
        "0000000"  ;
    
    salida7s = conteo_deco when (env_data='1')else
    "ZZZZZZZ";    
end special;


----------



## dmedina84

Buenos dias.

hace algunos dias pregunte por un condigo VHDL para un convertidor BCD a BCD exceso 3 y me ayudaron con el siguiente. Pero resulta que al usarlo me sale un error en la penultima linea  ("0000000"  ; ).... mi pregunta es...que le falta a este codigo???...gracias.. 



		Código:
	

Library IEEE;
use ieee.std_logic_1164.all;
 
Entity BCD_EX3 is
port
(
BCD: in std_logic_vector (3 downto 0);
BCD_3 : out std_logic_vector (3 downto 0)
);
end BCD_EX3;
 
Architecture flujo of BCD_EX3 is
begin
BCD_3<= "0011" when (BCD="0000")else--0
        "0100" when (BCD="0001")else--1
        "0101" when (BCD="0010")else--2
        "0110" when (BCD="0011")else--3
        "0111" when (BCD="0100")else--4
        "1000" when (BCD="0101")else--5
        "1001" when (BCD="0110")else--6
        "1010" when (BCD="0111")else--7
        "1011" when (BCD="1000")else--8
        "1100" when (BCD="1001")else--9
        "0000000"  ;
end flujo;


----------



## Earl

Pero en el display estarias viendo como es que va avanzando el contador solo cuando env_data='1' no? es necesario tambien pausar esa serie de datos cuando env_data='1'



		Código:
	

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity dado is
    port
    (
    clk_50, env_data: in std_logic;--al cristal de 50MHZ y env data es el boton
    salida7s: out std_logic_vector(6 downto 0)
    );
end dado;

Architecture special of dado is
   signal conteo: std_logic_vector(2 downto 0);
   signal conteo_deco: std_logic_vector(6 downto 0);
      begin
        process(clk_50)
            begin
            if(clk_50' event and clk_50='1')then
               [COLOR="Red"]if (env_data='0') then
                  conteo<=conteo+'1';
               elsif (env_data='1') then
                  conteo<=conteo;
               end if;[/COLOR]
                if(conteo="110")then
                conteo<="001";
                end if;
            end if;    
        end process;    
    conteo_deco <=
        "0110000" when (conteo="001")else--1
        "1101101" when (conteo="010")else--2
        "1111001" when (conteo="011")else--3
        "0110011" when (conteo="100")else--4
        "1011011" when (conteo="101")else--5
        "1011111" when (conteo="110")else--6
        "0000000"  ;
    
    salida7s <= conteo_deco when (env_data='1') else
    "ZZZZZZZ";    
end special;


----------



## jaimepsantos

tienes razon asi veriamos un numero cambviante mientras se presiona el env_data asi paramos la cuenta y se muestra un numero fijo en el display


----------



## jaimepsantos

disculpa fue un error solo cambia esos "0000000" por "0000" con eso estaria funcionando:


----------



## dmedina84

ok...muchas gracias por responder.... lo probaré.


----------



## SLIM00ING

gracias colegas pero yo estuve haciendolo mediante makina de moore con mapas k, tabla de exitacion y me falta solo es el eskematico para convertirlo en bloke en xilinx asi q si me pueden ayudar nuevamente se los agradezco gracias


----------



## ituarte

Hola tengo que hacer en la spartan 3E un circuito de detección de flanco descendente podeis ayudarme?? no se ni por donde empeza. 

gracias y un saludo


----------



## dmedina84

Buenas tardes, quisiera que porfavor me ayudaran:

Necesito varios ejemplos de programación en lenguaje VHDL para Registros *Lifo Lilo, Filo Fifo* (_Desplazamiento a derecha o izquierda_).... agradezco de antemano la ayuda... *Muchas gracias*...


----------



## jaimepsantos

ituarte dijo:


> Hola tengo que hacer en la spartan 3E un circuito de detección de flanco descendente podeis ayudarme?? no se ni por donde empeza.
> 
> gracias y un saludo



Hola que tal te dejo esto es un FF tipo d  de 8 bits utilizando flanco de bajada:



		Código:
	

Library ieee;
use ieee.std_logic_1164.all;

entity FFD_8 is
port(
    oe,clk : in std_logic;
    data_in : in std_logic_vector (7 downto 0);
    data_out: out std_logic_vector (7 downto 0)
    );
end FFD_8;

Architecture func of FFD_8 is
begin
    process(clk,oe)
    begin
        if (oe ='0') then
        data_out <= "ZZZZZZZZ";
        elsif(clk' event and clk='0') then--deteccion del flanco con cero es bajada
        data_out <= data_in;--con un 1 es subida
        end if;
    end process;
end func;


----------



## juansesochevi

Compañeros, lo que sucede es que tengo que hacer un modulo en vhdl, en el cual me entran dos vectores de 14 bits, y lo que tengo que hacer es sacar otro vector corregido de 14 bits segun la siguiente formula. (TR/TF)xTF , donde TR y TF son los vectores de entrada, ya que necesito hacer una calibracion para un termometro. Mi problema es que necesito que la salida tenga la mayor exactitud posible, para que se aproxime a TF, por lo tanto la division TR/TF de ser un real (ej:100/30=3.33) pero no he podido cuadrar el codigo ya que solo me permite hacer divisiones por 2 a la n. Agradeceria que me pudieran ayudar a cuadrar este codigo para que mi salida sea lo mas precisa posible.


----------



## jaimepsantos

Debes cambiar el tipo de variable seguramente estas usando el std_logic cambiala a real, aqui te dejo un ejemplo de como sebes hacerlo.

*Variables en VHDL*
•Tipos reales o flotantes.
Real o punto flotante, sirven para representar números enteros y fraccionarios su rango esta entre -1e38 a 1e38.

Ejemplos:
type Voltaje is range-5.5 TO 5.5;
signal V1: voltaje:= -3.3;
signal duracion: *real*:= -3.3; --Predefinido en el lenguajeVHDL

http://usuarios.multimania.es/israelsu/unimayab/Arquitectura%20de%20Computadoras/Arq%20computadoras_05.pdf

Ve la hoja tres


----------



## juansesochevi

Gracias por todo jaimepsantos, me salvaste la vida!!

amigo pero ahora el programa no me sintetiza, no se que pasa, te agrego el codigo por si me puedes ayudar.

entity calibracion is
    Port ( E : in  STD_LOGIC;
			  TR : in  STD_LOGIC_VECTOR (13 downto 0);
           TF : in  STD_LOGIC_VECTOR (13 downto 0);
           TC : out  STD_LOGIC_VECTOR (13 downto 0));
end calibracion;

architecture Behavioral of calibracion is

signal RI : integer; 
signal FI : integer;
signal RR : real;
signal FR : real;
signal C : real;
signal CR : real;
signal CI : integer;
signal CV : STD_LOGIC_VECTOR (13 downto 0);

begin

process(TR,TF,E)
begin
if (E=1) then
RI:= conv_integer(TR);
FI:= conv_integer(TF);
RR:= real(RI);
FR:= real(FI);
C:= (RR/FR);
CR:= (C*FR);
CI:= integer(CR);
CV<= to std_(13 downto 0)logic_vector(CI);
end if;
end process;
TC<=CV;

end Behavioral;

Creo que tal vez estoy fallando en la conversion de entero a vector (señal CV).


----------



## gaelin31

Hola:
Tengo que diseñar un osciloscopio de una manera abierta (en cuanto a los elementos que contenga) en código VHDL y me gustaría ver algún código relacionado en VHDL para que me sirva como inspiración.
¿Conocéis algún repositorio de código donde pueda encontrar este tipo de elemento?
Muchas gracias


----------



## juansesochevi

amigos agradeceria si alguien me pudiera ayudar con este programa de vhdl el cual no se por que razon no me quiere funcionar. Gracias.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity calibracion is
    Port ( E : in  STD_LOGIC;
			  TR : in  STD_LOGIC_VECTOR (13 downto 0);
           TF : in  STD_LOGIC_VECTOR (13 downto 0);
           TC : out  STD_LOGIC_VECTOR (13 downto 0));
end calibracion;

architecture Behavioral of calibracion is
signal RI : integer RANGE 0 TO 150; 
signal FI : integer RANGE 0 TO 150;
signal CI : integer RANGE 0 TO 150;
signal RR : real RANGE 0.0 TO 150.0;
signal FR : real RANGE 0.0 TO 150.0;
signal C : real RANGE 0.0 TO 150.0;
signal CR : real RANGE 0.0 TO 150.0;
signal CV : std_logic_vector(13 downto 0);

begin
process(TR,TF,E)

--VARIABLE RI: integer RANGE 0 TO 150;
--VARIABLE FI: integer RANGE 0 TO 150;
--VARIABLE CI: integer RANGE 0 TO 150;
--VARIABLE RR: real RANGE 0.0 TO 150.0;
--VARIABLE FR: real RANGE 0.0 TO 150.0;
--VARIABLE C: real RANGE 0.0 TO 150.0;
--VARIABLE CR: real RANGE 0.0 TO 150.0;
--VARIABLE CV : std_logic_vector(13 downto 0);

begin
if (E='1') then
RI<= conv_integer(TR);
FI<= conv_integer(TF);
RR<= real(RI);
FR<= real(FI);
C<= (RR/FR);
CR<= (C*FR);
CI<= integer(CR);
CV<= conv_std_logic_vector(CI, 14);
end if;
TC<=CV;
end process;

end Behavioral;


----------



## luis carlos remon

Buenas noches colegas, me gustaria que me ayudaran a resolver un problema que me plantearon en lenguaje VHDL, y que yo no tengo mucho experiencia en este lenguaje, pero que es muy utilizado en al actualidad, el problema consiste en hacer en VHDL un indicador visual que muestre cuando van pasando una materia o si la van perdiendo basandose en un circuito logico, yo pienso implementarlo con un sumador, y un comparador, el sumador tomara las notas y las sumara para luego comparar el resultado en un comparador el cual dara el resultado segun la condicion impuesta.

agradezco la colaboracion de ustedes

LUIS CARLOS COTES


----------



## dcastibl1

y si hacemos una alu q sume las nostas las divide en el porcentaje q se necesita y lo compare??


----------



## luis carlos remon

ok seria una buena idea pero como se le hace


----------



## dcastibl1

bueno yo en el post de curso para iniciarse con fpga puse una alu q restaba sumaba, comparaba y otras funciones solo tocaria pensar para hacer el divisor pero eso si no es tan facil de hacerlo revisa el alu y me cuentas


----------



## luis carlos remon

huy y ese pots donde esta que nose commo buscarlo, soy nuevo aqui


----------



## dcastibl1

busca en el link de circuitos logicos combiancionales y secuenciales luego busca ahi el link curso para iniciarce con fpga la ultima pagina y listo por ahi te aparece lo q te dije


----------



## Tazzadar

Como estan amigos del foro de electrónica, recien empiezo en lo que es VHDL y esto tratando de hacer un contador digital de 7 bits, en esta parte no tuve ningún problema, pero en la parte de simulación el programa en elXilinx ISE 12.1 me da periodos de reloj de 50MHz en frecuencia y quiero bajarla a 1Hz, estaria muy agradecido si me pudieran ayudar en esta tarea.

El diseño del contador de 7 bit es el siguiente:



		Código:
	

-- Contador de 7 bits --

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

Entity contador is
        Port(clk : in std_logic;
               X  : inout std_logic_vector(2 downto 0):="000");
End contador;

Architecture flujo of contador is
begin
    process (clk)
begin
        if (clk'event and clk = '0') then
                      X <= X + 1;
        end if;
    end process;
end flujo;


----------



## jaimepsantos

ocupas dividir la frecuencia con un contador, por ejemplo haces el caclculo para ver cuantos pulsos de reloj ocupas y le das un valor de 1, y se ponga en cero y asi consecutivamente, ;D.


		Código:
	

Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity div_50MHz is
port
(
osc_50MHz: in std_logic;
clk : buffer std_logic:='0'
);
end div_50MHz;

Architecture flujo of div_50MHz is
signal conteo: integer range 0 to 25000000;
begin
process(osc_50MHz)
    begin
    if(osc_50MHz' event and osc_50MHz='1')then
    conteo<=conteo +1;
        if(conteo=25000000)then
        conteo<=0;
        clk<=not(clk);
        end if;
    end if;    
end process;    
end flujo;


----------



## nukex

que tal

y que paso amigo siempre si te quedo tu proyecto  
podrias compartirlo con la comunidad para poder aprender vhdl

gracias


----------



## chrilemo

FUNCIONAMIENTO
El Registro de Desplazamiento, además del almacenamiento de datos propios del registro, es capaz de establecer comunicación entre los elementos (Flip- Flops) vecinos permitiendo el transporte de datos (de forma serie)a derecha e izquierda del registro. Por consiguiente, las operaciones que un registro de desplazamiento puede contener son: inicialización, carga de datos, desplazamiento a la derecha, desplazamiento a la izquierda y no operación.

Todas las operaciones, excepto la de inicialización asíncrona pueden estar controladas a través de una señal de control, ctrl, de dos bits.

A continuación se muestra la tabla de estados del registro de desplazamiento. Para los desplazamientos a derecha e izquierda, se necesita, además, una señal de entrada serie por la izquierda il, y otra por la derecha ir, respectivamente. 


A partir de la descripción de la tabla de estados del registro de desplazamiento es fácil comprender la descripción VHDL. LA descripción se ha realizado de forma genérica y se ha implementado para n=6 (bus de 6 datos). Se puede observar cuán fácil es implementar los distintos modos de funcionamiento del registro de desplazamiento utilizando la instrucción if-then. Además se ha implementado la instrucción if then <=0 para implementar el modo Noop del registro de desplazamiento. 




		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Proyecto is --Declarando puertos, variables de entrada y salida
    Port ( datos 	: in bit_vector(5 downto 0); --6 interruptores
           right	: in bit;	--pulsador hacia la derecha
           left	: in bit;	--pulsador hacia la izquierda
           muestra	: in bit;	--pulsador para cargar
           leds 	: out bit_vector(5 downto 0):="000000";	 --leds
           clock	: in bit);--reloj
end Proyecto; --Fin de la declaración

architecture Digitales of Proyecto is  --declaramos variables intermedias
signal temp:   bit_vector(5 downto 0):="000000";	--registro
signal salida: bit_vector(5 downto 0):="000000";	--temporal para el desplazamiento
signal correi: bit:='0';  			 --ya duro los 250ms undido el pulsador hacia la izq
signal corred: bit:='0';			 --ya duro los 250ms undido el pulsador hacia la der
signal contador: integer range 0 to 12500000; --contador para el clock de 50Mhz = 250ms
	
begin						 --iniciamos la programacion
process(clock)					 --cada vez que cambie el clock
begin	
	if clock'event and clock='1' then	--revisa si hay flanco de subida
		if muestra='1' then		--si undi el pulsador para cargar
			salida<=temp;		--carguemelo en el registro
			temp<=datos;
		end if;
	
		if left='1' then  				 --si se presiona el de la izq
			if contador=12500000 then	 --contador de 250ms
				correi <='1';		--si ya duro los 250ms, active correi
				contador<=0;		--y reinicieme el contador
			else	    --sino
				contador<=contador+1;	 --siga contando
			end if;
		end if;
	
		if correi='1' then         --si se mantuvo presionado el pulsador por mas de 250ms
			salida	<= temp; --cargueme lo del registro al temporal
			temp(5 downto 1) <=salida(4 downto 0); --desplace los 5 primeros bits hacia la izq
			temp(0)	<= salida(5);	--y el ultimo de la derecha pasa a ser el primero de la izq		
			correi<='0'; --y desactivamos correi
		end if;		

		if right='1' then	--el mismo procedimiento que el desplazamiento a la derecha
			if contador=12500000 then
				corred <='1';
				contador<=0;
			else
				contador<=contador+1;
			end if;
		end if;

		if corred='1' then
			salida	<= temp;
			temp(4 downto 0) <=salida(5 downto 1);
			temp(5)	<= salida(0);
			corred <= '0';
		end if;
		leds <= temp; --mostramos el registro en los leds
	end if;
end process;
end Digitales;



///////////////
asignacion de pines
/////////////
#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "clock"  LOC = "p77"  ;
NET "datos<0>"  LOC = "p89"  ;
NET "datos<1>"  LOC = "p88"  ;
NET "datos<2>"  LOC = "p87"  ;
NET "datos<3>"  LOC = "p86"  ;
NET "datos<4>"  LOC = "p84"  ;
NET "datos<5>"  LOC = "p83"  ;
NET "leds<0>"  LOC = "p46"  ;
NET "leds<1>"  LOC = "p45"  ;
NET "leds<2>"  LOC = "p44"  ;
NET "leds<3>"  LOC = "p43"  ;
NET "leds<4>"  LOC = "p42"  ;
NET "leds<5>"  LOC = "p41"  ;
NET "left"  LOC = "p57"  ;
NET "muestra"  LOC = "p58"  ;
NET "right"  LOC = "p59"  ;

#PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE


----------



## amnaranjo

buenas noches...
me podrian ayudar...
tengo q programar una memoria gal 16v8c con las funciones de una alu de 4 bits.
me toca utilizar el lenguaje abel, el programa se llama splever.
les agradeceria si me ayudan.


----------



## memols

Hola amigos tengo una duda con VHDL, espero que me puedan ayudar. Tengo unos códigos para un programa que es un poco largo, dentro de esos hacen referencia a otros subprogramas mediante el uso de la palabra _work.nombredelsubprograma_ Quiero implementar el pograma en general mediante el ISE de Xilinx para una Spartan3, mi pregunta es como debo relacionar el programa màs grande con los subrogramas, es decir, si todos los codigos los pongo en un mismo codigo, o como hacer para que funcione todo en su conjunto. Gracias.


----------



## jalzak

hola necesito hacer un registro de corrimiento de 8 bits.utilizando flujo de datos es decir no usar procesos espero que me puedan ayudar..


----------



## castigador84

Hola a todos me encuentro realizando el algoritmo de cifrado MD5 en vhdl para implantarlo en un FPGA virtex II pro XUP, pero me encuentro atorado tratando de hace un circuito que pueda recibir el mensaje, calcular la longitud y luego hacer el relleno de bits para que sea un nuevo mensaje multiplo de 512 bits, agradeceria si alguien ha realizado un trabajo similar que me pudiera auxiliar, aclaro es un trabajo para mi proyecto de fin de carrera no tiene fines de lucro


----------



## eidtech

castigador84 dijo:


> algoritmo de cifrado MD5



*
MD5, no es un algoritmo de cifrado, es una función hash. Por cierto bastante insegura y obsoleta. Deberias de por lo menos trabajar con SHA-3.*



castigador84 dijo:


> me encuentro atorado tratando de hace un circuito que pueda recibir el  mensaje, calcular la longitud y luego hacer el relleno de bits para que  sea un nuevo mensaje multiplo de 512 bits.



*Te encuentras atorado con todo.*



castigador84 dijo:


> aclaro es un trabajo para mi proyecto de fin de carrera



*Muy fácil para proyecto de fin de carrera.*


Bueno, te recomiendo la siguiente referencia:


*Francisco Rodríguez-Henríquez, N. A. Saqib, A. Díaz-Pérez, and Cetin Kaya Koc. Cryptographic Algorithms on Recongurable Hardware (Signals and Communication Technology). Springer-Verlag New York, Inc., Secaucus, NJ, USA, 2006.


También hay que saber buscar...

*http://scholar.google.com.mx/scholar?q=MD5+FPGA+Implementation&hl=es&btnG=Buscar&lr=


----------



## castigador84

Hola yo de nuevo, bueno les quiero comentar que respecto al tema anterior, agradezco la ayuda, pero no me supe explicar, estoy realizando la implementación del MD5 (Message Digest Algorith 5), del SHA-1 2 y 3 pero soy algo novato en vhdl y si alguien tiene una idea de como realizar los primeros pasos que son el relleno de bits y la concatenación de la longitud, se lo agradeceria. Quiero usar una tarjeta de desarrollo para conectarla a una PC y enviarle el mensaje por terminal rs232 y visualizar el resultado en la pantalla de la PC.


----------



## Americo

Buenas noches compañeros.

EL anterior semestre empeze aprendiendo y poniendo ejemplos de Vhdl. Aunque aun son muy basicos pues ya estoy entrando a problemas mas complejos en este semestre en la facultad.

Bueno desde ya les doy la direccion de puro ejemplos de VHDL
http://electronico-etn.blogspot.com/search/label/VHDL
espero tambien si me puedan ayudar en mi proyecto de este semestre un *sintetizador de musica* en vhdl. Mencionar que la tarjeta DE2 de Altera, tiene este proyecto como ejemplo, pero esta en HDL. hay manera de cambiar con algun programa el hdl a vhdlk? o lo tengo que hacer manual. Espero puedan ayudarme.


----------



## marinaamor11

adjunta tu paquete de sum4bit al principio de tu libreria y tbn agregalo para q al momento de compilar ste puesto es primer lugar


----------



## albemig

Hola,que tal. Pues veran,soy algo nuevo en esto de programar en VHDL, y he tenido un problema que no he podido resolver desde hace un buen tiempo aunque he buscado por todos lados.
Lo que debo hacer es un ALU de 3 bits( lleva 8 operaciones),donde cada operacion se realiza mediante un componente individual(suma,resta,etc.). El problema es que cuando quiero usar el componente dentro de un when-case para seleccionar la operacion, siempre me envia un mensaje de error y no logro resolverlo.
Este es el codigo que tengo



		Código:
	

library ieee;
use ieee.std_logic_1164.all;

entity ALU is
port(A,B,Op : in std_logic_vector(2 downto 0);
     CI:in std_logic;
     CO:out std_logic;
     res : out std_logic_vector(2 downto 0));

end;

architecture behavioral of ALU is

component suma1
port (A, B, CI :in std_logic;
      S, CO : out std_logic);
end component;
signal X: std_logic_vector(1 downto 0);

begin

process(Op)
begin
case Op is
when "000" => x1: suma1 port map (A(0), B(0), CI, res(0), X(0));
	            x2: suma1 port map (A(1), B(1), X(0), res(1), X(1));
                    x3: suma1 port map (A(2), B(2), X(1), res(2), CO);
when others => res <= A;
end case;

end process;

end behavioral;


El error es en la linea 25(en el when): :25:18:25:22|Expecting statement
Done: failed with exit code: 0100.
Hasta ahora solo quise implementar la suma para ver que funcionara. Y probe el componente de la suma de 1 bit y funciona bien.
Bien,eso es todo, gracias,hasta luego.


----------



## bluecode1908

Hola que tal a todos, primero que nada les digo que soy nuevo en el foro y tambien en el ámbito de la electronica, tengo un puequeño proyecto, es un contador que va del 0 al 9 de forma ascendente, pero ahora me gustaria saber si me pueden ayudar a que haga este procedimiento pero en forma descendente, ahora les pongo el codigo con el cual hice el contador, espero que me puedan ayudar, se los agradeceria mucho.



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity nueve is
	Port ( 
		clk 	: in bit;
		salida 	: out integer range 0 to 10
			);
end nueve;

architecture algoritmo of nueve is
begin
	process (clk)
	variable temporal: integer range 0 to 10;
begin
	if clk='1'and clk'event then
	temporal:=temporal +1;
		if temporal=10 then
		temporal:=0;
		end if; 
	end if;
salida<=temporal;

end process;
end algoritmo;


De antemano muchas gracias a todos.

Edito: Las salidas son cuatro leds que representan en binario.


----------



## ZeUrO

HOLA! bluecode1908:

yo tambien soy nuevo en el foro y bueno tratare de hacer lo posible para ayudarte:

antes que nada tratare de dejarte comentarios en cada linea que se necesite:


		Código:
	

library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;

entity cont9 is
   port( clk,reset,updown: in std_logic; --en este caso puse un reset al contador, ademas de hacerlo ascendente-desdendente con updown
         Q: out std_logic_vector(3 downto 0)); --en este caso para representar el nueve se necesitan 4 bits ya que en binario el nueve es '1001' puse un std_logic_vector el cual la cuenta se hace desde el 3 hasta el cero (3 downto) esto es traducido por el codigo como cuatro salidas: Q(3), Q(2), Q(1), y Q(0) todo eso anexado a Q

end cont9;

architecture arqcont9 of cont9 is
begin
   process (clk,reset) begin
     if (clk'event and clk = '1') then --la asignacion de la señal de reloj
	   if (updown = '1') then --aqui se usa un if para la condicion del updown el cual va a regir si es ascendente o desdendente, en este caso cuando sea 1 sera ascendente mi contador
        Q <= Q + 1; --aqui se indica la condicion, Q pasara a ser Q + 1, esto significa que sumare un 1 a Q cada vez ke la señal de reloj este ne flanco de subida y tenga un 1 en updown
          if (reset = '1' or Q = "1001") then --aqui hay una condicion anidada en otra condicion, ya que si no se implementa, nuestro contador llegara a su maxima cuenta de cuatro bits que es '1111' o en pocas palabras 15, pero como solo la cuenta es hasta el 9, cuando pase de ese conteo se reiniciara, asi que cuando Q sea igual a 9 en binario, o ('or' como esta implementado en mi condicion) mi señal de reset sea igual a 1 tendra que reiniciarse
             Q <= "0000"; --nuestro Q regresara al principio
          end if;
	   else --este else indica cuando updown es igual a 0
	    Q <= Q - 1; --en este caso a Q se le restara 1 cada flanco de subida de nuestro reloj
		  if (Q = "0000") then --aqui hay 2 if anidados, el primero me indica que si en el conteo llega a 0:
		     Q <= "1001"; --el siguiente conteo sera a 9
		  end if;
		  if (reset = '1') then --el otro if esta asignado a mi reset, cuando este vale 1:
		     Q <= "0000"; -- Q se reiniciara en 0
		  end if;
		end if;
     end if;
   end process;
end arqcont9;


Hay muchas maneras para programar un contador en VHDL, hay algunas mas elegantes que otras, en lo personal esta forma de programar con el std_arith, usando operaciones aritmeticas se me hace lo mas correcto para este caso, ya que es muy simple.

Tambien existe otro metodo, si tienes la maquina de estados ya sea de mealy o moore, puedes traducirlo en VHDL, en lo particular es muy elegante esta forma, ya que utiliza las variables 'type' y 'signal', las cuales te crean variables que no tienen importancia como entradas o salidas, pero son importantes en la funcion interna de este ya que son los estados de tu maquina, pero la desventaja es que tambien necesitan de espacio en el PLD, en pocas palabras el compilador le asigna pines, asi que en este caso, en vez de usar 4, usarias 8, e imaginemos que quieres que tu salida ya este decodificada para ir conectado directamente a tu display, serian 11, y lamentablemente la GAL 22V10 solo tiene 10 salidas asi que este metodo quedara descartado por ahora.

Bueno espero y esta informacion te haya sido util, suerte bluecode1908!


----------



## bluecode1908

Muchas gracias ZeUrO te agradezco infinitamente tu ayuda, probare el codigo, y volvere a comentar como me fue, pero en verdad, muchas gracias.


----------



## bluecode1908

Muchas Gracias Zeuro, me ayudo de mucho tu codigo, en verdad no se como agradecerte,


----------



## bluecode1908

hola, muchas gracias por la ayuda, bueno te comento *qu*e me sirvió de mucho el código, pero lo tengo *qu*e mostrar en un display de 7 segmentos, buscando por a*quí* en el foro, y tratando de comprender vhdl, llegue a anexarle algo al código *qu*e me habías propuesto, te lo dejo, espero que me puedas ayudar, ya que me un error, lo *qu*e *qu*iero es *qu*e Q ya no sea salida, si no ahora sera el display, de antemano gracias.



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY cont9 is
    Port ( 
        clk,reset,updown: in std_logic;
        DISPLAY : out STD_LOGIC_VECTOR(6 DOWNTO 0)
        );

        ATTRIBUTE PIN_NUMBERS OF cont9 : ENTITY IS
        "DISPLAY(6):21 DISPLAY(5):20 DISPLAY(4):19 DISPLAY(3):18 "
    &    "DISPLAY(2):17 DISPLAY(1):16 DISPLAY(0):15 ";


end cont9;

architecture arqcont9 of cont9 is
begin
   process (clk,reset) begin
   
     if (clk'event and clk = '1') then                                                                                             --la asignacion de la señal de reloj
       if (updown = '1') then                                                                                                     --aqui se usa un if para la condición del updown el cual va a regir si es ascendente o descendente, en este caso cuando sea 1 sera ascendente mi contador
        Q <= Q + 1;                                                                                                             --aqui se indica la condición, Q pasara a ser Q + 1, esto significa que sumare un 1 a Q cada vez [B][COLOR=Red]qu[/COLOR][/B]e la señal de reloj este ne flanco de subida y tenga un 1 en updown
          if (reset = '1' or Q = "1001") then                                                                                     --aqui hay una condición anidada en otra condición, ya que si no se implementa, nuestro contador llegara a su máxima cuenta de cuatro bits que es '1111' o en pocas palabras 15, pero como solo la cuenta es hasta el 9, cuando pase de ese conteo se reiniciara, así que cuando Q sea igual a 9 en binario, o ('or' como esta implementado en mi condición) mi señal de reset sea igual a 1 tendrá que reiniciarse
             Q <= "0000";                                                                                                         --nuestro Q regresara al principio
     
          end if;
       else                                                                                                                     --este else indica cuando updown es igual a 0
        Q <= Q - 1;                                                                                                             --en este caso a Q se le restara 1 cada flanco de subida de nuestro reloj    
          if (Q = "0000") then                                                                                                     --aqui hay 2 if anidados, el primero me indica que si en el conteo llega a 0:
             Q <= "1001";                                                                                                         --el siguiente conteo sera a 9
             
          end if;
          if (reset = '1') then                                                                                                 --el otro if esta asignado a mi reset, cuando este vale 1:
             Q <= "0000";                                                                                                         -- Q se reiniciara en 0
            end if;
        end if;
     end if;
   end process;

  with Q select
    DISPLAY<= "0110000" when "0001",
              "1101101" when "0010",
              "1111001" when "0011",
              "0110011" when "0100",
              "1011011" when "0101",
              "1011111" when "0110",
              "1110000" when "0111",
              "1111111" when "1000",
              "1110011" when "1001",
              "0000001" when others;
end arqcont9;


----------



## Chico3001

Temas combinados... gracias por sus aportes!!!


----------



## ZeUrO

Que tal "bluecode1908":

   Me da gusto de que el anterior codigo te haya funcionado. El codigo que ahora presentas tiene un error muy trivial y facil de reparar, solo tienes que declarar la entidad "Q" en "port" asi podras usar el comando "with" aunque, al declarar "Q" y "D" tendras que usar 11 pines, pero recuerda que la GAL22V10 solo tiene 10 pines de salida disponible, asi que ese codigo no cabe en tu GAL, la unica opcion es conseguir un CPLD, pero yo te ofreco otra opcion.

   En este caso te presento el codigo el cual solo recurre a las salidas de tu display sin tener que usar mas salidas, la novedad de este codigo es que ya no usa la libreria arith, y su funcion es parecida a la de la maquina de estados:



		Código:
	

library ieee;
use ieee.std_logic_1164.all;

entity contdisp is
    port(  Clk, reset, updown: 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, reset, updown) begin
   if(clk'event and clk = '1') then
         if (reset = '1') then
            D <= "0000001";
         else        
            case D is
               when "0000001" => D <= "0000001"; --0
                  if (updown = '1') then
                     D <= "1001111"; --1
                  else
                     D <= "0000100"; --9
                  end if;
               when "1001111" => D <= "1001111"; --1
                  if (updown = '1') then
                     D <= "0010010"; --2
                  else
                     D <= "0000001"; --0
                  end if;
               when "0010010" => D <= "0010010"; --2
                  if (updown = '1') then
                     D <= "0000110"; --3
                  else
                     D <= "1001111"; --1
                  end if;
               when "0000110" => D <= "0000110"; --3
                  if (updown = '1') then
                     D <= "1001100"; --4
                  else
                     D <= "0010010"; --2
                  end if;
               when "1001100" => D <= "1001100"; --4
                  if (updown = '1') then
                     D <= "0100100"; --5
                  else
                     D <= "0000110"; --3
                  end if;
               when "0100100" => D <= "0100100"; --5
                  if (updown = '1') then
                     D <= "0100000"; --6
                  else
                     D <= "1001100"; --4
                  end if;
               when "0100000" => D <= "0100000"; --6
                  if (updown = '1') then
                     D <= "0001111"; --7
                  else
                     D <= "0100100"; --5
                  end if;
               when "0001111" => D <= "0001111"; --7
                  if (updown = '1') then
                     D <= "0000000"; --8
                  else
                     D <= "0100000"; --6
                  end if;
               when "0000000" => D <= "0000000"; --8
                  if (updown = '1') then
                     D <= "0000100"; --9
                  else
                     D <= "0001111"; --7
                  end if;
               when "0000100" => D <= "0000100"; --9
                  if (updown = '1') then
                     D <= "0000001"; --0
                  else
                     D <= "0000000"; --8
                  end if;
	       when others => D <= "1111111";
            end case;       
         end if;
      end if;
   end process;
end arqcont;


   En sintesis, este es un contador ascendente-descendente del 0 al 9 ya decodificado para un display anodo comun, tiene un IF primario el cual rige el reset, en la condicion de que reset sea 1, la salida "D" pasara estrictamente a "0000001" o en pocas palabras a un 0 decodificado, en el "else" se incluye el codigo de la funcion del contador, despues uso el comando "case" muy parecido a "with", pero la unica diferencia es que es de tipo secuencia, en pocas palabras tiene una jerarquia, para seguir una secuencia se usa un if anidado el cual hace la funcion del conteo cada vez que se presenta la señal de reloj, para explicar su funcion recurrire a los primeros 2 numeros, el 0 y el 1:

*when "0000001" => D <= "0000001"; --0* _(este muestra el primero numero "0" en "D")_
*if (updown = '1') then* _(la condicion cuando updown sea '1')_
*D <= "1001111"; --1* _(el display pasara a ser "1" en D, asi se vincula al siguiente numero)_
*else* _(este es la condicion cuando updown sea '0')_
*D <= "0000100"; --9* _(el display pasara a ser "9" en "D", asi se vincula al ultimo numero en el conteo descendente)_
*end if;* _(fin del IF anidado)_
*when "1001111" => D <= "1001111"; --1* _(este codigo ahora es cuando "D" represente a "1")_
*if (updown = '1') then* _(la condicion de la ascendencia)_
*D <= "0010010"; --2* _("D" pasara a ser el siguiente numero "2")_
*else* _(la condicion de la descendencia)_
*D <= "0000001"; --0* _("D" pasara a ser el anterior numero "0")_
*end if;* _(asi sucesivamente hasta llegar al que "D" represente a "9".)_

   Este codigo me parece muy sencillo, ademas de que solo usa las salidas necesarias para el display. En caso de que quieras usar un display catodo comun, tendras que negar las salidas de "D" en el codigo, en pocas palabras para cuando "D" sea "0000001" en configuracion de anodo comun, ahora seria "1111110" para una configuracion de catodo comun, recuerda invertir todas las salidas en el codigo, ya que si se te pasa alguna, ya no funcionara tu contador adecuadamente. 

   Eso seria todo, cualquier duda recuerda dejar un mensaje, y tambien avisanos como te fue con el codigo, suerte "bluecode1908"!


----------



## bluecode1908

de verdad te agradezco infinitamente tu ayuda amigo ZeUrO, de verdad gracias, lo compile hace unos momentos, y todo a la perfección, solo hice la modificación de anodo a catodo, lo mas simple, mañana te aviso como me fue, ya que hasta el momento solo he alambrado el circuito en protoboard, el dia de mañana grabo en mi dispositivo, y yo aviso como funciono, muchas gracias.


----------



## abraren

Alguien tiene idea de como realizar un doblador de frecuencia utilizando xilinx system generator de simulink, necesito convertir una señal de 60 Hz a 120 Hz


----------



## hrdkre

que tal, gracias a todos por sus aportes, quisiera ver si alguien podria ayudarme a que mi contador ascendente descendente (4 bits) no necesite de un seleccionador para hacer la cuenta hacia arriba o hacia abajo, que lo haga de manera automatica, es decir que de 0 suba a 15 y de 15 baje a 14 , 13, 12 y así hasta el 0, por su atencion gracias


----------



## Menta14

Gente, necesito que me den una mano tengo que escribir un programa VHDL para diseñar una ALU para 32 bits y que realice 10 posibles operaciones lógicas y/o aritméticas.


----------



## Americo

Buen dia, pues como estoy en vacaciones, pues volví a este foro que tanto estimo, bueno pues a lo que va el tema, responder consultas aunque ya son antiguas, espero que sirvan aun... estaré respondiendo hasta mediados de febrero.. asi que pregunten .. y si puedo les ayudo


> abraren              *multiplicador de frecuencia*
> Alguien tiene idea de como realizar un doblador de frecuencia  utilizando xilinx system generator de simulink, necesito convertir una  señal de 60 Hz a 120 Hz


Pues claro que hay idea como realizar un multiplicador de frecuencias, te explico: teniendo una señal de "muestreo" en mi caso 27Mhz la cual pondrá en sincronía nuestra señal de *entrada* (con cualquier frecuencia que quieras), esta señal de muestreo realizara un conteo en cada flanco de nuestra señal de muestreo cuando la señal de *entrada* este en cero, cuando nuestra entrada pase de cero a uno (primer flanco) este nos ayudara a guardar el numero contado hasta esta instancia, guardamos este numero y realizamos la división por N que es el numero multiplicador de frecuencias de esta manera realizamos el multiplicador frec(salida)= N * frec(entrada), El código vhdl esta muy extenso se puede reducir las lineas de programa. podemos cambiar a gusto el numero multiplicador en programa, también se lo podría hacer  por selección externa.

     -- multiplica por "n" un valor de frecuencia de entrada. salida=entrada*n


		Código:
	

library ieee;
use ieee.std_logic_1164.all;

entity m_frec is
        generic (n: integer:=4); --Define numero N multiplicador
port (    entrada: in std_logic;
        clk_27Mhz:in std_logic;
        salida: out std_logic);
end m_frec;

architecture rtl of m_frec is 
    signal cuenta,cuenta2,div,M: integer:=0;
    signal f_in,f_sal:std_logic;
begin
process (clk_27Mhz)
    begin
    if (clk_27Mhz'event and clk_27Mhz = '1') then
    f_in <= entrada;
    end if;
end process;
process (f_in,clk_27Mhz)
    begin
    if (f_in = '1') then
    cuenta <= 0;
    elsif (clk_27Mhz'event and clk_27Mhz = '0') then
    cuenta <= cuenta + 1;
    end if;
end process;
process (f_in)
    begin
    if (f_in'event and f_in = '1') then
    M <= cuenta;
    end if;
end process;
div <= (M-1)/N;
process (clk_27Mhz)
    begin
    if (Clk_27Mhz'event and Clk_27Mhz = '1') then
        if (cuenta2 = div) then
        cuenta2 <= 0;
        f_sal <= not f_sal;
        else cuenta2 <= cuenta2 + 1;
        end if;
    end if;
end process;
salida <= f_sal;
end rtl;

   generando las ondas, en el programa en quartus II, observamos que efectivamente se multiplico por 4. Ahora bien,en tu caso podemos multiplicar la frecuencia de entrada por cualquier numero *n* (yo lo probe con 2,3,4,...10) cuando n=7 hay un ligero error.  





nota:lo simule en timing, para observar un comportamiento "real"



> hrdkre
> que tal, gracias a todos por sus aportes, quisiera ver si alguien  podria ayudarme a que mi contador ascendente descendente (4 bits) no  necesite de un seleccionador para hacer la cuenta hacia arriba o hacia  abajo, que lo haga de manera automatica, es decir que de 0 suba a 15 y  de 15 baje a 14 , 13, 12 y así hasta el 0, por su atencion gracias


pues un contador up/down automatico pues aca te envio el codigo vhdl de esto, solo necesitas un reloj de entrada



		Código:
	

    library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity updown is
port(
    clk: in std_logic;
    salida:out std_logic_vector(3 downto 0));
end updown;

architecture rtl of updown is
    signal cuenta:integer:=0;
    signal marcador:std_logic;
begin
process(clk)
    begin
    if (clk'event and clk='0') then
        if (cuenta = 15) then
        cuenta <= 0;
        marcador <= not marcador;
        else
        cuenta <= cuenta + 1;
        end if;
    end if;
end process;
process(marcador,cuenta)
    begin
    if (marcador='0') then
    salida<=conv_std_logic_vector(cuenta, 4);
    else
    salida<=not conv_std_logic_vector(cuenta, 4);
    end if;
end process;
end rtl;




> Menta14                       Gente, necesito que me den una mano tengo que escribir un programa  VHDL para diseñar una ALU para 32 bits y que realice 10 posibles  operaciones lógicas y/o aritméticas.


bueno compañero.. si quieres una alu de 32 bits, simplemente debes de especificar el vector de entrada sea de esta cantidad de bits, y pues vendria ser algo parecido a



		Código:
	

    library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity alu is port (
s: in std_logic_vector(2 downto 0); -- alu de 8 operaciones
a, b: in std_logic_vector(31 downto 0); 
f: out std_logic_vector(31 downto 0)); 
end alu;

architecture behavior of alu is
begin
process(s, a, b)
begin
case s is
when "000" => -- pass a through
f <= a;
when "001" => -- and
f <= a and b;
when "010" => -- or
f <= a or b;
when "011" => -- not a
f <= not a;
when "100" => -- add
f <= a + b;
when "101" => -- subtract
f <= a - b;
when "110" => -- increment
f <= a + 1;
when others => -- decrement
f <= a - 1;
end case;
end process;
end behavior;


 tienes que estudiar que operaciones desearías y .. el numero de bits en la salida
saludos


----------



## Menta14

Americo!! Muchas gracias capo!!!!


----------



## Antonionana

Hola,

Soy nuevo por aquí y ando un poco desesperado la verdad.
Me hacen entrgar un ejercicio en VHDL correspondiente a un tunel de lavado de coches, es que alguien podría echarme una mano? 
No tengo conocimientos en programación y estoy muy muuy perdido...

Gracias.

Un saludo


----------



## Americo

pues para poder resolver esto debes de especificar las acciones que tendra tu tunel de lavado de coches, y realizar un analisis de estados ya sea con mealy o moore. y tener tu circuito ejemplo de ahi describirlo en vhdl...


----------



## Antonionana

gracias por tu temprana respuesta!

es que podrías mandarme un privado (yo soy usuario reciente y no puedo) y te cuento un poco más en detalle, tampoco quiero monopolizar el foro...aunque luego puedo subir la respuesta final para compartirla por supuesto!

Muchas gracias


----------



## eggv9123

si me podrían ayudar con un seleccionador de velocidad para el clock de un contador ya que no puedo utilizar el clock que se encuentra en el FPGA, sino que tengo que variar la velocidad con dos switches. 
Además recien empiezo  a programar en VHDL


----------



## fms

Explica un poco más lo que quieres hacer y por qué no puedes utilizar el reloj de la FPGA.
Si necesitas distintas frecuencias a la salida, puedes utilizar el reloj de la FPGA y realizar cuentas diferentes según la frecuencia de salida deseada.


----------



## chclau

Un contador de por si es un divisor de frecuencia. Se puede crear una logica en la que el contador divisor de frecuencia cuenta para abajo desde un valor de preset segun los dip switches. Cada vez que el contador divisor llega a cero emite un pulso y recarga el valor de preset.

El pulso de salida del divisor es utilizado como clock enable para el segundo contador.


----------



## eggv9123

gracias chclau pero como le hago en lenguaje vhdl, porque eso nose como sera.....


----------



## chclau

No veo que ni siquiera lo hayas intentado. Trata de construir aunque sea un bloque contador, a ver que es lo que sabes.


----------



## Sorced

Un gran saludo a todos en el Foro que desde siempre me ha ayudado mucho para mi desarrollo como estudiante de electrónica.

Actualmente me encuentro tratando de comprender el lenguaje VHDL, y encontré el diseño de un contador:


		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.std_arith.all;
entity contadorII is port (
    clk: in std_logic;
    Q    : inout std_logic_vector (3 downto 0));
end contadorII;

architecture Behavioral of contadorII is
    begin
    
        Process (clk)
        begin
            if (clk' event and clk = '1') then
                Q <= Q + 1;
            end if;
        end process;
    
end Behavioral;

Aparentemente es sencillo, sin embargo cuando lo quiero implementar en mi software de desarrollo (ISE project Navigator v 13.4) no reconoce la declaración de la librería: *work.std_arith.all;*, luego al reemplazar esa librería por *use IEEE.std_logic_arith.all;* reconoce la librería, sin embargo no reconoce el operador "+" estoy en una encrucijada y no puedo avanzar en mi proyecto. Si alguien pudiera darme una mano, sería de gran ayuda.
Desde ya muchas gracias.


----------



## fms

Hola Sorced,

Prueba a poner estas bibliotecas a ver que pasa:


		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


Otra alternativa más razonable es que declares Q como unsigned. Pues en realidad, un std_logic_vector no debería de poder sumarse, pues no sabes qué representación tiene: no sabes si es un entero con signo, sin signo,...

Otras cosas:

¿Por qué pones el puerto Q como inout? ponlo como out, pues es en el contador donde únicamente le vas a asignar valor.

Pero entonces no podrás asignar y leer Q, tendrás que crear una señal auxiliar que es la que realiza la cuenta. 

Por ejemplo declaras la señal cuenta:

signal cuenta: unsigned (3 downto 0);

Y fuera del proceso asignas cuenta a Q:

Q <= cuenta;

Aparte, yo le pondría un reset al contador.

Si tienes más dudas, el capítulo 6 del libro Diseño de circuitos digitales con VHDL  se explican los contadores.

Espero que te haya servido de ayuda

Saludos


----------



## Sorced

Realmente mu*ch*as gracias amigo, tu duda me ha servido de mucho, y ahora creo q*ue* tengo q*ue* alzar la mano nuevamente y preguntar, (y disculpen pues realmente recién estoy aprendiendo esto del VHDL y aun se me complica =S) .

Bueno tome en consideración tu recomendación y efectivamente consiguió finalmente sintetizarlo, pero ahora lo que intento hacer es desarrollar un contador manual, q*ue* no necesite clock, con esta intención es que desarrolle lo siguiente:



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity contadorII is port (
    en: in std_logic;
    Q    : out unsigned (3 downto 0));
end contadorII;

architecture Behavioral of contadorII is
signal Cu: unsigned (3 downto 0);
    begin
    
     
    Process (en)
        begin
            if en = '1' then
                cu <= cu + 1;
            end if;
     end process;
     Q <= cu;
end Behavioral;

Sintetiza de forma adecuada, sin embargo al momento de implementar resulta que existe un error en la etapa de place and route, estube tratando de entender el porque, pero no le doy al problema, quizá pudieras darme otra idea nuevamente, desde ya te lo agradezco mu*chí*simo.


----------



## fms

Hola Sorced,
Mi recomendación es que pongas el reloj, y que dentro de la sentencia de reloj pongas la habilitación de la cuenta (_en_). Por otro lado, tendrás que incluir un detector de flancos para que cada vez que pulses aumente la cuenta en uno.

Vamos a analizar por qué no funciona tu circuito:
Tu circuito aumenta la cuenta en cada instante en que _en='1'_.
Es decir, si _en='1'_, en el primer nanosegundo aumentará la cuenta _cu<=1_, en el siguiente _cu<=2_,... incluso en las fracciones de nanosegundo aumentaría la cuenta (teóricamente, pero por eso no se puede sintetizar).
Ten en cuenta que en la síntesis no se tiene en cuenta la lista de sensibilidad, es decir, que aunque en simulación el circuito puede parecer que funciona bien porque sólo se entra en el proceso cuando hay cambios de _en _, en la realidad, el circuito sintetizado realizará la suma _cu <= cu + 1;_ durante todo el tiempo que _en='1'_.

Para que se pueda sintetizar, una solución sería poner la sentencia de reloj para que sólo se realice la suma con cada flanco de reloj.

Esto te arreglaría el problema de la síntesis, pero te seguiría contando mal, porque cada vez que presionamos el pulsador, habrán transcurrido miles de ciclos de reloj, por lo tanto la cuenta habrá aumentado mucho más que en una unidad.

Para solucionarlo, puedes incluir un circuito detector de flancos, que transforme la señal _en_ en un pulso de un único ciclo de reloj.
Hacer un detector de flancos no es difícil, está explicado en el apartado 5.3.2 del libro Diseño de circuitos digitales con VHDL

Saludos


----------



## Sorced

Muchísimas gracias, después de bastantes intentos consegui realizar lo q*ue* deseaba, gracias a su ayuda .


----------



## eggv9123

Hola a todos los compañeros de foros de electrónica, por favor me podrían ayudar con un contador que tengo que hacer en los displays pero tengo que subir y bajar con el encoder rotatorio del fpga eso es lo que tengo en el código



		Código:
	

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY encoder IS
PORT(    clk        :in        Std_logic; ----- pulsantes para ajuste del reloj
        upd1: in std_logic ;-----encoder subida
        upd2: in std_logic ;------encoder bajada
        rel_seg                :out    std_logic_vector(6 downto 0); ------- segmentos
        sel_dis                :out    std_logic_vector(3 downto 0)-------- displays
    );
END encoder;


ARCHITECTURE rotar OF encoder IS

SIGNAL    cont1,cont3,cont_salida    :std_logic_vector(3 downto 0);-----llegue hasta 9
SIGNAL    cont2,cont4        :std_logic_vector(2 downto 0);---- llegue hasta 5
SIGNAL    divisor            :std_logic_vector(25 downto 0);
SIGNAL    q1,q2,q3        :std_logic_vector(1 downto 0);
signal divpul            :std_logic_vector(1 downto 0);
signal  sel                    :std_logic_vector(2 downto 0);
SIGNAL    pulsa,d,s            :std_logic;
SIGNAL  pulsh, puls1         :std_logic;
signal ayuda: std_logic:= '1' ;

BEGIN
--puls1 << a q1=00 normal clock 59 segundos
--pulsh << a q1=00 normal clock (59 segundos and 59 minutos)
--q1=01 para ajuste segundos    q1=10 para ajuste minutos   q1=11 para ajuste horas
    

    s <= divisor(12) and not d;
    process(clk)
    begin
    if clk'event and clk='1'   then ---------------------------"""""""""""""""""
            d <= divisor(12);
            if divisor=39999999 then 
                divisor<="00000000000000000000000000" ;
            if q1="00" then pulsa<='1';
                else pulsa<='0';
                end if;            
            else
                divisor<=divisor+1;
                pulsa<='0';
        end if;
        
        if (upd1='0') and (upd2='0') then
            if pulsa='1' or ((q1="01") and (q2(0)='1')) then
        --    if upd1<='1' and upd2<='1' then
                    if cont1="1001" then cont1<="0000";
                    else cont1<=cont1+1;
                    end if;
            else 
            cont1<=cont1;
            
            end if;
            else 
                cont1<=cont1-1;
        end if;
                    
        if (upd1 ='0') and (upd2 ='0') then
            if ((q1="01" and q2(0)='1'))and (cont1="1001") then
        --    if upd1<='1' and upd2<='1' then
                if cont2="101" then
                   cont2<="000";
                else cont2<=cont2+1;
                end if;
            else 
            cont2<=cont2;
            end if;
        else 
        cont2<=cont2-1;
        end if;

            if (puls1='1') or ((q1="10") and (q2(0)='1')) then
                        if (upd1='0') and (upd2='0') then
if cont3="1001" then cont3<="0000";
                else cont3<=cont3+1;
                end if;
                        elsif (upd1='1') or (upd2='1') then
                cont3<=cont3-1;
            end if;
            
else cont3<=cont3;
            end if;
            
            if (puls1='1' or (q1="10" and q2(0)='1')) and (cont3="1001") then
            if (upd1='0') and (upd2='0') then
                if cont4="101" then
                    cont4<="000";
                else cont4<=cont4+1;
                end if;
            elsif (upd1='1') or (upd2='1') then
                cont4<=cont4-1;
            end if;    
            else cont4<=cont4;
            end if;
        

            
                    
        case divpul is
                when "00" =>
                    if(divisor(19)='1') then
                         divpul<="01";
                    else divpul<="00";
                    end if;
                when "01" => 
                    divpul<="10";
                when "10" =>
                    if (divisor(19)='0') then
                         divpul<="00";
                    else divpul<="10";
                    end if;
                when others=>
            end case;
            
        --q3(0) es ajuste para el cambio del reloj
        --q2(0) es el pulsante de ajuste del reloj
        
            case q2 is
                when "00" =>
                    if( divpul(0)='1') then
                        q2<="01";
                    else q2<="00";
                    end if;
                when "01" =>
                    q2<="10";
                when "10" =>
                    if (divpul(0)='1') then
                        q2<="00";
                    else q2<="10";
                    end if;
                when "11" => q2<="00";
                when others=>
            end case;
            
            case q1 is
              when "00" =>  
                if     q3(0)='1' then  
                    q1 <= "01";
                else
                    q1<="00";
                end if;
                
              when "01"  =>   
                       if q3(0)='1' then
                        q1<="10";
                    else
                        q1<="01";
                    end if;
                    
              when "10"  => 
                    if q3(0)='1' then
                        q1 <="11";
                    else
                        q1 <="10";
                    end if;                    
                
             when  "11" =>    
                if q3(0)='1' then
                    q1 <="00";
                else
                    q1 <="11";
                end if;
           end case;
            
            
          if s='1' then 
             if sel="101" then sel <="000";
             else sel <= sel+1;
             end if;
          else   sel <= sel;
          end if;
    end if;
    
        end process;
    
    
    
    
    process (sel,cont1,cont2,cont3,cont4)
    begin        
            case sel is
                when "010" =>
                    cont_salida<='0' & cont4;
                    sel_dis<="0001";
                when "011" => 
                    cont_salida<=cont3;
                    sel_dis<="0010";
                when "100" => 
                    cont_salida<='0' & cont2;
                    sel_dis<="0100";
                when "101" => 
                    cont_salida<=cont1;
                    sel_dis<="1000";
                when others =>
                    cont_salida<=cont1;
                    sel_dis<="0000";                
            end case;
    end process;



            
   rel_seg<= "1111110" when cont_salida="0000" else--------displays
             "0110000" when cont_salida="0001" else 
             "1101101" when cont_salida="0010" else 
             "1111001" when cont_salida="0011" else 
             "0110011" when cont_salida="0100" else 
             "1011011" when cont_salida="0101" else 
             "1011111" when cont_salida="0110" else 
             "1110000" when cont_salida="0111" else 
             "1111111" when cont_salida="1000" else 
             "1111011" when cont_salida="1001" else 
             "0000000";
            



            
END rotar;


----------



## fms

bueno eggv9123, cuentanos tambien algo sobre cual es el problema que tienes, qué es lo que no te sale, ....


----------



## eggv9123

lo que no me sale es que cuando pongo 00 si sube el contador  con el encoder pero en las otras condiciones en 01,10 y 11 no hace nada y no se muestra nada en los displays


----------



## fms

¿Has probado a simular? si es así incluye tambien el banco de pruebas y así miro la simulacion. Sin simulación es dificil depurar.
Si quieres que te ayude, explica con más detalle que quieres hacer y que hace cada cosa, así me es más facil ahorro tiempo.
Saludos


----------



## bur85x

Buenas a todos. Queria preguntarles si existe alguna buena guia que describa como simular un codigo en VHDL, mas precisamente con el programa Xilinx Ise 9.2. Desde ya, muchas gracias y espero su respuesta. Saludos.


----------



## fms

Hola
En el capitulo 8 del libro Diseño de circuitos digitales con VHDL se explica la simulación para un ejemplo sencillo

y si con el ISE usas Modelsim, en el capítulo 5 del libro Diseño de sistemas digitales con VHDL se explica una simulación más compleja.

Espero que te ayude, 
Saludos


----------



## bur85x

Hola Fms, muchas gracias por tu respuesta. Me agrada que me respondas tu, ya que se nota que tienes mucha experiencia en este lenguaje. Ahora me estoy enfocando para codificar contadores y registros de desplazamiento, y tengo este codigo de un contador ascendente/descendente con carga y reset que muestro a continuacion:



		Código:
	

library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
  
entity contador is port(
clk, load, reset,arriba:in std_logic;
data:    in std_logic_vector(3 downto 0);
conta:buffer std_logic_vector(3 downto 0)
);
end contador;
  
architecture archicontador of contador is
begin
process (clk,reset)
begin
  if reset = '1' then
   conta <= "0000";
  elsif (clk'event and clk= '1') then
   if load = '1' then
    conta <= data;
   elsif arriba = '1' then
    conta <= conta + 1;
   else conta <= conta - 1;
   end if;
  end if;
end process;
end archicontador;


En primer lugar queria consultarte si seria correcto decir que este contador tiene reset asincronico, por el hecho de que la señal del reset se encuentra fuera de la condicion del if del clock (que detecta cambios a partir de su flanco ascendente). En segundo lugar, lo que necesito hacer es modificar el codigo, de forma tal de hacer que la carga paralela sea tambien asincronica... ¿Como te parece que podria implementarlo? A mi se me ocurrio sacar el "if load = '1' then conta <= data;" de la condicion del clock, y ponerlo debajo de la condicion del reset. En fin, me gustaria saber que opinas, o cual podria ser la mejor forma para hacerlo. Desde ya, muchas gracias por tu tiempo.

Saludos.

---

Edit: Ademas deberia modificar la linea de "process (clk,reset)", ¿no es cierto? Agregando la carga a la lista de sensibilidad, pero tengo la duda si añadir al parentesis ambas señales o una sola, ya que tengo "load" y "data".

"load" es una señal que, si se encuentra en "1", es decir, "habilitada", me asigna los datos al contador.

"data" es una señal donde basicamente se encuentran los datos en cuestion para ser asignados.

Espero que me puedas dar una mano. Agradezco tu ayuda.


----------



## fms

Hola bur85x,
Sí, el reset es asíncrono por la razón que dices. Y para tener la carga asíncrona la solución es la que dices. Como dices, tendrás que añadir a la lista de sensibilidad del proceso las señales "load" y "data".

Del código tengo algunos comentarios:

*1*. usas la biblioteca, work.std_arith.all; supongo que querras usar :

  use ieee.std_logic_arith.all;
  use ieee.std_logic_unsigned.all;

o bien 

  use ieee.numeric_std.all;

*2*. el puerto "conta" lo has declarado como buffer. Supongo que lo has hecho así para poderlo leer y escribir. Sería mejor declararlo como puerto de salida (out), y usar una señal auxiliar en el proceso, por ejemplo "conta_aux". Si lo haces así, fuera del proceso, como sentencia concurrente, tendrías que realizar la siguiente asignación:

 conta <= conta_aux;

*3*. Para la señal conta, o al menos para la auxiliar conta_aux, yo la declararia como tipo unsigned. Esto permite realizar las sumas.

Si haces esto último, te podrá ser necesario convertir entre std_logic_vector y unsigned. Esto se hace con una conversión _cast_, por ejemplo:

  conta <= std_logic_vector(conta_aux); -- conta es std_logic_vector y conta_aux unsigned

  conta_aux <= unsigned(data); -- conta_aux es unsigned y data std_logic_vector

Espero que te ayude, saludos


----------



## bur85x

Muchas gracias por tu apreciacion, Fms, realmente me sirve.

Con respecto a las librerias, en verdad deje las que se cargan por defecto cuando creo un modulo de VHDL, pero ya que tu me lo mencionas, calculo que seria mucho mas optimo utilizar solamente las que necesito en el codigo.

Ademas, me parece acertado el hecho de usar una variable auxiliar para manejar el contador.

Aprovecho para hacerte otra consulta, si es posible, en este caso sobre registros de desplazamiento. Mi profesor me envio el siguiente codigo que te muestro a continuacion, que consiste en un registro de 8 bits, bidireccional, con señal de clock ascendente, entrada de datos en serie y salida de datos en paralelo. Aqui va el codigo:



		Código:
	

entity shift is
port (C, SI, LEFT_RIGHT : in std_logic;
      PO : out std_logic_vector (7 downto 0));
end shift;

architecture archi of shift is
  signal tmp : std_logic_vector (7 downto 0);
begin
  process (C)
    begin
      if (C'event and C='1') then
        if (LEFT_RIGHT='0') then
          tmp <= tmp (6 downto 0) & SI;
        else
          tmp <= SI & tmp (7 downto 1);
        end if;
      end if;
    end process;
  PO <= tmp;
end archi;


Lo que te queria preguntar era, mas que nada, para tratar de comprender las lineas: "tmp <= tmp (6 downto 0) & SI;" y "tmp <= SI & tmp (7 downto 1);" que basicamente hacen la "magia" del registro, pero me cuesta entender como es que funcionan, y como me doy cuenta si esta desplazando a izquierda o a derecha. Muchas gracias.


----------



## fms

El operador "&" es el operador para concatenar
Entonces la sentencia:

   tmp <= tmp (6 downto 0) & SI;

lo que hace es asignar a *tmp(7 downto 0)* la concatenacion de *tmp (6 downto 0)* con  *SI*;. En el mismo orden de de bits: izquierda a derecha. El bit 7 se le asignaría tmp(6) y al bit 0 se le asignaría SI. Es decir, sería equivalente a relizar estas asignaciones individuales:

-- codigo desp izq
  tmp(7) <= tmp(6);
  tmp(6) <= tmp(5);
  tmp(5) <= tmp(4);
  tmp(4) <= tmp(3);
  tmp(3) <= tmp(2);
  tmp(2) <= tmp(1);
  tmp(1) <= tmp(0);
  tmp(0) <= SI;

Lo importante de entender aquí es que en los procesos las señales no actualizan el valor asignado hasta llegar al final del proceso (*ésta es la principal diferencia con las variables*), porque especialmente en el desplazamiento a la derecha puede dar lugar a dudas, por ejemplo:

          tmp <= SI & tmp (7 downto 1);

sería equivalente a:

-- codigo desp dcha
  tmp(7) <= SI;       
  tmp(6) <= tmp(7);
  tmp(5) <= tmp(6);
  tmp(4) <= tmp(5);
  tmp(3) <= tmp(4);
  tmp(2) <= tmp(3);
  tmp(1) <= tmp(2);
  tmp(0) <= tmp(1);

Al ver que SI se asigna a tmp(7), y como tmp(7) se asigna a tmp(6), tmp(6) a tmp(5), y así sucesivamente .... hasta tmp(0), podríamos pensar que al final *SI* se va a asignar a tmp(0), y que todo el vector tmp va a tener el valor de SI al salir del proceso.
Pero esto no ocurre, ya que al estar dentro de un proceso, tmp(7) no va a tomar el valor de SI hasta que se sale del proceso. 
Por lo tanto, da igual el orden en que se pongan las asignaciones, es decir que sería equivalente a describirlo en el orden inverso:

-- codigo desp dcha 2
  tmp(0) <= tmp(1);
  tmp(1) <= tmp(2);
  tmp(2) <= tmp(3);
  tmp(3) <= tmp(4);
  tmp(4) <= tmp(5);
  tmp(5) <= tmp(6);
  tmp(6) <= tmp(7);
  tmp(7) <= SI;

Así que las descripciones _codigo desp dcha_ y _codigo desp dcha 2_ serían equivalentes.

Espero haberme explicado. Es uno de los conceptos que al principio más cuesta entender del VHDL
Saludos


----------



## bur85x

Es cierto, al principio cuesta un poco comprender el tema de los desplazamientos, pero te agradezco mucho tu explicacion, ya que me fue de gran ayuda para saber como se realizan las asignaciones a la señal, paso a paso.

Estos dias voy a aprovechar para hacer algunos ejercicios para practicar, cualquier cosa te consulto, ¿vale?


----------



## bur85x

Hola, buenos dias. Hoy estuve realizando unos cuantos ejercicios en VHDL sobre contadores y registros, por eso queria hacer algunas preguntas que surgieron sobre algunos de ellos, y revisar si el procedimiento es correcto.

En el caso de la señal "cuenta", por ahora preferi dejarla declarada como buffer, dado que el profesor nos envio un modelo basico de contadores donde la señal estaba representada asi, pero mas que nada para que el despues no me invada con preguntas especificas sobre alguna modificacion adicional que haya realizado, o algo asi, jeje.

Del siguiente ejercicio, queria saber si es valida la estructura condicional asincrona formada por el reset y la carga. ¿Esta bien utilizar el elseif? ¿No puede suceder que se saltee alguna condicion que deba cumplirse?

Contador binario ascendente 4 bits c/ carga paralela asincrónica
• 1 entrada CLOCK.
• 1 entrada de indicación de carga (1bit): mientras esté activa, implica la carga paralela a salida.
• 1 entrada carga paralela (4 bits): se introduce el dato de carga
• 1 entrada Reset Asincrónico: la cuenta vuelve a 0000.
• 4 salidas (1 bit): conteo.



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity contador_3 is
port (clk, carga, rst : in std_logic;
      datos : in std_logic_vector (3 downto 0);
      cuenta : buffer std_logic_vector (3 downto 0));
end contador_3;

architecture comportamiento of contador_3 is
begin
   process (clk, carga, rst, datos)
   begin
      if (rst='1') then
         cuenta<="0000";
      elsif (carga='1') then
         cuenta<=datos;
      elsif (clk'event and clk='1') then
         cuenta<=cuenta+1;
      end if;
   end process;
end comportamiento;


Ahora tenemos un contador johnson, que basicamente lo simplifique a partir de uno mucho mas complejo, que traia resets sincronos y asincronos, pero lo adapte a las condiciones que se pedian en el ejercicio. Me gustaria saber si, a simple vista, esta mas o menos bien representado, o si hay algo que te parece que pueda faltar...

Contador Johnson ascendente n bits
• 1 entrada CLOCK.
• 1 entrada de Habilitación: si no está habilitado, el contador ignora los pulsos de CLK
• n salidas (1 bit): conteo.



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity johnson is
generic (n : natural := 4);
port (clk, habilitacion : in std_logic;
      cuenta : out std_logic_vector (n-1 downto 0));
end johnson;

architecture comportamiento of johnson is
signal reg_john, nxt_john : std_logic_vector (n-1 downto 0);
begin
   process (clk)
   begin
      if (clk'event and clk='1') then
         if (habilitacion='1') then
            reg_john<=nxt_john;
         end if;
      end if;
   end process;
   process (reg_john)
   begin
      nxt_john<=reg_john (n-2 downto 0) & not reg_john (n-1);
   end process;
   cuenta<=reg_john;
end comportamiento;


Finalmente, el ultimo ejercicio que resolvi es el de un registro, pero con este no tuve mayor dificultad.

Registro de desplazamiento
• Registro de desplazamiento de 8 bits
• Activo por flanco ascendente de CLOCK
• Entrada datos serie
• Salida datos PARALELO
• Entrada de HABILITACIÓN por nivel (H=0 => ignora CLK)
• Carga PARALELO de datos asincrónica



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity registro_5 is
port (clk, entrada, habilitacion, carga : in std_logic;
      datos : in std_logic_vector (7 downto 0);
      salida : out std_logic_vector (7 downto 0));
end registro_5;

architecture comportamiento of registro_5 is
signal tmp : std_logic_vector (7 downto 0);
begin
   process (clk, carga, datos)
   begin
      if (carga='1') then
         tmp<=datos;
      elsif (clk'event and clk='1') then
         if (habilitacion='1') then
            tmp<=tmp (6 downto 0) & entrada;
         end if;
      end if;
   end process;
   salida<=tmp;
end comportamiento;


Lo que voy a intentar hacer es la simulacion de los ejercicios, ya que estimo que es una buena forma para chequear que la logica de cada programa se cumple para cada caso. Mil gracias por su tiempo. Saludos.

---

Hola. Estuve simulando los ejercicios de contadores y funcionaron perfecto. El unico problema lo tuve cuando simule el contador johnson, por el hecho de que, en la salida de la cuenta, me muestra todas letras 'U's, y estando la habilitacion seteada en "1" en determinados momentos. A continuacion dejo el screenshot:







¿Que significaria esa 'U' que me aparece? ¿De que manera lo podria solucionar?

Tambien probe simulando el contador johnson original que tenia, y sucede lo mismo.

Espero su respuesta. Muchas gracias.

PD: La cuenta deberia ser esta.


----------



## chclau

Una manera de resolqver el problema que tenes con el contador Johnson es agregarle una entrada de reset o de carga paralela para establecer condiciones iniciales 

Saludos


----------



## bur85x

Gracias por tu respuesta. Aca logre arreglar el programa:


----------



## fms

Que bueno que lo hayas resuelto
Creo que de lo que preguntabas solo te queda pendiente saber si los _elsif_ pudieran hacer que no se cumpliese alguna condición en tu contador ascendente 4 bits con carga paralela asíncrona:


		Código:
	

      if (rst='1') then  
         cuenta<="0000";
      elsif (carga='1') then  
         cuenta<=datos;
      elsif (clk'event and clk='1') then
         cuenta<=cuenta+1;
      end if;

Los _elsif _establecen prioridades de arriba a abajo dentro del mismo nivel de anidamiento, así que en tu caso, si hay reset ni se carga nada ni cuenta. 
Luego, si no hay reset pero hay carga, no se cuenta.
Y por último, si no hay reset ni carga, se cuenta.
Todo esto es lógico, pues cuando reseteas o cuando cargas el dato no tiene sentido contar. De todos modos, las prioridades de las condiciones deben estar especificadas claramente, y si no lo están, o bien lo interpretas como creas, o bien lo preguntas, lo que es una mejor opción porque muchas veces ocurre que el que quiere el circuito no se ha planteado qué hacer en cada uno de los casos.
Saludos


----------



## chclau

Igual te aclaro que la carga asincronica es una curiosidad, no algo que se utilice en diseños reales de hoy en dia. Lo unico asincronico es el reset e incluso para este, se sincroniza la subida de la señal de reset de manera de que los datos siempre, siempre cambien en forma sincronica con el reloj.


----------



## Davila

Hola buenas noches,

Tengo un gran problema ya que necesito progrmar una GAL22v10 con V.H.D.L. para que me muestre las letras en 4 display´s.

ejemplo:

tiempo 1: 0 0 0 0 (estado del display)
timepo 2: 0 0 0 G 
tiempo 3: 0 0 G O
tiempo 4: 0 G O A
tiempo 5: G O A L


----------



## chclau

y que hiciste hasta ahora ?

Contanos los,primeros pasos que diste y de ahi te ayudamos


----------



## Davila

Mostrar en cuatro displays de siete segmentos una palabra de cuatro caracteres. La palabra estará formada por las primeras 4 letras que son S T E F 

lo que quiero hacer es mostrarlos en 4 displays pero con este efecto 
0000
000S
00ST
0STE
STEF
TEF0
EF00
F000
0000

Lo primero que he realizado es saber q combinaciones necesito en los displays para generar estas letras
segmentos de mis display g  f  e d c b a
                                   1 1  0 1 1 0 1  --s--
                                   0 1  1 0 0 0 1  --t--
                                   1 1  1 1 0 0 1  --e--
                                   1 1  1 0 0 0 1  --f--
pero mi programacion de v.h.d.l no funciona =(


----------



## chclau

... pone lo que hiciste y lo comentamos


----------



## Davila

entity Unidad_3 is

port( CLK: in  std_logic ;
        Q: out std_logic_vector ( 6 downto 0 ));
end Unidad_3;

architecture behavioral of Unidad_3 is
begin
   process (CLK)
   begin 
      if (CLK'event and CLK = '1' ) then 
         if (Q = "0111111") then --0--
             Q<= "1101101";
      elsif (Q = "1101101") then --s--
             Q<= "0110001";
      elsif (Q = "0110001") then --t--
             Q<= "1111001";
      elsif (Q = "1111001") then --e--
             Q<= "1110001";
       else  Q<= "1110001";      --f--
     end if;
   end if;
   end process;
end behavioral;


----------



## chclau

Algunas observaciones

Fijate que asi como esta nunca va a pasar nada ya que Q no tiene un valor inicial. Lo que podes hacer es agregarle una swñal de reset y asignarle el primer valor en reset.

Lo otro es que en VHDL no se puede leer el valor de una salida, entonces lo que se hace es definir una señal interna y segun el valor que tenga, activar la logica y la salida.

Luego de esas correcciones ya tendrías la salida para un display, te falta pensar como hacer la logica para cuatro.


----------



## Davila

mira ya tengo la sincronia con 2 display solo me falta ajustarlo para que los sig dos funcionen =. tendras algun manual o algo q m pueda ayudar parte del libro de maxinez?


----------



## chclau

Fijate si esto te ayuda


https://www.forosdeelectronica.com/f26/recomendacion-vhdl-74225/


----------



## axshaw

Hola 

requiero la realizacion de un sistema secuencial para un trabajo en la universidad, el problema es que es circuito tiene un 555 como monoestable de unos 5sg, la tarea es realizar este temporizador en vhdl, las dudas me embargan ya que tengo practica con microprocesadores y no con este lenguaje, si es posible que alguien me oriente sobre este tema seria de gran ayuda, ya que no se si estos dispositivos tiene clock y como manejar esta señal.

Gracias


----------



## chclau

Los FPGA normalmente tienen señal de reloj, si tenes una referencia exacta de reloj, hacer un temporizador en definitiva es contar n pulsos de reloj. Si el reloj tiene periodo de 1us, un contador hasta mil puede hacer un retardo de hasta 1ms


----------



## axshaw

gracias por la nota aclarativa, lo siguiente es como puedo crear una variable en vhdl, segun veo 
varible axx: integer 0 to 100; esta  bien declarada y al hacer esto la puedo usar para decrementarla en cada transicion del clk.


----------



## chclau

VHDL es distinto a un lenguaje de programacion comun. En un lenguaje como Basic o C creas una variable y ella ocupara una posicion de memoria. En VHDL lo que se hace es describir hardware. Por eso no pensamos en funcion de variables sino en funcion de elementos de hardware: compuertas, flipflops, contadores. Buscate algun libro de los que ya fueron recomendados en el foro y fijate como se define y usa un contador.


----------



## axshaw

este es el algoritmo creado para resolver la aplicación, me podrías regalar tu opinión.



		Código:
	

use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity    CAR is             //definer la eentidad carro
PORT (IN1,IN2,CLK:IN STD_LOGIC; Q1,Q1N,Q2,Q2N:OUT STD_LOGIC);// entradas y salidas de la entidad
end CAR

Architecture  CAR_CONTROL of CAR is
signal (QT,fin: STD_LOGIC;cont:integer range o to 99000)

begin 
process (IN1,IN2,CLK,fin,cont)
begin 


if  (rising_edge(IN1) or RISING_EDGE(IN2)) then
      QT<= NOT QT;
          if  QT=1 then
                Q1<=0;
                Q1N<=0;
                Q2<=0;
                Q2N<=1;
            
            else //QT=0
                         Q2<=0;
                Q2N<=0;
                Q1<=0;
                Q1N<=1;
        end if 
        cont<=3000;
                          fin<=0;
 CICLO DE ESPERA 
    while  fin = 0 loop 
        
        if  ( clk'event  and  clk='1') then 
             cont<=cont -1;
                if cont= '0'
                    fin<='1';
                end if
        end if 
       end loop 
    
     
else 
        Q1<=1;
        Q2<=1;
        Q1N<=0;
        Q2N<=0;
        
end if


----------



## chclau

Hola!

bueno, has hecho ya un esqueleto y eso es bueno

unas cuantas observaciones

En un dispositivo sincrono, como flip flops y contadores, hay solamente dos señales a tomar en cuenta en la sensitividad de los procesos

Reset ( que no usaste) 
y clock

se usa rising edge solamente para la señal de clock, ya que es el clock el que muestrea la entrada y la presenta a la salida
reset normalmente resetea al flip flop o contador

un ejemplo tipico de flip flop 

process (reset, clock)

if (reset = '0')
   q<= '0';
elsif(rising_edge(clock))
   q<= in;
end if;

end process

fijate que la señal in y q no aparecen en la lista de sensibilidad

Un contador es parecido a un flip flop con el agregado de una señal de load para cargar datos y una de enable para contar.

Una compañia que a mi me gusta es Altera, busca en su sitio y encontraras exactamente como escribir flip flops y contadores. Si todavia no queda algo claro pregunta

Suerte!


----------



## jhon f sa

tengo un contador de 0 a 9999 con un pin de down/up con el cual el automaticamente comienza a contar ascendente o descendente, necesito quitarle el automatico y volverlo manual, de tal manera que le habilite un pulsador que cada vez que lo pulse cuente 1, 2, 3, 4, 5...etc


----------



## gaqf

Bueno, debo hacer una máquina de estado, e implementarla en una FPGA, sucede que no tengo claro como podría multiplexar 4 displays 7 segmentos de la targeta para mostrar una secuencia en dichos displays, cada cierto segundo.
A continuación la secuencia que debe seguir cada segundo.

Ver el archivo adjunto 102910
Alguien tiene documentación de como hacer esa multiplexación de displays..
gracias.

Algo que se me ocurre es mostrar el mensaje al tiempo en todos los displays y tener 4 señales de reloj..diseñar divisores de frecuencia para que la la frecuencia sea tan rápida que el ojo humano no la perciba.. gracias.


----------



## fms

Tienes un ejemplo de como multiplexar los displays de 7 segmentos en el apartado 6.3.2 del libro Diseno de circuitos digitales con VHDL (http://eciencia.urjc.es/handle/10115/4045). Quiza tengas que mirarte los apartados anteriores para entenderlo mejor.
Saludos


----------



## aguevara

Les comento, recién estoy haciendo mis primeros ensayos en VHDL usando el software QuartusII versión 13.1 de Altera.
La placa de desarrollo es la DE0, la intención es hacer un contador de 4 bits (muy simple creo yo) y para empezar está ok.
Bueno el código esta aquí:

-- contador 4 bits con clk y reset


		Código:
	

library ieee;
use ieee.std_logic_1164.all;

entity contador is port (clk: in std_logic;
                 rst: in std_logic;
                   q: inout std_logic_vector (3 downto 0));
end contador;


architecture cuenta of contador is
begin 
process (clk,rst) begin 
    if (rst'event and rst = '0') then 
        q<= "0000";
        if (clk'event and clk = '0') then 
            q <= q+1;
        end if;
    end if;
end process;
end cuenta;

La pregunta es; al compilar me arroja el siguiente error:
Error (10327): VHDL error at contador.vhd(16): can\'t determine definition of operator "+" -- found 0 possible definitions

Buscando, encontré que usando la librería std_logic_unsigned se podría corregir dado que no es posible hacer una suma con datos del tipo std_logic y std_logic_vector, así que declaré la librería y nada, el error persiste.
He usado varias librerías sin resultado positivo. ¿Alguien tiene alguna pista sobre como corregir este error?

Saludos.


----------



## joquines

Estimado aguevara, estas trabajando con operadores sobrecargados, por lo que tendrás que utiliza la librería IEEE para tal fin. Esto lo puedes solucionar declarando al inicio de tu descripción:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

Además recuerda en declarar las señales de manera correcta para poder realizar la operaciones de suma.

Cualquier duda revisa las librerías o comenta para dar mas ayuda. 
Recuerda que VHDL NO TIENE EL MISMO TRATO QUE LENGUAJE C.



Otra aclaración, no es recomendable declarar un puerto como entrada y salida a la vez, sobre todo si recien estas comenzando a describir hardware.


----------



## aguevara

Lo de las librerias ya las he definido como indicas y .. nada de nada el mismo error, a que te refieres con declarar las señales de manera correcta?, es que acaso debo diseñar el contador completamente con compuertas?? que si deseo omitir ese paso y ver al contador solo como una caja con 2 entradas y 4 salidas?? (no se si me explique)


----------



## chclau

Este anda, comparalo con el tuyo y fijate si entendes todos los cambios que hice, ya que todos son necesarios.



		Código:
	

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity counter is 
port (
	clk: in std_logic;
    rst: in std_logic;
    q: 	 out std_logic_vector (3 downto 0)
);
end counter;


architecture count of counter is
	signal cnt : std_logic_vector (3 downto 0);
begin 
process (clk,rst) begin 
    if (rst = '0') then 
        cnt <= (others => '0');
    elsif (clk'event and clk = '0') then 
        cnt <= cnt + 1;
    end if;
end process;
q <= cnt;
end count;


Te remarco algunos de los principales:

Usé out en lugar de inout para la salida q
No usé event para reset (es incorrecto usar event para reset, se usa para clock)
Usé la libreria unsigned
Usé una variable auxiliar (por que?)...


----------



## aguevara

Gracias a Joquines y chclau por sus respuestas, efectivamente con los cambios propuestos por chclau se corrigio el asunto, ahora supongo que el uso de la variable cnt es propiamente una salida logica del contador propuesto y que admite la operacion de suma, y que q es una salida fisica a donde se enviara el valor de la variable cnt, por ello el uso de esa variable, ahora una pregunta la señal de rest y clk las hare a travez de unos interruptores, porque no usar el comando event en la instruccion reset ?? me explicas el uso de others, yo he visto ese comando pero con las directivas del tipo "case", el ejemplo y lo que les comento todo lo he visto en un libro, por ello mis dudas.

Saludos


----------



## fms

Hola,

- La señal de rst no debe llevar event porque es una senal activa por nivel y no por flanco. Normalmente, las unicas senales activas por flanco deberian ser las del reloj. Si pusieses *if (rst'event and rst = '0') then*, implicaria que solo se resetearia en el flanco de bajada de rst, y pero despues del flanco no estarias reseteando, incluso si rst sigue a cero.

- *others* hace que todos los bits de ese vector se pongan al valor indicado, en este caso a cero.

- Un puerto de salida no puede leerse, por eso el uso de la señal auxiliar. Con esto puedes declarar q como puerto de salida (y no inout), y cnt es la que lees dentro del proceso (*cnt <= cnt + 1;*)

Saludos


----------



## aguevara

Gracias fms por tu respuesta


----------



## darwblk

¿Alguien podría decirme si es posible leer el programa de un FPGA para poder grabarlo en otro?
El problema es que tengo una tarjeta de la cual necesito sacar la programación del FPGA.


----------



## chclau

En principio, no.

La mayoria de los FPGA no tienen grabado nada, se "cargan" luego del encendido a traves de una EPROM externa o de un procesador host que lee el archivo de, por ejemplo, una memoria Flash y carga al FPGA.


----------



## Fallen Belial6

Hola buen día.

En mi clase de digitales nos piden hacer un programa que cuente cuantas veces se activa un sensor.
Deberá activarse el numero de veces que se indique con una botonera, puede ser de 0 a 99 veces.
Al contar las x cantidad de veces, el programa resetea el conteo y vuelve a comenzar.
Además, x cantidad de veces que cuente el sensor se indica en 2 displays de 7 segmentos y el conteo actual se muestra en otros 2 displays.
Los displays son multiplexados.

Ya escribí el programa, pero me marca muchos errores de mapeo.

¿Podría alguien decirme cual es el error?
A continuación pondré el código del programa y los errores que me marca.

Este es el código del programa:



		PHP:
	

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_Arith.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Pract15 is
    Port ( KB : in  Unsigned (9 downto 0);
           Start : in  STD_LOGIC;
              motor : out STD_LOGIC;
           Stop : in  STD_LOGIC;
           SEGDP : out  Unsigned (6 downto 0);
           sensor : in  STD_LOGIC;
           CLKfast : in  STD_LOGIC;
              PolDP : out Unsigned (3 downto 0));
              
end Pract15;

architecture Behavioral of Pract15 is
signal C,RA,RB,CU1,CU2 : Unsigned(3 downto 0);
signal Q : unsigned(6 downto 0);
signal tecla,QCU: unsigned (1 downto 0);
signal SP,CU099 : UNSIGNED(7 downto 0);
signal q1,q2 : unsigned(3 downto 0);
signal MUXDP : unsigned (3 downto 0);
signal reset : std_logic ;
begin
teclado: process(KB, C, tecla)                --este proceso es el encargado de registrar la cantidad
variable i: unsigned(1 downto 0) :="00"; --de veces que contará el sensor antes del reset de ciclo
begin
if KB ="0000000001" then
    C <="0000"; tecla <= i;
    elsif KB ="0000000010" then 
    C <= "0001"; tecla <= i;
    elsif KB ="0000000100" then
    C <= "0010"; tecla <= i;
    elsif KB ="0000001000" then 
    C <= "0011"; tecla <= i;
    elsif KB ="0000010000" then 
    C <= "0100"; tecla <= i;
    elsif KB ="0000100000" then
    C <= "0101"; tecla <= i;
    elsif KB ="0001000000" then
    C <= "0110"; tecla <= i;
    elsif KB ="0010000000" then
    C <= "0111"; tecla <= i;
    elsif KB ="0100000000" then
    C <= "1000"; tecla <= i;
    else 
    C <= "1001"; tecla <= i;
end if;

if tecla ="00" then
RB <= C; -- Unidades
else 
RA <= C; -- Decenas
end if;

i:= i+1;

if (i = "10") then 
i := "00";
end if;

end process;

Convert: process(RA, RB)     -- este proceso convierte los 2 numeros de BCD a entero
--variable X : UNsigned (7 downto 0);
begin
SP <= (RA*10)+(RB);
--SP <= X;
end process;

Memory: process(start, RA, RB) -- Esta memoria registra la cantidad a contar una vez que se 
begin                                     -- presiona el botón de iniciar (start)
if (start' event and start ='1') then
q1 <= RB;
q2 <= RA;
end if;
end process;

Contar99 : process(sensor,CU099, reset) -- Es el contador de conteo actual
begin
If reset = '1' or CU099 = "01100011" or stop = '1' then CU099 <= "00000000";
else
If sensor ' event and sensor = '1' then 
CU099 <= CU099+1;
end if;
end if;
end process;

QuickCU: process(CLKfast, QCU)  --Contador control de multiplexor de display
begin
if CLKfast' event and CLKfast = '1' then
    if QCU = "11" then QCU <= "00";
    else
    QCU <= QCU+1;
    end if;
end if;
end process;

CUnit : process ( sensor, CU1, CU2, reset) -- Este marca el conteo actual y lo envia al MUX para
begin                                                   -- los displays
IF stop = '1' or CU1 = "1010" or reset = '1' then CU1 <= "0000";
else
if sensor ' event and sensor = '1' then
    CU1 <= CU1+1;
    end if;
if (stop ='1' or CU2 = "1010") or reset = '1' then CU2 <= "0000";
if sensor' event and sensor ='1' and CU1 = "1010" then 
    CU2 <= CU2 +1;
end if;
end if;
end if;
end process;

CMP : process (SP, CU099)   -- compara el conteo actual con el solicitado
begin
if SP = CU099 then
reset <= '1';
else reset <= '0';
end if;
end process;

Encoder : process(QCU)   -- este polariza los displays
begin
case QCU is
when "11" => PolDP <= "1110";
when "10" => PolDP <= "1101";
when "01" => PolDP <= "1011";
when "00" => PolDP <= "0111";
when others => PolDP <= "1111";
end case;
end process;

MUX : process( q1,q2,CU1,CU2,QCU)  -- multiplexa el numero que se observará en cada display
begin
case QCU is
when "11" => MUXDP <= q1;
when "10" => MUXDP <= q2;
when "01" => MUXDP <= CU1;
when "00" => MUXDP <= CU2;
when others => MUXDP <= "0000";
end case;
end process;

DISP : Process(MUXDP)        --decoder de BCD a display 7 segmentos
begin
case MUXDP is
when "0000" => SEGDP <= "1000000";
when "0001" => SEGDP <= "1111001";
when "0010" => SEGDP <= "0100100";
when "0011" => SEGDP <= "0110000";
when "0100" => SEGDP <= "0011001";
when "0101" => SEGDP <= "0010010";
when "0110" => SEGDP <= "0000010";
when "0111" => SEGDP <= "1111000";
when "1000" => SEGDP <= "0000000";
when "1001" => SEGDP <= "0011000";
when others => SEGDP <= "1111111";
end case;
end process;
end Behavioral;



La lista de errores es la siguiente:



		Código:
	

ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP21" (output signal=Mmux_MUXDP2) has
   input signal "q1<0>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP21" (output signal=Mmux_MUXDP2) has
   input signal "q2<0>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP41" (output signal=Mmux_MUXDP4) has
   input signal "q1<1>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP41" (output signal=Mmux_MUXDP4) has
   input signal "q2<1>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP61" (output signal=Mmux_MUXDP6) has
   input signal "q1<2>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP61" (output signal=Mmux_MUXDP6) has
   input signal "q2<2>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP81" (output signal=Mmux_MUXDP8) has
   input signal "q1<3>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT3 symbol "Mmux_MUXDP81" (output signal=Mmux_MUXDP8) has
   input signal "q2<3>" which will be trimmed. See Section 5 of the Map Report
   File for details about why the input signal will become undriven.
ERROR:MapLib:979 - LUT4 symbol "reset853" (output signal=reset853) has input
   signal "RB<0>" which will be trimmed. See Section 5 of the Map Report File
   for details about why the input signal will become undriven.
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP21" (output signal=Mmux_MUXDP2) has an
   equation that uses input pin I0, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP21" (output signal=Mmux_MUXDP2) has an
   equation that uses input pin I2, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP41" (output signal=Mmux_MUXDP4) has an
   equation that uses input pin I0, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP41" (output signal=Mmux_MUXDP4) has an
   equation that uses input pin I2, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP61" (output signal=Mmux_MUXDP6) has an
   equation that uses input pin I0, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP61" (output signal=Mmux_MUXDP6) has an
   equation that uses input pin I2, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP81" (output signal=Mmux_MUXDP8) has an
   equation that uses input pin I0, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT3 symbol "Mmux_MUXDP81" (output signal=Mmux_MUXDP8) has an
   equation that uses input pin I2, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).
ERROR:MapLib:978 - LUT4 symbol "reset853" (output signal=reset853) has an
   equation that uses input pin I2, which no longer has a connected signal.
   Please ensure that all the pins used in the equation for this LUT have
   signals that are not trimmed (see Section 5 of the Map Report File for
   details on which signals were trimmed).


No sé ni a que se refieren los errores, estoy apenas comenzando en esto de programar en VHDL.

Saludos y gracias de antemano.


----------



## chclau

La verdad?

Tiene tantos errores que es dificil guiarte y decirte por donde empezar, y no entiendo como te dieron semejante practica sin comenzar por algo mas simple.

Te diria que empieces despacito, bloque por bloque, y pidas ayuda a tu profesor para los conceptos basicos. VHDL no es un programa, VHDL es una descripcion de hardware. 

Cuando escribes VHDL debes imaginarte como el codigo que has escrito se convierte en un MUX, o en un FF, o en un registro. Entonces, te diria que empieces de ahi, y de a poco. 
Escribe el codigo de un mux.
Escribe el codigo de un FF, y luego de un registro.
Cada ejemplo, lo simulas, lo verificas y lo sintetizas.

Asi podras entender por ejemplo que no se usa 'event para cualquier cosa, sino unicamente para señales de reloj.

Para ayudarte un poco, puse aqui una version corregida de parte del codigo que escribiste y que se sintetiza sin errores. Fijate si podes agregarle el resto de los bloques teniendo en cuenta lo que ya te dije. Nota que la señal start es utilizada dentro de una logica de flip flop (usa a CLKfast)



		Código:
	

entity Pract15 is
    Port ( 
           SEGDP 	: out  Unsigned (6 downto 0);
           CLKfast  : in  STD_LOGIC;
           PolDP 	: out Unsigned (3 downto 0));
              
end Pract15;

architecture Behavioral of Pract15 is
signal RA,RB,CU1,CU2 : Unsigned(3 downto 0);
signal QCU: unsigned (1 downto 0);
signal q1,q2 : unsigned(3 downto 0);
signal MUXDP : unsigned (3 downto 0);
begin

Memory: process(CLKfast)	 					-- Esta memoria registra la cantidad a contar una vez que se 
begin                                       	-- presiona el botón de iniciar (start)
	if (CLKfast' event and CLKfast ='1') then
		if (start = '1') then
			q1 <= RB;
			q2 <= RA;
		end if;	
	end if;
end process;

QuickCU: process(CLKfast)  					-- Contador control de multiplexor de display
begin
	if CLKfast' event and CLKfast = '1' then
		QCU <= QCU+1;
    end if;
end process;

Encoder : process(QCU)   -- este polariza los displays
begin
	case QCU is
		when "11" => PolDP <= "1110";
		when "10" => PolDP <= "1101";
		when "01" => PolDP <= "1011";
		when "00" => PolDP <= "0111";
		when others => PolDP <= "1111";
	end case;
end process;

MUX : process(q1,q2,CU1,CU2,QCU)  			-- multiplexa el numero que se observará en cada display
begin
	case QCU is
		when "11" => MUXDP <= q1;
		when "10" => MUXDP <= q2;
		when "01" => MUXDP <= CU1;
		when "00" => MUXDP <= CU2;
		when others => MUXDP <= "0000";
	end case;
end process;

DISP : Process(MUXDP)        				--decoder de BCD a display 7 segmentos
begin
	case MUXDP is
		when "0000" => SEGDP <= "1000000";
		when "0001" => SEGDP <= "1111001";
		when "0010" => SEGDP <= "0100100";
		when "0011" => SEGDP <= "0110000";
		when "0100" => SEGDP <= "0011001";
		when "0101" => SEGDP <= "0010010";
		when "0110" => SEGDP <= "0000010";
		when "0111" => SEGDP <= "1111000";
		when "1000" => SEGDP <= "0000000";
		when "1001" => SEGDP <= "0011000";
		when others => SEGDP <= "1111111";
	end case;
end process;
end Behavioral;


----------



## Fallen Belial6

Hola. 
gracias por la ayuda Chclau. 
Si puedo sintetizar el proyecto, pero al momento de entrar a la fase del "map" salen todos los errores que están listados.
No se ni a que se refieren y mi profesor, al parecer, tampoco.
Los programas ya los había realizado, bueno algunos de ellos, por ejemplo los contadores, el mux, deco de BCD a 7 segmentos.
Lo que agregué nuevo fue el del teclado.

Gracias por tu ayuda, investigaré a que se refieren los errores que me aparecen al momento del "map" para ver cual podría ser la solución.

Además tengo otra duda.
Si quiero solo registrar un flanco positivo, existe otra instrucción que no vea el pulso como de reloj?
No conozco mucho de como se ejecuta el programa pero imagino que es de forma secuencial de arriba hacia abajo de manera cíclica. 
Por lo que supongo que si tengo un contador que cuente hacia arriba cuando esté en '1' la entrada 'x' por ejemplo, si 'x' se activa durante 1 segundo y el la ejecución del programa dura 10 ms, entonces el contador me contaría hasta 100? ya que durante ese segundo se ejecutaron 100 ciclos?
Es debido a eso por lo que uso event en varios lugares.
Si es de esa forma como se realizaría la ejecución? o estoy equivocado?

Espero haber sido claro con mi explicación. 

Gracias de antemano.

Saludos.


----------



## chclau

Hola

Nuevamente, VHDL NO ES un programa. Si no entiendes eso, vamos mal.

VHDL es una manera de describir hardware. Por eso no se puede usar 'event para cualquier cosa, se utiliza UNICAMENTE para señales de reloj.

Un contador en VHDL cuenta pulsos de reloj, no existe ninguna "ejecucion del programa" de 100 ciclos ni de 10ms.

Disculpame pero tu profesor no te ha explicado bien, o no has entendido. Como ya te dije, si no entiendes cosas basicas como, como funciona un registro o un contador, mal puedes lograr logica que funcione.

Un contador cuenta pulsos de reloj. La cantidad de pulsos que cuente depende de la frecuencia del reloj y, en los casos en que tal señal existe, de la entrada de habilitacion. Un contador en VHDL es como poner, por dar un ejemplo, un TTL 7490 en tu proyecto. Si entiendes como funciona un contador TTL, entenderas y no tendras ninguna duda sobre como funciona un contador en VHDL.

Te enseñaron a utilizar Modelsim u otra herramienta para simular tus diseños?


----------



## Fallen Belial6

Hola de nuevo.

Uso una tarjeta basys2 spartan3E-100 para probar los programas, no se usar herramientas de simulación.

gracias.


----------



## axel1566

¿Se pueden crear varios "vhdl file" dentro de un proyecto en Quartus?
Lo que pasa es que vi a un amigo que hacía eso y pues quise intentarlo, pero no corre en mi laptop.
Quisiera resolver mis dudas. Gracias, de ante mano.


----------



## Ruben_00

Hola. Apenas empiezo en VHDL y se me presenta un problema al abrir el fichero en Vivado, se queda abriendo el archivo de forma indefinida y termina en nada. Ya lo había guardado, solo me salió un error de sintaxis pero no me abre mas, ¿Qué podría haber pasado? Gracias.

Como apenas empiezo con este lenguaje de descripción ¿Alguien tiene un manual se sintaxis en VHDL?


----------



## Joloko

Ando trabado con esta tarea hace unos cuantos días y siempre hay algún caso que me tira error y ya no sé qué probar para solucionarlo. Si alguien me tira una ayudita le estoy más que agradecido.

Este es el código que está hecho hasta ahora: EDA Playground

Y adjunto foto de la tarea a resolver.


----------

