Curso para iniciarse con FPGAs

Bueno en Argentina nose. Pero la puedes comprar directamente en la pagina de Digilent o en Amazon a veces tambien tienen.
 
hola que tal,

acabo de iniciar mi curso con FPGA's y pues solo espero poder responder.. y como no algunas dudas del foro.. espero que el tema no muera por que posible nos podamos ayudar
 
un saludo especial a toda la comunidad del foro.

amigos del foro necesito ayuda, pues estoy programando en Quartus 9.0 y estoy tratando de hacer un conversor de un codigo binario (hasta 8bits, maximo numero decimal 255) a bcd y mostrarlo en tres displays 7 segmantos, pues le pido ayuda porque hasta ahora estoy aprendiendo, el tipo de lenguaje es VHDL.

gracias.
 
Hola que tal a todos los compañeros de la comunidad. Ahora vengo con la molestia para ver si alguno de ustedes me puede ayudar, mi problema es el siguiente:

Estoy tomando la materia de digital I y tengo que entregar como proyecto final un sumador completo de cuatro bits con sus cuantro banderas, de las cuales ya tengo el carrey, Z y la N pero me falta V que es la de desvordamiento y la verdad no se como programarlo.

Mi segundo problema es que al programar preeliminarmente una GAL22V10-25LP con el sumador y las tres banderas me lleve la gran sorpresa de que no cabe en la gal entonces no se como hacerle para que me quepa, me surguio la idea de hacer dos sumadores de 2 bits y programarlos en dos GAL pero no se muy bien como despues juntarlas. Les dejo el codigo:

Código:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
  
ENTITY Sumador IS
	GENERIC(No: INTEGER :=4);
	PORT(
	A,B	: 	in 	std_logic_vector(No-1 DOWNTO 0);
	Cin	: 	in 	std_logic;
	S	: 	out std_logic_vector(No-1 DOWNTO 0);
	Cout: 	out std_logic;	
	Z,N: 	out std_logic
	);
END Sumador;

ARCHITECTURE bits_4 OF Sumador IS
BEGIN 
	PROCESS (A, B, Cin)								 
	VARIABLE suma:  std_logic_vector(No DOWNTO 0);
	BEGIN
	suma	:=  ('0' & A) + ('0' & B) + Cin;
	S		<=	 std_logic_vector (suma(No-1 DOWNTO 0));
	Cout	<=	 std_logic(suma(No));
	N		<=	 std_logic(suma(No-1));
	
	IF std_logic_vector(suma(No-1 DOWNTO 0)) = 0
		THEN z <= '1';
		ELSE z <= '0';
	END IF;
	END PROCESS;
	
	
END bits_4;

Espero pueda ayudar, lo necesito para el lunes, les agradecere mucho :D
 
Estoy realizando un contador decreciente que empieza su cuenta en 546, tiene un reset, un reloj interno de 50mhz y el stop.

el programa funciona perfectamente en la FPGA de altera quartusII, CycloneII con su conteo decreciente a un 1 segundo y el reset.
mi problema es que no se como implementar la "para" del conteo cuando pulse un pushbutton y empieze de nuevo el conteo cuando vuelva y presione el mismo pbutton.
la idea es que siga decrementandose desde el valor donde fue el stop.
gracias...
agradeceria alguna solucion, ya he intentado muchas y no dan resultadosss.
mi codigo es el siguiente:

Código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
      
entity contstop is 
port (reloj,reset,stop: in std_logic; 
      hex3,hex2,hex1 : out bit_vector (6 downto 0)); 
end contstop; 

architecture estructural of contstop is                 
             subtype vector is bit_vector(6 downto 0);
             function conversion(bcd: integer) return vector is
             begin 
                  case bcd is
                  when 0 => return "0000001";
                  when 1 => return "1001111";
                  when 2 => return "0010010";
                  when 3 => return "0000110";
                  when 4 => return "1001100";
                  when 5 => return "0100100";
                  when 6 => return "0100000";
                  when 7 => return "0001111";
                  when 8 => return "0000000";
                  when 9 => return "0000100";
                  when others => return "1111111";
                  end case; 
             end conversion;     
begin 
     process (reloj,reset)
            variable contador: integer:=546;
            variable resultado3: integer;
            variable resultado2: integer;
            variable resultado1: integer;
            variable resul: integer;
            variable tiempo: integer;
            
            begin     
                 if (reset='1') then
                     contador:=546;  
                 elsif(reloj='1' and reloj'event) then
                       if (tiempo=5000000) then
                           tiempo:=0;
                           contador:=(contador - 1); 
                           resultado3:=(contador / 100);
                           resul:=(contador REM 100); 
                           resultado2:=(resul / 10);         
                           resultado1:=(resul REM 10);    
                       else tiempo:=(tiempo + 1);
                       end if;
                 end if;    
                 
                 if (contador=0) then
                     contador:=546;
                 end if;                                        
     hex3<=conversion(resultado3);
     hex2<=conversion(resultado2);  
     hex1<=conversion(resultado1);          
     end process;     
end estructural;
 
Última edición por un moderador:
hola a todos, tengo que diseñar con VHDL una unidad logica aritmetica que realice suma y resta aritmeticas y las funciones NAND y NOR y comparador de magnitud (igual, mayor que, menor que) que se parametrizable. Necesito tutoriales sobre el uso de VHDL, ya que es la primera vez que lo uso. Y si es posible algunos ejemplos de estos circuitos.
 
Hola! Tengo que diseñar un osciloscopio digital con un CAD y la FPGA de la familia Spartan3E. Sé que tendré que coger la señal sinusoidal, muestrearla, guardar esos valores en una memoria RAM,procesarlos y despúes reconstruir la señal para representarla en un LCD gráfico. Lo que me gustaría es si alguien me podría ayudar en cuanto a plantear el diagrama de las secuencias de operaciones y qué circuitos auxiliares me harían falta. Por ejemplo, necesito, mínimo una RAM, registro de desplazamiento, etc.,....
Muchas Gracias por todo.

Yo puedo aportar el circuito lógico de las señales de sincronismo para el TRIGGER el contador y la memoria >>> Ver acá <<<<.

Este desarrollo lo estoy haciendo con componentes discretos pero con una FPGA ganaría velocidad.
El nivel de detalle se puede aumentar tanto más funciones se quieran implementar en el proceso de captura.

Espero que al menos sirva como ejercicio de aplicación. A mí me vendría bien poder implementarlo en físico. Estoy bajándome todas las herramientas (Quartus II, ByteBlaster II Download Cable y pdf varios), pero aún no se nada de estos bichos FPGA, y tampoco sabría elegir el chip para hacerlo.

Saludos

ED:
Estoy realizando un contador decreciente que empieza su cuenta en 546, tiene un reset, un reloj interno de 50mhz y el stop.

el programa funciona perfectamente en la FPGA de altera quartusII, CycloneII con su conteo decreciente a un 1 segundo y el reset.
mi problema es que no se como implementar la "para" del conteo cuando pulse un pushbutton y empieze de nuevo el conteo cuando vuelva y presione el mismo pbutton.
la idea es que siga decrementandose desde el valor donde fue el stop.
gracias...
agradeceria alguna solucion, ya he intentado muchas y no dan resultadosss.

Creo que tu problema se arregla usando "banderas"
Yo haría lo siguiente:
1.- defino dos variables STOP y ESTADO
2.- mientras STOP=0 y ESTADO=ACTIVO se cuenta el tiempo normalmente
3.- cuando se detecta el evento STOP=1 se pone la variable ESTADO <= DETENIDO y se espera a que vuelva a estar STOP=0 (con un retraso para evitar rebotes)
4.- mientras ESTADO=DETENIDO solo se sensa el botón STOP y se saltea el resto del proceso
5.- si con ESTADO = DETENIDO se pone STOP = 1, se cambia ESTADO <= ACTIVO y se espera a que vuelva a estar STOP=0
6.- goto 2

Creo que la forma de implementarlo sería parecida al ejemplo de la lavadora de "carros", en la parte:
WHEN esta1 =>
IF m = ‘1’ AND s3 = ‘1’ THEN
prox_est <= esta2;
ELSE
prox_est <= esta1;
END IF;
WHEN esta2 =>
IF p = ‘1’ THEN
prox_est <= esta6;
ELSIF s2 = ‘1’ THEN
prox_est z= esta3;
ELSE
prox_est <= esta2;
END IF;

Yo haría (No sé bien como implementar el retraso antirebotes):
Código:
CASE estado IS 
WHEN activo =>
   IF stop = ‘1’ THEN
      --cambia de valor la bandera "estado"
      estado <= detenido 
   ELSE
      -- Gatilla el retraso para antirebotes ?
      -- Proceso de la cuenta de tiempo
      ...
   ENDIF
WHEN detenido =>
   IF stop = ‘1’ THEN
      --cambia de valor la bandera "estado"
      estado <= activo
   ELSE
      --  No hace nada o hace otra cosa
      -- Gatilla el retraso para antirebotes ?
    ENDIF
 END CASE:
Estará bien ? :eek:
 
Última edición:
Respecto a la implementación de un "osciloscopio" digital, por la capacidad disponible que estoy viendo en algunos chips (1MB de RAM), me parece que dentro de la misma FPGA podría ir la memoria para captura de datos, los contadores para generar la dirección y los retardos.
Sólo quedaría afuera el conversor AD y el circuito de adaptación de la señal analógica, algunos botones, el GLCD, y el puerto para salir a la pc via LPT.
Por supuesto también el puerto para programación JTAG.

Lo que me parece complicado es la factura de las placas por el tema de las bolillas de contacto que tienen los chips de muchos pines.
¿ Van soldadas las bolillas o solo hacen contacto ?
Las de gran cantidad de contactos ¿ es necesario que las placas sean multicapa ?

Saludos

PD: Algunos enlaces que puse antes no andan porque el servidor está en mantenimiento. Calculo que en un par de días (?) lo restablecen. :confused:
 
Respecto a la implementación de un "osciloscopio" digital, por la capacidad disponible que estoy viendo en algunos chips (1MB de RAM), me parece que dentro de la misma FPGA podría ir la memoria para captura de datos, los contadores para generar la dirección y los retardos.
Sólo quedaría afuera el conversor AD y el circuito de adaptación de la señal analógica, algunos botones, el GLCD, y el puerto para salir a la pc via LPT.
Por supuesto también el puerto para programación JTAG.

Lo que me parece complicado es la factura de las placas por el tema de las bolillas de contacto que tienen los chips de muchos pines.
¿ Van soldadas las bolillas o solo hacen contacto ?
Las de gran cantidad de contactos ¿ es necesario que las placas sean multicapa ?

Saludos

PD: Algunos enlaces que puse antes no andan porque el servidor está en mantenimiento. Calculo que en un par de días (?) lo restablecen. :confused:

En los componentes tipo BGA las bolillas van soldadas, de ahí que sea casi imposible hacerlas uno mismo y haya que fabricar fuera... En mi empresa por ejemplo las FPGA las mandamos a soldar a otro lado que tienen una máquina de soldar BGA's.

En cuanto a la cantidad de contactos, si eres capaz de rutar una FPGA en una o dos caras, enhorabuena :D Lo normal son más caras, depende claro del número de pines que vayas a usar... Por ejemplo en una tarjeta que tiene una FPGA de 672 pines tiene 10 ó 12 capas porque se usan la mayoría de ellos

Si estás pensando en montarte tú mismo las placas con FPGA, es algo casi inalcanzable... Hay FPGA de montaje superficial en encapsulado QFP que es casi lo más a lo que un aficionado puede aspirar, pero también suelen ser más pequeñas que las BGA.

Un saludo
 
Gracias por responder.
Mucho me temía lo de las capas. :cry:
Aparentemente es una consecuencia de la gran capacidad de estos chips.
Veré si me alcanza con alguna de las de patillas laterales, que igual son
bastante "patilludas".
Tendré que ir averiguando quién hace multicapas por el barrio. Aunque sea para más adelante ...

De paso, ya abusando de tu amabilidad, otra preguntilla:
No se alcanza a ver bien en las fotos de las placas de desarrollos, pero si no me equivoco, el chip parece venir soldado.
Supongamos que tengo el código listo y la placa de mi aplicación ya hecha. Sólo me falta transferir el esquema al chip. ¿ Cómo es el procedimiento ?
¿ Me tengo que armar el cable "ByteBlaster" para transferir el circuito via JTAG ?
¿ O eso también lo tengo que mandar a hacer ?

Desde ya gracias. (y)
 
Hola

Depende de cómo te lo montes. La FPGA es volátil, o sea cuando apagas la alimentación se borra y hay que volver a grabarla. Hay dispositivos como CPLD que no les sucede eso, pero son más pequeños, o sea al final depende de lo que uses...

Para evitarlo se usan memorias Flash que la FPGA lee automáticamente durante el arranque para descargar la configuración. Estas memorias pueden ser serie o paralelo, y la forma de conectarlas suele venir en el datasheet de la FPGA ya que tiene que ser por determinados pines, ya que la FPGA actúa como "master" para leer la memoria.

Lo normal sería que vía JTAG pudieras acceder a la FPGA y a la Flash, de este modo puedes configurar la Flash que al final es lo que vas a necesitar, pero también tienes acceso a la FPGA por si tienes que hacer debug o si tienes que hacer pruebas en volátil (que se programa mucho más rápido que la Flash). Para eso creo que bastaba con ir conectando el TDO de un dispositivo con el TDI del siguiente (TDI y TDO son señales del JTAG), TCLK común, y no recuerdo si algo más... (lo podría mirar si realmente lo necesitas)

Creo que se podría hacer algún invento para grabar la Flash sin tener que pasar por la FPGA, pero al final la conexión entre Flash y FPGA debe existir, salvo claro que tu circuito esté siempre alimentado, pues en cuanto le quites la alimentación se borra...

Y en cuanto al ByteBlaste, si usas una conexión JTAG común pues sí, te lo tendrás que armar, y no es nada difícil, yo me armé éste: http://www.sparkfun.com/datasheets/...rogrammer/Altera_Programmer-v10_Schematic.pdf Eso sí si te vas a dedicar mucho a usar FPGA's de Altera, te recomiendo que inviertas en un USB-Blaster, es lo mismo pero con conexión USB y mucho más rápido (programa mucho más rápido y permite hacer debug mejor). En Ebay valen alrededor de 30 euros y los byteblaster alrededor de 20... Para FPGA de Xilinx creo que no valen y tendrás que armarte el mismo programador pero "versión xilinx" (no tengo esquemático).

Saludos
 
Te paso el contador 0 al 9 en vhdl
Código:
entity CONTA is
	(mclk: in STD_LOGIC;
	clr: in STD_LOGIC;
	clk190: out STD_LOGIC;
	d: out STD_LOGIC_VECTOR (6 downto 0);
	an: out STD_LOGIC_VECTOR (3 downto 0));
end CONTA;

architecture Behavioral of CONTA is
signal q: STD_LOGIC_VECTOR (27 downto 0);
signal count: STD_LOGIC_VECTOR (3 downto 0);
signal clk48: STD_LOGIC;
signal a: STD_LOGIC_VECTOR (3 downto 0);

begin
--CONTA
process (mclk, clr)
begin
        if clr = '1' then
           q <= x "0000000";
        else if mclk' event and mclk = '0' then
        q <= q+1;
        end if;
end process;
clk48 <= q(26); --.745 hz
clk190 <= q(27); --.255hz

process (clk48, clr)
      begin
           if clr = '1' then
              count <= "0000";
           else if clk48' event and clk48 = '0' then
                  if count = "1001" then
	     count <= "0000";
	  else
	     count <= count + 1;
	  end if;
           end if;
end process;

a <= count;
an <= "0111";

process (a) begin
        case a is
	when "0000" => d <= "0000001";
	when "0001" => d <= "1001111";
	when "0010" => d <= "0010010";
	when "0011" => d <= "0000110";
	when "0100" => d <= "1001100";
	when "0101" => d <= "0100100";
	when "0110" => d <= "0100000";
	when "0111" => d <= "0001111";
	when "1000" => d <= "0000000";
	when "1001" => d <= "0000100";
	when others => d <= "1111001";
        end case;
end process;

end Behavioral;
 
ese venia en un libro que se llama el arte de programar
pero como sea te mando esto cuekalo

Código:
aaaaaaaaaaaaaaaaaaaaaa
--Decodificador
library ieee;
use ieee.std_logic_1164.all;
entity deco is
port (a: in std_logic_vector(3 downto 0)
        s: out std_logic_vector(6 downto 0))
end deco;
architecture deco1 of deco is
begin
process (a) begin
 case a is
    when "0000" => s <= "1111110";
    when "0001" => s <= "0110000";
    when "0010" => s <= "1101101";
    when "0011" => s <= "0101011";
    when "0100" => s <= "1011011";
    when "0101" => s <= "1011111";
    when "0110" => s <= "1110000";
    when "0111" => s <= "1110000";
    when "1000" => s <= "1111111";
    when "1001" => s <= "1111011";
    when others => s <= "1111110";
  end case;
 end process;
 end deco1;
 
Última edición por un moderador:
Hola a todos, me pregunto si alguien puede ayudarme con el diseño en VHDL de un PWM que se controle mediante una señal digital de 8 bits. El ancho de pulso para el pwm puede ser de 1ms a 8ms.
Si alguien tiene alguna idea de lo que tengo que hacer se los agradeceria mucho, ya que soy nuevo en esto de los FPGA.
 
Hola a todos, me pregunto si alguien puede ayudarme con el diseño en VHDL de un PWM que se controle mediante una señal digital de 8 bits. El ancho de pulso para el pwm puede ser de 1ms a 8ms.
Si alguien tiene alguna idea de lo que tengo que hacer se los agradeceria mucho, ya que soy nuevo en esto de los FPGA.

¿Qué velocidad de reloj (MHz) tiene tu FPGA, y qué periodo exactamente quieres que tenga el PWM? Son datos importantes para definir la frecuencia de funcionamiento del mismo.

En cuanto a la implementación, basta un contador de 8 bits y un comparador que compare el valor del contador con el de tu señal de control. Si el control es menor que el contador, la salida pwm vale 1, si no vale 0.

El siguiente código es un ejemplo, está incompleto (falta toda la entity) y además cuenta con el reloj de la FPGA, es decir si pones un reloj de 50 MHz y sabiendo que el contador desborda cada 256 ciclos, el periodo del pwm es de 50.000.000 / 256 = 195 kHz. Para adaptarlo a tu periodo basta que hagas un contador de más bits y luego compares sólo los 8 bits más significativos en vez de todos.

Código:
architecture beh of control_pwm is
signal cnt : std_logic_vector(7 downto 0);
begin
process (clk, nrst)
begin
if nrst = '0' then
    pwm_out <= '0';
    cnt <= (others => '0');
elsif clk'event and clk = '1' then
    cnt <= cnt + x"01";
    if (cnt > control_pwm) then
        pwm_out <= '0';
    else
        pwm_out <= '1';
    end if;
end if;
end process;
 
Última edición:
MUY BIEN QUE BUENO EL TEMA DE LOS FPGA AUN TENGO DUDAS AL RESPECTO
1RO CUALE EL LA DIFERENCIA ENTRE UN FPGA Y UN CPLD
2DO VEO QUE EL KIT DE ALTERA Ciclone II de Altera VIENE con los intergrados soldados totalmente, es decir si diseño un proyecto con este kit por ejemplo un frecuencimetro, descargo el firmware a el kit, luego tengo que usar toda la targeta para poder usar mi frecuencimetro. disculpen pero esta es mi duda o cual deberia ser el procedimiento

atentamente desde Peru 8)
 
Si te apañas con el inglés, aquí lo describen bastante bien: http://vlsifaq.blogspot.com/2007/11/what-is-difference-between-fpga-and_17.html

Si no, de la Wikipedia (pero más incompleto): http://es.wikipedia.org/wiki/FPGA

Tanto los CPLDs como las FPGAs contienen un gran número de elementos lógicos programables. Si medimos la densidad de los elementos lógicos programables en puertas lógicas equivalentes (número de puertas NAND equivalentes que podríamos programar en un dispositivo) podríamos decir que en un CPLD hallaríamos del orden de decenas de miles de puertas lógicas equivalentes y en una FPGA del orden de cientos de miles hasta millones de ellas. Aparte de las diferencias en densidad entre ambos tipos de dispositivos, la diferencia fundamental entre las FPGAs y los CPLDs es su arquitectura. La arquitectura de los CPLDs es más rígida y consiste en una o más sumas de productos programables cuyos resultados van a parar a un número reducido de biestables síncronos (también denominados flip-flops). La arquitectura de las FPGAs, por otro lado, se basa en un gran número de pequeños bloques utilizados para reproducir sencillas operaciones lógicas, que cuentan a su vez con biestables síncronos. La enorme libertad disponible en la interconexion de dichos bloques confiere a las FPGAs una gran flexibilidad.
Otra diferencia importante entre FPGAs y CPLDs es que en la mayoría de las FPGAs se pueden encontrar funciones de alto nivel (como sumadores y multiplicadores) embebidas en la propia matriz de interconexiones, así como bloques de memoria
Y basándome en mi experiencia, que tampoco es mucha


- Las FPGA tienen un mayor número de puertas que las CPLD, por lo cual pueden hacerse diseños más complejos.
- Las FPGA tienen bloques que una CPLD no suele tener (ejemplos: multiplicadores y bloques de RAM). En estos casos la CPLD puede ser capaz de implementar el circuito a base de puertas lógicas (por ejemplo si metes un multiplicador y la CPLD no tiene bloques multiplicadores, te lo construye a base de usar lógica, el problema entonces es que te comes rápidamente todo el espacio de la CPLD)
- Las CPLD usan una memoria no volátil (EEPROM, creo) para guardar su configuración. Las FPGA usan memoria volátil (RAM), por lo que al apagarlas se borra su configuración. Para configurar las FPGA se usa una memoria externa (normalmente Flash) que la propia FPGA descarga sobre su RAM al encender la alimentación.
- Por el motivo anterior, las CPLD arrancan inmediatamente. Sin embargo, las FPGA tienen un instante en que sus pines están en alta impedancia (lo que dura la configuración desde la memoria Flash). Puede haber circuitos en que el tiempo de arranque sea crítico, en ese caso habría que usar CPLD.


En cuanto a lo del kit de altera, no entiendo bien a qué te refieres... como bien dices, si haces un diseño y lo cargas en la tarjeta, luego tienes que usar toda la tarjeta. No puedes andar arrancando los integrados... :LOL:
 
Atrás
Arriba