Curso para iniciarse con FPGAs

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;
 
Última edición por un moderador:
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.
 
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
 
Última edición por un moderador:
por que no un aporte tipico para FPGA? un control de maquinaria secuencial...

Te ayudaria... pero no se programar FPGAs :LOL: :LOL: te digo que tambien ando aprendiendo
 
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... :rolleyes:

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
 
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...
 
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.
 
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;
 
Última edición por un moderador:
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;
 
Última edición por un moderador:
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
 

Adjuntos

  • compuertas_625.png
    compuertas_625.png
    7.5 KB · Visitas: 129
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;
 

Adjuntos

  • circuito1_183.jpg
    circuito1_183.jpg
    26.1 KB · Visitas: 124
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
 
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;
 

Adjuntos

  • vector_vhdl_189.png
    vector_vhdl_189.png
    7.9 KB · Visitas: 200
Atrás
Arriba