# Curso para iniciarse con FPGAs



## yukardo

Saludos.

Me gustaria que este post sea de utilidad para todos los que quieran o comienzan a iniciarse en el mundo de los FPGAs.

La idea es iniciar con ejemplos sencillos y poco a poco ir subiendo de nivel, de manera de ir dominando poco a poco los perifericos que incluyen nuestras tarjetas de desarrollo.

Sin más espero contar con la colaboracion de las personas que conozcan sobre el tema.


----------



## joshdaniel

Recien acabo de empezar con este mundo aun no hice ningun proyecto con mi placa de desarrollo pero espero que las personas que saben de FPGAS nos aclaren ciertas dudas bueno sin mas que decir solo les dejo la direccion de mi blog en la cual puse unas cuantas fotos de mi placa de desarrollo SPARTAN 3AN.

http://josh-disenio.blogspot.com/

Joshdaniel


----------



## yukardo

Esta fue la tarjeta de desarrollo que me compré. Una Nexys2 de digilent.


----------



## Chico3001

Yo tengo una Ciclone II de Altera...... con tarjetas hijas para LCD de color y camara CCD... solo que nito darme tiempo para aprender a programar bien en VHDL... fui a unos cursos express donde me dieron 3 librotes de programacion un dia de estos los voy a escanear para poderlos compartir por este medio


----------



## yukardo

Aqui coloco un material que puede ser de utilidad. Algunos estan en español y otros en ingles pero pueden ser de gran ayuda.

Este manual es muy bueno de echo ya me lo lei.
http://links.wamba.com/noref.php?url=http://rapidshare.com/files/68374029/VHDL.pdf

Este es un libro muy bueno lo descargue hace poco por lo que no lo he leido.


aqui otros libros que consegui en la red, pueden resultar utiles en algun momento.

Vhdl Programming By Example - Douglas L Perry.pdf
http://w17.easy-share.com/1702941922.html

----------
VHDL Reference Manual
http://w17.easy-share.com/1702941830.html

------------
Prentice Hall - Verilog HDL - A Guide To Digital Design
http://w17.easy-share.com/1702941824.html

------------
1076 IEEE Standard VHDL Language Reference Manual
http://w17.easy-share.com/1702941825.html

------------
McGraw Hill - VHDL Programming by Example 4th Ed
http://w17.easy-share.com/1702941801.html

------------
MIT Press - Circuit Design with VHDL (2005)
http://w17.easy-share.com/1702941816.html

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

En caso de que se deseen bajar todos los libros:



Fichero de 41 MB. Por cierto, todos los archivos se abre con la contraseña torito


----------



## Chico3001

Muchas Gracias por la literatura... !... ya los ando descargando... solo que el ultimo link parece estar mal...


----------



## yukardo

El ultimo link contiene los otros libros desde el Douglas Perry en adelante, en caso de que no funcione bueno quedaria bajarlos uno por uno. No son muy pesados esos se bajan rapido.

Pronto subiere otros que tengo muy bueno en español.


----------



## yukardo

Aqui les adjunto un manual muy bueno.

Tengo otros manuales pero su tamaño es mayor a un MB por lo cual no los puedo subir.


----------



## yukardo

Para los que aun no han comprado su tarjeta de desarrollo aqui les dejo un par de links para que vean algunos modelos.

Estos son los modelos de la pagina de xilinx, tambien indican los distribuidores que las venden.
http://www.xilinx.com/products/boards/s3_sk_promo.htm

Estos son los modelos que ofrece Digilent.
http://www.digilentinc.com/Products/Catalog.cfm?NavTop=2&NavSub=400&Cat=Programmable Logic


----------



## Chico3001

No olvides a la competencia de Xilinx.... Altera... 

http://www.altera.com/products/devkits/kit-dev_platforms.jsp


----------



## yukardo

Cierto verdad que tenemos un compañero que tiene una tarjeta altera. Gracias por la acotacion

Aqui les dejo el link donde pueden descargar el Ise WebPACK y el ModelSim que son los programas necesarios para trabajar con el FPGA.

http://www.xilinx.com/support/download/index.htm

Aqui les dejo este manual del ISE WebPACK, es excelente explican todo paso a paso.

http://toolbox.xilinx.com/docsan/xilinx10/books/docs/qst/qst.pdf


----------



## Ferny

Hola a todos

En mi trabajo entre otras cosas me dedico a desarrollar y probar firmware para FPGA's, por lo que si tenéis alguna duda concreta os puedo intentar echar una mano 

Por otro lado he trabajado con FPGA's de Altera y de Xilinx, mi consejo si os queréis comprar una placa de evaluación para aprender su manejo es que os compréis una de Altera, más que nada (en mi opinión) porque el entorno de trabajo es mucho más amigable y sencillo de usar, además de ser más estable (el ISE de Xilinx se "cuelga" a veces...). En mi trabajo he usado la Cyclone II de altera y es una tarjeta muy sencilla de usar y mi preferida si alguna vez decido comprarla, además de ser de las más baratas... También he usado las tarjetas de evaluación Spartan 3A y Virtex II Pro de Xilinx y son unas tarjetas más completas que la de Altera, pero como ya dije su uso se complica algo más...

Quizá para desarrollar exclusivamente código VHDL la diferencia no sea tanta, porque al fin y al cabo lo "gordo" del proyecto es escribir el código, y para eso con el notepad de windows ya basta  Donde he visto grandes ventajas de Altera sobre Xilinx es en el desarrollo de esquemáticos (pueden llegar a ser muy útiles para unir varios bloques de código VHDL que interactúen entre sí) y en la herramienta de análisis lógico (chipscope de xilinx y signaltap de altera, que te permiten visualizar en el PC el valor de señales internas de la FPGA, para saber su estado exacto en cada momento). Me pareció que las de Altera son más intuitivas de usar...

Para Altera basta que se bajen el Quartus Web Edition (creo que es gratuito), lo único que no soporta los modelos más avanzados de FPGA pero la Cyclone II de la tarjeta de evaluación sí funciona (además el Web Edition viene en el CD adjunto a la tarjeta que compren, por lo que ni siquiera tienen que bajarlo). Tiene un simulador de código VHDL que si bien no es muy completo, sí permite hacer casi todas las pruebas que uno puede necesitar durante el desarrollo de código. Una herramienta de simulación mucho más avanzada es el modelsim, creo que incluso tiene una versión gratuita (con sus limitaciones).

Espero que esta información os sirva

Un saludo


----------



## yukardo

Gracias al amigo Ferny por ofrecerse a colaborar.


----------



## Chico3001

Creo que seria bueno postear ejemplos sencillos para irnos familiarizando con el uso de los kits... pero va a ser algo complejo por que en kits como los de altera me parece que las patitas se escogen en el compilador y no en el programa... saben VHDL soporta una forma de "estandarizar" los pines del chip?


----------



## Ferny

> saben VHDL soporta una forma de "estandarizar" los pines del chip?



La forma de asignar los pines en el proyecto VHDL es cogerte el esquemático de la tarjeta de evaluación y ver a qué pin de la FPGA llega la señal que te interesa... y es ese pin el que tienes que asignar. Es decir, la elección está restringida por el hardware. Lo que sí se puede hacer es sacar tus señales por el pin de la FPGA que quieras, pero claro otra cosa es que funcione (si sacas una señal de activación de un led por un pin que está conectado a un pulsador pues obviamente nada funciona...). Vamos esto es como con los PIC, si activas un led por el puerto A1 pues tendrás que conectar el led a ese pin... lo malo de las FPGA es que una vez hecho el circuito cambiar un pin puede no ser posible.

En cuanto a eso de "estandarizar" no entiendo muy bien a qué te refieres. El código VHDL no usa pines, usa señales, es decir al final tú vas a tener una "caja negra" con señales de entrada/salida. Después en el compilador es donde asignas cada señal a un pin físico de la FPGA. Además el código VHDL es portable, es decir realizas un diseño que encienda leds y ese mismo VHDL te sirve para cualquier FPGA, solo tienes que reasignar los pines cuando cambies de modelo de FPGA,


----------



## yukardo

Lo que dice Ferny es muy cierto.

Yo hice un programita sencillo y me funciono.

Espero subirlo pronto para que todos puedan empezar a usar sus tarjetas.


----------



## Chico3001

a lo que me refiero es que he hecho programas simples que corren en el Quartus II de Altera, defino las señales y dentro del Quartus hay un panel de control donde defino que pin va a recibir que señal, pero no se si el proceso sea el mismo para Xilinx u otro fabricante... Si el VHDL soporta ese tipo de inicializacion "in situ" podriamos intercambiar proyectos independientemente de la plataforma... un programa que haga para altera podria correr en un modulo Xilinx sin cambios o con cambios minimos...

Es esto posible?


----------



## Ferny

Chico3001 dijo:
			
		

> a lo que me refiero es que he hecho programas simples que corren en el Quartus II de Altera, defino las señales y dentro del Quartus hay un panel de control donde defino que pin va a recibir que señal, pero no se si el proceso sea el mismo para Xilinx u otro fabricante... Si el VHDL soporta ese tipo de inicializacion "in situ" podriamos intercambiar proyectos independientemente de la plataforma... un programa que haga para altera podria correr en un modulo Xilinx sin cambios o con cambios minimos...
> 
> Es esto posible?



Eso es así, las señales en xilinx se asignan también a los respectivos pines de la FPGA. Lo único que cambia es la forma de hacerlo, mientras en quartus generalmente se hace de forma gráfica (te sale el dibujito de la FPGA y vas marcando los pines) en xilinx suele hacerse definiéndolos mediante un fichero de texto (el denominado UCF), aunque creo que también tiene una forma gráfica (nunca la usé).

Recuerden... el VHDL es PORTABLE, hacen un diseño en altera y les vale para xilinx u otra FPGA. Lo que NO es portable son los esquemáticos, que como dije son muy útiles... pero tanto quartus como ise permiten exportar los esquemáticos a código VHDL, así que tampoco es un gran problema (aunque ambos tienen sus fallos al exportar, no lo hacen bien del todo, pero eso ya es otro tema...)

Otra cosa que hay que tener en cuenta es la frecuencia de reloj. Imaginen que hacen un módulo de retardo de 1s en una FPGA cuyo reloj son 50MHz. Si luego lo compilan para otra FPGA cuyo reloj son 40MHz, ahora el retardo pasa a ser de 1.25s, porque el ancho de ciclo cambia... Para estos casos utilicen contadores y constantes, de manera que el usuario sólo tenga que calcular y cambiar el valor de las constantes.


----------



## defilippo

hola yo tengo una duda importante: ¿que es exactamente un FPGA?
y otra mas: ¿que aplicaciones se les da?


----------



## Chico3001

Tomado de Wiki:



> Una FPGA (del inglés Field Programmable Gate Array) es un dispositivo semiconductor que contiene bloques de lógica cuya interconexión y funcionalidad se puede programar. La lógica programable puede reproducir desde funciones tan sencillas como las llevadas a cabo por una puerta lógica o un sistema combinacional hasta complejos sistemas en un chip



Osea que es un chip que solo tiene compuertas sin conectar en su interior, y por medio de un lenguaje de programacion defines como se van a conectar estas compuertas, asi que el rango de aplicaciones es practicamente ilimitado y va desde aplicaciones de logica combinacional, secuenciadores, expansores de puertos para microcontroladores y microprocesadores, hasta aplicaciones en las que le puedes programar un microprocesador en su interior con los todos los perifericos que necesites


----------



## yukardo

Aqui les dejo el primer programa que he echo y probado en mi FPGA.

Es muy sencillo la idea es familiarizarse con el ISEweb pack.



		Código:
	

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 primero is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
     SIGNAL      C : out  STD_LOGIC);
end primero;

architecture primero of primero is

begin
C <= A AND B; 

end primero;


----------



## yukardo

Pronto colocare otro de un poquito mas de nivel, si alguien quiere colocar alguno bienvenido sea lo importante es ir viendo como se hacen los programas.


----------



## yukardo

Aqui les dejo un video de la implementación de una compuerta AND usando FPGA.


----------



## Chico3001

donde? donde?


----------



## yukardo

jajajaj se me olvido pegar el link. aqui lo tienen.

YouTube - AND con FPGA


----------



## yukardo

Código:
	

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 o is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           C : out  STD_LOGIC);
end o;

architecture Behavioral of o is

begin
C<=A or B;

end Behavioral;


Aqui les dejo la implementacion de una compuerta OR.

y Aqui les dejo el video con la prueba.  Si funciona.

YouTube - OR con FPGA


----------



## yukardo

Alguien puede darme una idea de algun ejemplo que se pueda hacer que sea sencillo de programar.


----------



## Chico3001

por que no un aporte tipico para FPGA? un control de maquinaria secuencial... 

Te ayudaria... pero no se programar FPGAs   te digo que tambien ando aprendiendo


----------



## Ferny

Usando un par de botones de la tarjeta, hacer un contador ascendente/descendente que muestre el valor de las pulsaciones realizadas en los displays de 7 segmentos... Es decir con un botón aumentas el contador y con otro lo disminuyes...  

Yo lo veo como algo fácil y si necesitas un cable te lo puedo echar sin problemas, ahora bien este circuito ya implica el manejo de procesos, una señal de reloj y registro de valores, en definitiva es un circuito síncrono... no sé si ya has realizado alguno de ese tipo. Al final prácticamente todos los circuitos que implementes en una FPGA van a ser síncronos (aprox. un 99.999999%) con lo cual mejor acostumbrarse pronto 

Al final sale algo muy sencillo pero que se puede complicar cuanto uno quiera (filtro antirrebotes para evitar que cuente más de 1 cada vez que se pulse el botón, contador con desbordamiento o con posibilidad de representar números negativos, que cuente rápidamente si se deja un botón pulsado, etc.), pero de momento con lo que te propuse tienes para un rato jejeje

Cualquier cosa que necesites pídela por aquí...

Un saludo


----------



## Ferny

Un detalle sin mayor importancia, yo no llamaría "programa" al código VHDL que desarrollas para la FPGA... la verdad no sé muy bien como llamarlo, en mi trabajo se suele hablar del firmware, pero "programa" da a entender como que es software, y no es así, lo que haces con la FPGA al final es hardware...

Una gran diferencia a destacar es que el software es algo secuencial, es decir hace sólo una cosa en un determinado instante, aunque a tanta velocidad que a nosotros nos "parece" que hace varias cosas a la vez, pero a bajo nivel no es así. Por otro lado el hardware no es tan "simple", pues en la FPGA puedes hacer muchas cosas en el mismo instante y a mucha velocidad.

Por ponerte un ejemplo de lo que se puede hacer, en uno de mis proyectos tenemos un microprocesador implementado dentro de la FPGA, ese microprocesador a su vez corre un sistema operativo multitarea sobre el que a su vez corren varias aplicaciones. Este microprocesador se comunica dentro del VHDL con una serie de periféricos de entrada/salida de la tarjeta, tales como un convertidor analógico/digital, un controlador de red ethernet, un puerto RS232, relés, memoria DDR, etc..., que al final son manejados vía las aplicaciones software. El hardware (FPGA) puede "controlar" todo eso a la vez (puede controlar el ADC a la vez que atiende el puerto RS232 y a la vez que descarga un dato de la memoria DDR), pero al final la aplicación software es la que va procesando los resultados obtenidos de uno en uno...


----------



## yukardo

Bueno voy a empezar por el que dijo chico3001 primero, y luego comienzo con los que me sugirió ferny.

Espero que me echen una mano.


----------



## rachy

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.


----------



## yukardo

Aqui les dejo un simple multiplexor en el que comienzo a ultizar el comando process.




		Código:
	

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 Mux157 is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           Y : out  STD_LOGIC;
           selec : in  STD_LOGIC);
end Mux157;

architecture Multiplexor of Mux157 is

begin
process(A,B,selec)
BEGIN
	if selec='0' then
			Y<=A;
			else
			Y<=B;
			end if;
end process;

end Multiplexor;


----------



## jamjose130780

Qué tal soy nuevo en el foro y también en el lenguaje VHDL tengo un poco de conocimiento y bueno les dejo también un Mux 2x1 de tres bits con un convertidor para visualizar el resultado



		Código:
	

-- MUX2A1W3

entity MUX2A1W3 is
	port
	(
		A:	in bit_vector(2 downto 0);
		B:	in bit_Vector(2 downto 0);
		Sel:	in bit;
		Displayut bit_vector(6 downto 0)
	);
end entity MUX2A1W3;

architecture ARCH_MUX2A1W3 of MUX2A1W3 is

	signal Alambre: bit_vector(2 downto 0);
	
begin

	MUX:
	Alambre <=	A when Sel='0' else B;
	
	CONVERTIDOR:
	with Alambre select
	Display	<=	"1101101" when "001",	-- 1
			"0100010" when "010",	-- 2
			"0100100" when "011",	-- 3
			"1000101" when "100",	-- 4
			"0010100" when "101",	-- 5
			"0010000" when "110",	-- 6
			"0101101" when "111",	-- 7
			"0001000" when others;	-- 0

end architecture ARCH_MUX2A1W3;


----------



## jamjose130780

También necesito que me hechen una mano; tengo que hacer un proyecto para la Uni aqui va pero no tengo idea utiliza FF


----------



## Elvic

saludos 

Pues aunque se muy poquito sobre VHDL, voy a seguir el desarrollo de este tema para aprender mas;
pues me gustaría saber sobre los códigos y la manera de estructurarlos, y pues aunque me gustaría implementar en la tarjeta de desarrollo, como lo muestras nuestro amigo yukardo, no lo puedo hacer pues no tengo una tarjeta 
Tratare de que  eso no sea un problema y pondré una captura de pantalla de la simulacion para mostrar su funcionamiento.

bien aquí les dejo mi primer código  

*Describir las compuertas lógicas en VHDL * 


		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity Compuertas is
	 port(
		 Ent_x : in STD_LOGIC; -- entradas
		 Ent_y : in STD_LOGIC;
		 Sal_And : out STD_LOGIC; -- salidas para las distintas compuertas
		 Sal_Xor : out STD_LOGIC;
		 Sal_Or : out STD_LOGIC;
		 Sal_Nand : out STD_LOGIC;
		 Sal_Nor : out STD_LOGIC;
		 Sal_Xnor : out STD_LOGIC;
		 Not_y : out STD_LOGIC;  -- invertir señal de entrada y
		 Not_x ut STD_LOGIC
	     );
end Compuertas;

architecture Arreglo of Compuertas is
begin

Sal_And    <= Ent_x and Ent_y;
Sal_Xor	 <= Ent_x xor Ent_y;
Sal_Or	 <= Ent_x or Ent_y;
Sal_Nand  <= Ent_x nand Ent_y;
Sal_Nor	 <= Ent_x nor Ent_y;
Sal_Xnor   <= Ent_x Xnor Ent_y;
Not_y	 <= not Ent_y;
Not_x	 <=	not Ent_x;

end Arreglo;


código compilado en active HDL student edition


----------



## Elvic

Continuando con los codigos

Vamos a describir en Vhdl el  circuito de la imagen.


y el código VHDL es el siguiente con las señales intermedias etiquetadas como T1,T2,T3.


		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity Circuito1 is	 
	port(
		A,B,C : in std_logic;
		X ut Std_logic 
		);
end Circuito1;

architecture Arreglo of Circuito1 is
signal T1,T2,T3 : std_logic ;
begin
	T1<= A or B or C;
	T2<= A and B and(not C);
	T3 <= T1 xor T2;
	X <=not T3;
end Arreglo;


----------



## yukardo

Estan muy buenos tus aportes elvic. Gracias.

Poco a poco iremos colocando programas de mas nivel.


----------



## Elvic

bien pues aquí pongo una simplificación del código anterior; con tan solo cambiar la arquitectura



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity Circuito1 is   
   port(
      A,B,C : in std_logic;
      X ut Std_logic
      );
end Circuito1;

architecture Arreglo of Circuito1 is
begin
X <= not((A or B or C ) Xor (A and B and (not C)));
end Arreglo;


sigan aportando


----------



## Elvic

en este código se muestra el uso de vectores; es decir de  el

                                                  Msb       Lsb
std_logic_vector ( _ to _ );  --> [A0, A1, A2]

ó
                                                      Msb       Lsb
std_logic_vector( _ downto_); --> [A2, A1, A0]

la diferencia entre uno y otro es la forma de tomar el bit mas significativo. 

sirven para declara varias señales ya sean de entrada o salida simplificando el uso de identificadores; mas abajao el circuito descrito y enseguida su código vhdl 



		Código:
	

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity Tres_entradas is
	 port(
	 	A : in STD_LOGIC_VECTOR(2 downto 0);
	 	B : in STD_LOGIC_VECTOR(2 downto 0);
		C : in STD_LOGIC_VECTOR(1 downto 0);
		Q : out STD_LOGIC;
		Z : out STD_LOGIC;
		Y : out STD_LOGIC
	     );
end Tres_entradas;

architecture compuertas of Tres_entradas  is
begin
                  Q	<= A(2) and A(1) and A(0);
                  Z   <= B(2)  or B(1)  or B(0); 
                  Y   <= C(1) xor C(0);
end compuertas;


----------



## jamjose130780

PUES AQUI REPORTANDO RESULTADOS DE MIS PROYECTOS QUE GRACIAS A "ELVIC" Y A "YUCARDO" PUDE RESOLVER.
EL PRIMERO ES UN REGISTRO CONDESPLAZAMIENTO A LA IZQUIERDA O A LA DERECHA.



		Código:
	

--DISENO DE UN REGISTRO CON DESPLAZAMIENTO
ENTITY REG_DESP IS
PORT(
	DIN_A, DIN_B: IN BIT_VECTOR(3 DOWNTO 0); --ENTRADAS DE REGISTRO	
	IN_SERIAL: IN BIT; --ENTRADA DE BIT POR DESPLAZAMIENTO
	CHARGE: IN BIT; --CARGADOR DE DATOS EN LOS REGISTROS
	SHIFT_LR: IN BIT; --CONTROL DE DESPLAZAMIENTO
	CLK: IN BIT; --SEÑAL DE RELOJ
	QOUT_A, QOUT_B: OUT BIT_VECTOR(3 DOWNTO 0) --SALIDA DE REGISTROS	
	);
END ENTITY REG_DESP;

ARCHITECTURE ARC OF REG_DESP IS

	SIGNAL REG_B, REG_A: BIT_VECTOR(3 DOWNTO 0);
	BEGIN
	REG: PROCESS(CLK)
	BEGIN
		IF CLK'EVENT AND CLK='1' THEN
			IF CHARGE='1' THEN REG_B <= DIN_A;
					   REG_A <= DIN_B;
				IF SHIFT_LR='0' THEN
					REG_A(0) <= IN_SERIAL;
					REG_A(1) <= REG_A(0);
					REG_A(2) <= REG_A(1);
					REG_A(3) <= REG_A(2);
					REG_B(0) <= REG_A(3);
					REG_B(1) <= REG_B(0);
					REG_B(2) <= REG_B(1);
					REG_B(3) <= REG_B(2);
				ELSE 
					REG_B(3) <= IN_SERIAL;
					REG_B(2) <= REG_B(3);
					REG_B(1) <= REG_B(2);
					REG_B(0) <= REG_B(1);
					REG_A(3) <= REG_B(0);
					REG_A(2) <= REG_A(3);
					REG_A(1) <= REG_A(2);
					REG_A(0) <= REG_A(1);			
				END IF;
			END IF;
	END IF;
	END PROCESS REG;
	QOUT_A <= REG_B;
	QOUT_B <= REG_A;
END ARCHITECTURE ARC;


EL SEGUNDO ES UN REGISTRO CON DESPLAZAMIENTO ROTACIONAL


		Código:
	

--DISENO DE UN REGISTRO ROTACIONAL
ENTITY REG_DESP IS
PORT(
	DIN_A, DIN_B: IN BIT_VECTOR(3 DOWNTO 0); --ENTRADAS DE REGISTRO	
	CHARGE: IN BIT; --CARGADOR DE DATOS EN LOS REGISTROS
	SHIFT_LR: IN BIT; --CONTROL DE DESPLAZAMIENTO
	CLK: IN BIT; --SEÑAL DE RELOJ
	QOUT_A, QOUT_B: OUT BIT_VECTOR(3 DOWNTO 0) --SALIDA DE REGISTROS	
	);
END ENTITY REG_DESP;

ARCHITECTURE ARC OF REG_DESP IS

	SIGNAL REG_B, REG_A: BIT_VECTOR(3 DOWNTO 0);
	
BEGIN
	REG: PROCESS(CLK)
	BEGIN
		IF CLK'EVENT AND CLK='1' THEN
			IF CHARGE='1' THEN REG_B <= DIN_A;
					   REG_A <= DIN_B;
			ELSE 
				IF SHIFT_LR='0' THEN
					REG_A(0) <= REG_B(3);
					REG_A(1) <= REG_A(0);
					REG_A(2) <= REG_A(1);
					REG_A(3) <= REG_A(2);
					REG_B(0) <= REG_A(3);
					REG_B(1) <= REG_B(0);
					REG_B(2) <= REG_B(1);
					REG_B(3) <= REG_B(2);
				ELSE 
					REG_B(3) <= REG_A(0);
					REG_B(2) <= REG_B(3);
					REG_B(1) <= REG_B(2);
					REG_B(0) <= REG_B(1);
					REG_A(3) <= REG_B(0);
					REG_A(2) <= REG_A(3);
					REG_A(1) <= REG_A(2);
					REG_A(0) <= REG_A(1);					
				END IF;
			END IF;
		END IF;
	END PROCESS REG;	
	QOUT_A <= REG_B;
	QOUT_B <= REG_A; 
END ARCHITECTURE ARC;

POR ULTIMO UNA MAQUINA DE 8 ESTADOS O CONTADOR INSTANCIADA CON UNA MEMORIA ROM 


		Código:
	

--DISENAR UN CONTADOR HEXADECIMAL ASCENDENTE-DESCENDENTE CON RESET Y CONTADOR DE NUMEROS PRIMOS
ENTITY CNT_8 IS
PORT(
	CLK: IN BIT; --FLANCOS DE SUBIDA
	X, Y, Z: IN BIT;
	RESET: IN BIT; --PONE LA SALIDA EN 0's.
	DISPLAY: OUT BIT_VECTOR(6 DOWNTO 0); --SALIDA HEXADECIMAL
	BAR_LED: OUT BIT_VECTOR(2 DOWNTO 0) --SALIDA AL BAR LED
	);
END ENTITY CNT_8;
------------------------------------
------------------------------------

ARCHITECTURE ARC_CNT OF CNT_8 IS

	COMPONENT ROM_MXN IS
		PORT(
			M: IN BIT_VECTOR(2 DOWNTO 0); --ENTRADA A LA MEMORIA ROM
			N: OUT BIT_VECTOR(6 DOWNTO 0) --SALIDA DE MEMORIA ROM
			);
	END COMPONENT ROM_MXN;

    	SIGNAL HEX: BIT_VECTOR(2 DOWNTO 0);
	TYPE ESTADOS IS (A, B, C, D, E, F, G, H);
	SIGNAL EP, ES: ESTADOS;
	SIGNAL ADRESS: BIT_VECTOR(2 DOWNTO 0);

	
BEGIN

	--*************PARTE SINCRONA****************
	SINC: PROCESS(CLK)
	BEGIN
		IF CLK'EVENT AND CLK='1' THEN
			IF RESET='1' THEN
				EP <= A;
			ELSE
				EP <= ES;
			END IF;
		END IF;
	END PROCESS SINC;
	--*********FIN DE LA PARTE SINCRONA**********
	
	--***********PARTE COMBINACIONAL*************
	COMB: PROCESS(EP, X, Y, Z)
	BEGIN 
		CASE EP IS
		
		WHEN A => ADRESS <="000";
			IF X='0' THEN ES <= A;
			ELSIF X='1' AND Y='0' THEN ES <= B;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= H;
			ELSE ES <= B;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN B => ADRESS <="001";
			IF X='0' THEN ES <= B;
			ELSIF X='1' AND Y='0' THEN ES <= C;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= A;
			ELSE ES <= C;
			--X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN C => ADRESS <="010";
			IF X='0' THEN ES <= C;
			ELSIF X='1' AND Y='0' THEN ES <= D;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= B;
			ELSE ES <= D;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN D => ADRESS <="011";
			IF X='0' THEN ES <= D;
			ELSIF X='1' AND Y='0' THEN ES <= E;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= C;
			ELSE ES <= F;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN E => ADRESS <="100";
			IF X='0' THEN ES <= E;
			ELSIF X='1' AND Y='0' THEN ES <= F;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= D;
			ELSE ES <= B;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN F => ADRESS <="101";
			IF X='0' THEN ES <= F;
			ELSIF X='1' AND Y='0' THEN ES <= G;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= E;
			ELSE ES <= H;
			--X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN G => ADRESS <="110";
			IF X='0' THEN ES <= G;
			ELSIF X='1' AND Y='0' THEN ES <= H;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= F;
			ELSE ES <= B;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		WHEN H => ADRESS <="111";
			IF X='0' THEN ES <= H;
			ELSIF X='1' AND Y='0' THEN ES <= A;
			ELSIF X='1' AND Y='1' AND Z='0' THEN ES <= G;
			ELSE ES <= B;
			-- X='1' AND Y='1' AND Z='1' THEN 
			END IF;
		END CASE;
	END PROCESS COMB;
	--*******FIN DE LA PARTE COMBINACIONAL*******
	ROM: ROM_MXN 
		PORT MAP(
			M => ADRESS,
			N => DISPLAY
			);
	BAR_LED <= ADRESS;
	--******************************************
	
END ARCHITECTURE ARC_CNT;



	--***************MEMORIA ROM*****************
ENTITY ROM_MXN IS
PORT(
	M: IN BIT_VECTOR(2 DOWNTO 0); --ENTRADA A LA MEMORIA ROM
	N: OUT BIT_VECTOR(6 DOWNTO 0) --SALIDA DE MEMORIA ROM
	);
END ENTITY ROM_MXN;

ARCHITECTURE ARC OF ROM_MXN IS
BEGIN
	ROM: PROCESS(M)
	BEGIN
		CASE M IS
			WHEN "000" => N <= "0000001";	--A
			WHEN "001" => N <= "1010000";   --b
			WHEN "010" => N <= "0011010";	--C
			WHEN "011" => N <= "1100000";	--d
			WHEN "100" => N <= "0010010";	--E
			WHEN "101" => N <= "0010011";	--F
			WHEN "110" => N <= "0000100";	--g
			WHEN "111" => N <= "1000001";	--H
			WHEN OTHERS => N <= (OTHERS=>'0');
		END CASE;
	END PROCESS ROM;
END ARCHITECTURE ARC;


----------



## kain589

Estoy siguiendo el tema por encima, porqué me resultan muy interesantes las fpga's, una lastima que los dias no tengan mas horas y no tener mas recursos economicos. ¿hay algun programa que sirva para programar y simular las fpga's? Lo pregunto de cara a poder hacer pruebas sin tener ninguna fpga. Tambien he visto las placas aunque son muy caras.


----------



## Ferny

Puedes usar el Quartus II Web Edition que es gratuito. Tiene un simulador incorporado que aunque no es gran cosa sí te permite simular bastante bien el código.


----------



## yukardo

Bueno te digo tu puedes descargar el ISEWeb Pack 10.1 gratis desde la pagina de xilinx.

Yo lo tengo instalado. Lo unico que tienes es que registrarte.

El otro problema es que se instala on line. Tienes que dejar tu pc conectada mientras se instalan los aprox. 5 Gb.


----------



## yukardo

Para implementar una máquina de Moore, se
muestra el ejemplo de un tren de lavado de carros
de la figura 9.

Para controlar el lavado se necesita:
- Tres motores:
- Un motor principal que mueve el tren a lo
largo del carril con dos señales de actuación
MP1 y MP2. Cuando se activa MP1 el tren
se mueve de izquierda a derecha. Cuando
se activa MP2 el tren se mueve de derecha a
izquierda.
- Un motor para los cepillos, con una única
señal de actuación MC.
- Un motor para el ventilador, con una única
señal de actuación MV.
- Una electro-válvula XV que permita la salida del
liquido del lavadero hacia el carro.
- Dos sensores fin de carrera S1 y S2 que detectan
la llegada del tren a los extremos del carril.
- Un sensor S3 que detecta la presencia del carro.
- Dos pulsadores M y P de marcha y paro
respectivamente.

Con estas variables se puede determinar las entradas
y salidas de nuestro diseño, así pues:

Las salidas del sistema son:
 Mi = Motor que lleva el tren a la izquierda del
carril.
 Md = Motor que lleva el tren a la derecha del
carril.
 Mc = Motor de giro de los cepillos.
 Mv = Motor de giro de los ventiladores.
 Xv = Accionamiento de la salida de jabón.

Se intuye que en el funcionamiento del sistema, todos
los carros idealmente pasan por un mismo proceso,
por lo que cada una de las etapas del lavado será un
estado del sistema, se tendrá los siguientes estados:

- Estado 1: Inicialmente el sistema se encuentra en
el extremo izquierdo, con el sensor fin de carrera
izquierdo activado (S1 = 1) ya que ésta es la posición donde reposa el tren del lavadero. El sistema
se pone en marcha al activarse el pulsador (M
= 1) siempre y cuando haya un carro dentro del
lavado automático, es decir el sensor que indica
la presencia de un carro debajo del tren del lavadero
está activo (S3 = 1).

- Estado 2: Una vez accionado M, el tren del lavadero
comenzará a funcionar desplazándose hacia
la derecha (Md = 1), accionando el motor de los
cepillos (Mc = 1) y el jabón liquido (Xv = 1) hasta
llegar al final del carril derecho, activándose
(S2 = 1). En este momento se pasa al siguiente
estado.

- Estado 3: En este estado se regresa el tren del
lavadero hacia el carril derecho (Mi = 1) y se
mantienen los cepillos y la válvula de jabón encendidos
(Mc = 1 y Xv = 1). Cuando se llega al
final de carril izquierdo se activa (S1 = 1) y se
pasa al siguiente estado

- Estado 4: En este estado se regresa el tren del
lavadero nuevamente hacia el carril derecho (Md
= 1) con el ventilador encendido para secarlo (Mv
= 1), hasta llegar nuevamente al fin del carril derecho,
momento en que se vuelve a activar (S2 =
1) y se pasa al siguiente estado.

- Estado 5: Se regresa nuevamente el tren del lavadero
hacia el carril izquierdo (Mi = 1) manteniendo
el ventilador encendido (Mv = 1). Cuando
se llega a la posición final del carril izquierdo
(S1 = 1) se pasa al estado inicial quedando el trabajo
terminado.

- Estado 6: Cuando se acciona el pulsador de parada
(P = 1) en cualquier estado, el tren del lavadero
se dirige hacia el carril izquierdo (Mi = 1) y
se apagan todos los actuadores (Mc = Mv = Xv
= 0). Cuando éste llega al final del carril izquierdo,
se pasa al estado inicial.

Este ejercicio esta en una de las guias que yo puse para descargar.

Luego les publico el codigo que hice.


----------



## Elvic

saludos

pues bien, esperemos que se animen en seguir aportando ideas o códigos para implementar sobre un FPGA, por mi parte aun continuo en lo básico, así que no he podido aportar nada nuevo ó interesante, pero espero  que no dejen caer el tema y continúen con sus aportaciones.


----------



## yukardo

Aqui les dejo el codigo del problema del autolavado. Espero que les sea de utilidad.

Le adicione algo para que mostrara en display 7 segmento el numero del estado.



		Código:
	

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 Lavado is
    Port ( S1 : in  STD_LOGIC;
           S2 : in  STD_LOGIC;
           S3 : in  STD_LOGIC;
           M : in  STD_LOGIC;
           P : in  STD_LOGIC;
           Mi : out  STD_LOGIC;
           Md : out  STD_LOGIC;
           Mc : out  STD_LOGIC;
           Mv : out  STD_LOGIC;
           Xv : out  STD_LOGIC;
			  en : out STD_LOGIC;
			  reset : in  STD_LOGIC;
           clk : in  STD_LOGIC;
			  display: out BIT_VECTOR (6 DOWNTO 0));
end Lavado;

architecture Moore of Lavado is

TYPE maq_estados IS (esta1, esta2, esta3, esta4, esta5, esta6); 

signal est, prox_est: maq_estados;

Begin

A: process(m,p,s1,s2,s3)
	begin 
	CASE est IS
	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<=esta3;
	else
		prox_est<=esta2;
	end if;
	when esta3 =>
	if p='1' then
		prox_est<=esta6;
	elsif s1='1' then
		prox_est<=esta4;
	else
		prox_est<=esta3;
	end if;
	when esta4 =>
	if p='1' then
		prox_est<=esta6;
	elsif s2='1' then
		prox_est<=esta5;
	else
		prox_est<=esta4;
	end if;
	when esta5 =>
	if p='1' then
		prox_est<=esta6;
	elsif s1='1' then
		prox_est<=esta1;
	else
		prox_est<=esta5;
	end if;
	when esta6 =>
	if s1='1' then
		prox_est<=esta1;
	else
		prox_est<=esta6;
	end if;
	when others =>
		prox_est<=esta1;
end CASE;
end process;
B: process (reset,clk)
begin
	if reset ='1' then
		est<=esta1;
	elsif (clk'EVENT AND clk='1') then
		est<=prox_est;
	end if;
	end process;
md<='1' when(est=esta2 or est=esta4)else '0';
mi<='1' when(est=esta3 or est=esta5 or est=esta6)else '0';
mc<='1' when(est=esta2 or est=esta3)else '0';
mv<='1' when(est=esta4 or est=esta5)else '0';
xv<='1' when(est=esta2 or est=esta3)else '0';

en<='0';
C: process
begin

CASE est IS
when esta1 => display<="1001111";
when esta2 => display<="0010010";
when esta3 => display<="0000110"; 
when esta4 => display<="1001100";			  	
when esta5 => display<="0100100";
when esta6 => display<="0100000";			  	
when others => display<="0000001"; 
end case;
end process;			
end Moore;


Pronto agregare un video con las pruebas


----------



## Ferny

Hola

Les dejo con abundantes comentarios explicativos un ejemplo que genera el efecto de las luces del coche fantástico. Simplemente necesitan asignar los pines de la señal de reloj, reset (activo a nivel bajo, o sea un '0' es reset y un '1' es funcionamiento normal), y 8 salidas de leds. Si tienen un número distinto de leds en la tarjeta, creo que es sencillo de ver las modificaciones a realizar...

Para cualquier duda sobre este u otro ejemplo den un toque por aquí 



		Código:
	

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

entity efecto_leds is
    port (
        clka : in std_logic;                        -- Reloj 50MHz
        res  : in std_logic;                        -- Reset activo a nivel bajo
        led  : out std_logic_vector(7 downto 0)     -- LEDs
    );
 
end efecto_leds;
  
architecture rtl of efecto_leds is

-- Contador de tiempo. La idea es ir contando ciclos de reloj hasta llegar a un
-- número determinado, con el objetivo de medir tiempos. Mi placa tiene un reloj
-- de 50MHz, lo que equivale a un periodo de ciclo de 20 nanosegundos. Como quiero
-- medir tiempos de 100 milisegundos, la cantidad de ciclos que debo contar es de
-- 100*10^(-3) / 20*10^(-9) = 5.000.000
-- Por tanto el valor de la constante que indica cuándo se ha alcanzado ese número
-- debería ser igual a 5.000.000, pero he puesto 4.999.999, esto es porque el valor
-- "cero" del contador también vale, luego hay que restar 1 al número calculado si
-- quieren que el tiempo sea exaco (en este ejemplo el error sería sólo de 20ns,
-- pero según qué caso se podría cometer un error más gordo, sólo aviso para que
-- las cosas se hagan bien desde un principio...)
signal   contador :  STD_LOGIC_VECTOR(31 downto 0);
-- La función conv_std_logic_vector convierte un entero a un std_logic_vector del
-- número de bits que se le indique en el segundo argumento (32 en este caso)
constant CIEN_MS  :  STD_LOGIC_VECTOR(31 downto 0) := conv_std_logic_vector(4999999, 32);
-- Esta señal dará un pulso a '1' de duración 1 ciclo de reloj cada 100ms
signal   prsc     :  STD_LOGIC;
-- Dirección de los leds, a derecha o izquierda (según se mire la placa, claro)
signal   dir      :  STD_LOGIC;
-- Señal para uso interno. Esta señal se usa porque dentro del código VHDL se va a
-- "leer" el valor de los leds para saber cuál hay que encender según el estado en
-- que estén. Si tratan de leer una señal de tipo out, verán un lindo mensaje de
-- error. Por eso esta señal es necesaria, porque las señales "internas" sí se leen
-- sin problemas
signal   leds_i   :  STD_LOGIC_VECTOR(7 downto 0);

-- Bien, empecemos
begin

-- Se asigna en todo momento el valor de la señal interna de estado de los leds a
-- la salida de los 8 leds. Fíjense que es asíncrono, no depende de ningún reloj,
-- aunque la señal leds_i sí está dentro de un proceso síncrono
led <= leds_i;

-- Proceso que genera el prescaler, señal que se pone a '1' durante 1 ciclo de reloj
-- cada 100ms
PRESCALER : process(clka, res)
begin
    if (res = '0') then
        contador                       <= (others => '0');
        prsc                           <= '0';
    elsif rising_edge(clka) then
        if (contador = CIEN_MS) then   -- Si llega al final, pone el contador a cero y activa el prescaler
            prsc                       <= '1';
            contador                   <= (others => '0');
        else
            prsc                       <= '0';
            contador                   <= contador + x"00000001";
        end if;
    end if;    
end process;

-- Proceso que genera el efecto de los leds
LEDS_OUT : process(clka, res)
begin
    if (res = '0') then
        leds_i                         <= (0 => '1', others => '0'); -- El led de la derecha se inicializa encendido (¡es necesario inicializar un led encendido!)
        dir                            <= '0';
    elsif rising_edge(clka) then
        if (prsc = '1') then                                         -- Si llega el prescaler
            if (dir = '0') then                                      -- Si están moviéndose hacia la izquierda
                if (leds_i(7) = '1') then                            -- Y está activo el led de más a la izquierda
                    dir                <= '1';                       -- Se cambia la dirección
                    leds_i             <= "01000000";                -- Y se activa el led de su derecha
                else                                                 -- Si no está activo el led de más a la iquierda
                    leds_i             <= leds_i(6 downto 0) & '0';  -- Se desplazan todos una posición a la izquierda
                end if;
            else                                                     -- Si están moviéndose hacia la derecha
                if (leds_i(0) = '1') then                            -- Y está activo el led de más a la derecha
                    dir                <= '0';                       -- Se cambia la dirección
                    leds_i             <= "00000010";                -- Y se activa el led de su izquierda
                else                                                 -- Si no está activo el led de más a la derecha
                    leds_i             <= '0' & leds_i(7 downto 1);  -- Se desplazan todos una posición a la izquierda
                end if;
            end if;
        end if;
    end if;    
end process;

-- Y fin
end rtl;


----------



## cristian_elect

Para hacer varios pwm  en fpga se puede. Para controlar varios led rgb.


----------



## Ferny

cristian_elect dijo:
			
		

> Para hacer varios pwm  en fpga se puede. Para controlar varios led rgb.



Claro que se puede, digamos que quitando el pin de reset y el de reloj, podrías sacar (más o menos) tantos pwm como pines tenga la FPGA... cada uno con una frecuencia y un ciclo de trabajo distintos  Además un PWM en FPGA no es nada complicado de programar (un contador que establezca la frecuencia y un comparador para el ciclo de trabajo)


----------



## jamjose130780

BIEN CONTINUANDO EN EL FORO LES DEJO UNOS PROYECTOS SIMPLES QUE REALICE EN MI UNI... 

ESPERO Q A MAS DE UNO LES SIRVA COMO EJEMPLO.



		Código:
	

--CIRCUITO ARITMETICO: MULTIPLICADOR DE 4 X 3 BITS MEDIANTE HARDWARE


ENTITY MUX IS
	PORT
	(
	MULTIPLICANDO: IN BIT_VECTOR(3 DOWNTO 0);  --MULTIPLICANDO N BITS
	MULTIPLICADOR: IN BIT_VECTOR(3 DOWNTO 0);  --MULTIPLICADOR DE M BITS
	PROD: OUT BIT_VECTOR(7 DOWNTO 0)  --DE M+N BITS
	);
END ENTITY MUX;

ARCHITECTURE ARQ OF MUX IS

	COMPONENT SC4B IS
	PORT
		(
		AIN, BIN: IN BIT_VECTOR(3 DOWNTO 0);
		CIN: IN BIT;
		SUMA: OUT BIT_VECTOR(3 DOWNTO 0);
		COUT: OUT BIT
		);
	END COMPONENT SC4B;

----SENALES NECESARIAS PARA EL CIRCUITO ARITMETICO----

	SIGNAL AL: BIT_VECTOR(3 DOWNTO 0);
	SIGNAL PP0, PP1, PP2, PP3: BIT_VECTOR(3 DOWNTO 0); --PARA PRODUCTOS PARCIALES
	SIGNAL CERO: BIT; 
	SIGNAL XY: BIT_VECTOR(4 DOWNTO 0);
	SIGNAL CABLE: BIT_VECTOR(4 DOWNTO 0);

BEGIN
---------------------------------------------------------------------------------------
	CERO<='0';
---------------------------------------------------------------------------------------
	
	-- PRODUCTOS PARCIALES
	PP0<=MULTIPLICANDO WHEN MULTIPLICADOR(0)='1' ELSE "0000";
	PP1<=MULTIPLICANDO WHEN MULTIPLICADOR(1)='1' ELSE "0000";
	PP2<=MULTIPLICANDO WHEN MULTIPLICADOR(2)='1' ELSE "0000";
	PP3<=MULTIPLICANDO WHEN MULTIPLICADOR(3)='1' ELSE "0000";
	
---------------------------------------------------------------------------------------
	--M - 1 SUMADORES DE N BITS CADA UNO
	--AQUI UTILIZAMOS LOS SUMADORES COMPLETOS DE 4 BITS
	
	PROD(0)<=PP0(0);
	AL(3)<='0'; 
	AL(2)<=PP0(3); 
	AL(1)<=PP0(2); 
	AL(0)<=PP0(1);
	
	--ES LO MISMO QUE
	--AL<='0' &PP0(3 DOWNTO 0);
	---------------------------------------
	---------------------------------------
	---------------------------------------
	SUMADOR1: SC4B PORT MAP(
		AIN=>AL, BIN=>PP1, CIN=>CERO,
		SUMA=>XY(3 DOWNTO 0), COUT=>XY(4));
		
	---------------------------------------
	PROD(1)<=XY(0);
	---------------------------------------
	---------------------------------------
	SUMADOR2: SC4B PORT MAP(
		AIN=>CABLE(4 DOWNTO 1), BIN=>PP2, CIN=>CERO,
		SUMA=> CABLE(3 DOWNTO 0), COUT=>CABLE(4));
	
	---------------------------------------
	---------------------------------------
        PROD(2)<=CABLE(0);
	---------------------------------------------------------
	SUMADOR3: SC4B PORT MAP	(
		AIN=>CABLE(4 DOWNTO 1),BIN=>PP3,CIN=>CERO,
		SUMA=> PROD(6 DOWNTO 3),COUT=>PROD(7));

END ARCHITECTURE ARQ;

-----------------------------------------------------------------
-----------------------------------------------------------------
-----------------SUMADOR COMPLETO DE 1 BIT-----------------------

ENTITY SC1B IS
	PORT
	(
	X,Y,CIN: IN BIT;
	S,COUT: OUT BIT
	);
END ENTITY SC1B;

ARCHITECTURE ARQ OF SC1B IS

BEGIN
	S<= X XOR Y XOR CIN;
	COUT<= (X AND Y) OR (X AND CIN) OR (Y AND CIN);
END ARCHITECTURE ARQ;

-----------------------------------------------------------------
-----------------------------------------------------------------
-----------------SUMADOR COMPLETO DE 4 BITS----------------------

ENTITY SC4B IS
	PORT
	(
	AIN,BIN: IN BIT_VECTOR(3 DOWNTO 0);
	CIN: IN BIT;
	SUMA: OUT BIT_VECTOR(3 DOWNTO 0);
	COUT: OUT BIT
	);
END ENTITY SC4B;

ARCHITECTURE ARQ OF SC4B IS
	COMPONENT SC1B IS
		PORT
		(
		X,Y,CIN:IN BIT;
		S,COUT: OUT BIT
		);
	END COMPONENT SC1B;
		
SIGNAL C:BIT_VECTOR(4 DOWNTO 0);

BEGIN

HO: FOR K IN 0  TO 3 GENERATE
HH:SC1B 
	PORT MAP
	(
	X=>AIN(K),Y=>BIN(K),CIN=>C(K),
	S=>SUMA(K),COUT=>C(K+1)
	);
	END GENERATE HO;
	
	C(0)<= CIN;
	COUT<= C(4);

END ARCHITECTURE ARQ;


UNO MAS


		Código:
	

--DISEAR UN SUMADOR RESTADOR DE 4 BITS DE ANCHO MEDIANTE LA INSTANCIACION DE FA1B Y FA4B

ENTITY SUM_RES IS
	PORT(
		A: IN BIT_VECTOR(3 DOWNTO 0); --SUMANDO + MINUENDO
		B: IN BIT_VECTOR(3 DOWNTO 0); --SUMANDO + - SUSTRAENDO
		R_S: IN BIT; --'1' RESTA CON '0' SUMA
		SUMA: OUT BIT_VECTOR(3 DOWNTO 0); --SALIDA DE RESTA O SUMA
		COUT: OUT BIT --ACARREO DE SALIDA O PRESTAMO DE SALIDA(NEGADO)
		);
END ENTITY SUM_RES;

---------------------------------
ARCHITECTURE ARQ OF SUM_RES IS
	--DECLARAMOS FA4B DISENADA POR EL EQUIPO 2
COMPONENT FA4B IS
	PORT(
		A, B: IN BIT_VECTOR(3 DOWNTO 0);  --SUMADORES
		CIN: IN BIT;                      --BIT DE ARRASTRE
		SM: OUT BIT_VECTOR(3 DOWNTO 0);   --SALIDA DE TAMAO DE SUMADORES
		COUT: OUT BIT                     --SALIDA DE ARRASTRE
		);
		
END COMPONENT FA4B;

	SIGNAL MUX: BIT_VECTOR(3 DOWNTO 0);
BEGIN
	------------------------------------
	SM_0:FA4B PORT MAP(
		A=> A,
		B=>MUX,
		SM=>SUMA,
		CIN=>R_S,
		COUT=>COUT
		);
	----FIN DE LA INSTANCIANCION DE FA4B--------
	--DISENO DEL MUX
	MUX<=B WHEN R_S='0' ELSE NOT(B);
	-------FIN DEL MUX-----------
		
	------------------------------------
END ARCHITECTURE ARQ;



ENTITY FA1B IS
	PORT(
		X, Y: IN BIT;     --ENTRADA DE DATOS DE UN SOLO BIT
		CIN: IN BIT;      --ENTRADA DE ACARREO DE UNA ETAPA ANTERIOR
		S, COUT: OUT BIT  --SALIDAS.
		);
		
END ENTITY FA1B;

ARCHITECTURE ARC OF FA1B IS
BEGIN
	COUT<= (X AND Y) OR (X AND CIN) OR (Y AND CIN);
	-----------------------------------------------
	S<=(X XOR Y) XOR CIN;
	-----------------------------------------------
	
END ARCHITECTURE ARC; 



ENTITY FA4B IS
	PORT(
		A, B: IN BIT_VECTOR(3 DOWNTO 0);  --SUMADORES
		CIN: IN BIT;                      --BIT DE ARRASTRE
		SM: OUT BIT_VECTOR(3 DOWNTO 0);   --SALIDA DE TAMAO DE SUMADORES
		COUT: OUT BIT                     --SALIDA DE ARRASTRE
		);
		
END ENTITY FA4B;
------------------------------------
ARCHITECTURE ARC OF FA4B IS

	---------TRABAJO DEL EQUIPO 1-----------
	COMPONENT FA1B IS
	PORT(
		X, Y: IN BIT;     --ENTRADA DE DATOS DE UN SOLO BIT
		CIN: IN BIT;      --ENTRADA DE ACARREO DE UNA ETAPA ANTERIOR
		S, COUT: OUT BIT  --SALIDAS.
		);
		
           END COMPONENT FA1B;
           SIGNAL C: BIT_VECTOR(4 DOWNTO 0);
BEGIN
	-----------------------------------------
	
	U: FOR J IN 0 TO 3 GENERATE
		------------------------------------------
		H: FA1B PORT MAP (
			X=>A(j),
			Y=>B(j),
			CIN=>C(j),
			S=>SM(j),
			COUT=>C(j+1)
			);
		------------------------------------------
	
	
	
	
	
	END GENERATE U;	
	
	-----------------------------------------	
	
	
END ARCHITECTURE ARC;


----------



## yukardo

Aqui les dejo el video con las pruebas que le realice a la aplicación del autolavado.

En la imagen del archivo adjunto se muestra los leds que indican el encendido de los motores y los swtchs que hacen la funcion de los sensore.



YouTube - Autolavado con FPGA


----------



## adrianjpc

hola  todos!

yo estoy comenzando a realizar puebas con ek kit de alteraa cyclone II

Eh realizado agunos jercicios como empezando desde los basico hasta lo mas complicado.
como por ejemplo ya eh manejado los leds, los display de 7- SEG, Pantalla LCD 16x2.
por ahora estoy comenzando a anejar la pantalla LCD de matriz en punto de alta deficion. despues quiero meterme a manejar las camaras.

yukardo como le puedo hacer para subir videos al foro


----------



## yukardo

Saludos. Bienvenido a este post. Es bueno que se agreguen mas personas que colaboren con mas material.

Bueno para colocar un video solo tienes que subirlo a youtube y despues pones el link y listo. Cuando escribes hay una opción para colocar el link, usa esa para que se muestre.


----------



## yukardo

Aqui les dejo el video de la prueba realizada al codigo que publico el amigo ferny del efecto del coche fantastico.

YouTube - Efecto AutoFantastico con FPGA


----------



## thinkerdafy

buenas...
para un proyecto de la universidad necesito mover un motor paso a paso.....
pero el incoveniente es que tengo que utilizar Picoblaze de la spartan 3e
les agradeceria mucho a la persona que tuviera conocimiento de esto que me pudiera colaborar 
la verdad es de urgencia..
gracias.....


----------



## yukardo

Bueno yo en realidad aun no manejo esa aplicación de Picoblaze.

Lo que si me gustaria es hacer un contador ascendente/decendentes usando el FPGA.


----------



## yukardo

Quiero hacer un contador Ascendente/descente y me gustaria saber como puedo hacer el retardo para el antirrebote.


----------



## Chico3001

Asi? 

http://www.fpgarelated.com/usenet/fpga/show/78095-1.php


----------



## santiago alvarez

hola queria preguntarles si alguien sabe donde puedo comprar una placa de desarollo en argentina, estube preguntando en casas de electronica y me responden: " que son los FPGA?" , desde ya muchas gracias!


----------



## yukardo

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


----------



## cris3D

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


----------



## SPEEDBOY

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.


----------



## eidtech

En el siguiente link esta el documento PDF de la implementación de un "Control de Acceso Inteligente con RFID" basado en FPGAs.

http://www.embedded.com.mx/AC-RFID.pdf

Cualquier duda, comentario o sugerencia no duden en decirme.


----------



## emigidio

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


----------



## joseherrera90

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;


----------



## frespez

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.


----------



## asherar

rachy dijo:


> 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: 


joseherrera90 dijo:


> 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 ?


----------



## asherar

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.


----------



## Ferny

Alejandro Sherar dijo:


> 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.



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  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


----------



## asherar

Gracias por responder. 
Mucho me temía lo de las capas.  
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.


----------



## Ferny

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


----------



## asherar

Muchas gracias Ferny. Me has aclarado el panorama.


----------



## elizondo2249

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;


----------



## abram

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;


----------



## eafaump

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.


----------



## Ferny

eafaump dijo:


> 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;


----------



## yukardo

Revisen esta pagina se ve muy interesante.

http://www.fpgacentral.com/


----------



## LUCASLEON

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)


----------



## Ferny

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...


----------



## LUCASLEON

Gracias por su respuesta  ...  Pero entonces cada proyecto realizado en el kit de altera me costara uno buenos dolares  la pregunta es no venden solo el chip principal  solamente  par realizarle su placa


----------



## Ferny

Sí que puedes comprar las FPGA por separado, pero tienes que tener cuidado porque no sólo es la FPGA sino toda la circuitería asociada (flash de configuración, condensadores de desacoplo para la alimentación, conector de programación, etc.). Por otro lado hacerte un PCB para una FPGA es complicado, es difícil que te quepa en sólo 2 caras por lo que ya hablamos de PCB multicapa, que tendrás que mandar a fabricar a algún lado... Por otro lado si compras una FPGA en encapsulado BGA, a ver cómo lo sueldas... -> Tienes que enviarlo a soldar a algún lado que tengan un horno para soldadura de BGA. No creas que diseñar con FPGA's es barato.

No es tan sencillo hacer un circuito con una FPGA, tiene bastante trabajo de diseño detrás. Tú tienes que ver si te compensa las horas de diseño y precios de los componentes.

Lo bueno del kit y de las FPGA es que son reutilizables, o sea puedes tener varios diseños y cuando vayas a usar uno pues le programas con lo que deseas. Lo malo es precisamente esto, que tienes que reprogramarla cada vez que cambies de diseño.

Para proyectos de aficionado, una tarjeta de evaluación y basta ya, que si no te dejas mucho dinero. No es como usar un PIC, que por poco dinero tienes un circuito.

Saludos


----------



## Chico3001

Un kit Cyclone de altera ronda los $150 usd.... no se me hace caro para comenzar.... y te quitas de muchos dolores de cabeza.... 

Incluso y si tu bolsillo lo permite te recomendaria mas que compraras el kit de desarrollo del Cyclone III para NIOS, solo que cuesta 500 usd...  

http://www.altera.com/products/devkits/altera/kit-cyc3-embedded.html


----------



## asherar

Yo no termino de entender ... :cabezon: 

Siendo tan conveniente esta tecnología, tan rápida, tan pequeña, tan flexible, en fin ... 
No sería más conveniente para las fábricas de FPGA que hubiera disponibles placas adaptadoras para estos integrados ? 
Algo pequeño, con todas las capas internas necesarias, y con todo lo mínimo indispensable para conectar y arrancar ? 
No tan sobrecargado como las placas de desarrollo, sino lo básico, para que resulte sencillo aplicarlas a diseños propios.   

Tal vez sea una decisión de marketing, para que las soluciones resulten selectivas del usuario, y más o menos caras, de modo que sirva para ir financiando el desarrollo de esa tecnología. 

No se, digo ...


----------



## Ferny

La verdad se echa de menos algo así. Yo por suerte tengo eso mismo, una plaquita de unos 9x9 cm que trae una FPGA bastante amplia con su Flash de configuración, conector JTAG, sus alimentaciones, un puerto serie y 8 leds, o sea lo más básico, y luego 128 pines de E/S de propósito general a los que conectar lo que se me ocurra. La compré hace tiempo en Ebay por unos 50 euros, pero ya no la venden (se llama Stratix SmartPack)

Igualmente para hacer diseños con FPGA más complejas, requieren registrar la herramienta del fabricante (Quartus de Altera, o ISE de Xilinx), o sea más desembolso... No obstante estos fabricantes tienen versiones de estudiante y similares que sirven para las FPGA más pequeñas.

No sé, si no lo hacen será porque no les sale rentable, ten en cuenta que una plaquita por muy sencilla que sea ya resulta cara para muchos bolsillos: precio de una FPGA pequeña pero algo amplia, 20€, fabricar el PCB puede salir fácil por otros 20€ si se hacen muchos para bajar los costes fijos de fabricación, soldar la FPGA es otro tema aparte con mucha historia detrás, más luego el resto de electrónica asociada... Hablamos de mínimo unos 50€ de fabricación por placa en el mejor de los casos, a lo que hay que sumar los márgenes de beneficio, al final no se vendería mucho. Como ya dije, diseñar con FPGA es un lujo nada barato.


----------



## LUCASLEON

BUENO TAL VES LA SOLUCION SERIA SOLO LA ´PLACA GENERAL AUNQUE ESTA  BUENA LA OFERTA PARA EL CYCLONE III 

UNA PREGUNTA HAY ALGUNA TIENDA EN ESPAÑA PARA COMPRAR DIRECTO ESTE APARATO ... surte tengo un familiar en Cordoba que ya se regresa a Peru  
gracias por su gentil ayuda

Aqui un foto de cyclone iii  en version reducida la que quiero adquirir

QUE OPINAN ...


----------



## Ferny

Hola

En una tienda... casi imposible encontrarlo. Yo no conozco ninguna. Las placas se suelen comprar por internet.

Os recomiendo dar un vistazo a esta página, venden placas pequeñitas muy interesantes: http://www.knjn.com

También esta página para aclarar conceptos: http://www.fpga4fun.com


----------



## Chico3001

LUCASLEON dijo:


> BUENO TAL VES LA SOLUCION SERIA SOLO LA ´PLACA GENERAL AUNQUE ESTA  BUENA LA OFERTA PARA EL CYCLONE III
> 
> UNA PREGUNTA HAY ALGUNA TIENDA EN ESPAÑA PARA COMPRAR DIRECTO ESTE APARATO ... surte tengo un familiar en Cordoba que ya se regresa a Peru
> gracias por su gentil ayuda
> 
> Aqui un foto de cyclone iii  en version reducida la que quiero adquirir
> 
> QUE OPINAN ...



Por favor no escribas en mayusculas.... eso equivale a gritar... 

Gracias...


En cuanto a las tablillas economicas si he visto pero son con CLPD... un FPGA requiere mucho soporte externo para poder funcionar y como es muy amplia la gama de cosas que puede hacerse no le veria sentido a ofrecer algo "basico"


----------



## eafaump

Ferny dijo:


> Sí que puedes comprar las FPGA por separado, pero tienes que tener cuidado porque no sólo es la FPGA sino toda la circuitería asociada (flash de configuración, condensadores de desacoplo para la alimentación, conector de programación, etc.). Por otro lado hacerte un PCB para una FPGA es complicado, es difícil que te quepa en sólo 2 caras por lo que ya hablamos de PCB multicapa, que tendrás que mandar a fabricar a algún lado... Por otro lado si compras una FPGA en encapsulado BGA, a ver cómo lo sueldas... -> Tienes que enviarlo a soldar a algún lado que tengan un horno para soldadura de BGA. No creas que diseñar con FPGA's es barato.
> 
> No es tan sencillo hacer un circuito con una FPGA, tiene bastante trabajo de diseño detrás. Tú tienes que ver si te compensa las horas de diseño y precios de los componentes.
> 
> Lo bueno del kit y de las FPGA es que son reutilizables, o sea puedes tener varios diseños y cuando vayas a usar uno pues le programas con lo que deseas. Lo malo es precisamente esto, que tienes que reprogramarla cada vez que cambies de diseño.
> 
> Para proyectos de aficionado, una tarjeta de evaluación y basta ya, que si no te dejas mucho dinero. No es como usar un PIC, que por poco dinero tienes un circuito.
> 
> Saludos




Estoy trabajando con la tarjeta spartan3 y tengo un problema con la tarjeta el caso es que cada vez que cargo un programa y apago la tarjeta al conectarla otra vez ya no tiene nada, es como si se hubiera reiniciado, según he investigado tiene que ver con la configuración de la memoria flash... pero no se exactamente que es lo que tengo que hacer para que aun cuando  se apague la tarjeta siga conservado el programa descargado..
si alguien sabe como configurarla se lo agradecería......


----------



## Ferny

Tienes que generar un archivo para la memoria Flash, para eso usa el iMPACT y la opción Prom File Formatter (creo recordar que se llamaba así). La extensión suele ser .mcs pero creo que no siempre (depende del tipo de Flash que uses). Ese archivo lo cargas en la Flash de la tarjeta y así al apagar y encender vuelve a cargar la configuración. Mira el manual de tu tarjeta que seguro que viene algo ahí.


----------



## eafaump

Alguien sabe como multiplexar los displyas de la tajeta, en mi caso es una spartan 3. Algo de lo que quiero hacer por ejemplo, es un decodificador de BCD a 7 segmentos y mostralo en los displays. si alguien sabe le agradeceria mucho que me ayudara. 
PD: Gracias al foro que me a ayudado mucho a resover mis dudas.....


----------



## Ferny

Depende de cómo sea el circuito de los displays, se hará de una forma u otra. Postea el circuito.


----------



## mikeedavila

Hola a todos, primero quería felicitarlos por sus proyectos y además quería pedirles ayuda, en la u me mandaron a hacer un proyecto, en teoría nada complicado pero no sé ni por dónde comenzar.... tengo q explicar el funcionamiento de la comunicacion ethernet del Spartan 3 con el código correspondiente(el que viene de demo en el CD... alguien ha trabajado alguna vez con esta aplicación?... gracias de antemano por su ayuda


----------



## cespalacios

*Ferny*Llevo un ciclo aprendiendo el manejo de las tarjetas, la que uso es la Spartan 3E, si me puedes ayudar a contar tiempo con la terjeta, es decir, que una accion se produzca cada cierto tiempo.


----------



## Ferny

Es tan simple como usar un contador de ciclos de reloj. Si por ejemplo la frecuencia de reloj que usas es de 50 MHz, contando 50.000.000 de ciclos tienes un segundo de tiempo, e igualmente con otros tiempos.


----------



## catllar

Hola a todos,

me decidi por comprar de digilent una Nexys2, el caso es que voy muy pez.
me he bajado el programa de la pagina de digilent Adept, pero segun parece necesito tambien los programas de xilinx ISE 11.1, para poder cargar los VHDL y trabajar sobre la placa.

He instalado ISE sobre ubuntu, pero no acaba de funcionar el USB, asi que iba a probarlo en un ordenador con Windows, pero como no es mio queria que me orientarais un poco sobre que hacer. Despues, sabeis si la licencia hay que ir renovandola, o caduca tal cual tras 30 dias.

Perdonad mi ignorancia, Estoy haciendo telecomunicaciones y me interesaba este tema para un futuro proyecto.

Gracias.


----------



## Ferny

Hola

Según he visto el Adept parece ser sólo para programar y verificar la tarjeta, no para compilar tus diseños, para lo cual necesitas el ISE. Con el ISE también puedes programar la tarjeta (con la aplicación IMPACT que viene incluida), así que yo me olvidaría del Adept si no aporta otra novedad interesante...

Creo que hay una versión gratuita de ISE que tiene algunas limitaciones, por ejemplo creo que tenía alguna limitación de líneas de código máximas o de qué dispositivos se pueden grabar o no. No creo que haya problemas para una tarjeta de evaluación ya que suele soportar las FPGA que montan en estas tarjetas. La licencia creo que tienes que pedirla en la web de Xilinx, te registras y buscas por ahí, te la mandan a tu email sin coste. Siento no ser de más ayuda pero es que llevo años sin usar el ISE gratuito y no sé bien cuánto ha cambiado desde entonces...

Respecto del sistema, si vas a probar en Ubuntu y no te va el USB puedes tratar de buscar un programador por puerto paralelo, es más lento pero debería funcionar bien ahí. De todas formas sigue intentándolo porque el USB debería funcionar, pero bueno ya se sabe que cuando metes algo "rarito" en un linux puede pasar de todo...

¡Suerte!


----------



## 1982220

hola a todos en especial tengo una duda con el implemento de multiplexores en la fpga  quiero desplegar en varios displays una palabra que valla recorriendose de letra en letra y al final quede toda la palabra desplegada en los displays 

he estado investigando de multiplexores en cascada pero no veo algo que me ayude mucho 

"aclaro" solo quiisiera una idea , si es con multiplexores o implementando flip-flops 

muchas gracias 

y a todos en general gracias!! este foro esta buenisimo me ha servido mucho


----------



## catllar

Hola,

Estoy intentando implementar este proyecto de una puerta de garage en una Nexys2, el caso es que no se como asignarle las entradas y salidas.
Lo hago desde ISE.

Mi idea era asignar un boton para el reset y otro para el mando a distancia, dos switch para dos sensores que detectan puerta_cerrada y puerta_abierta y en el display dibujar una 'o' y una 'c' cuando la puerta esta abierta o cerrada.

He intentado asignarlo a traves del archivo .ucf, pero me da error.

Si teneis alguna una idea, es el primer programa que intento por mi cuenta, a aparte de los que he cargado de ejemplos ( que esos si funcionaban claro ). Gracias.



		Código:
	

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity parking is
  port(
    puerta_cerrrada: in std_logic;
    puerta_abierta: in std_logic;
    mando: in std_logic;
    clk,reset: in std_logic;
    abrir_puerta: out std_logic;
    cerrar_puerta: out std_logic;
        sevenseg : out  std_logic_vector (6 downto 0); 
    anodes : out  std_logic_vector (3 downto 0);
  );
end parking;
architecture arq_ctrl_parking of parking is
type posibles_estados is (EstadoInicial,Cerrando,Cerrado,Abriendo,Abierto);
signal estado: posibles_estados;
begin
process (clk, reset)
begin
       if (reset='1') then
                estado <= EstadoInicial;
       elsif (clk'event and clk='1') then
                case estado is
                        when EstadoInicial =>
                               if (puerta_abierta='1') then estado <= Cerrado;
                               else estado <= Cerrando;
                               end if;
                        when Cerrando =>
                               if (puerta_cerrada='1') then estado <=Cerrado;
                               end if;
                        when Cerrado =>
                               if (mando='1') then estado <=Abriendo;
                               end if;
                        when Abriendo =>
                               if (puerta_abierta='1') then estado <=Abierto;
                               end if;
                        when Abierto =>
                               if (mando='1') then estado <=Cerrando;
                               end if;
                end case;
       end if;
end process;
process (estado)
begin
case estado is
        when EstadoInicial => abrir_puerta<='0';
                                                         cerrar_puerta<='0';
                                                         
        when Cerrando =>       cerrar_puerta<='1';
        when Cerrado =>        cerrar_puerta<='0';
                                                            sevenseg<="0000111";
        when Abriendo =>        abrir_puerta<='1';
        when Abierto =>         abrir_puerta<='0';
                                                            sevenseg<="0100011";
anodes<="1110";
end case;
end process;
end arq_ctrl_parking;


Este es el .ucf

NET "anodes<0>"  LOC = "F17";  
NET "anodes<1>"  LOC = "H17";  
NET "anodes<2>"  LOC = "C18";  
NET "anodes<3>"  LOC = "F15";  
  
NET "sevenseg<0>" LOC = "L18";  
NET "sevenseg<1>" LOC = "F18";  
NET "sevenseg<2>" LOC = "D17";  
NET "sevenseg<3>" LOC = "D16";  
NET "sevenseg<4>" LOC = "G14";  
NET "sevenseg<5>" LOC = "J17";  
NET "sevenseg<6>" LOC = "H14";  
  
NET "mando<0>" LOC = "B18";  
NET "reset<1>" LOC = "D18";  

NET "puerta_cerrada<0>" LOC = "G18";  
NET "puerta_abierta<1>" LOC = "H18";


----------



## Ferny

Sería bueno que copiaras el error que da.

Luego prueba quitando las comillas y espacios del = del archivo.ucf (creo que no pasa nada porque estén, pero no puedo probar ahora mismo si funciona así...), por ejemplo:

NET anodes<0>  LOC="F17";  

Porúltimo, ¿dónde has puesto el pin de clk?


----------



## catllar

Hola Ferny,

Gracias por responder. No habia puesto el reloj, lo de las comillas no me da error en los otros programas mas simples que he compilado.

ahora queda asi, y te adjunto un archivo con los mensajes de error.



		Código:
	

NET "anodes<0>" LOC = "F17";
NET "anodes<1>" LOC = "H17";
NET "anodes<2>" LOC = "C18";
NET "anodes<3>" LOC = "F15";

NET "sevenseg<0>" LOC = "L18";
NET "sevenseg<1>" LOC = "F18";
NET "sevenseg<2>" LOC = "D17";
NET "sevenseg<3>" LOC = "D16";
NET "sevenseg<4>" LOC = "G14";
NET "sevenseg<5>" LOC = "J17";
NET "sevenseg<6>" LOC = "H14";

NET "mando<0>" LOC = "B18";
NET "reset<1>" LOC = "D18";

NET "puerta_cerrada<0>" LOC = "G18";
NET "puerta_abierta<1>" LOC = "K18";

NET "clk" LOC = "B8";


----------



## Ferny

ok, se queja porque tienes mal tu UCF, has nombrado mal tres señales, te pongo en rojo lo que tienes que eliminar



> NET "anodes<0>" LOC = "F17";
> NET "anodes<1>" LOC = "H17";
> NET "anodes<2>" LOC = "C18";
> NET "anodes<3>" LOC = "F15";
> 
> NET "sevenseg<0>" LOC = "L18";
> NET "sevenseg<1>" LOC = "F18";
> NET "sevenseg<2>" LOC = "D17";
> NET "sevenseg<3>" LOC = "D16";
> NET "sevenseg<4>" LOC = "G14";
> NET "sevenseg<5>" LOC = "J17";
> NET "sevenseg<6>" LOC = "H14";
> 
> NET "mando<0>" LOC = "B18";
> NET "reset<1>" LOC = "D18";
> 
> NET "puerta_cerrada<0>" LOC = "G18";
> NET "puerta_abierta<1>" LOC = "K18";


----------



## catllar

Hola Ferny,

Era tal como decias, lo he borrado y ya lo he podido cargar en mi Nexys 2, y ver que funciona.

Por cierto me daba algunas advertencias con el reloj, tienes alguna idea?

Muchas gracias de nuevo, y sigo probando cosas.

Un saludo.


----------



## Ferny

¿Funciona? Entonces puedes ignorarlos 

De hecho la versión oficial de Xilinx es esa misma: http://www.xilinx.com/support/answers/30295.htm


----------



## Nepper

No cazo una!! :cabezon:

No entiendo nada!!! 
¿de que están hablando?
FPGAS?
VHDL?
XILINX?
ISE?
1RO CUALE EL LA DIFERENCIA ENTRE UN FPGA Y UN CPLD????????
CPLD?
Placas de desarrollo?
multiplexores en cascada? (No hagas eso... la última resonancia en cascada la hiso Gordon Freeman y abrió un universo paralelo... o por lo menos lo multiplexó...)

HAHAHAHAHHHHH!AAAAAAAAAAA!!!! ME DUELE LA CABEZA!!!!!!! 

Me metí en el foro de curiosidad, pero la verdad que no tengo idea de que clase de tecnología están utilizando...

Lo que yo entendí hasta ahora:
Existen unos pequeños integrados que su función es simplemente comportarse como puerta lógica... La característica que hace especiales a estos integrados, es que su lógica de puertas puede ser "programada", de esta forma, construimos 100000 chip's identicos (logrando la construcción en masa), y que los clientes le pongan la lógica que se les cante...
En otras palabras, puedo comprarme un decodificador 7 segmentos, o comprarme este chip, programable la lógica de compuertas para que sea igual a la del decodificador 7 segmentos... la única diferencia será el tamaño y el precio..

¿es eso correcto?

Hago estas preguntas porque lo veo interesante... o sea, quisiera saber sus aplicaciones generales, si es muy usado... 
también que digan algunos precios estándares para ver a que nos enfrentamos XD (no es obligatorio)

Estuve leyendo la wik****ia, y no profundiza mucho el concepto... bueno... si lo hace, pero necesito una segunda opinión para cerrar la idea....
Ahora, yo me enteré de esto por el foro, pero... esta tecnología ¿cómo se aprende fuera del foro? ¿ustedes de donde aprendieron todo esto? 

Lo digo porque me intriga la situación... o sea, en un laburo necesitan que alguien programe en FPGA, entonces ¿llaman a un ing electrónico o informático? y suponiendo que no saben ¿la empresa los capacitó o vienen sabiendo porque hicieron un curso por correo?
No pretendo insultar a nadie, solamente me interesa saber cómo se metieron el algo tan... ¿raro?... ¿desconocido?


----------



## jaimepsantos

Oye nepper un fpga (_Field Programmable Gate Array_) y un cpld (_Complex __Programmable Logic Device) _son muy parecidos pero como tu dices puedes comprar un deco ya hecho de 14 pines pero tambien lo podrias  programar en un dispositivo de estos pero normalmente la capacidad de cualquiera de los dos es tan amplia que en ellos se pueden programar hasta microprocesadores, es un desperdicio programar solo un simple deco, espero que entiendas.
La principal diferencia ente un cpld y un fpaga es su arquitectura es decir la forma como estan contituidos internamente pero igual son programables. Su programcion consta de poner los estados siguentes como en una tabla de veradad, se pude con if, when, else, etc con palabras de descripcion de lenguaje comun de programacion tales como c, puedes poner ecuaciones logicas, tambien puedes interconectar bloques de circuitos logicos entre otros.

En la escuela o en el trabajo , yo aprendi en la escuela donde contamos con algunas de estas tarjetas especiales con perifericos.


----------



## Nepper

XD
Ok, entonces estaba en lo cierto, pero... ¿que utilidades se les dá? digo, ahora que veo esto, me doy cuenta que me faltan por conocer muchos componentes y sistemas digitales electrónicos, tal vez, yo hice cosas complejas donde tranquilamente podía haber utilizado este simple componente (que no lo creo) y me gustaría que mencionen utilidades, y conceptos para saber donde aplicarlo, porque si no me equivoco, en varias situaciones lo pude haber utilizado... donde antes utilizaba 5 integrados con compuertas, ahora simplemente me puedo programar uno de estos y listo.


----------



## jaimepsantos

De hecho tienes razon, pero basicamente se utiza en microprocesadores caseros, microcontroladores y sistemas embebidos. Que son sistemas completos de control logico capaces de "pensar" debido a la gran logica que se les da. Para aplicaciones con cientos o miles de compuertas, pero como dices pudes programar solo 5. Para programar a un nivel tan bajo te convendria utilizar otros dispositivos logicos programables (PLD) como los GAL o PAL que son base de la arquitectura de los CPLD, son mucho mas baratos, acesibles y tienen una capacidad reducida de conexion de compuertas internas te podre decir que yo he usado un GAL22V10 (22in 10out) y con eso he hecho mux demux deco codificadores contadores sumadores restadores multiplicadores maquinas de estado pero todas menores a 4 bits.


----------



## Chico3001

Nepper, este enlace te puede servir para entenderlo mejor:

https://www.forosdeelectronica.com/f24/fpga-vs-microcontrolador-mejor-16764/


----------



## Nepper

Chico3001, tu enlace abrió la caja de pandora, ese enlace me llevó a otros enlaces, y todavía no termino de leer todo...

Si el mundo se destruye en el 2012 es porque aprendí a programar FPGAs 

Eso tambien me trajo buenas noticias, porque veo que el "Informático" está muy alejado del Harware, contrariamente a lo que piensan unos amigos "informáticos"


----------



## Chico3001

Si me he topado con Informaticos que creen saber mucho de electronica y viceversa... la verdad es que son campos completamente diferentes que se complementan entre si...

Todos los Informaticos necesitan saber algo de electronica para entender mejor que programan y como se puede ir optimizando.. por el contrario los electronicos necesitan saber algo de informatica por que la electronica (de microprocesadores) no hace nada sin la informatica

Desafortunadamente no se puede aprender todo... hay que aprender a buscar expertos en cada area y tratar de explicarles que es lo que se requiere para formar un grupo de trabajo lo mas flexible que se pueda....


----------



## Earl

jaimepsantos dijo:


> otros dispositivos logicos programables (PLD) como los GAL o PAL



Ya me entro una duda, los FPGA no son PLD's??


----------



## Chico3001

Si... un FPGA es un PLD....

De echo cualquier logica programable es considerada un PLD, (PLD = Programable Logic Device = Dispositivo logico programable)


----------



## Earl

Ah ok gracias! esque se me hizo raro ver esa linea,, todo como antes =D


----------



## camohe90

Hola buenas noches soy nuevo en el foro, pero el tema de las FPGA's me parece muy interesante. En mi caso cuento con una tarjeta de evaluacion de ALTIUM que cuenta con una FPGA sprtanAN, que es un programa para el desarrolo de dispositivos electronicos y me gustaria compartir un poco de lo q es este software y conocer mas de otros software.


----------



## pedrow

Para poder programar bien una fpga, es necesario saber antes electronica y los componentes basico que lo forman. Un amigo mio es informatico y está teniendo grandes dificultades para entender la programacion VHDL y como se comporta la fpga.

Un  saludo


----------



## antiworldx

pedrow dijo:


> Para poder programar bien una fpga, es necesario saber antes electronica y los componentes basico que lo forman. Un amigo mio es informatico y está teniendo grandes dificultades para entender la programacion VHDL y como se comporta la fpga.
> 
> Un  saludo



Ha! es que el asunto es muy sencillo.

La FPGA no es un microcontrolador que utiliza una programacion lineal. El VHDL no es un lenguaje de programacion, es un "lenguaje descriptor de circuitos".
Es decir, estas haciendo circuitos que operan simultaneamente, o como dice el concepto propiamente, son circuitos de lógica combinacional.

Cuando tu pones dos instrucciones, sease como:
sal <= en1 and en2;
sal2 <= en3 or en4;
no se ejecuta la primer linea y despues la segunda, si no que se ejecutan simultaneamente.

Hay proceso directivas propias del vhdl que permiten hacer proceso síncronos secuenciales, como los for, pero a fin de cuentas, el vhdl terminara deshaciendolo a la hora de la implementacion y todo terminara metido como un circuito combinacional y alguna parte síncrona.
De ahí el porque a veces el vhdl implementa cosas "raras".

Un programador tradicional, particularmente tendra el problema de entender eso. Es algo tan drastico como el cambio de programación lineal a la programacion en objetos y multihilo, por mencionar un ejemplo.

salu2!


----------



## carmorlav

hola a todos

Apenas estoy aprendiendo vhdl, pero en la escuela me han puesto un proyecto a desarrollar, este consiste en hacer un modulo conversor analogo digital de tres entradas con visualizacion en LCD en la Spartan 3E. Quisiera que alguien me ayudara con esto.


----------



## biko

Yo necesito ayuda sobre como conectar el puerto serial con mi un microprocesador..


----------



## pedrow

Hola biko

Para conectar el microprocesador a una fpga, puedes utilizar rl protocolo uart, es decir, realizar lso componentes necesarios para hacer los dispositivos que necesites, pero hay un libro que ya te viene todo hecho y bien explicado:

Wiley.FPGA.Prototyping.by.VHDL.Examples.Xilinx.Spartan.3.Version.Feb.2008

Yo lo utilize para conectar la fpga al ordenador y demas¡¡¡

Un saludo


----------



## biko

Hey Pedro muchas gracias, igual te recibo toda la informacion que tengas para ayudarme, debo hacer una calculadora con mips.. y ando como atrasada con eso


----------



## pedrow

Hola biko, muchas gracias por transladar la respuesta¡¡¡

Ese libro es muy bueno para ejemplos de todo tipo, tambien incluye la respuesta a carmelov sobre su bcd, ademas del uso de protocolos ps2, vga, picoblaze, etc¡¡ Pero para entender bien la sintaxis, creo que es mejor otro:

vhdl programming by example 4 edition

Mi profesores me recomendaron este cuando empezé con le tema, ademas de este:

The Design Warrior's Guide to FPGAs.

Aunque el ultimo no te puedo decir mucho porque no lo he visto pero se ve que lo citaba mucho en clase¡¡

Un saludo y para cualquier duda...


----------



## jaimepsantos

Disculpen pero tengo una duda en el quartus de altera, saben como ver el equivalente en compuetras, es un circuito grafico??


----------



## Earl

jaimepsantos dijo:


> Disculpen pero tengo una duda en el quartus de altera, saben como ver el equivalente en compuetras, es un circuito grafico??



Con el proyecto abierto (obviamente) debes ir a Tools>Netlist Viewers>RTL Viewer y encontraras LOS BLOQUES de lo que es tu proyecto, es lo mas que puedes ver, segun yo no es posible verlo a nivel de compuertas =/ Saludos!


----------



## lordlogan

hola a todos

solo quieria saber como soy apenas viendo eso de los codigos de VHDL y la nexys 2 quiero saber como se conecta y configura una LCD para un proyecto que tengo q hacer... si alguien me puede orientar seria un gran paro.... gracias, y muy buenos los libros los ando descargando para tener mas idea de lo q estoy haciendo.


----------



## juansesochevi

Bueno lordlogan me imagino que eso de pende de cada FPGA, pero en general un lcd es controlado por 3 maquinas de estado, tengo un ejemplo que sirve para la FPGA Spartan 3E, te lo adjunto, y si vas a trabajar con la nexys2 descargate su datasheet, para q puedas hacer los cambios que necesites.


----------



## dcastibl1

hola tengo una pregunta y es que quisiera saber que debo tener en cuenta para hacer un control de temperatura PID digital en vhdl. gracias


----------



## labo

Hola,
estamos haciendo un trabajo que consiste en generar barras de colores (patrón de test) en VGA con una Spartan 3E. Hemos hecho el código, pero incluso cogiendo código de internet nos pasa que la pantalla no tiene señal.
me explico.
En el proyecto, después de crear la dcm (porque queremos una señal de 25mhz), el ucf, crear el bitstrem y transferirlo a la spartan (lo hacemos por jtag), la pantalla no coge ninguna señal (se ve como titila el boton de la pantalla, y mirando con un osciloscopio, se ve q no llega señal).
Así que hemos pensado que quizá sea problema de la transferencia que hacemos o que nos saltamos algun paso que hay que configurar.
Alguna idea?
Estamos un poco desesperadas .
Muchas gracias.


----------



## Ferny

Forma rápida de ver si el código se está cargando bien en la FPGA: en tu proyecto VGA, pon también un led a parpadear con frecuencia "visible" (que parpadee cada 0.5s por ejemplo).

Si el led no parpadea:
- Problema en la configuración de la memoria flash (si lo cargas en flash)
- Problema de asignación del pin de reloj, o del reloj en sí (¿el generador de reloj, genera reloj?).
- Problema de asignación del pin de reset (¿puede estar la FPGA en constante estado de reset?)
- Algo has hecho mal con el led (supongo que esto es fácil y sabes hacerlo ¿no? :-D)

Si el led parpadea:
- Revisa tu código.
- Revisa especialmente la DCM, probablemente ahí esté el fallo.

Un saludo

PD: no he mirado tu código


----------



## dcastibl1

hola a todos quisiera aportar un codigo de un sistema alu con un comparador el alu tiene dos entradas de 8 bits cada uno un selector de 3 bits y una salida de 8 bits el comparador tiene dos entradas de 8 bits cada uno y tres salidas donde una es A>B, A=B, Y A<B DONDE 1 SI ES VERDADERO Y 0 SI ES FALSO PARA EL COMPARADOR. aqui les dejo el codigo y teng una duda con la parte final del comparador cualquier cosa me corrigen.

ENTITY ALUCOMP IS
PORT ( A,B: IN STD_LOGIC_VECTOR (7 DOWNTO 0), 
           SEL:IN STD_LOGIC_VECTOR (2 DOWNTO 0),
          C:OUT STD_LOGIC_VECTOR (7 DOWNTO 0),
          D,E,F: IN STD_LOGIC);
END ENTITY

ARCHITECTURE ALU OF ALUCOMP IS

BEGIN
        WITH SEL SELECT
 C<= A+B WHEN "000",
        A-B WHEN "001",
       A OR B WHEN "010",
       A AND B WHEN "011",
       A XOR B WHEN "100",
       NOT (A) WHEN "101",
       NOT (B) WHEN "110",
       A WHEN "111",
       "XXXXXXXX" WHEN OTHERS;
     -- COMPARADOR 
       D<= '1' WHEN A>B ELSE '0',
       E<= '1' WHEN A=B ELSE '0',
       F<= '1' WHEN A<B ELSE 'X';
END ARCHITECTURE;


----------



## kurt

Hola que tal gente, tengo una pregunta,queria saber si con la version demo del software QUARTUS II de ALTERA (la baje de la pag. de Altera), se puede programar una fpga o cpld realmente fisicamente, o sea si el mismo crea el archivo para transferirlo a la fpga.
Otra este chip de Altera es una fpga o cpld, y si el mismo es volatil o no?







Muchas gracias, slsds..


----------



## Earl

kurt dijo:


> Hola que tal gente, tengo una pregunta,queria saber si con la version demo del software QUARTUS II de ALTERA (la baje de la pag. de Altera), se puede programar una fpga o cpld realmente fisicamente, o sea si el mismo crea el archivo para transferirlo a la fpga.
> Otra este chip de Altera es una fpga o cpld, y si el mismo es volatil o no?
> 
> 
> 
> 
> 
> 
> Muchas gracias, slsds..



Me parece que es CPLD (lo digo por la cantidad de pines) aunque sería mejor revisar el código que tiene en la página de Altera para verificarlo, si quieres el diagrama de un programador puedo proporcionartelo.


----------



## Ferny

Es un CPLD: http://www.altera.com/literature/ds/m7000.pdf

La versión demo de Quartus sí genera los archivos de programación pero no para todos los dispositivos, los más "avanzados" suelen estar capados, pero para ésta CPLD es posible que sí puedas. Simplemente instálalo, crea un nuevo proyecto seleccionando este dispositivo y prueba...


----------



## kurt

Bueno muchas gracias por las respuestas, cualquier cosa si hago algun proyecto se los comento.
Otra cosa alguno tiene el pcb (PROTEUS o PBC Wizard) del programador hecho, porfa me lo pasan.
despues subo el que yo hice (todavia no lo implemente fisicamente) para ver si se puede mejorar o corregir errores si tiene.
Gracias.., Slds..


----------



## Ferny

¿Necesitas un programador de Altera (un byteblaster)? Yo tengo uno y creo que estaba en proteus...


----------



## kurt

Hola que tal Ferny, dale pasame el pcb asi me fijo, ste me sireve para prog   la flia 7000S 
(EPM7064SCL44-10), disculpame vos lo tenes hecho programaste algun chip con este pcb?  Sdls..


----------



## Ferny

Lo tengo que buscar, a ver si me acuerdo que lo tengo en casa y ahora no estoy allí...

Es un Byteblaster MV, en teoría programa todo tipo de FPGAs, CPLDs y Flash de Altera, y he programado sin problemas diferentes modelos de todo tipo.


----------



## Ferny

Hola

El programador que yo me construí utiliza resistencias de 100 Ohm y condensadores de 100pF (valores aproximados) en tamaño SMD 1206 y 0805 respectivamente, ¿tienes posibilidad de conseguirlos? En caso contrario el PCB no te vale. De momento te paso el esquemático, en proteus tengo hecho sólo el PCB, y de manera un poco rudimentaria.

En el conector JP1 conecto un cable plano que va pin a pin a mi placa (el pinout del conector es estándar)

Saludos


----------



## kurt

Hola que tal Ferny garacias, dale pasame pcb q si consigo los componentes smd, slds...

Kurt


----------



## Ferny

Te lo dejo por aquí, los componentes y los puentes que hay que hacer están sobre el propio layout. Verás que hay dos 74ACT125, esos los puedes sustituir perfectamente por dos 74HC125.


----------



## kurt

Muchas gracias Ferny, slds..


----------



## OtReM

Hola muy buenas,

Soy seminuevo en este foro y en todo lo referente a FPGA's y programacion en vhdl y necesitaria un poquillo de ayuda referente a Xilinx.
Les cuento. Antes usaba el Xilinx 9.1 para programar en vhdl y simulaba gracias a un fichero test bench waveform. Me he instalado la version 12.1 y no me aparece como una opcion de fichero, con lo cual no puedo crearlo ni simular mi proyecto.

Tengo entendido que se puede crear un fichero llamado VHDL Testbench, donde mediante codigo puedes especificar los parametros de la simulacion. No se si lo tengo bien entendido, pero bueno, esta opcion no me gusta demasiado ya que prefiero poner mis señales de manera visual y senzilla con el test bench waveform tal como lo hacia antes.

Hay alguna manera de poder simular tal como lo hacia anteriormente con el Xilinx 12.1?

Les estaria muy agradecido por cualquier comentario de ayuda u opinion.

OtReM


----------



## ars

OtReM dijo:


> Hola muy buenas,
> 
> Soy seminuevo en este foro y en todo lo referente a FPGA's y programacion en vhdl y necesitaria un poquillo de ayuda referente a Xilinx.
> Les cuento. Antes usaba el Xilinx 9.1 para programar en vhdl y simulaba gracias a un fichero test bench waveform. Me he instalado la version 12.1 y no me aparece como una opcion de fichero, con lo cual no puedo crearlo ni simular mi proyecto.
> 
> Tengo entendido que se puede crear un fichero llamado VHDL Testbench, donde mediante codigo puedes especificar los parametros de la simulacion. No se si lo tengo bien entendido, pero bueno, esta opcion no me gusta demasiado ya que prefiero poner mis señales de manera visual y senzilla con el test bench waveform tal como lo hacia antes.
> 
> Hay alguna manera de poder simular tal como lo hacia anteriormente con el Xilinx 12.1?
> 
> Les estaria muy agradecido por cualquier comentario de ayuda u opinion.
> 
> OtReM


  Te copio lo que te respondí en el otro tema que creaste y te enviaron a moderacion:

Si no entiendo mal(perdona pero soy muy nuevo con las fpga) lo que tendrias que usar es el soft Modelsim XE, en la pagina de xilinx esta como opción a descargar. 


Saludos


----------



## nietzche

ammmm, soy nuevo en esto, pero en si un fpga que es?, es como un microcontrolador?, se programa solo el chip en la tarjeta y se saca?, o es toda la tarjeta, no entiendo ?


----------



## ars

nietzche dijo:


> ammmm, soy nuevo en esto, pero en si un fpga que es?, es como un microcontrolador?, se programa solo el chip en la tarjeta y se saca?, o es toda la tarjeta, no entiendo ?



es un chip tambien, pero no es como un microcontraldor, el el micro vos programas software, en las fpga programas hardaware, osea tiene montones de compuertas y lo que programas seria la interconexión de las mismas. Una de las ventajas es que el sistema desarrollado sera muy rápido, ya que podrá procesador datos paralelamente y no sigue un secuencia como un programa.


----------



## Chico3001

nietzche dijo:


> ammmm, soy nuevo en esto, pero en si un fpga que es?, es como un microcontrolador?, se programa solo el chip en la tarjeta y se saca?, o es toda la tarjeta, no entiendo ?



Hay... por que nunca leen o usan el buscador??? :cabezon::cabezon:

https://www.forosdeelectronica.com/f25/fpga-vs-microcontrolador-mejor-16764/


----------



## KARAPALIDA

Disculpen mi ignorancia, para que se usa uno de estos???

O sea me imagino que vale la pena trabajar tanto para lograr un arreglo a nivel hardware, teniendo micros muy rapidos hoy en dia. 

Si alguien me puede explicar, escomo la discucion de asembler y c, todabia no eh encontrado a nadie que me muestre una real ventaja. 

Saludos


----------



## Chico3001

Algunas aplicaciones donde los podemos llegar a encontrar:

- Controladores de Buses avanzados (PCI, USB, AGP etc)
- Sistemas de adquisicion de datos de alta velocidad
- Controladores o cerebros electronicos para equipos muy especificos, como GPS, Radares, etc
- Controladores de datos para redes de alta velocidad (Ethernet, Fibra Optica, etc)
- Manejadores para pantallas de leds
- Expansores de puertos para micros


Sobretodo en investigacion y robotica se usan mucho para implementar algoritmos ultrarapidos que permiten preprocesar la informacion que llega de los sensores y asi bajarle la carga a los procesadores

En Microprocesadores se usan para probar los diseños de microprocesadores antes de fabricarlos

etc, etc, etc...


----------



## charlysed

hola  me estoy iniciando en esto de labview fpga,, y necesito hacer un generador de frec de 1MHZ, utilizando el metodo de DDS con labview,, Encontre este link http://zone.ni.com/devzone/cda/epd/p/id/6066 con unos ejemplos interesantes, pero son para una targeta diferente y labview 8.5.   Yo tengo spartan3e kit satarter y el labview fpga 2009,, y no puedo hacer correr los ejemplos que figuran alli, seguramente por las diferencias que mencione,, Si alguien sabe como  hacerlos correr en el spartan 3e o quizas los parametros que debo cambiar o considerar, estare agradecidoooo,,          help meeeeee


----------



## jcristhian_1

Que herramientas de desarrollo se necesitan para iniciarse con fpga aparte de la tarjeta de desarrollo , por ejemplo esta tarjeta, Basys2 FPGA Board que la vende Digilent INC, se requiere algun circuito o cable especial para programar la fpga que contiene la tarjeta. Saludos y muchas gracias


----------



## camachoave

Que tal a todos, estoy iniciando en el mundo de los FPGAs y me gustaria recibir algunos consejos para poder empezar a programarlos. Si pudieran ayudarme con algunas recomendaciones relacionadas con este tema se los agradeceria. ¿Que libros me recomiendan? , algunos tutoriales, cambiando de tema mi profesor de asignatura me dijo tambien que bajara de la red el ACTIVE HDL. ¿QUE TAN BUENO ES ESTE SIMULADOR?. SI PUDIERAN ORIENTARME SE LOS AGRADECERE.

GRACIAS.


----------



## camachoave

bueno, aqui les dejo mi primer programa en VHDL espero que al aguien le sea de utilidad.

es un multiplexor 


l
	
	




		Código:
	

ibrary    ieee;
use ieee.std_logic_1164.all;

entity mux2_1 is
    port (
    
    i:in std_logic_vector(1 downto 0);
    selec:in std_logic;
    f:out std_logic );
    
end mux2_1;


architecture simple of mux2_1 is     --nombramos la arquitectura
begin
    process(selec) --variable en proceso
    begin
        case selec is --ponemos el selector como el caso de las posibles valores a tomar
            when'0'=> f<=i(0); --cuando el selecto es cero la salida es i(0)
            --when'1'=> f<=i(1); --cuando el selector es uno lasalida es i(1)
            when others=>f<='0';-- cuando no hay valor de seleccion la salida es cero
            
        end case;  -- terminamos el caso
        
        
        end process;  --terminamos el proceso



end simple;         --terminamos la arquitectura


----------



## dextermty

Hola a todos , soy nuevo en el foro y voy a empezar con esto de los FPGA, haciendole caso al amigo Ferny, he decidido comprar una tarjeta altera, aunque yo siempre habia querido comprar una spartan, me he pasado casi 4 dias leyendo todo lo que han hecho en este tiempo y mi pregunta para Ferny es, se puede desarrollar una tesis o proyecto integrador final de Maestria, con un sistema de control en FPGA? pregunto esto porqeu a pesar de que falta un año para terminar mi maestria, esto delos FPGA siempre me ha llamado la atencion y se que seria algo muy bueno poder desarrollarlo


----------



## Ferny

Se puede, claro... depende de lo que quieras hacer, pero sistemas de control basados en FPGAs sí que se pueden desarrollar.


----------



## snakewather

GRACIAS! por postear algo de este tema por que la verdad habia leido algo pero nada en concreto para analizar mas a fondo.

una pregunta es necesario programarlos en VHDL o hay otros lenguajes y algun compilador que conozcan para empezar a probar?


----------



## Ferny

También admiten lenguaje Verilog.

Compiladores, cada fabricante tiene el suyo, tienes el Quartus II para Altera y el Xilinx ISE para Xilinx.


----------



## dextermty

eh ferny que piensas  dela nexys 2???


----------



## Ferny

Como tarjeta de evaluación es de gama media o media-baja, pero al precio que tiene es muy buena opción para empezar a aprender, a pesar de ser de Xilinx  (ya he dicho más de una vez que el entorno de Altera me parece mucho más amigable para empezar jeje).


----------



## dextermty

Si, entiendo perfectamente tu punto, pero no podemos negar que por ejemplo una basys2 a 49 dolares contra una Cyclone II a 125 dolares( eso si el Consejo Academico de Altera te autoriza vendertela  a ese precio, yo he mandado 3 correos con monton de datos para que me aprueben y es fecha que no he recibido respuesta) o a 199 precio normal, es un mundo de diferencia en dinero, y no olvidemos que todavia no estoy incluyendo el costo  de envio, para cuanto les gusta el envio? 30 dolares por UPS? aparte de que en Mexico la gran mayoria sino es que todos los libros de VHDL hacen referencia inmediata a Xilinx y las Spartan, y los cursos(rarisimos) que se llegan a impartir se van sobre Xilinx, nada menos en Diciembre vienen los de Xilinx a dar curso sobre Spartan 6, buscate LABVIEW FPGA en youtube y los primeros 20 resultados que te brincan son sobre Spartan y Virtex ambos de la misma casa, eso si, Cyclone II trae montones de cosas que no traen las otras, que es lo que pasa entonces? falta de difusion de los productos de Altera? o la gente simplemente porque los demas hacen algo ahi van y hacen lo mismo y no prueban otras cosas distintas? Por mi parte sigo esperando la respuesta del Consejo Academico de Altera aver si me quieren vender la tarjeta a 125 sino a ver que hare..........desprenderme de 199 dolarucos.. jeje


----------



## dextermty

Pues al final de cuentas nunca me respondio la gente de Altera, y mi chica al ver mi decepcion decidio darme una sopresa de cumpleaños, me mando traer una tarjeta Basys2, y he estado leyendo acerca de ella, lo malo ya baje el ISE webpack 12.3 , el Adept y demas cosas, copie un peqeuño codigo de un comparador , y zas me dice que hay un problema con el reloj, o sea que los tiempos no estan declarados, un   tutorial que me lei dice que en cierto momento sale un wizard para los tiempos, el caso es que este ISE no trae ese wizard, en donde se declaran los tiempos del reloj en la programacion?? debo aclarar que esta version de ISE aparte que trae un monton de cosas, por lo que he leido quito algunas, como el wizard que les mencionaba......


----------



## Ferny

1- Postea el código.
2- Postea el error, copiado tal cual sale.

No somos adivinos para saber qué es lo que pasa...


----------



## dextermty

library IEEE;
use IEEE.STD_LOGIC_1164.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 sumador_tutorial is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           C : in  STD_LOGIC;
           S : out  STD_LOGIC;
           SC : out  STD_LOGIC);
end sumador_tutorial;

architecture Behavioral of sumador_tutorial is

begin
S <= A XOR B XOR C;
SC <=(B AND C) OR (A AND (B XOR C ));


end Behavioral;


ese es el texto del codigo, como algun manual que baje traia las indicaciones para hacer proyectos en el ise webpack pero era la version 6, el que tengo es la 12.3, la nueva, entonces al usar el Adept, porqeu para programar la tarjeta necesitas el Adept, dice lo siguiente al programar

"Startup clock for this file is CCLK instead of JTAG CLK, Problems will likely occur Associate config with file device anyway?

Y si lo baja y programa, pero solo se enciend un led y se queda sin hacer nada, y eso no es lo que debe hacer, como comente antes, deberia aparecer un wizard para poner el reloj pero esta version ya no la trae, me imagino  obviamente entonces que hay que declarar relojes en codigo


----------



## Ferny

Hola

Efectivamente en ese diseño no hay reloj con lo cual no debe pedirte nada (yo de todas formas no recuerdo que te tenga que pedir nada, pero bueno, quizá es una nueva "feature"). Supongo que A, B, C serán pulsadores o interruptores, y S y SC serán leds, para poder manejarlo externamente ¿no?

Sobre el error, me suena, fijate si en la carpeta donde se genera el .bit hay dos archivos .bit, uno que se llama download.bit es el que en teoría debes cargar, el otro no.

Saludos


----------



## dextermty

es que ese es el gran problema Ferny, te paso la liga del documento donde viene ese pequeño codigo, el asunto es que si lleva reloj pero en el ISE 6 lo ponen "por fuera" en un wizard que se suponia salia en esa version, en algun momento que tengas oportunidad leelo, el wizard aparece en la pagina 14 del documento

http://www.scribd.com/doc/37267090/Tutorial-Para-Programar-en-Xilinxx

y muchisimas gracias por contestar......

otra cosa en la version 12.3 se genera un solo .bit que es el descargable y lleva el nombre del proyecto.....


----------



## Ferny

Hola

Ese reloj es para realizar una simulación del comportamiento del VHDL. En realidad ni le haría falta ponerlo, es más para cuando usas un circuito síncrono (con señal de reloj). Lamentablemente nunca he usado el simulador de Xilinx así que con eso poco puedo ayudarte. Para simular he usado el Modelsim, donde te tienes que construir un test bench (también en VHDL) donde excitas las entradas y observas las salidas en el simulador. Eso está bien para simulaciones complejas, pero para simulaciones rápidas me gusta mucho el simulador del Quartus II de Altera...

¿Lo que te sucede es que lo programas pero no funciona? En ese caso puede ser que tengas mal asignados los pines de entrada o salida.



> otra cosa en la version 12.3 se genera un solo .bit que es el descargable y lleva el nombre del proyecto.....


Cierto, es normal, no me acordaba que eso sucede cuando usas el EDK e integras un microprocesador dentro de la FPGA, en ese caso genera un .bit sin el código del programa del micro y otro .bit (download.bit) que sí lleva el programa del micro. No es tu caso, así que nada que ver...


----------



## dextermty

Pues segui al pie de la letra el tutorial, en la pantalla donde asigno variables le pongo si es entrada o salida, lo que he podido entender en lo que he leido de ustedes es que hay que designar los pines, en este caso no me aparece ninguna pantalla para designar pines, eso si me pide al principio en que tarjeta voy a trabajar, y la designacion que trae es spartan 3e 250, x3s250e es la designacion oficial en la lista, entonces me quiero imaginar que los pines al declararlos como entrada o salida en la pantalla de asignacion de variables, automaticamente los identifica, alguien que haya trabajado con la Basys por ahi tendra alguna soluciona  esto??

ahora, tampoco me  voy a frustrar por un codigo que no salio, voya checar otros codigos y cargarlos a ver que es lo que sucede, son mis primeros pasos y sin ayuda mas que la de ustedes que se los agradezco mucho, pues si es un poco dificil........


----------



## Ferny

La designación de pines se hace desde el archivo .ucf

No suelo usar los configuradores automáticos, quizá ahí haya estado el error y no se han asignado bien. Olvida que haga asignaciones automáticas, tú tienes que configurar cada pin y decirle si es entrada o salida. Lo de definirlo como entrada/salida se hace en el VHDL cuando lo declaras como "in" o como "out", y luego en el .ucf asignas esa señal a un pin físico de la FPGA. Mirando el esquemático de tu tarjeta, puedes saber a dónde va ese pin (un led, pulsador, display de 7s, etc.)


Pon por aquí el contenido del archivo .ucf de tu proyecto. Me voy a bajar el esquemático de la Basys2 y con eso podemos saber si están bien asignados...


----------



## centauri

dextermty dijo:


> Si, entiendo perfectamente tu punto, pero no podemos negar que por ejemplo una basys2 a 49 dolares contra una Cyclone II a 125 dolares( eso si el Consejo Academico de Altera te autoriza vendertela  a ese precio, yo he mandado 3 correos con monton de datos para que me aprueben y es fecha que no he recibido respuesta) o a 199 precio normal, es un mundo de diferencia en dinero, y no olvidemos que todavia no estoy incluyendo el costo  de envio, para cuanto les gusta el envio? 30 dolares por UPS? aparte de que en Mexico la gran mayoria sino es que todos los libros de VHDL hacen referencia inmediata a Xilinx y las Spartan, y los cursos(rarisimos) que se llegan a impartir se van sobre Xilinx, nada menos en Diciembre vienen los de Xilinx a dar curso sobre Spartan 6, buscate LABVIEW FPGA en youtube y los primeros 20 resultados que te brincan son sobre Spartan y Virtex ambos de la misma casa, eso si, Cyclone II trae montones de cosas que no traen las otras, que es lo que pasa entonces? falta de difusion de los productos de Altera? o la gente simplemente porque los demas hacen algo ahi van y hacen lo mismo y no prueban otras cosas distintas? Por mi parte sigo esperando la respuesta del Consejo Academico de Altera aver si me quieren vender la tarjeta a 125 sino a ver que hare..........desprenderme de 199 dolarucos.. jeje



he comprado un bemicro a €95 (con costo de envio) pero no puedo usarlo en linux  pensé que un cyclone 3 fuera empieza bueno ahora no estoy cierto.


----------



## Ferny

En la página 3 del manual de Bemicro (http://www.arrownac.com/offers/alte.../BeMicro_Instructions_Embedded_System_Lab.pdf)



> Intel Pentium III or compatible Windows PC, running at 866MHz or faster, with a minimum of 512MB of systemmemory. NOTE REGARDING UNSUPPORTED OPERATING SYSTEMS: Neither Linux nor 64-bit versions of Windows Vista or Windows 7 are not supported by the BeMicro drivers at this time.


No soporta linux ni las versiones de 64 bits de WinVista o Win7

Mi experiencia me dice que nada que vaya por puerto USB funciona en linux, salvo que se demuestre lo contrario  (obviamente muchas cosas sí, pero cuando instalas algo más "raro" suelen venir los problemas)


----------



## MGustavo

Estoy practicando un poco de *VHDL*, utilizando *Xilinx ISE 12.1* en *Ubuntu 10.10*. Pero la verdad es que cuando comprendemos la sintaxis del lenguaje, podemos escribir el código en un editor de texto común.

Recomiendo *Geany*, que soporta las plataformas *Windows* y *Linux*. Para escribir el código, me agrada más incluso que la propia IDE de xilinx. Luego tomamos los archivos, al final, los agregamos a un proyecto en el Xilinx y listo. Creen un programita sencillo y observen además el panel de símbolos. Es práctico y muy pero muy liviano!

- Podemos minimizar el código.
- Autocompletado.

Otra opción es *Emacs*, aunque prefiero el que mencione anteriormente.

*Pregunta*: Alguien sabe como configurar Geany con el compilador de Xilinx?. En realidad lo que realmente me interesa es saber si mi código tiene un error (Ya que nos resalta las palabras reservadas pero no si me olvide un punto y coma, etc..), no compilarlo para pasarlo a la FPGA...


----------



## atorres019

Hola soy novato en el tema y  me dejaron en la escuela diseñar e implementar en una Gal22v10 usando VHDL (el programa que utilizo es Galaxy WARP R4) una Unidad Aritmético Lógica (ALU) que acepte dos números de 3 bits cada uno, representados por A2,A1,A0 y B2,B1,B0, además incluya 2 selectores S1S0 y las respectivas salidas Z2,Z1,Z0. Las operaciones que debe realizar la ALU son:
1) Z=A +- B
2) Z=A OR B
3) Z=A AND B
4)Z= COMPARACION SOBRE:  SI A<B ==> Z=1
                                        SI A>_B ==>Z=0


----------



## Beamspot

¿Y?¿Acaso pretendes que te hagamos los deberes?


----------



## asherar

Hasta ahora no pidió nada ...


----------



## FARITRON

Hola, soy nuevo por aqui, es un alivio ver un foro en español por fin sobre FPGA´s. Mi duda:

Estoy haciendo un proyecto (filtros FIR para audio) para la universidad sobre una placa SPARTAN 3AN, pero el tema es que me gusto mucho el tema de FPGA y quieria comprarme una placa de pruebas para mi, y tengo una duda sobre el modelo. Estoy dudando entre:
*SPARTAN 3AN (sobre 200 euros) , la 
*SPARTAN 3E 1600 (sobre 220 euros) -- que trae mas capacidad para proyectos futuros, y la 
*SPARTAN 3E 500k (sobre 190 euros) 
Trataria de terminar el proyecto en mi placa por lo que necesito que lleve los ADC y DAC y pantalla 2x16 LCD, ya que por trabajo no tengo tiempo de ir a la universidad cada dia a probar el firmware que hago por las noches.
Para el proyecto me vale cualquiera de las 3 ya que es muy basico. que placa comprarian ustedes??
Un saludo


----------



## Ferny

La experiencia me dice que es difícil llenar una FPGA, pero dado que la diferencia de precio no es mucha, "burro grande, ande o no ande":

*SPARTAN 3E 1600 --> 1600k gates*
SPARTAN 3AN --> 700k gates
SPARTAN 3E 500k --> 500k gates

PD: en realidad cualquiera te iría bien


----------



## waltergallegos

"...ir a la universidad cada dia a probar el firmware que hago por las noches..."

Por instinto quienes hacemos cosas en electrónica nos gusta "ver la cosa funcionar"; mismo que en la practica lo que realmente veremos serán algunas pantallas mostrando la interpretación de algunas señales eléctricas. 

Quienes inician en FPGA deberían tener mucho cuidado con esto. Muchos de mis alumnos y quienes nos consultan por proyectos tienen esa tendencia. Es un camino peligroso que tiende a buscar fallas y errores de diseño en placa en lugar de hacerlo en el simulador.

Si la intención es aprender, primero el diseño debe funcionar en simulación. Cuando el diseño funcione, recién en este momento necesitaras la placa para calmar los instintos naturales...


----------



## jalzak

hola... necesito hacer un contador de 0  a 99 usando el ise foundation y la spartan 3e pero lo tengo que hacer a una frecuencia de 1hz mas o menos y hasta donde se la tarjeta te proporciona una frecuancia de 50MHz entonces no se como hacer esto, lo tengo que realizar en schematic porq eu todavia no se VHDL espero que alguin me pueda ayudar.. gracias de antemano


----------



## asherar

waltergallegos dijo:


> "...ir a la universidad cada dia a probar el firmware que hago por las noches..."
> 
> Por instinto quienes hacemos cosas en electrónica nos gusta "ver la cosa funcionar"; mismo que en la practica lo que realmente veremos serán algunas pantallas mostrando la interpretación de algunas señales eléctricas.
> 
> Quienes inician en FPGA deberían tener mucho cuidado con esto. Muchos de mis alumnos y quienes nos consultan por proyectos tienen esa tendencia. Es un camino peligroso que tiende a buscar fallas y errores de diseño en placa en lugar de hacerlo en el simulador.
> 
> Si la intención es aprender, primero el diseño debe funcionar en simulación. Cuando el diseño funcione, recién en este momento necesitaras la placa para calmar los instintos naturales...



Creo que también, en parte, depende de la formación recibida. Los que estudiamos cuando los simuladores no existían tenemos otra percepción de lo que es un desarrollo. 

También es peligroso confiar demasiado en los entornos automáticos como simuladores, o ruteadores. Por más que los hacen muy inteligentes, siguen habiendo cosas que no se pueden simular: en especial aspectos subjetivos como criterios de trabajo, formas de ordenar ideas, ubicación "mental" del ambiente donde va a operar el equipo, consideración de posibles adversidades (azar), etc. 

Está bien que como primera etapa de depuración de errores, y como economizador de recursos,  sea súmamente útil el manejo de herramientas digitales, pero el que cree que sabe un tema porque maneja bien un simulador, se puede llevar una sorpresa muy grande al chocar con la realidad. 

No se trata de instintos naturales: el equipo a la larga va a tener que funcionar "en físico". 
Tal vez lo que pasa es que desde el punto de vista pedagógico, las cosas "reales" quedan un poco demasiado fuera de programa (no son tan académicas).


----------



## waltergallegos

Solo para poner el escenario, 
Son mis primeros intentos de entrar en esta comunidad, con el animo de una discusión creativa. 
Cuando yo me formé en electrónica y ya pasé los 50 hace algunos años, los cálculos los hacíamos con regla de calculo...nada se calculadoras y menos computadores en clase.
Nota para lo viejos : cuidado algunas de las cosas que veíamos en lógica discreta y funcionaban no funcionan en FPGA.

Estoy en el área industrial no académica si bien las universidades nos llaman para dar cursos de posgrado a los docentes y egresados. 


Comparto que el resultado final será cargando una configuración dentro de un FPGA, pero el resultado final es un buen proyecto no simplemente un proyecto que funcione hoy. 
Durante las consultorias en las industrias veo proyectos que funcionaban y simplemente dejaron de funcionar al implementar el mismo código HDL otra vez, o porque cambiaron de FPGA, o porque nadie sabe el porque...

Estos diseños generalmente tienen errores de metodología de diseño y/o no fueron bien simulados, son generalmente diseños que recorrieron varios ciclos de edición-implementación hasta que finalmente funcionaron y se pensó que todo estaba bien...hasta que empezó la producción y nada parece funcionar. 

En nuestros diseños todo es verificado en simulación antes de pasar a placa, a nivel industrial esto ahorra tiempo y dinero. La meta es que si esta bien planificado el proyecto; el bitstream y la placa montada deberían llegar al mismo tiempo.

Por otro lado si el diseño funciona en simulación (considerando que el banco de prueba esta bien construido y cumple con las normas de diseño y verificación), se siguió la metodología de diseño correcta (mucho cuidado aquí), se colocaron las directivas y restricciones de la herramienta en forma correcta, los posibles errores se deberán exclusivamente a lo físico pero externo al FPGA.

El simular en forma independiente cada modulo de un proyecto permite trabajar mas eficientemente concentrándose el proyectista en una sola funcionalidad del diseño. Los años nos demostraron esto mas de una vez.

Los bancos de prueba independientes por modulo y remarco bien construidos, son una herramienta invaluable para el mantenimiento del proyecto.

Un punto mas, la simulación ayuda a salir de dudas sobre la idiosincrasia de las herramientas, tanto del simulador como en la implementación, y a descubrir si el error es de la herramienta o del diseño, pero esto ya es harina de otro costal.


----------



## asherar

Todo bien, Walter, mi intención es la misma. Qué bueno es que aporte alguien que está en la "línea de fuego" con todas las herramientas de la tecnología moderna. Desde ya bienvenido. 
En lo personal trataré de aprovechar para sacarme algunos prejuicios de mi vision parcializada. 
Mi experiencia viene primero del lado de la física (he sido auxiliar de laboratorio de física durante varios años) y más tarde de alguna práctica en empresas (no demasiado formales). 

PD: Lo de desconfiar de los autómatas viene por alguna experiencia negativa con el ruteador automático del Protel. Conozco gente que han quedado con pistas a ningún lado porque le faltaba el footprint adecuado de un CI, ... y el soft ni avisa !
*
PD2: **A pesar de que remarqué el punto de vista contrario, entiendo bien a qué te refieres.
He conocido gente que creía que investigar era tomar un modelo y empezar a variar los parámetros.*


----------



## FARITRON

Hola Walter, estoy de acuerdo que todo se debe simular bien antes de cargar en placa...pero una vez que simulas y compruebas que todo esta ok,ya quieres cargar el firmware y ver por ejemplo la pantalla LCD funcionando como programaste (sobre todo si es la primera vez que lo haces). Un saludo


----------



## centauri

mi mensaje último dije que no hay apoyo a linux, pero encontré este: http://clippy.cz.cc/index.php?show=120


		Código:
	

/*
 *   Clone of usb blaster driver
 *
 *   Copyright (C) 2009 Setec Astronomy Project - who are not aware of the donation of this code
 *   to their cause, but can be notified by sending this file to them.
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Affero General Public License as
 *   published by the Free Software Foundation, either version 3 of the
 *   License, or (at your option) any later version, with the exception of
 *   any individual providing services to a corporation, or the corporation itself,
 *   if the name of the corporation starts with:
 *
 *        "ARR" or "ALTER"
 *
 *   These corporations and their employees, assigns, contractors, shareholders,
 *   rightsholders, attorneys and associates are specifically excluded by this
 *   license. This is not discriminatory; they can obtain software to perform
 *   interoperability and necessary functionality by pursuing internal licensing
 *   within their corporations or with all relevant rightsholders.
 *
 *   Copyright infringement by the above corporations and their employees, assigns,
 *   contractors, shareholders, rightsholders, attorneys and associates will be
 *   prosecuted to the fullest extent of the law. This license shall be governed
 *   by the laws of the State of California. If any part of this license
 *   is deemed to be invalid under applicable law, the remainder of the license
 *   shall be deemed severable and remain in force.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Affero General Public License for more details.
 *
 *
 *   Please read to the bottom of the file for instructions on how to use this.
 */

#include <string.h>
#include <dlfcn.h>

/*
 * The following section is pasted verbatim from libftdi.h, part of the package
 * libftdi-0.18
 *
 * If you prefer, you can use the file installed on your system using:
 * #include "libftdi-0.18.h"
 *
 * libftdi.so must also be installed from the same package. It is dynamically loaded
 * below.
 *
 * The following is Copyright (C) 2003 by Intra2net AG, and is licensed under
 * the GNU Lesser General Public License.
 *
 * The derived work, namely, the whole of this file, is governed by the copyright above,
 * under the compatible but more restrictive GNU Affero General Public License.
 */

/***************************************************************************
                          ftdi.h  -  description
                             -------------------
    begin                : Fri Apr 4 2003
    copyright            : (C) 2003 by Intra2net AG
    email                : opensource@intra2net.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Lesser General Public License           *
 *   version 2.1 as published by the Free Software Foundation;             *
 *                                                                         *
 ***************************************************************************/

#ifndef __libftdi_h__
#define __libftdi_h__

#include <usb.h>

#define FTDI_DEFAULT_EEPROM_SIZE 128

/** FTDI chip type */
enum ftdi_chip_type { TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2, TYPE_R=3, TYPE_2232H=4, TYPE_4232H=5 };
/** Parity mode for ftdi_set_line_property() */
enum ftdi_parity_type { NONE=0, ODD=1, EVEN=2, MARK=3, SPACE=4 };
/** Number of stop bits for ftdi_set_line_property() */
enum ftdi_stopbits_type { STOP_BIT_1=0, STOP_BIT_15=1, STOP_BIT_2=2 };
/** Number of bits for ftdi_set_line_property() */
enum ftdi_bits_type { BITS_7=7, BITS_8=8 };
/** Break type for ftdi_set_line_property2() */
enum ftdi_break_type { BREAK_OFF=0, BREAK_ON=1 };

/** MPSSE bitbang modes */
enum ftdi_mpsse_mode
{
    BITMODE_RESET  = 0x00,    /**< switch off bitbang mode, back to regular serial/FIFO */
    BITMODE_BITBANG= 0x01,    /**< classical asynchronous bitbang mode, introduced with B-type chips */
    BITMODE_MPSSE  = 0x02,    /**< MPSSE mode, available on 2232x chips */
    BITMODE_SYNCBB = 0x04,    /**< synchronous bitbang mode, available on 2232x and R-type chips  */
    BITMODE_MCU    = 0x08,    /**< MCU Host Bus Emulation mode, available on 2232x chips */
                              /* CPU-style fifo mode gets set via EEPROM */
    BITMODE_OPTO   = 0x10,    /**< Fast Opto-Isolated Serial Interface Mode, available on 2232x chips  */
    BITMODE_CBUS   = 0x20,    /**< Bitbang on CBUS pins of R-type chips, configure in EEPROM before */
    BITMODE_SYNCFF = 0x40,    /**< Single Channel Synchronous FIFO mode, available on 2232H chips */
};

/** Port interface for chips with multiple interfaces */
enum ftdi_interface
{
    INTERFACE_ANY = 0,
    INTERFACE_A   = 1,
    INTERFACE_B   = 2,
    INTERFACE_C   = 3,
    INTERFACE_D   = 4
};

/* Shifting commands IN MPSSE Mode*/
#define MPSSE_WRITE_NEG 0x01   /* Write TDI/DO on negative TCK/SK edge*/
#define MPSSE_BITMODE   0x02   /* Write bits, not bytes */
#define MPSSE_READ_NEG  0x04   /* Sample TDO/DI on negative TCK/SK edge */
#define MPSSE_LSB       0x08   /* LSB first */
#define MPSSE_DO_WRITE  0x10   /* Write TDI/DO */
#define MPSSE_DO_READ   0x20   /* Read TDO/DI */
#define MPSSE_WRITE_TMS 0x40   /* Write TMS/CS */

/* FTDI MPSSE commands */
#define SET_BITS_LOW   0x80
/*BYTE DATA*/
/*BYTE Direction*/
#define SET_BITS_HIGH  0x82
/*BYTE DATA*/
/*BYTE Direction*/
#define GET_BITS_LOW   0x81
#define GET_BITS_HIGH  0x83
#define LOOPBACK_START 0x84
#define LOOPBACK_END   0x85
#define TCK_DIVISOR    0x86
/* Value Low */
/* Value HIGH */ /*rate is 12000000/((1+value)*2) */
#define DIV_VALUE(rate) (rate > 6000000)?0:((6000000/rate -1) > 0xffff)? 0xffff: (6000000/rate -1)

/* Commands in MPSSE and Host Emulation Mode */
#define SEND_IMMEDIATE 0x87
#define WAIT_ON_HIGH   0x88
#define WAIT_ON_LOW    0x89

/* Commands in Host Emulation Mode */
#define READ_SHORT     0x90
/* Address_Low */
#define READ_EXTENDED  0x91
/* Address High */
/* Address Low  */
#define WRITE_SHORT    0x92
/* Address_Low */
#define WRITE_EXTENDED 0x93
/* Address High */
/* Address Low  */

/* Definitions for flow control */
#define SIO_RESET          0 /* Reset the port */
#define SIO_MODEM_CTRL     1 /* Set the modem control register */
#define SIO_SET_FLOW_CTRL  2 /* Set flow control register */
#define SIO_SET_BAUD_RATE  3 /* Set baud rate */
#define SIO_SET_DATA       4 /* Set the data characteristics of the port */

#define FTDI_DEVICE_OUT_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT)
#define FTDI_DEVICE_IN_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN)

/* Requests */
#define SIO_RESET_REQUEST             SIO_RESET
#define SIO_SET_BAUDRATE_REQUEST      SIO_SET_BAUD_RATE
#define SIO_SET_DATA_REQUEST          SIO_SET_DATA
#define SIO_SET_FLOW_CTRL_REQUEST     SIO_SET_FLOW_CTRL
#define SIO_SET_MODEM_CTRL_REQUEST    SIO_MODEM_CTRL
#define SIO_POLL_MODEM_STATUS_REQUEST 0x05
#define SIO_SET_EVENT_CHAR_REQUEST    0x06
#define SIO_SET_ERROR_CHAR_REQUEST    0x07
#define SIO_SET_LATENCY_TIMER_REQUEST 0x09
#define SIO_GET_LATENCY_TIMER_REQUEST 0x0A
#define SIO_SET_BITMODE_REQUEST       0x0B
#define SIO_READ_PINS_REQUEST         0x0C
#define SIO_READ_EEPROM_REQUEST       0x90
#define SIO_WRITE_EEPROM_REQUEST      0x91
#define SIO_ERASE_EEPROM_REQUEST      0x92


#define SIO_RESET_SIO 0
#define SIO_RESET_PURGE_RX 1
#define SIO_RESET_PURGE_TX 2

#define SIO_DISABLE_FLOW_CTRL 0x0
#define SIO_RTS_CTS_HS (0x1 << 8)
#define SIO_DTR_DSR_HS (0x2 << 8)
#define SIO_XON_XOFF_HS (0x4 << 8)

#define SIO_SET_DTR_MASK 0x1
#define SIO_SET_DTR_HIGH ( 1 | ( SIO_SET_DTR_MASK  << 8))
#define SIO_SET_DTR_LOW  ( 0 | ( SIO_SET_DTR_MASK  << 8))
#define SIO_SET_RTS_MASK 0x2
#define SIO_SET_RTS_HIGH ( 2 | ( SIO_SET_RTS_MASK << 8 ))
#define SIO_SET_RTS_LOW ( 0 | ( SIO_SET_RTS_MASK << 8 ))

#define SIO_RTS_CTS_HS (0x1 << 8)

/* marker for unused usb urb structures
   (taken from libusb) */
#define FTDI_URB_USERCONTEXT_COOKIE ((void *)0x1)

#ifdef __GNUC__
    #define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
    #define DEPRECATED(func) __declspec(deprecated) func
#else
    #pragma message("WARNING: You need to implement DEPRECATED for this compiler")
    #define DEPRECATED(func) func
#endif


/**
    \brief Main context structure for all libftdi functions.

    Do not access directly if possible.
*/
struct ftdi_context
{
    /* USB specific */
    /** libusb's usb_dev_handle */
    struct usb_dev_handle *usb_dev;
    /** usb read timeout */
    int usb_read_timeout;
    /** usb write timeout */
    int usb_write_timeout;

    /* FTDI specific */
    /** FTDI chip type */
    enum ftdi_chip_type type;
    /** baudrate */
    int baudrate;
    /** bitbang mode state */
    unsigned char bitbang_enabled;
    /** pointer to read buffer for ftdi_read_data */
    unsigned char *readbuffer;
    /** read buffer offset */
    unsigned int readbuffer_offset;
    /** number of remaining data in internal read buffer */
    unsigned int readbuffer_remaining;
    /** read buffer chunk size */
    unsigned int readbuffer_chunksize;
    /** write buffer chunk size */
    unsigned int writebuffer_chunksize;
    /** maximum packet size. Needed for filtering modem status bytes every n packets. */
    unsigned int max_packet_size;

    /* FTDI FT2232C requirecments */
    /** FT2232C interface number: 0 or 1 */
    int interface;   /* 0 or 1 */
    /** FT2232C index number: 1 or 2 */
    int index;       /* 1 or 2 */
    /* Endpoints */
    /** FT2232C end points: 1 or 2 */
    int in_ep;
    int out_ep;      /* 1 or 2 */

    /** Bitbang mode. 1: (default) Normal bitbang mode, 2: FT2232C SPI bitbang mode */
    unsigned char bitbang_mode;

    /** EEPROM size. Default is 128 bytes for 232BM and 245BM chips */
    int eeprom_size;

    /** String representation of last error */
    char *error_str;

    /** Buffer needed for async communication */
    char *async_usb_buffer;
    /** Number of URB-structures we can buffer */
    unsigned int async_usb_buffer_size;
};

/**
    \brief list of usb devices created by ftdi_usb_find_all()
*/
struct ftdi_device_list
{
    /** pointer to next entry */
    struct ftdi_device_list *next;
    /** pointer to libusb's usb_device */
    struct usb_device *dev;
};

/**
    \brief FTDI eeprom structure
*/
struct ftdi_eeprom
{
    /** vendor id */
    int vendor_id;
    /** product id */
    int product_id;

    /** self powered */
    int self_powered;
    /** remote wakeup */
    int remote_wakeup;
    /** chip type */
    int BM_type_chip;

    /** input in isochronous transfer mode */
    int in_is_isochronous;
    /** output in isochronous transfer mode */
    int out_is_isochronous;
    /** suspend pull downs */
    int suspend_pull_downs;

    /** use serial */
    int use_serial;
    /** fake usb version */
    int change_usb_version;
    /** usb version */
    int usb_version;
    /** maximum power */
    int max_power;

    /** manufacturer name */
    char *manufacturer;
    /** product name */
    char *product;
    /** serial number */
    char *serial;

    /** eeprom size in bytes. This doesn't get stored in the eeprom
        but is the only way to pass it to ftdi_eeprom_build. */
    int size;
};

#ifdef __cplusplus
extern "C"
{
#endif

    int ftdi_init(struct ftdi_context *ftdi);
    struct ftdi_context *ftdi_new(void);
    int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface);

    void ftdi_deinit(struct ftdi_context *ftdi);
    void ftdi_free(struct ftdi_context *ftdi);
    void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usbdev);

    int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist,
                          int vendor, int product);
    void ftdi_list_free(struct ftdi_device_list **devlist);
    void ftdi_list_free2(struct ftdi_device_list *devlist);
    int ftdi_usb_get_strings(struct ftdi_context *ftdi, struct usb_device *dev,
                             char * manufacturer, int mnf_len,
                             char * description, int desc_len,
                             char * serial, int serial_len);

    int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product);
    int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
                           const char* description, const char* serial);
    int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
                           const char* description, const char* serial, unsigned int index);
    int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev);
    int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description);

    int ftdi_usb_close(struct ftdi_context *ftdi);
    int ftdi_usb_reset(struct ftdi_context *ftdi);
    int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi);
    int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi);
    int ftdi_usb_purge_buffers(struct ftdi_context *ftdi);

    int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate);
    int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
                               enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity);
    int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
                                enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
                                enum ftdi_break_type break_type);

    int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
    int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
    int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);

    int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
    int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
    int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);

    int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size);
    void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more);

    int DEPRECATED(ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask));
    int ftdi_disable_bitbang(struct ftdi_context *ftdi);
    int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode);
    int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins);

    int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency);
    int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency);

    int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status);

    /* flow control */
    int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl);
    int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts);
    int ftdi_setdtr(struct ftdi_context *ftdi, int state);
    int ftdi_setrts(struct ftdi_context *ftdi, int state);

    int ftdi_set_event_char(struct ftdi_context *ftdi, unsigned char eventch, unsigned char enable);
    int ftdi_set_error_char(struct ftdi_context *ftdi, unsigned char errorch, unsigned char enable);

    /* set eeprom size */
    void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size);

    /* init and build eeprom from ftdi_eeprom structure */
    void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom);
    void ftdi_eeprom_free(struct ftdi_eeprom *eeprom);
    int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output);
    int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *output, int size);

    /* "eeprom" needs to be valid 128 byte eeprom (generated by the eeprom generator)
       the checksum of the eeprom is valided */
    int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom);
    int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid);
    int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize);
    int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom);
    int ftdi_erase_eeprom(struct ftdi_context *ftdi);

    int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val);
    int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val);

    char *ftdi_get_error_string(struct ftdi_context *ftdi);

#ifdef __cplusplus
}
#endif

#endif /* __libftdi_h__ */


/* end of libftdi.h */




#include <stdint.h>
#include <stdio.h>

#define ATTR_CDECL      __attribute__((cdecl))

struct ftdi_so_st {	/* pointers to libftdi.so */
	ATTR_CDECL int (* p_ftdi_init)(struct ftdi_context *ftdi);
	ATTR_CDECL uint32_t (* p_ftdi_interface_write)(void * unused_void, unsigned long const * buf, unsigned long count);
	ATTR_CDECL int (* p_ftdi_set_interface)(struct ftdi_context *ftdi, enum ftdi_interface interface);
	ATTR_CDECL void (* p_ftdi_deinit)(struct ftdi_context *ftdi);
	ATTR_CDECL int (* p_ftdi_usb_open)(struct ftdi_context *ftdi, int vendor, int product);
	ATTR_CDECL char (* p_ftdi_interface_close)(void * unused_void);
	ATTR_CDECL int (* p_ftdi_usb_close)(struct ftdi_context *ftdi);
	ATTR_CDECL int (* p_ftdi_usb_reset)(struct ftdi_context *ftdi);
	ATTR_CDECL int (* p_ftdi_usb_purge_buffers)(struct ftdi_context *ftdi);
	ATTR_CDECL int (* p_ftdi_read_data)(struct ftdi_context *ftdi, unsigned char *buf, int size);
	ATTR_CDECL int (* p_ftdi_read_data_set_chunksize)(struct ftdi_context *ftdi, unsigned int chunksize);
	ATTR_CDECL int (* p_ftdi_write_data)(struct ftdi_context *ftdi, unsigned char *buf, int size);
	ATTR_CDECL int (* p_ftdi_write_data_set_chunksize)(struct ftdi_context *ftdi, unsigned int chunksize);
	ATTR_CDECL int (* p_ftdi_write_data_get_chunksize)(struct ftdi_context *ftdi, unsigned int *chunksize);
	ATTR_CDECL int (* p_ftdi_set_bitmode)(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode);
	ATTR_CDECL char * (* p_ftdi_get_error_string)(struct ftdi_context *ftdi);
	void * handle;	/* handle to libftdi DSO returned from dlopen() */
	unsigned chunksize;	/* cached from ftdi_write_data_get_chunksize */
};

typedef ATTR_CDECL char (* fn_find_devs)(uint32_t dev_index, char * out_desc, uint32_t api_ver);
typedef ATTR_CDECL char (* fn_find_descriptions)(const char * description);
typedef ATTR_CDECL int (* fn_init_dev)(uint32_t * p_exit_status, const char * desc, struct ftdi_so_st * s_server_ops, void * parent);
typedef ATTR_CDECL void (* fn_close)(void * unused_void);
typedef ATTR_CDECL void (* fn_pkt_wr_pattern)(void * unused_void, uint32_t jtag_tms, uint32_t v, unsigned long len);
typedef ATTR_CDECL void (* fn_pkt_wr_bits)(void * unused_void, unsigned jtag_tms, unsigned long * p_bits, unsigned long len, unsigned long field_144_minus_len);
typedef ATTR_CDECL char (* fn_do_flush)(void * unused_void, int bool_val, uint32_t index_val);
struct virtual_fns_st {	/* ABI to pass data in and out of driver */
	uint32_t             st_size;	/* to check ABI compatibility */
	char                 dev_description[32];
	uint32_t             st_flags;
	void *               reserved01[2];
	fn_find_devs         p_find_devs;
	fn_find_descriptions p_find_descriptions;
	fn_init_dev          p_init_dev;
	fn_close             p_close;
	void *               reserved02[3];
	fn_pkt_wr_pattern    p_pkt_wr_pattern;
	fn_pkt_wr_bits       p_pkt_wr_bits;
	void *               reserved03[1];
	fn_do_flush          p_do_flush;
	void *               reserved04[5];
};

struct driver_st
{
	uint32_t num_devs;
	struct virtual_fns_st vfns;
	struct ftdi_so_st ffns, str_fns;
	struct ftdi_context dev_info;
	void * parent;
	uint8_t w_buf[0x10000];	/* FT2232D can receive up to 64KB in one USB transfer */
	uint32_t w_buf_use, want_read, last_tms, last_cmd, chain_3d;
	uint8_t r_buf_2[0x10000], r_nbits[0x10000];
};
extern struct driver_st d;

int do_ftdi_write(uint8_t * c, size_t s)
{
	if (!d.ffns.chunksize) return 1;
	int r;
	if (d.ffns.chunksize < ((s + 0xff) & ~0xff)) {
		if ((r = d.ffns.p_ftdi_write_data_set_chunksize(&d.dev_info, (s + 0xff) & ~0xff)) < 0) return 1;
	}
	size_t i;
	if ((r = d.ffns.p_ftdi_write_data(&d.dev_info, c, s)) < 0) return 1;
	if (!d.want_read) return 0;
	unsigned got_read;
	for (got_read = 0, i = 0; got_read < d.want_read; got_read += r, i++) {
		if ((r = d.ffns.p_ftdi_read_data(&d.dev_info, &d.r_buf_2[got_read], sizeof(d.r_buf_2)/sizeof(d.r_buf_2[0]) - got_read)) < 0) return 1;
		if (i >= 10) return 1;
	}
	return 0;
}

ATTR_CDECL char find_devs(uint32_t dev_index, char * out_desc, uint32_t api_ver)
{
	if (api_ver < 4) return 0;
	if (dev_index >= d.num_devs) return 0;
	strcpy(out_desc, "bus-instance");
	return 1;
}

ATTR_CDECL char find_descriptions(const char * description)
{
	return !strcmp(description, "bus-instance");
}

inline void init_w_buf_red_on()
{
	d.w_buf[0] = 0x80;
	d.w_buf[1] = 0x10;
	d.w_buf[2] = 0x9b;
	d.w_buf_use = 3;
	d.last_tms = 0;
	d.last_cmd = 0;
	d.chain_3d = 0;
	d.want_read = 0;
}

ATTR_CDECL int init_dev(uint32_t * p_exit_status, const char * desc, struct ftdi_so_st * s_server_ops, void * parent)
{
	if (!parent) return 1;
	if (strcmp(desc, "bus-instance") != 0) return 1;
	init_w_buf_red_on();
	if (d.ffns.chunksize) return 1;
	memset(&d.str_fns, 0, sizeof(d.str_fns));
	d.str_fns.p_ftdi_interface_write = s_server_ops->p_ftdi_interface_write;
	d.str_fns.p_ftdi_interface_close = s_server_ops->p_ftdi_interface_close;
	d.parent = parent;
	if (d.ffns.chunksize) return 1;
	if (d.ffns.p_ftdi_write_data_get_chunksize(&d.dev_info, &d.ffns.chunksize) < 0 || d.ffns.p_ftdi_set_bitmode(&d.dev_info, 0x0b, 2) < 0) return 1;
	d.want_read = 0;
	uint8_t cmd[] = { 0x80, 0x90, 0x9b, 0x82, 0x07, 0x07, 0x86, 0, 0, 0x85, };
	if (do_ftdi_write(cmd, sizeof(cmd)) || d.ffns.p_ftdi_usb_purge_buffers(&d.dev_info) < 0) return 1;
	*p_exit_status = 1;
	return 0;
}

ATTR_CDECL void do_close(void * unused_void)
{
}

ATTR_CDECL char do_flush(void * unused_void, int bool_val, uint32_t index_val)
{
	if (!d.num_devs) return 1;
	uint8_t * wp = &d.w_buf[d.w_buf_use];
	*(wp++) = 0x80;	*(wp++) = 0x10;	*(wp++) = 0x9b;	*(wp++) = 0x87;
	do_ftdi_write(&d.w_buf[0], d.w_buf_use + 3);
	unsigned ulout_use = 0, bit = 0, i, q;
	for (i = 0; i < d.want_read; i++) {
		uint8_t bv = d.r_buf_2[i];
		for (q = 0; q < d.r_nbits[i]; q++) {
			if (!bit) d.r_buf_2[ulout_use] = 0;	/* prepare next byte to receive bits */
			if (bv & (0x80 >> (d.r_nbits[i] - q - 1))) d.r_buf_2[ulout_use] |= 1 << bit;
			bit++;
			if (bit & 8) {
				bit = 0;
				ulout_use++;
			}
		}
	}
	if (d.str_fns.p_ftdi_interface_write) d.str_fns.p_ftdi_interface_write(d.parent, (unsigned long *) d.r_buf_2, ulout_use * 8 + bit);
	if (d.str_fns.p_ftdi_interface_close) d.str_fns.p_ftdi_interface_close(d.parent);
	init_w_buf_red_on();
	return 1;
}

void send_bit(unsigned tms, unsigned v)
{
	if (d.last_tms != tms) {
		if (d.last_cmd == 0 && d.w_buf_use == 3) d.w_buf_use = 0;
		/* datasheet: TMS should be asserted before rising edge of first clock */
		d.w_buf[d.w_buf_use++] = 0x80;	d.w_buf[d.w_buf_use++] = 0x10 | (tms ? 0x08 : 0);	d.w_buf[d.w_buf_use++] = 0x9b;
		d.last_tms = !!tms;
		d.chain_3d = 0;
	} else if (d.w_buf_use > 3 && d.w_buf[d.last_cmd] == 0x3e) {
		if (d.w_buf[d.last_cmd + 1] < 6) {
			d.w_buf[d.last_cmd + 2] |= (v ? 1 : 0) << (++d.w_buf[d.last_cmd + 1]);
			d.r_nbits[d.want_read - 1]++;
		} else {
			if (!d.chain_3d) {
				d.w_buf[d.last_cmd] = 0x3d;
				d.w_buf[d.w_buf_use] = d.w_buf[d.w_buf_use - 1] | (v ? 0x80 : 0);	d.w_buf[d.w_buf_use - 1] = 0x00;	d.w_buf[d.w_buf_use - 2] = 0x00;
				d.w_buf_use++;
				d.r_nbits[d.want_read - 1]++;
				d.chain_3d = d.last_cmd;
			} else {
				unsigned chain = (d.w_buf[d.chain_3d + 1] | (d.w_buf[d.chain_3d + 2] << 8)) + 1;
				d.w_buf[d.chain_3d + 1] = chain & 0xff;	d.w_buf[d.chain_3d + 2] = (chain >> 8) & 0xff;	d.w_buf[d.chain_3d + 3 + chain] = d.w_buf[d.last_cmd + 2] | (v ? 0x80 : 0);
				d.w_buf_use = d.chain_3d + chain + 4;
				d.last_cmd = d.chain_3d;
				d.r_nbits[d.want_read - 1]++;
			}
		}
		return;
	}
	d.last_cmd = d.w_buf_use;
	d.w_buf[d.w_buf_use++] = 0x3e;	d.w_buf[d.w_buf_use++] = 0x00;	d.w_buf[d.w_buf_use++] = (v ? 1 : 0);
	d.r_nbits[d.want_read++] = 1;
	if (d.want_read > 128) do_flush(0, 0, 0);
}

ATTR_CDECL void pkt_wr_pattern(void * unused_void, uint32_t jtag_tms, uint32_t v, unsigned long len)
{
	if (!d.num_devs || len < 1) return;
	unsigned long i;
	for (i = 0; i < len; i++) send_bit(jtag_tms, v);
}

ATTR_CDECL void pkt_wr_bits(void * unused_void, unsigned jtag_tms, unsigned long * p_bits, unsigned long len, unsigned long field_144_minus_len)
{
	if (!d.num_devs || len < 1) return;
	unsigned long i;
	for (i = 0; i < len; i++) send_bit(jtag_tms, (p_bits[i / 32] >> (i & 31)) & 1);
}

int do_set_interface()
{
	if (d.ffns.p_ftdi_set_interface(&d.dev_info, INTERFACE_A) < 0 || d.ffns.p_ftdi_usb_open(&d.dev_info, Vendor, ProdID) < 0)
	{
		d.ffns.p_ftdi_deinit(&d.dev_info);
		return 1;
	}
	if (d.ffns.p_ftdi_usb_reset(&d.dev_info) < 0 || d.ffns.p_ftdi_read_data_set_chunksize(&d.dev_info, 65536) < 0)
	{
		d.ffns.p_ftdi_usb_close(&d.dev_info);
		d.ffns.p_ftdi_deinit(&d.dev_info);
		return 1;
	}
	return 0;
}

struct driver_st d = {
	.vfns = {
		.st_size             = sizeof(struct virtual_fns_st),
		.dev_description     = "usb-blaster-clone",
		.st_flags            = 0x800,
		.p_find_devs         = find_devs,
		.p_find_descriptions = find_descriptions,
		.p_init_dev          = init_dev,
		.p_close             = do_close,
		.p_pkt_wr_pattern    = pkt_wr_pattern,
		.p_pkt_wr_bits       = pkt_wr_bits,
		.p_do_flush          = do_flush,
	},
};

#define STRINGIFIER_DSO_METHOD_NAME(x) #x
#define STRINGIFY_DSO_METHOD_NAME(y) STRINGIFIER_DSO_METHOD_NAME(y)
#define STRING_DSO_METHOD_NAME STRINGIFY_DSO_METHOD_NAME(DSO_METHOD_NAME)

#define VISIBILITY_DEFAULT_EXTERN __attribute__((visibility("default"))) extern

VISIBILITY_DEFAULT_EXTERN struct virtual_fns_st * DSO_METHOD_NAME(uint32_t hw_type)
{
	if (hw_type != 0) return 0;
	if (d.ffns.handle) return &d.vfns;
	d.ffns.handle = dlopen("libftdi.so", RTLD_NOW);
	if (!d.ffns.handle) {
		#if 0
			If you have libftdi.so installed and you get this error, try a test:
			Create a file test.c:

			int main() { return 0; }

			Next, compile it with: gcc -o test -lftdi test.c

			Use google to fix any problems, then make sure libftdi.so is in /usr/lib

			As a last resort, change the call to dlopen() above so it has the full file path
		#endif
		return 0;
	}

	#define load_ffn(f) (!(d.ffns.p_##f = dlsym(d.ffns.handle, #f)))
	/* these can fail when the version is wrong. it must be libftdi-0.18 */
	if (load_ffn(ftdi_init) || load_ffn(ftdi_set_interface) || load_ffn(ftdi_deinit) ||
		load_ffn(ftdi_usb_open) || load_ffn(ftdi_usb_close) || load_ffn(ftdi_usb_reset) ||
		load_ffn(ftdi_usb_purge_buffers) || load_ffn(ftdi_read_data) ||
		load_ffn(ftdi_read_data_set_chunksize) || load_ffn(ftdi_write_data) ||
		load_ffn(ftdi_write_data_set_chunksize) || load_ffn(ftdi_write_data_get_chunksize) ||
		load_ffn(ftdi_set_bitmode) || load_ffn(ftdi_get_error_string) ||
		d.ffns.p_ftdi_init(&d.dev_info) < 0 || do_set_interface())
	{
		dlclose(d.ffns.handle);
		d.ffns.handle = 0;
		return 0;
	}
	d.num_devs = 1;
	return &d.vfns;
}





/*

TODO
multiple device support
use bulk usb transfer, programming speed can be a lot faster
mac os support


INSTRUCTIONS
------------
save this file as libjtag_hw_your_name_here.c
(yes, you can use any name after libjtag_hw_)

you must then plug in your hardware to detect the USB ID and compile it into the .so file
then compile it with this command:
(this is a very long line, and it must all be typed on the same line)

gcc -fPIC -fvisibility=hidden -DDSO_METHOD_NAME=`wget -qO - http://ubuntuforums.org/archive/index.php/t-142166.html | sed -e '/ial pro/p;d' | cut -d " " --output-delimiter=_ -sf 37-39 | sed -e 's/.$//'` `awk '/clone/{print gensub("=","=0x","g",gensub(".*(V[^ ]*) *(P[^ ]*).*","-D\\\\1 -D\\\\2","",Q))}{Q=P;P=$0}' /proc/bus/usb/devices` -shared -Wl,-soname,libjtag_hw_your_name_here.so -o libjtag_hw_your_name_here.so -ldl libjtag_hw_your_name_here.c

then check that compilation went ok by typing this command:

nm -CD *.so|md5sum|awk '{if ($1 == "9c9ae1be799a6ebda49a84a7a3b09104") print "ok"; else print "problem"}'

then copy the .so file to the directory that has other files named libjtag_hw_*,
note that there are two directories, you can copy the .so file into both for normal situations

*/

ahora funciona asi asi


----------



## waltergallegos

Hola Faritron, es natural que lo quieras ver funcionar; cada cosa a su tiempo, por eso comenté que :

"Cuando el diseño funcione, recién en este momento necesitaras la placa para calmar los instintos naturales..."

Mi comentario trata de remarcar dos cosas, 

1 La herramienta de verificación es el simulador. 

2 El hecho de que un diseño funcione sobre una placa no quiere decir que el diseño este bien. Sobre todo si el diseño fue por decir de alguna forma "criado" sobre la placa.

Concuerdo contigo que para quienes nos gusta meter la mano en la masa es estimulante ver que mas no sea un LED parpadeando como queríamos. Claro que si no enciende el LED el haber simulado bien te da la seguridad necesaria para buscar el problema en el lugar adecuado.

Saludos,


----------



## FARITRON

Hola, ya me llego la placa de Spartan 3e 1600 , es tan bonita y le dedicare tanto tiempo... (mi novia me deja seguro jeje)







Estaba haciendo el proyecto en una spartan 3AN, pero esta es mucho mas grande!!!
Un saludo


----------



## waltergallegos

FARITRON,  

Con calma, debería haber una ley que les obligue a indicar en la caja :

"ATENCIÓN : El contacto prolongado produce efectos secundarios, consulte a su soporte técnico. "

Buena suerte y a las ordenes.


----------



## danielfae

Estoy Trabajando con una CPLD CoolRunner, la idea es implementar un registro de 21 bits PIPO que haga de contador por medio de un sumador mas uno; esto con el fin de incluir algunas acciones por medio de pulsadores a los cuales se les aplica un circuito antirebote previamente.

Necesito Ayuda con el codigo en  VHDL ya que tengo un diagrama esquemático de bloques de lo que quiero que ocurra, pero no se como describirlo en este lenguaje.


----------



## waltergallegos

daniel 

para empezar que sabes de VHDL ? cursaste o estas cursando algún curso oficial ? 

A que le llamas "PIPO" ?


----------



## danielfae

PIPO: Paralel Input-Paralel Output.

de VHDL se lo básico, apenas puedo usarlo para crear los componentes básicos: Flip Flops, mux y registros y otras cosas; actualmente curso la materia de Sitemas Digitales en la Universidad.

lo que necesito es un tipo de contador que vaya desde 0 hasta completar 21 bits de "1"s, hecho a partir de un registro PIPO. en si el proyecto trata de crear un generador de direcciones para un reproductor de música, por tal razón necesito que la salida pueda detenerse, devolverse , pausarse, pasar a siguiente canción y a la anterior, estos comandos van implementados por medio de pulsadores con un sistema antirebote.


----------



## waltergallegos

Supongo es tarea de la Universidad por eso no te daré toda la repuesta, es bueno aprender a pensar...

Necesitas declarar una señal

    SIGNAL contador : unsigned(20 DOWNTO 0);

Y el contador lo haces con

    contador <= contador + 1;

dentro de un PROCESS sincrono

Si quieres que pare cuando este todo el contador en '1' deberás incluir una sentencia del tipo

 IF contador = "111....(21 unos) THEN .... 
(se puede simplificar o usar otra técnica para evitar un comparador de 21 bits)

dentro del PROCESS

Walter


----------



## R3tikus

buenass, me he leido las 10 páginas de este hilo, y me gustaria saber a día de hoy, cualquier persona que quiera iniciarse en las fpgas ¿que placa le recomendais que se compre?

Gracias un saludo


----------



## Ferny

Yo recomendaría ésta (de Altera, por supuesto): http://www.altera.com/products/devkits/altera/kit-cyc2-2C20N.html

La FPGA que trae es bastante grande ("cabe mucho"), tienes pulsadores, leds, conector de expansión, salidas de vídeo y audio, conexión de tarjeta SD...

Como habrás leído, para alguien que empieza con las FPGAs le recomendaría empezar con Altera y no con Xilinx, porque el entorno de desarrollo de Altera es muchísimo más amigable que el de Xilinx.


----------



## R3tikus

Muchas gracias por tu respuesta ferny, entonces ¿me recomiendas la cyclone II?¿por donde me recomiendas,ademas, que la adquiera?¿por su tienda o por un distribuidor? 

Saludos


----------



## Ferny

Personalmente no la he comprado, aunque sí usado. Para adquirirla yo creo que da igual, intenta con un distribuidor primero pero si no lo encuentras o bien te cobra más por la placa, pídela directamente a Altera, yo iría por la opción más económica.


----------



## R3tikus

el mejor sitio que he visto hasta ahora es este distribuidor,
farnell
pero he visto que hay muchos tipos de kits, ha diferentes precios, ¿cual me aconsejas? esque he visto por ahi la cyclon III

Un Saludo


----------



## Ferny

Farnell es totalmente fiable, pero mira a ver cuántos gastos de envío te clavan ya que no son baratos.

Si eliminamos de esa búsqueda los que se han dejado de fabricar, los que valen casi 1000€ o más y los que son tarjetas para pinchar en un PC, nos quedan sólo el kit de la Cyclone II y el de la Cyclone III.

Si te fijas, el de la Cyclone III apenas trae periféricos (botones, switches, leds, etc.), los conectores de expansión que traen son muy incómodos de usar... Esta tarjeta la veo más pensada para desarrollar una aplicación con un microprocesador (Nios), ya que lo que sí trae es una memoria DDR de 32 MB. No la recomendaría para alguien que no sabe.

Sin embargo en la Cyclone II tienes varios botones, switches, leds, displays de 7 segmentos, puerto serie, puerto VGA, conectores de audio, memoria SD... también incluye una SDRAM de 8MB, y también se pueden montar una aplicación con un microprocesador dentro, por si eso es de tu interés. Creo que todos estos componentes son más útiles para alguien que empieza ¿no? Además, los conectores de expansión que tiene son bastante cómodos de usar, por si quieres conectar la tarjeta a otra que tú te hagas y meter por ejemplo un ADC o un DAC o lo que se te ocurra.

Te sigo recomendando la Cyclone II, es una placa muy buena en mi opinión, en mi trabajo la hemos usado para desarrollar prototipos y probar firmware antes de fabricarnos nuestras tarjetas hechas a medida.


----------



## R3tikus

enserio muchisimas gracias, me has resueltos todas las dudas, esta tarde la pido, en cuanto me llegue pondre unas fotos por si alguien le interesa.
Muchas gracias por todo ferny un saludo


----------



## joselo27

Ferny dijo:


> Hola a todos
> 
> En mi trabajo entre otras cosas me dedico a desarrollar y probar firmware para FPGA's, por lo que si tenéis alguna duda concreta os puedo intentar echar una mano
> 
> Por otro lado he trabajado con FPGA's de Altera y de Xilinx, mi consejo si os queréis comprar una placa de evaluación para aprender su manejo es que os compréis una de Altera, más que nada (en mi opinión) porque el entorno de trabajo es mucho más amigable y sencillo de usar, además de ser más estable (el ISE de Xilinx se "cuelga" a veces...). En mi trabajo he usado la Cyclone II de altera y es una tarjeta muy sencilla de usar y mi preferida si alguna vez decido comprarla, además de ser de las más baratas... También he usado las tarjetas de evaluación Spartan 3A y Virtex II Pro de Xilinx y son unas tarjetas más completas que la de Altera, pero como ya dije su uso se complica algo más...
> 
> Quizá para desarrollar exclusivamente código VHDL la diferencia no sea tanta, porque al fin y al cabo lo "gordo" del proyecto es escribir el código, y para eso con el notepad de windows ya basta  Donde he visto grandes ventajas de Altera sobre Xilinx es en el desarrollo de esquemáticos (pueden llegar a ser muy útiles para unir varios bloques de código VHDL que interactúen entre sí) y en la herramienta de análisis lógico (chipscope de xilinx y signaltap de altera, que te permiten visualizar en el PC el valor de señales internas de la FPGA, para saber su estado exacto en cada momento). Me pareció que las de Altera son más intuitivas de usar...
> 
> Para Altera basta que se bajen el Quartus Web Edition (creo que es gratuito), lo único que no soporta los modelos más avanzados de FPGA pero la Cyclone II de la tarjeta de evaluación sí funciona (además el Web Edition viene en el CD adjunto a la tarjeta que compren, por lo que ni siquiera tienen que bajarlo). Tiene un simulador de código VHDL que si bien no es muy completo, sí permite hacer casi todas las pruebas que uno puede necesitar durante el desarrollo de código. Una herramienta de simulación mucho más avanzada es el modelsim, creo que incluso tiene una versión gratuita (con sus limitaciones).
> 
> Espero que esta información os sirva
> 
> Un saludo




viendo que tienes gran experiencia en el manejo de estas tarjetas de desarrollo, te pediría un consejo y es que con unos compañeros de la universidad compraremos una fpga no sabemos aun si comprar la spartan 3E 1600 o la nexys 1200,, ay ciertas diferencias entre las dos tarjetas,., me gustaria saber su opinion de ello, y de igual forma si me puedes regalar un link e informacion de las tarjetas de desarrollo altera,...

y la verdad saber cual nos serviría mas para tratar con señales ya que queremos enfocarnos en comando de voz,.,.,. gracias por su atencion



yukardo dijo:


> Alguien puede darme una idea de algun ejemplo que se pueda hacer que sea sencillo de programar.




contador de 8 bits


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



entity contador is
generic(m: integer :=8);
port( clk: in std_logic;
reset : in std_logic;

l:in std_logic;
ud : in std_logic;
      load: in std_logic_vector(m downto 0);
		cuentaut std_logic_vector(m downto 0));

end contador;

architecture Behavioral of contador is
signal temp: std_logic_vector(m downto 0);
begin
process(clk,reset,ud,l) 
variable temp:std_logic_vector(m downto 0);

begin
if clk'event and clk='1' then 
if reset='1' then 
temp:="000000000";
end if; 
end if;
if l='1' then 
temp:=load;
elsif ud='1' then
temp:= temp+1;
elsif ud = '0' then 
temp:=temp-1;
end if;
cuenta<=temp;
end process;


end Behavioral; 


bueno aquí les dejo un contador de 8 bits


----------



## Ferny

La spartan 3E 1600 es más completa que la nexys 1200, tiene una FPGA más grande (1600 kpuertas frente a 1200 kpuertas), el doble de RAM (32MB frente a 16MB) que es muy útil si vas a implementar un microprocesador para tu aplicación, también tiene más periféricos (ethernet, LCD...)

Para una aplicación de audio, piensa cómo vas a "meter el audio" en la FPGA. La 1600 tiene un convertidor ADC, que te puede resultar muy útil para esto. La 1200 creo que no.


----------



## joselo27

Ferny dijo:


> La spartan 3E 1600 es más completa que la nexys 1200, tiene una FPGA más grande (1600 kpuertas frente a 1200 kpuertas), el doble de RAM (32MB frente a 16MB) que es muy útil si vas a implementar un microprocesador para tu aplicación, también tiene más periféricos (ethernet, LCD...)
> 
> Para una aplicación de audio, piensa cómo vas a "meter el audio" en la FPGA. La 1600 tiene un convertidor ADC, que te puede resultar muy útil para esto. La 1200 creo que no.



gracias men por el dato,, espero la podamos conseguir, por medio de este ADC como se maneja dentro de la spartan 3E, o tienes algun circuito que resulte sencillo de entender donde este esta aplicacion,,.,.,. gracias por su atencion


----------



## Ferny

No lo he usado nunca, pero al ser una placa bastante conocida es posible que buscando encuentres alguna aplicación donde se use el ADC. También es posible que con la documentación de la tarjeta te vengan archivos de ejemplo.


----------



## joselo27

Ferny dijo:


> No lo he usado nunca, pero al ser una placa bastante conocida es posible que buscando encuentres alguna aplicación donde se use el ADC. También es posible que con la documentación de la tarjeta te vengan archivos de ejemplo.



men que pena molestar tanto, la verdad es que en estos instantes estoy haciendo un DAC para empezar a realizar poco el proyecto de fin de semestre, estábamos recreando un generador de señales, como la seno, la coseno, la cuadrada, y la exponencial. el diseño en la fpga que nos prestamos bien, funciona, pero a la hora de trabajar esto con el DAc 0808 no me mostro nada en el osciloscopio, me base en u circuito que encontré en Internet, asi que le pido el favor de un circuito que funcione para este tipo de idea que quiero realizar y que utilice un dac le agradeceria


----------



## josedavid

Saludos a todos,

Me encuentro buscando información o ejemplos concretos sobre la utilización del puerto VGA para visualizar imágenes en la FPGA cyclone II de Altera, utilizando Quartus II, NIOS II o SOPC Builder, les agradeciera cualquier colaboración que me puedan prestar en este tema.


----------



## FARITRON

joselo27 dijo:


> men que pena molestar tanto, la verdad es que en estos instantes estoy haciendo un DAC para empezar a realizar poco el proyecto de fin de semestre, estábamos recreando un generador de señales, como la seno, la coseno, la cuadrada, y la exponencial. el diseño en la fpga que nos prestamos bien, funciona, pero a la hora de trabajar esto con el DAc 0808 no me mostro nada en el osciloscopio, me base en u circuito que encontré en Internet, asi que le pido el favor de un circuito que funcione para este tipo de idea que quiero realizar y que utilice un dac le agradeceria


Hola, has simulado el circuito y comprobado las señales? Revisa bien el circuito y cuidado con los circuitos que encontramos en la red. Un saludo

Hola, tengo una placa Spartan 3E 1600, estoy haciendo un filtro de audio FIR con el metodo MAC (multiplicaciones y sumas),  el problema viene del numero de bit, la muestras tienen 14 bit y los coeficicentes los codifico con otros 14 bit, esto hacen 27 bit con signo al multiplicar. Utilizo filtros de orden 14, con lo que tengo 14 sumas y añadir un bit en cada suma, esto hacen 41 bit. La salida la hago a través de un conversor D/A de 12 bit por lo que desprecio muchos bit con la consiguiente perdida de precision (salen escalones en la señal reconstruida). El dilema, es mejor hacer filtros de menor orden y ponerlos en cascada? o desprecio algunos bit mas significativos que seguro que son CEROS??
Un saludo y gracias


----------



## FARITRON

hola, es que nadie ha implementado un filtro FIR en una placa Spartan??? una ayudita. Un saludo


----------



## josedavid

Faritron, existe una opción utilizando Sytem Generator de Matlab y FDA tols que permite utilizar simulink para genera el código HDL.


----------



## Ferny

> Hola, tengo una placa Spartan 3E 1600, estoy haciendo un filtro de audio  FIR con el metodo MAC (multiplicaciones y sumas),  el problema viene  del numero de bit, la muestras tienen 14 bit y los coeficicentes los  codifico con otros 14 bit, esto hacen 27 bit con signo al multiplicar.  Utilizo filtros de orden 14, con lo que tengo 14 sumas y añadir un bit  en cada suma, esto hacen 41 bit. La salida la hago a través de un  conversor D/A de 12 bit por lo que desprecio muchos bit con la  consiguiente perdida de precision (salen escalones en la señal  reconstruida). El dilema, es mejor hacer filtros de menor orden y  ponerlos en cascada? o desprecio algunos bit mas significativos que  seguro que son CEROS??
> Un saludo y gracias



Es mejor que desprecies bits por arriba, que generalmente serán cero, y que satures la salida en caso de que el valor sea mayor.

Si por ejemplo tienes 41 bits, prueba despreciando 8 bits, y en caso de que el valor supere los 41-8=33 bits, saturas la salida del filtro a 2^33-1 (en hexadecimal, todos los bits a uno o sea 0x1FFFFFFFF)

Suerte


----------



## Basalto

Hola buenas a todos, es la primera vez que entro en esta sección. En la universidad trabajamos con los Coolrunner II. Yo quiero avanzar en mi aprendizaje y estoy pensado en comprarme este kit http://es.farnell.com/xilinx/sk-crii-l-g/kit-arranque-coolrunner-ii-lo-pwr/dp/1670944. ¿Me vale la pena, deberia de cambiar de chip o kit? Un saludo espero poner ejemplos pronto


----------



## carontester

ayuda fpgas, GAL, programar simular....
hola hace uns dias un profe me pidio le ayudara a entender como programar una gal la GAL18V10B, 20LP, B626J05,, lo unico que me proporciono el inge es el libro "VHDL arte de programar Sistemas Digitales Maxinez , Alcala", que te explica mas o menos como esta la jugada, y hasta donde llevo leido creo entenderle, el problema viene a la hora de programar el codigo y tratar de simularlo sobretodo, como te menciono hasta hace unos dos dias en mi vida habia agarrado algo de esto (solo conocia los micros y sus softwares programadores/simuladores), el inge en cuestion me dio el warp 6.1, con el que programo, o intento programar, pero segun veo luego se me amensa feo el software, ya que me pone error en programas y codigo que en teoria esta bien (tambien he checado que algunos ejemplos del libro vienen con errores, o eso creo, al meterlos y compilarlos en el soft), y que en ocaciones codigo que ya he compilado, y me ha dicho que esta bien, al meterlo de nuevo me marca errores al compilarlo, otra dificultad es que no aparece el modelo de mi gal la GAL 18V10B, dentro de los modelos que te da para escoger, sabras como hacer para que aparesca como se agregaria o con cual software podria programar para este GAL????, otra bronca es que no he podido lograr simular nada de lo que he logrado compilar sin errores, me marca cosas como "unknown automation function called", design does not contain verilog source files verilog simulation cannot be started....., segun investigue para que no de broncas el programa .vhd que debes de abrir para programar es qel que se genera en el directorio del proyecto no?, y que debe de ser compilado en el galaxy con las opciones de timming model formato 1164/VHDL, y activado el enable testbench output, cosa que si hago, pero me tira ese error en el active vhdl ver 3.3 que se instalo junto con el warp release 6.1, te agradeceria bastante me ayudaras, y gracias por leer este extenso post espero me hayas entendido, y puedas ayudarme , bye


----------



## yeestrada

Hola a todos, actualmente estoy aprendiendo a trabajar con FPGA mediante la herramienta Xilinx 12.1, tengo en mi poder un Spartan 3E. Sucede que actualmente me encuentro enfrascado en empotrar un sistema operativo petalinux (v0.4) en el Spartan para hacer uso del Stack tcp/ip que tiene incluido. Pero sucede que no entiendo bien como hacerlo. Necesito si alguien ya ha logrado realizar este objetivo, que me de, si es posible, al menos una guia mínima para lograr el sistema operativo en el fpga.

gracias y saludos
yordan


----------



## Chico3001

posiblemente sonara obvio, pero el spartan ya tiene compilado algun CPU?? y si es asi esta soportado en la distribucion de linux que le quieres colocar?


----------



## yeestrada

A que te refieres con algun CPU??


----------



## Chico3001

Un CPLD o un FPGA solo contienen logica digital sin conectar, y para usarlos necesitas programarles algo... en tu caso necesitas programarles algun procesador, para despues instalar el petalinux


----------



## yeestrada

Bueno el Spartan 3E cuenta con el microblaze y tengo entendido que el petalinux viene optimizado para microblaze.

saludos
yordan


----------



## jaumegs

Tanto Xilinx y Altera poseen los procesadores MicroBlaze y Nios II, respectivamente, ambos capaces de ejecutar una versión ligera de Linux.

Saludos.


----------



## joselo27

Ferny dijo:


> La spartan 3E 1600 es más completa que la nexys 1200, tiene una FPGA más grande (1600 kpuertas frente a 1200 kpuertas), el doble de RAM (32MB frente a 16MB) que es muy útil si vas a implementar un microprocesador para tu aplicación, también tiene más periféricos (ethernet, LCD...)
> 
> Para una aplicación de audio, piensa cómo vas a "meter el audio" en la FPGA. La 1600 tiene un convertidor ADC, que te puede resultar muy útil para esto. La 1200 creo que no.



una pregunta sabe como puedo calcular los coeficientes de un filtro digital sin  utilizar algún tipo de software, y si tiene tiene información acerca de como realizar el código en vhdl le agradeceria,.,.,.


----------



## tavogus

Hola a toda la comunidad. Estoy comenzando con esto  de los fpga, quisiera saber si alguien sabe donde pueda comprar un FPGA en México de antemano muchas gracias……… 
                                              saludos


----------



## Chico3001

Que yo sepa solo Newark, Arrow, Mouser o Digikey.... y taaal vez en AG electronica...


----------



## farmcorp

excelente lo de la bibliografía 

gracias por los libros publicados


----------



## joselo27

tavogus dijo:


> Hola a toda la comunidad. Estoy comenzando con esto  de los fpga, quisiera saber si alguien sabe donde pueda comprar un FPGA en México de antemano muchas gracias………
> saludos



pidela directamente de digilent ,... 
escoje la que quieras y se acomode a sus necesidades

http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,400&Cat=10&FPGA



Ferny dijo:


> No lo he usado nunca, pero al ser una placa bastante conocida es posible que buscando encuentres alguna aplicación donde se use el ADC. También es posible que con la documentación de la tarjeta te vengan archivos de ejemplo.



ola ferney nuevamente por aquí llenándolo de interrogantes, 

1_) primero gracias por los concejos en preguntas pasadas que me llevaron a sacar un proyecto de reconocimiento de voz con 4 comandos elaborado y llevado a cabo totalmente en la fpga.

2_) ahora mi pregunta y es acerca de la spartan 3e 1600 ya que estuve viendo el manual de la misma y me he encontrado que contiene un microprocesador, una memoria sram, un cpld todos allí... me gustaría saber si sabe como programar ese microprocesador y la sram ya que las necesitaria pera llevar a que mi proyecto sea de mejor calidad y mas exacto a la hora de hacer el analisis de los comandos, ya que lo unico que se es que todos se conectan a la fpga, 


como siempre gracias por su valioso tiempo.,,,.,.


----------



## Ferny

Hola

El micro no está físicamente en la placa, sino que se refiere a que dentro de la FPGA puedes implementar el Microblaze, que es el micro de Xilinx. Para ello y para usar la RAM que tienes fuera (que sí está físicamente), utiliza el Xilinx EDK, es un constructor de "sistemas", en él especificas todo lo que va a tener tu sistema: un procesador Microblaze conectado a una RAM, salidas y entradas digitales, etc... tiene muchos módulos ya hechos a tu disposición. Además te proporciona una interfaz para programar lo que el micro va a ejecutar, en lenguaje C / C++.

Lo bueno es que te hace casi todo él solo, por ejemplo para usar la SRAM simplemente le tienes que indicar qué SRAM es (la referencia del chip), y él ya tiene el driver incorporado y se encarga de "unirlo" al procesador. Te recomiendo que pruebes con los ejemplos que traiga el EDK, que los trae también para tu placa de evaluación, y hagas ejemplos sencillos como encender un led a través del software del micro, así te vas haciendo a la idea de cómo funciona.

Un saludo


----------



## joselo27

Gracias por su pronta respuesta voy a comenzar a trabajar con esa herramienta que me dices,.,.,.


----------



## joselo27

jaumegs dijo:


> Tanto Xilinx y Altera poseen los procesadores MicroBlaze y Nios II, respectivamente, ambos capaces de ejecutar una versión ligera de Linux.
> 
> Saludos.



ola la presente es para ver que tanta información me puedes brindar sobre el microblaze de xilinx

muchas gracias por su atencion,.,.,.


----------



## Ferny

No tengo más información que la que puedas encontrar en la ayuda del Xilinx EDK. De todas formas es un micro del cual seguro que encuentras lo que necesites en una búsqueda en google, ya que es muy usado.

Yo cuando lo he utilizado no me he preocupado de ver lo que tiene, al final con el EDK construyes un sistema con el micro, memoria, periféricos y tal, y luego tienes otra ventana para escribir el código C++ que va a ejecutar... con lo cual ni es necesario que sepas lo que hace internamente ya que eso te lo soluciona el EDK.


----------



## joselo27

como siempre gracias por su atención y tenes razón hay mucha información acerca de ello,.,.,.,


----------



## abraren

un video completo de como hacer un sencillo programa en Spartan 3


----------



## abraren

hola amigos del foro una pregunta, la Spartan 3E posee convertidor analogico digital o es necesario acondicionarla por ejemplo con un ADC0804


----------



## Ferny

Si te refieres a la placa Spartan 3E Starter Kit, trae un convertidor analógico digital incorporado (el LTC1407)

http://www.xilinx.com/support/documentation/boards_and_kits/S3E_Starter_Schematic.pdf (página 11)


----------



## abraren

hola ferny como estas, te hacia esta pregunta porque deseo hacer lo siguiente:

Estoy realizando un sistema de control para un regulador de voltaje utilizando MOSFET IRF630 que iran junto a un transformador, bueno la idea es que todo el sistema de control este trabajando dentro de la spartan3 para lo cual necesito sensar el 2 voltajes el de la red electrica obviamente no los 120 V de AC sino unos 5 V AC que me parece soporta la tarjeta a una frecuencia de 60 Hz, y ademas debo medir  una señal de DC en la carga que la consigo a traves de un rectificador. 

De esta manera con las dos señales puedo trabajarlas en la FPGA y tener mi señal de control para dos MOSFET, el sistema de control lo he ralizado en simulink y ahora lo estoy adaptando utilizando el xilinx system generator de simulink para conseguir lo propuesto.

El problema es que no tengo idea de un circuito para adaptar las señales de la linea electrica para poder realizar el control, alguien me decia programar el ADC de la misma tarjeta pero como que es un poco complicado el asunto y la verdad no me arriesgo a estropearla, ademas estaba pensando en utilizar optoacopladores4N25 o un comparador NTE943, para conseguir que la señal de AC se convierta en una señal cuadrada (es decir medio ciclo positivo un 1 logico, y medio ciclo negativo un 0 logico) y de ahi si a la tarjeta.

No se si la idea es buena o que opinas...


----------



## Ferny

Busca por los foros o en google "detector paso por cero", es lo que buscas. Te generará un pulso "1 lógico" a cada paso por cero de la onda de 120VAC. También los hay que se ponen a "1 lógico" en los semiciclos positivos y a "0 lógico" en los semiciclos negativos.

También lo puedes plantear de otra forma, más interesante para aprender pero más compleja en sí, y es sensar con el ADC el voltaje de la línea, pero eso implica:

1- Usar un transformador para aislarte y bajar los 120VAC a algo "manejable" (por ejemplo un transformador de 120VAC a 6VAC)
2- Un divisor de tensión a la salida del transformador tal que la tensión que maneje esté entre 0V y 2.5V (no digo hasta 5V para no estar al límite de lo que soporte el ADC, por eso por ejemplo que en condiciones normales llegue sólo a la mitad de su rango).
3- Llevar esa señal "limitada" al ADC.
4- Hacerte un driver en VHDL para leer esa tensión desde el ADC, y de ahí llevarla a un comparador para saber si estás en una zona determinada de la onda o en otra.

La ventaja del circuito detector de paso por cero es que a la FPGA le entran directamente señales digitales y te evitas el engorro de hacerte el driver para el ADC (que si no manejas bien el VHDL puede ser complejo, pero muy bonito si lo que quieres es aprender!!)


----------



## abraren

Hola de nuevo estoy intentando realizar un multiplicador de frecuencias utilizando las herramientas de Xilinx blockset, el diseño que tengo en simulink es utilizando un PLL con un flip-flop formando lo que seria un sintetizador de frecuencias; bueno ahora estoy viendo que para implementar en la Spartan 3E el multiplicador se deberia diseñar un DPLL (PLL digital). Alguien puede sugerir alguna otra alternativa, adjunto un documento que encontre en la internet.


----------



## volrok

Necesito desarrollar una controladora ATA y creo que para ello lo mejor es utilizar un FPGA, he visto algunos Kits de desarrollo con conexion SATA, lo que no se es que si dentro de la lógica de programación de estos kits traen de alguna forma embebido o algun tipo de soporte a comandos ATA.
Tambien he leido en este topico que recomiendan algunas marcas como ALTERA para lo que estamos iniciando en este mundo, con mi objetivo de desarrollar una controladora ATA Cuál me recomiendan?

Si alguien tiene experiencia en esto le agradecería su ayuda.


----------



## abraren

Entiendo que tu preguntas por una controladora no la interfaz. La interfaz P-ATA es de logica TTL y puede ser facilmente manejada por FPGA's y puede necesitar un tipo de traduccion de nivel. S-ATA puede ser manejado por la mayoria de los FPGA's sin embargo implica una logica compleja (IP Cores) y son bastante caros. 
La interface ATA/IDE ya ofrece lectura y escritura de sectores un controlador basico posiblemente puede añadir un bufer de datos eso no es problema para un FPGA. Solo a modo limitado la lectura de un sector de arranque seria razonable para implementar en un diseño VHDL.


----------



## volrok

abraren dijo:


> Entiendo que tu preguntas por una controladora no la interfaz. La interfaz P-ATA es de logica TTL y puede ser facilmente manejada por FPGA's y puede necesitar un tipo de traduccion de nivel. S-ATA puede ser manejado por la mayoria de los FPGA's sin embargo implica una logica compleja (IP Cores) y son bastante caros.
> La interface ATA/IDE ya ofrece lectura y escritura de sectores un controlador basico posiblemente puede añadir un bufer de datos eso no es problema para un FPGA. Solo a modo limitado la lectura de un sector de arranque seria razonable para implementar en un diseño VHDL.



Hola gracias por tu respuesta, pero tengo hartas dudas y espero que me puedas ayudar.
Lo que necesito hacer, es lograr leer un sector en un disco duro.
Se que para eso necesito un FPGA, y como dijiste esto implica una logica de IP cores.
Entonces una vez que se implementa un IP core en el fpga, se supone que uno envía una señal por el pin de lectura solicitando leer un sector del disco duro y otro pin devuelve la información.
Es así el funcionamiento?

De ser así, a través de que puerto del computador podría enviar esa señal para poder leerla?
En un ip core que esta en opencores.org existe un diseño para una controladora ATA la cual dice "wishbone compatible", sabes que significa eso?

Gracias

Andrés


----------



## LUIFER61

En Barranquilla a donde dictan Cursos de FPGA's

Atte.

Luis Fernando Vergara P.

317-7707077


----------



## mfsanchezl

Hola a todos, estoy haciendo un juego de memoria para implementarlo un spartan 3E, y necesito hacer un periferico para generar las figuras aleatoreamente lo tengo que hacer con vhdl...no se como empezar...alguien me puede ayudar


----------



## cristianmath

Hola amigos del foro , saludos para todos escribo este post con la finalidad de pedir ayuda , comentarios , criticas , opiniones y sugerencias sobre un proyecto que debo desarrollar , con una FPGA Espartan 3E .


como ya escribí en un  post anteriormente , sobre el proyecto de de detector de distancia , lastimosamente  no recibí  respuesta , pues e avanzado un poco , pero tengo un problema  con la comunicación serial  ENTRE EL SENSOR Y LA FPGA  , 

NECESITO AYUDA ¡¡¡¡¡  por favor si alguien tiene una idea , alguna explicación ,comentario estoy dispuesto a escuchar cualquier sugerencia , de antemano muchas gracias , 

Espero su ayuda .....:


----------



## pou

eup! hay va una lista de vendedores de placas entrenadoras, es un poco locura leerse todo 
http://www.fpga-faq.org/FPGA_Boards.shtml
hay una que para españa igual esta bien, (de Alemania, y mas barato que farnell por decir alguna):
http://shop.trenz-electronic.de/cat...4_119&osCsid=988ec6525655c6b4f48e83d600cd4253

y aqui otra entrenadora, creo que es libre (no se si es vieja, ya no me entero, pego unas cabezadas que voy a partir el teclao )
bueno, haber si es de provecho
eeepa! la pagina jej: http://www.iearobotics.com/personal/juan/doctorado/jps-xpc84/jps-xpc84.html


----------



## cepillillo

Necesito contralar el adc y el dac de la fpga spartan 3an usando simulink. si puediera ayudarme.
Muchas gracias


----------



## Aradmagol

Que tal, yo llevo poco con esto de las FPGA´s tengo una BASYS 2 y tengo una duda, respecto a los osciladores, el RCCLK como se utiliza? y conocen una matricula para el oscilador externo que se le coloca en UCLK? Gracias por su atención


----------



## jaimepsantos

Para conectar el pin del reloj es B8 en la declaracion del *.ucf


----------



## Aradmagol

Si de hecho ese el que utilizo, solo que me entro la curiosidad respecto al oscilador UCLK (externo) y principalmente al oscilador RCCLK, del cual no he encontrado mucha información, por ello mi pregunta anterior, aun así te agradezco por responder pronto.


----------



## Giovanni Brenes

Hola como estan todos? yo soy nuevo aca! y mi pregunta es la siguiente quiero iniciarme en el mundo de las FPGA asi que me intereso mucho estos comentarios, ahora bien mi pregunta es que los primeros links de los libros ya no sirven y era para ver si alguien los tenia o si me recomendaban algun libro en especial para asi entender mejor la programacion! GRacias por sus respuestas!!


----------



## fms

Yo no he usado ningún oscilador externo, pero el manual de referencia de la Basys 2 indica que se puede usar cualquier oscilador. Si la aplicación requiere un oscilador con una estabilidad mayor que el que trae la tarjeta, conviene que sea uno de cristal de cuarzo. En el manual dan un ejemplo de oscilador SG-8002JF-PCC. Aunque parece que éste ya no lo tienen, y podría valer cualquier otro que tuviese 4 pines, que se pueda meter en un zócal DIP y tuviese similares características.
Por ejemplo, he visto en otros proyectos que han usado este: ACHL-25.000MHZ-EK.

Para los libros, quizá te puedan valer estos dos:
Diseño de circuitos digitales con VHDL
Diseño de sistemas digitales con VHDL

Saludos


----------



## hugochdez

Puedes verificar en este link algunos libros que recomiendan:
http://www.linkedin.com/groups/Libros-sobre-FPGA-VHDL-3742759.S.43337213

Yo te recomiendo estos libros:

FPGA Prototyping by VHDL Examples:Xilinx Spartan-3 Version, By: Pong P. Chu 
VHDL el arte de programar sistemas digitales. Jessica Alcala Jara & David G. Maxinez.
Digital design, Morris Mano M, 2007,4ª edición. Pearson Prentice Hall. 
Circuit Design with VHDL. Volnei A. Pedroni. MIT Press.

Saludos


----------



## Ale008

Hola, han probado programar FPGA con labview ?


----------



## reallink

hola soy mu nuevo en esto de fpgas y vhdl, pero mas o menos tengo una idea de que es una programación a un dispositivo con muchas compuertas en su interior.
mi duda es que dispositivos puedo adquirir para programarlos, he estado buscando en la pagina de internet de la tienda de electrónica de mi ciudad y no encuentro nada acerca de fpgas o vhdl.
le dejo el link de la pagina.
http://www.carrodelectronica.com/store/


----------



## chclau

Los dos principales proveedores de FPGA son Altera y Xilinx, busca en sus paginas, tenes kits muy buenos incluso por precios de 50 a 100 dolares.


----------



## reallink

alguno en especifico que me puedas recomendar?, pero  de las paginas que me comentas si hacen envíos internacionales?


----------



## chclau

A mi personalmente me gusta Altera, que yo sepa envian a todo el mundo pero te doy un consejo, busca si tienen un distribuidor en tu pais que quiza tenga tarjetas en stock y podes ver en vivo de que se trata.

Cualquier tarjeta economica que te compres con un Cyclone te va a servir, yo te aconsejo III o IV, del tipo que ya vienen con soporte para NIos que es un procesador que Altera utiliza. En estos dias Altera esta haciendo la transicion a ARM Cortex A9 en los Cyclone V pero esos vas a tener que esperar, me parece, bastante hasta que esten disponibles. Me parece que para empezar para la parte de procesador el Nios esta bien, y obviamente tenes toda la parte de sintesis de HW con el FPGA. Entre procesador y logica programada podes hacer cosas muy interesantes, creeme que agotar realmente el potencial de esas tarjetitas te va a llevr un monton, no hay necesidad de comprar nada mas caro.

Es tambien cuestion de gusto personal, cuando yo me compre la mia podia elegir entre una con LCD y muchos pulsadores u otra con Ethernet y DDR y escogi esta ultima para hacer experiencias con conexiones a memorias rapidas. Volvi a mirar los precios y en el sitio de Altera estan entre 80 y 150 dolares.

De nuevo te recomiendo verificar en forma local para evitar dolores de cabeza de envio, impuestos aduaneros y etc. y ver en persona lo que compras siempre es preferible.

Suerte

Agrego como nota que el Cyclone V dev. kit teoricamente ya se puede encargar pero vale 1600 dolares y si te fijas tienen cero en stock, no me extrañaria que aunque tuvieras y quisieras gastar la plata en el, les lleve unos cuantos meses proveerlo.


----------



## reallink

estoy aquí buscando un poco de orientación con los expertos, soy de los que piensan que lo barato termina saliendo caro, pero pues la verdad solo quiero un kit para empezar y hacer practicas sencillas de mi escuela y quisiera saber que opinan acerca de este kit.
http://www.ebay.com/itm/ALTERA-Core...621?pt=LH_DefaultDomain_0&hash=item416f2b5b3d
muchas gracias por su ayuda


----------



## chclau

es un dispositivo ya viejito y limitado, te recomiendo si podes tratar de comprar uno que tenga al menos Cyclone II o III.


----------



## MiloHoffman

Saludos a todos!...

Una duda, Altera, al ofrecer sus tarjetas de desarrollo FPGA, dice, por ejemplo 20,000 LEs... Xilinx por su parte dice 1200K gates...

¿Eso que significa? ¿Una LEs es igual a 1 gate, son lo mismo? ¿O cuál es su diferencia?...

Gracias...


----------



## chclau

Por lo que yo se, Altera define sus elementos logicos como LEs, y Xilinx como LCs.

Son parecidos, pero varian de familia a familia. Un LE consta de una tabla look-up de varias entradas para implementar funciones logicas, y de uno o varios flipflops. Un LC, es lo mismo.

Gate count es un concepto del mundo de ASICs y en general no se aplica a FPGAs.

El tema se complica mas por la gran cantidad de bloques especializados que tiene un FPGA de estos dias, como ser bloques de memoria, SERDES, bloques DSP (MAC), procesadores y un muy amplio etcetera.

De todos modos ambos fabricantes suelen publicar tablas comparativas entre dispositivos...

Te diria que no te compliques mucho con esto si es que recien empezas, elegi el que te parezca mas comodo para trabajar y dale para adelante.


----------



## mayron

alguien sabe como desarrollar una ruta de datos? o si tienen alguna literatura acerca de este tema. Gracias.


----------



## Hellmut1956

Hola amigos, como el familiar inscrito en la universidad este año acaba su carrera, pienso aprovechar el comprarme a precios para estudiantes un placa para aprender la programación en VHDL. En mis circuitos me bastarán CPLDs, pero ya Xilinx noi ofrece el único kit que teníam, el "CoolRunner II Starter Kit". Pienso adquirir el "Nexys™4 Artix-7 FPGA Board" de Digilent por solo 159.- USDs, lo que gracias a Putin y Obama actualmente son unos 110.- Euros. Como me toca ahorrar espero comprarla en Abril/mayo de este año.

Tengo una pregunta sobre la programación de los FPGAs de Xilinx. Hace ya bastantes años, cuando espereaba avanzar mas rápido con el modelo de mi velero radio controlado para el cual quiero hacer una interfaz intelligente, me conseguí el "Platform Cable USB II".  Componente que conecta el PC con una placa con un interfaz definido para programar componentes de Xilinx. esto aún se requiere y es apoyado por las IDEs actuales, entre otras Vivado y Webpack? No encontré ya referencia alguna!


----------



## chclau

Si no me equivoco la tarjeta que vas a comprar no necesita cable programador, el adaptador de USB a JTAG esta "built in" como ya es costumbre en las placas de desarrollo de FPGAs ultimamente.


----------



## Hellmut1956

Gracias por responder chclau. Efectivamente así es. Pero como esas placas solo son para aprender, así que mas Tarde se puede aplicar/usar lo aprendido e integrar un FPGA en un circuito propio, entonces ese circuito necesita ser accesible por JTAG y allí es donde entra el asunto de mi pregunta, en mi caso el cable HW-USB-II-G y su aplicabilidad.


----------



## chclau

OK entiendo la pregunta. Personalmente lo ultimo que use de Xilinx fue el ISE hace ya unos 5 años... desde ese entonces estoy con Altera. Entiendo que ese Vivado es una plataforma nueva... pero te diria que no creo que tengas problemas con el cable por el cambio a la nueva plataforma. 

Los conectores de JTAG no cambian casi nada, en Altera todavia podrias usar teoricamente el Byte Blaster por puerto paralelo sin problemas (salvo la velocidad lenta). Puede ser que salgan cables mas rapidos pero apostaria a que el tuyo anda sin problemas (de ultima creo que lo podes comprobar vos mismo una vez que tengas la tarjeta en tu poder).


----------



## joselo27

Buenas 

¿Que tipos de tarjetas de FPGA tienen hardware abierto? 

¿Como puedo programar el chip FPGA en un diseño de PCB propio?

¿Como usar el plataform cable usb II para programar la FPGA y la SPI?

Gracias por su atención.


----------



## savad

Hola, 
Viendo que casi todos usan FPGA's, que clase de proyectos escolares necesitan tanta lógica?, Yo creo que para aprender el CPLA de altera ATF750c es más que suficiente para trabajos de escuela,  20 Flip-flops en 10 macro-celulas y por solo $4 us en digi-key. No necesita un programador o tablilla especial, ya que cualquier programador universal de memorias lo puede programar (En la gran mayoria de las escuelas, el lab tiene al menos uno). El software es gratis y facil de aprender ... WinCupl. Asi que puedes crear tu proyecto, simularlo y hacer documentación sin necesidad de tener el chip físico.
Creo que es una buena alternativa para empesar a aprender y solo te cuesta ...tu tiempo.
Ademas una vez que aprendes Wincupl ... de pilón puedes programar cualquier PAL o GAL para proyectos más pequeños ... hasta 10 estados con el GAL22V10.


----------



## Hellmut1956

Hola amigos, como desde mi patatuz y problemas con el ritmo cardiaco el último año tengo problemas concentrarme por tiempo prolongado en un tema, varío para seguir entrenando mi ordenador biológico entre las 2 orejas y así también me estoy metiendo en el diseño digital, que a la larga es lo que se mete como resultado en un PLD.

Una cosa que me había molestado durante bastante tiempo, probablemente por lo metódico que mi mente con genética alemana requiere, es lo que en inglés llaman el "workflow" o processo de desarrollo, usando por ejemplo el Webpack de Xilinx.

Como estoy metiendome en lo profundo de la electrónica análoga estudiando el curso "Real Analog: Circuit 1", aproveche tiempos de recuperación estudiando los otros cursos ofrecidos a través del sitio de "Diligent" y me encontré con estos 2 tutoriales sobresalientes que entre otras describen en detalle el proceso de un proyecto en el entorno del webpack de Xilinx. "Real Digital - A hands-on approach to digital design"y "Introduction to Diligent Digital Design: From VHDL to FPGAs".

Lo que quiero resaltar es, que el proceso de programar un PLD es, como waltergallego muy bien escribe aquí en el foro, mas que el escribir código en VHDL o Verilog y lograr programar un PLD con el resultado. Es un proceso que requiere sistematizar el proceso para lograr resultados estables y en caso ideal reutilisables. Estos cursos de forma sistemática pasan de introducir el webpack de Xilinx, de generar un circuito usando un esquema dentro del entorno del webpack a la generación automática del código VHDL, para así demostrar que el entrar el código usando el lenguaje VHDL, el que se agrega al entorno del código que se definió al iniciar el proceso relacionado a un proyecto en el Webpack. Todas las iniciaciones relacionadas a la componente seleccionada, etcétera, son generadas por el entorno y el código deseado solo se agrega en el sitio evidente en el código de inicialización automáticamente generado por el webpack.

Luego introduce otros elementos del proceso, hasta que, lo que a mí me faltaba, aunque parezca elemental, el como generar una test bench. Test bench es un archivo que aplica al circuito diseñado los pulsos deseados en las entradas, lo que permite verificar que el circuito diseñado realmente hace lo que era la intención. Y así sigue en el proceso hasta acabar ir aplicando el resultado al PLD seleccionado.

Yo pienso comprarme la placa Nexys™4 Artix-7 FPGA Board de Digilent pues también permite usar el nuevo entorno de Vivado y a condiciones académicas solo cuesta unos 120.- Euros. Es la ventaja de estar jubilado y tener el tiempo para estas investigaciones!

Vale la pena estudiar los cursos ofrecidos en el sitio de Diligentinc.com bajo la ceja "classroom". Ojalá hubiera tenido tales oportunidades cuando visité la universidad aquí en Alemania.


----------



## yese13911

este se puede emplear con la tarjeta basys


Ferny dijo:


> Hola
> 
> Les dejo con abundantes comentarios explicativos un ejemplo que genera el efecto de las luces del coche fantástico. Simplemente necesitan asignar los pines de la señal de reloj, reset (activo a nivel bajo, o sea un '0' es reset y un '1' es funcionamiento normal), y 8 salidas de leds. Si tienen un número distinto de leds en la tarjeta, creo que es sencillo de ver las modificaciones a realizar...
> 
> Para cualquier duda sobre este u otro ejemplo den un toque por aquí
> 
> 
> 
> Código:
> 
> 
> library ieee;
> use ieee.std_logic_1164.all;
> use ieee.std_logic_arith.all;
> use ieee.std_logic_unsigned.all;
> 
> entity efecto_leds is
> port (
> clka : in std_logic;                        -- Reloj 50MHz
> res  : in std_logic;                        -- Reset activo a nivel bajo
> led  : out std_logic_vector(7 downto 0)     -- LEDs
> );
> 
> end efecto_leds;
> 
> architecture rtl of efecto_leds is
> 
> -- Contador de tiempo. La idea es ir contando ciclos de reloj hasta llegar a un
> -- número determinado, con el objetivo de medir tiempos. Mi placa tiene un reloj
> -- de 50MHz, lo que equivale a un periodo de ciclo de 20 nanosegundos. Como quiero
> -- medir tiempos de 100 milisegundos, la cantidad de ciclos que debo contar es de
> -- 100*10^(-3) / 20*10^(-9) = 5.000.000
> -- Por tanto el valor de la constante que indica cuándo se ha alcanzado ese número
> -- debería ser igual a 5.000.000, pero he puesto 4.999.999, esto es porque el valor
> -- "cero" del contador también vale, luego hay que restar 1 al número calculado si
> -- quieren que el tiempo sea exaco (en este ejemplo el error sería sólo de 20ns,
> -- pero según qué caso se podría cometer un error más gordo, sólo aviso para que
> -- las cosas se hagan bien desde un principio...)
> signal   contador :  STD_LOGIC_VECTOR(31 downto 0);
> -- La función conv_std_logic_vector convierte un entero a un std_logic_vector del
> -- número de bits que se le indique en el segundo argumento (32 en este caso)
> constant CIEN_MS  :  STD_LOGIC_VECTOR(31 downto 0) := conv_std_logic_vector(4999999, 32);
> -- Esta señal dará un pulso a '1' de duración 1 ciclo de reloj cada 100ms
> signal   prsc     :  STD_LOGIC;
> -- Dirección de los leds, a derecha o izquierda (según se mire la placa, claro)
> signal   dir      :  STD_LOGIC;
> -- Señal para uso interno. Esta señal se usa porque dentro del código VHDL se va a
> -- "leer" el valor de los leds para saber cuál hay que encender según el estado en
> -- que estén. Si tratan de leer una señal de tipo out, verán un lindo mensaje de
> -- error. Por eso esta señal es necesaria, porque las señales "internas" sí se leen
> -- sin problemas
> signal   leds_i   :  STD_LOGIC_VECTOR(7 downto 0);
> 
> -- Bien, empecemos
> begin
> 
> -- Se asigna en todo momento el valor de la señal interna de estado de los leds a
> -- la salida de los 8 leds. Fíjense que es asíncrono, no depende de ningún reloj,
> -- aunque la señal leds_i sí está dentro de un proceso síncrono
> led <= leds_i;
> 
> -- Proceso que genera el prescaler, señal que se pone a '1' durante 1 ciclo de reloj
> -- cada 100ms
> PRESCALER : process(clka, res)
> begin
> if (res = '0') then
> contador                       <= (others => '0');
> prsc                           <= '0';
> elsif rising_edge(clka) then
> if (contador = CIEN_MS) then   -- Si llega al final, pone el contador a cero y activa el prescaler
> prsc                       <= '1';
> contador                   <= (others => '0');
> else
> prsc                       <= '0';
> contador                   <= contador + x"00000001";
> end if;
> end if;
> end process;
> 
> -- Proceso que genera el efecto de los leds
> LEDS_OUT : process(clka, res)
> begin
> if (res = '0') then
> leds_i                         <= (0 => '1', others => '0'); -- El led de la derecha se inicializa encendido (¡es necesario inicializar un led encendido!)
> dir                            <= '0';
> elsif rising_edge(clka) then
> if (prsc = '1') then                                         -- Si llega el prescaler
> if (dir = '0') then                                      -- Si están moviéndose hacia la izquierda
> if (leds_i(7) = '1') then                            -- Y está activo el led de más a la izquierda
> dir                <= '1';                       -- Se cambia la dirección
> leds_i             <= "01000000";                -- Y se activa el led de su derecha
> else                                                 -- Si no está activo el led de más a la iquierda
> leds_i             <= leds_i(6 downto 0) & '0';  -- Se desplazan todos una posición a la izquierda
> end if;
> else                                                     -- Si están moviéndose hacia la derecha
> if (leds_i(0) = '1') then                            -- Y está activo el led de más a la derecha
> dir                <= '0';                       -- Se cambia la dirección
> leds_i             <= "00000010";                -- Y se activa el led de su izquierda
> else                                                 -- Si no está activo el led de más a la derecha
> leds_i             <= '0' & leds_i(7 downto 1);  -- Se desplazan todos una posición a la izquierda
> end if;
> end if;
> end if;
> end if;
> end process;
> 
> -- Y fin
> end rtl;


----------



## Hellmut1956

Hola amigos, finalmente mi pedido de cosas para estudiar electrónica análoga están con Fedex en Alemania y me llegarán la próxima semana. Como he sido incapaz de encontrar mi protoboard me compré una nuevo en ebay. Estudiando material disponible en el sitio de Analog Devices entre otras aprendí que para realmente entender el comportamiento de circuitos armados en un protoboard hay que tomar en consideración el efecto de tener pistas adyacentes, lo que equivale a un capacitador. Metido en esto me decidí finalmente armarme en ese protoboard un circuito que quiero realizar usando un CPLD de Xilinx, el tipo es XC9536XL. Después de intensas investigaciones pude averiguar que la última versión del Webpack de Xilinx que apoya esa componente es la versión 13.3, siendo 14.7 la actual.

Tengo pensado, cosa que va a ocurrir esta primavera, es armar una placa para experimentar con el CPLD XC9536XL. las componentes ya las tengo y voy a armar una plaquita en la cual el XC9536XL podrá ser encajado en el protoboard. Haré un paso a paso que quizá interese a alguno, entre otras porque el costo es mínimo y con la protoboard súper flexible. Creo, como escribió alguien en este hilo refiriéndose a un CPLA de Altera, lo que me imagino es equivalente a los CPLDs de Xilinx, los FPGA son excesivamente grandes. Creo que realmente para aprender y para aprovecharse de las capacidades de un CPLD y realizar circuitos simples pero útiles en la práctica las densidades ofrecidas mas que alcanzan!

Confieso que no soy bueno en eso de ecuaciones lógicas, pero como en todo, usarlas y experimentar me dará el acceso. Ademas pienso comprar la Suite académica de Matlab y Simulink y me meteré en los asuntos matemáticos!


----------



## lunat1ks

Buenas noches,  intento hacer un codigo con ps2 y que la tecla que teclee la arroje en un monitor, estoy ocupando una FPGA ALTERA DE2 y mi programación es en verilog, ocupo el modulo ps2 y el vga, tienen algun codigo que me puedan prestar para visualizarlo y ver que me sirve, Gracias de antemano.


----------



## Kazuo

hola a TODOS una consulta...
soy nuevo en esto de los FPGAs y tengo un proyecto para realizar la cual incluye varios puntos...

pero primero quisiera saber como es que puedo garantizar la TX y RX mediante el puerto ethernet con protocolo UDP del chip DM9000A?? me digeron que se lo programa pero no entiendo mucho este codigo que esta en el guia 
UINT16 IOaddr;	/* UINT32 IOaddr=0x19000000; for example defined in ARM-base HPI BANK3*/

void iow ( UINT16 register, UINT8 dataB )
{
outb (register, IOaddr);	/* I/O output a Byte to INDEX port, select the register */
outb (dataB, IOaddr+ 4);	/* I/O output a Byte to DATA port, WRITE the register data */
}

UINT8 ior ( UINT16 register )
{
outb (register, IOaddr);	/* I/O output a Byte to INDEX port, select the register */
return inb (IOaddr + 4);	/* I/O input a Byte from DATA port, READ the register data */
}

o si tuvieras otra forma de programarlo seria magnifico

saludos


----------



## daca1953

Hola, como estan?
Estos ultimos meses he estado practicando con las FPGA´s y la programacion en VHDL, lo hacia con las tarjetas que prestan en la universidad pero ya ue estoy en vacaciones me gustaria adquirir una, pero estoy entre la BASYS 3 de Xilinx y la NEXYS 4 tambien de Xilinx 

cual me recomiendan para aplicar y seguir estudiando?

se que la nexys es mucho mejor, pero quiero saber su opinion de si esta es la apropiada para mi ya que basicamente hasta ahora estoy entrando a fondo en el tema o me voy por la basys que es mas simploncita?

no se fijen en el precio

GRACIAS!!!

pdt: no puedo poner los links por que soy todavia muy nuevo


----------



## asherar

Yo me compre esta 

Mojo V3

https://embeddedmicro.com/mojo-v3.html

Trae sólo lo mínimo indispensable para programar un Spartan 6, y por eso es perfecto para adaptarlo a cualquier aplicación.


----------



## dcp1985

Hola a todos,

Perdón por subir el hilo..., 
Estoy intentando usar el ip core aurora 8b/10b con una spartan 6 para transmision de datos por SFP+, pero ando un poco perdido..., Alguien tiene experiencia en ello? Alguna recomendación?

Saludos!


----------



## chclau

dcp1985 dijo:


> Hola a todos,
> 
> Perdón por subir el hilo...,
> Estoy intentando usar el ip core aurora 8b/10b con una spartan 6 para transmision de datos por SFP+, pero ando un poco perdido..., Alguien tiene experiencia en ello? Alguna recomendación?
> 
> Saludos!


Sin saber tu nivel de conocimiento previo es dificil contestarte ya que no se trata de un proyecto simple.

Yo comenzaria por revisar los diseños de ejemplo que provee Xilinx.


----------



## Jhonatanalexander

hola gente soy nuevo en esto de los foros( mas aun aqui en foros de electronica) he estado trabajando con la placa de terasic De0 nano que incorpora un cyclone IV, estoy buscando informacion sobre todo de como se usan los modulos que incorpora( memoria, acelorometro, adc etc) tambien dispongo de una placa DE2 115 de la universidad pero es la misma historia, he hecho proyectos y todo pero hasta ahoraa solo habia usado la fpga nada mas, incluso tambien poyectos con adc, pero adc paralelos como el adc0804, lo qu quiero es uasr los odulos que incorpara la tajeta, pero no encunetro info respcto a ello, estan los ejemplos de terasic pero todos ellos los hacen usando el procesador NIOSII, ¿es la unica forma de hacerlo? donde podria encontrar codigos en vhdl para poder manejar estos perifericos, desde ya gracias por la respuesta que me puedan dar.



Les dejo un pequeño proyecto que hice, un contador de 0 a 9999 con visualizacion en un diplay de 7 segmentos de 4 digitos multiplexado, espero les sirva. Trabaja con Clock de 48MHZ



		Código:
	

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

entity contador_9999 is 
	port(	clk: in std_logic;
			display: out std_logic_vector(7 downto 0);
			ena: out std_logic_vector(3 downto 0));
end contador_9999;

architecture circuito of contador_9999 is
	signal clk_1hz: std_logic;
	signal clk_mux: std_logic;
	signal cuenta1: std_logic_vector(24 downto 0);
	signal cuenta2: std_logic_vector(17 downto 0);
	signal sel: std_logic_vector(1 downto 0);
	signal Q: std_logic_vector(3 downto 0);
	signal q1:std_logic_vector(3 downto 0);
	signal q2:std_logic_vector(3 downto 0);
	signal q3:std_logic_vector(3 downto 0);
	signal q4:std_logic_vector(3 downto 0);
	
begin
	process(clk)
	begin
		if clk='1' and clk'event then
			cuenta1<=cuenta1+1;
			if cuenta1=23999999 then
				cuenta1<=(others=>'0');
				clk_1hz<= not clk_1hz;
			end if;
		end if;
	end process;
	
	process(clk)
	begin
		if clk='1' and clk'event then
			cuenta2<=cuenta2+1;
			if cuenta2=23999 then
				cuenta2<=(others=>'0');
				clk_mux<= not clk_mux;
			end if;
		end if;
	end process;
	
	process(clk_1hz)
	begin
		if clk_1hz='1' and clk_1hz'event then
			q1<=q1+1;
			if q1=9 then
				q1<="0000";
				q2<=q2+1;
				if q2=9 then
					q2<="0000";
					q3<=q3+1;
					if q3=9 then
						q3<="0000";
						q4<=q4+1;
						if q4=9 then
							q4<="0000";
						end if;
					end if;
				end if;
			end if;
		end if;
	end process;
	
	process(clk_mux)
	begin
		if clk_mux='1' and clk_mux'event then
			sel<=sel+1;
			if sel=3 then
				sel<="00";
			end if;
		end if;
	end process;
	
	with sel select Q<= q1 when "00",
							  q2 when "01",
							  q3 when "10",
							  q4 when others;
	
	with sel select ena<="1110" when "00",
								"1101" when "01",
								"1011" when "10",
								"0111" when others;
								
	with Q select display <= "00000011" when "0000",
									 "10011111" when "0001",
								    "00100101" when "0010",
								    "00001101" when "0011",
								    "10011001" when "0100",
								    "01001001" when "0101",
								    "01000001" when "0110",
								    "00011111" when "0111",
								    "00000001" when "1000",
								    "00001001" when "1001",
								    "11111111" when others;	
	
end circuito;


----------

