Autor Tema: FPGA NiosII para control de matriz (cubo) de LEDs.  (Leído 16766 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
FPGA NiosII para control de matriz (cubo) de LEDs.
« en: 03 de Enero de 2012, 08:34:13 »
Feliz Año 2012 a todos....


Para empezar el "ultimo año del planeta" se me ha ocurrido hacer algo con una placa FPGA Altera CycloneII + 16Mb de SDRAM que compre hace tiempo en eBay.

Después de comprobar que usar esta placa para sintetizar pequeños/medianos  circuitos lógicos era un desperdicio, me pusé a jugar con el soft core NiosII de Altera y sus perifericos.

Al final con la ayuda del magnifico kit ( freeware) de Altera conseguí "meter" una CPU NiosII con su correpondiente controlador de SDRAM , controlador serie, timer, etc...en la FPGA y correr un programa C compilado desde Eclipse... :mrgreen:

Y lo siguiente que me he propuesto es hacer un periferico HW mapeado directamente en el espacio de direcciones de la CPU, que permita gestionar una matriz de LEDs por HW. Si todo va bien al final tendre un sistema con una CPU NiosII que puede comunicarse via serie con el PC; y que dispone de varios controladores HW de matriz de LEDS integrados, pensando en el control de un cubo-LED a alta velocidad ... :shock:

Ya os ire contando...

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #1 en: 03 de Enero de 2012, 11:37:18 »
Para empezar el "ultimo año del planeta"

 :D

Después de comprobar que usar esta placa para sintetizar pequeños/medianos  circuitos lógicos era un desperdicio, me pusé a jugar con el soft core NiosII de Altera y sus perifericos.

Al final con la ayuda del magnifico kit ( freeware) de Altera conseguí "meter" una CPU NiosII con su correpondiente controlador de SDRAM , controlador serie, timer, etc...en la FPGA y correr un programa C compilado desde Eclipse... :mrgreen:

Y lo siguiente que me he propuesto es hacer un periferico HW mapeado directamente en el espacio de direcciones de la CPU, que permita gestionar una matriz de LEDs por HW. Si todo va bien al final tendre un sistema con una CPU NiosII que puede comunicarse via serie con el PC; y que dispone de varios controladores HW de matriz de LEDS integrados, pensando en el control de un cubo-LED a alta velocidad ... :shock:

Ya os ire contando...

Muy interesante... Me comentaron que hay un par de CPU open source, que info tienes al respecto? Tengo que conseguirme un kit de esos para jugar, uno más a la lista  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #2 en: 03 de Enero de 2012, 12:19:09 »
En opencores.org puedes encontrar unas cuantas soft CPU "free".

Pero si quieres montarte un System On a Programmable Chip (SOPC) serio , te aconsejo que uses el kit de Altera ( en mi caso es  la FPGA que uso...) , que viene con CPUs ( de tres niveles de compeljidad) y muchos perifericos que se pueden conectar facilmente a la CPU mediante un bus de Altera  ( Avalon). Ademas viene con un entorno Ecplise para desarrollar programas en C/C++ para el SOPC que fabriques.

Con ese kit y la documentación asociada , que es mucha... yo consegui instalar en la FPGA un SOPC y compilar y ejecutar un miniprograma en poco más de una hora, el famoso "Hello world..."

Animo y suerte...

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #3 en: 03 de Enero de 2012, 13:54:14 »
Muchas gracias por la data  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #4 en: 03 de Enero de 2012, 19:14:18 »
Este es el esquema de bloques :




Uploaded with ImageShack.us


Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #5 en: 08 de Enero de 2012, 07:51:44 »
Buenas, os pongo el codigo VHDL del componente que controla una matriz 2D de LEDs, resumiendo es un componente con puertos para conectarse a la CPU NiosII usando el bus Avalon (Addr,DataRd,DataWR,Wr,Rd,CS,Clk ,nReset) y los puertos de salida de control de la matriz 2D LED ( LedRowPut,LedColOut). Instanciando varios componentes de este tipo podremos controlar la matriz 3D ( cubo).

El problema es que consume muchos recursos de la FPGA ya que la matriz la sintetiza con registros, estoy viendo como usar la memoria interna que llevan los Cyclone de Altera para reducir el uso de registros al minimo.

Código: [Seleccionar]
LIBRARY ieee;

USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_signed.all;

--USE ieee.numeric_std.all;

---------------------------------------------------
--------------------------------------------------
-- LED 2D Matrix driver
-- COL : num. columnas ( 5 cols.).
-- ROW : num. filas ( 5 red + 5 green = 10 rows. )
-- Freq refresco : 100 Hz ( 10 ms )
-- Valores LED : 64
-- Freq. PWM : 64 * ROW @ 10 ms -> ROW(10) => 64000 hz.
--------------------------------------------------
--------------------------------------------------

ENTITY shifter_LED IS
GENERIC(
COL_NUMBER  : in natural := 8;  -- Max 16
ROW_NUMBER  : in natural := 16; -- Max 16
CLK_DIVIDER : in natural := 780 -- 50 Mhz / 780 -> 64000 Hz
);
PORT (
-- Avalon interface
Clk : IN STD_LOGIC;
nReset : IN STD_LOGIC;
CS : IN STD_LOGIC;
Addr : IN STD_LOGIC_VECTOR(1 downto 0);
Wr : IN STD_LOGIC;
DataWr : IN STD_LOGIC_VECTOR(15 downto 0);
Rd : IN STD_LOGIC;
DataRd : OUT STD_LOGIC_VECTOR(15 downto 0);

--MatrixPWMClk : IN std_logic;

-- LED Outputs ( 5 x 5 x 2 colors)
LedRowOut : OUT STD_LOGIC_VECTOR(ROW_NUMBER-1 downto 0);
LedColOut : OUT STD_LOGIC_VECTOR(COL_NUMBER-1 downto 0)
) ;
END shifter_LED;


ARCHITECTURE rtl OF shifter_LED IS

CONSTANT COL_BITS   : integer := 3; -- 2^COL_BITS <= COL_NUMBER
CONSTANT ROW_BITS   : integer := 4; -- 2^ROW_BITS <= ROW_NUMBER

-- Matrix types
subtype t_LED_value is  integer range 0 to 127;
CONSTANT VAL_BITS   : integer := 7; -- 2^VAL_BITS < t_LED_value'high


type t_LED_matrix is array  (0 to ROW_NUMBER-1,0 to COL_NUMBER-1) of t_LED_value;

-- LED Matrix
signal matrix : t_LED_matrix;

-- Registers
signal control_reg: STD_LOGIC_VECTOR ( 7 DOWNTO 0);
--signal data_reg   : STD_LOGIC_VECTOR (15 DOWNTO 0);
signal addr_reg   : STD_LOGIC_VECTOR (15 DOWNTO 0);


signal MatrixPWMClk : std_logic;

SIGNAL led_row_out: STD_LOGIC_VECTOR (ROW_NUMBER-1 DOWNTO 0);
SIGNAL scanner    : UNSIGNED(COL_NUMBER-1 DOWNTO 0);


BEGIN

LedRowOut <= led_row_out;
LedColOut <= STD_LOGIC_VECTOR(scanner);

process (clk,nReset)

variable row : integer range 0 to ROW_NUMBER-1;
variable col : integer range 0 to COL_NUMBER-1;
begin
if (nReset = '0') then
matrix <= (others => (others =>  0));
control_reg <= (others => '0');
col := 0;
row := 0;
elsif rising_edge(Clk) then
if CS = '1' and Wr = '1' then
case Addr is
-- Control register
when "00" =>
control_reg <= DataWr(7 DOWNTO 0);
-- Address register
when "01" =>
addr_reg <= DataWr;
-- WARN: No hay chequeo de rangos...
col := conv_integer( unsigned(addr_reg ( 8+COL_BITS-1 DOWNTO 8 )));
row := conv_integer( unsigned(addr_reg ( ROW_BITS-1   DOWNTO 0 )));
-- Data register
when "10" =>
-- WARN: No hay chequeo de rangos...
matrix(row,col) <= conv_integer( unsigned(DataWr( VAL_BITS-1  DOWNTO 0 )));
-- Auto-incremento Row->Col
if (row = ROW_NUMBER-1)
then
row := 0;
if (col = COL_NUMBER-1)
then
col := 0;
else
col := col + 1;
end if;
else
row := row + 1;
end if;
addr_reg( 7   DOWNTO 0 ) <= STD_LOGIC_VECTOR(conv_unsigned(row,8));
addr_reg( 15  DOWNTO 8 ) <= STD_LOGIC_VECTOR(conv_unsigned(col,8));

when others => null;
end case;
end if;
end if;
end process;


-- Generate internal Clock

process_Clock:
process(Clk, nReset)

variable cntClock : integer range 0 to CLK_DIVIDER+1;

begin
if (nReset = '0') then
MatrixPWMClk <= '0';
cntClock := 0;
elsif rising_edge(Clk) then
if(cntClock > CLK_DIVIDER) then
MatrixPWMClk <= not MatrixPWMClk;
cntClock := 0;
else
cntClock := cntClock +1 ;
end if;
end if;
end process process_Clock;


-- Shift data
process_GeneratePWM:
process(MatrixPWMClk, nReset)

variable cntCol : integer range 0 to COL_NUMBER := 0;
variable valPWM : t_LED_value := 0;
begin
if (nReset = '0') then

led_row_out <= (others => '0');
scanner <= conv_unsigned(1,COL_NUMBER);
cntCol := 0;
valPWM := 1;

elsif rising_edge(MatrixPWMClk) then

-- Incrementamos valor del PWM
-- Si llegamos al maximo reiniciamos
if (valPWM = t_LED_value'high)
then
valPWM := 1;

-- Siguiente columna
cntCol := cntCol +1;
if (cntCol < COL_NUMBER) then
scanner(COL_NUMBER-1 downto 1) <= scanner(COL_NUMBER-2 downto 0);
scanner(0) <= scanner(COL_NUMBER-1);
else
scanner <= conv_unsigned(1,COL_NUMBER);
cntCol := 0;
end if;

else
valPWM := valPWM + 1;
end if;

-- Activamos salida LED solo si el valor  es mayor que valPWM actual.
for row in 0 to ROW_NUMBER-1
loop
if ( matrix(row,cntCol) >= valPWM)
then
led_row_out(row) <= '1';
else
led_row_out(row) <= '0';
end if;
end loop;


end if;
end process process_GeneratePWM;

-- Asynchronous Read
process_Read:
process(Addr,control_reg,addr_reg,CS,Rd,matrix)

--variable row : integer range 0 to ROW_NUMBER-1;
--variable col : integer range 0 to COL_NUMBER-1;

begin

--if CS = '1' and Rd = '1' then
case Addr is
when "00"   => DataRd <= "00000000" & control_reg;
when "01"   => DataRd <= addr_reg;
--when "10"   =>
-- WARN: No hay chequeo de rangos...
--col := conv_integer( unsigned(addr_reg ( 8+COL_BITS-1 DOWNTO 8 )));
--row := conv_integer( unsigned(addr_reg ( ROW_BITS-1   DOWNTO 0 )));
--DataRd <= STD_LOGIC_VECTOR(conv_unsigned(matrix(row,col),16));

when others => DataRd <= (others => '1');
end case;
--end if;
end process process_Read ;


END rtl;

Desconectado pastgriot

  • PIC10
  • *
  • Mensajes: 5
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #6 en: 20 de Marzo de 2012, 14:10:49 »
Felicitaciones por el proyecto splasma ((:-)) lo seguiré con mucho interés. Desde hace unas semanas semanas se me encargó construir una controladora ATA con uno de estos bichos y llegué a la misma conclusión de usar un procesador embebido en el fpga en vez de reinventar la rueda construyendo cada módulo desde cero.

Me queda una duda que se me puedes aclarar, una vez que creaste el módulo compatible con el bus avalon y lo "importaste" en el Qsys (suponiendo que usas Qsys) y  sintetizaste el proyecto, que parámetros manejas posteriormente desde el eclipse?? o bien, que funciones se crean en el system.h para controlar tu módulo???

Una vez mas, felicitaciones  :)

Desconectado fausto0123

  • PIC10
  • *
  • Mensajes: 9
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #7 en: 23 de Marzo de 2012, 01:13:06 »
buenas noches muy interesante sus aportes, acabamos de adquirir un kit de altera que es un nios ii cyclone iii y la idea es hacer procesamiento de video
para hacer un vehiculo autonomo usando una camara, pero para empezar se quiere usar ultrasonidos como sensor. la duda que tenemos es que este kit cuenta
con pocos conectores ps solo cuenta con el serial, me gustaria saber si se puede hacer sabiendo que se debe manejar los sensores ultrasonicos y los motores por el puertos serial


Desconectado pastgriot

  • PIC10
  • *
  • Mensajes: 5
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #8 en: 23 de Marzo de 2012, 10:30:50 »
Fausto, puedes dar mas detalles de tu kit?? me parece extraño que el único método I/O de la placa sea un puerto serial. Ademas, que tipo de interfaz presentan tus sensores?? es decir, que tipo de datos entregan, hay algunos que entregan datos ascii via rs232 y otros una variedad de pulsos (entre muchas maneras mas).

Otra cosa, no es que el FPGA en cuestion sea un NIOS II, sino que este integrado soporta un procesador embebido en el Cyclone III, de hecho puedes usar otros procesadores como el de un PIC o un ARM entre otros, es cosa de mirar opencores para hacerse una idea.

Saludos.

Desconectado fausto0123

  • PIC10
  • *
  • Mensajes: 9
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #9 en: 23 de Marzo de 2012, 11:11:14 »
gracias por responder mira los datos del kit

LCD daughtercard
Color LCD touch-screen display
800 x 480 resolution
24-bit CD-quality Audio CODEC with line-in, line-out, and microphone-in jacks
10/100 Ethernet physical layer/media access control (PHY/MAC)
Connectors
VGA output
Composite TV-in
Audio-out, audio-in, and microphone-in
4-bit Secure digital (SD) card
Serial connector (RS-232 DB9 port)
PS/2
Ethernet connector (RJ-45)
8-pin debug I/O
Size:125*100 mm
The Cyclone III FPGA Starter Kit
Cyclone III EP3C25F324 FPGA

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=56&No=372  y aqui esta la imagen del kit

a los sensores son los srf05 son ultrasonidos y los motores son cc de 24v a 5a
y pues le agradezc cualquier ayuda la idea es ir haciendo estas practicas y ir subiendo el nivel hasta llegar a procesar video
ya que este kit me lo dieron para hacer pruebas

Desconectado pastgriot

  • PIC10
  • *
  • Mensajes: 5
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #10 en: 23 de Marzo de 2012, 13:01:26 »
Está bien buena la placa eh?  :mrgreen: En la placa veo un puerto llamado GPIO Header (General Purpose Input Output) creo q este debería ser inicialmente tu punto de partida para manejar los motores y sensores.

Por lo que vi en http://www.superrobotica.com/S320111.htm deberias dedicar dos pines de la placa al sensor y crear algún tipo de maquina de estados que envíe el pulso inicial y lea el ancho de pulso para ser convertido en distancia, en cuanto al motor, seria algo parecido pero ten cuidado con la adaptación de voltajes y la corriente que consumen los motores, un puente H o algún buffer seria necesario ahí.

Saludos.

Desconectado fausto0123

  • PIC10
  • *
  • Mensajes: 9
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #11 en: 23 de Marzo de 2012, 13:17:16 »
si claro este kit es muy bueno me llego la semana pasada y pues la idea es hacer practicas aprovechando la pantalla tactil que tiene y claro tambien me gustaria ir mostrando en el foro mis avances para eso tengo 6 meses con este kit por eso mi interes de hacer practicas y poderlas compartir
 entonces me dices que ademas del puerto serial hay otro puerto? que se puede usar..  para mi objetivo

por la parte de del motor pues tengo la parte de control aparte con un puente h y pues creo que se uede aislar con optoacopladores para evitar problemas con el kit

y veo que en la sd que tiene el kit vienen ejemplos para el uso del programa nios II
esa es otra cosa de este kit ya todo se cargar a la sd.

ya que veo que manejas tan bien esto cual programa me recomendaria para empezar el quartus II o el nios II
veo q tienen herramientas como sopc builder

Desconectado fausto0123

  • PIC10
  • *
  • Mensajes: 9
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #12 en: 23 de Marzo de 2012, 13:29:49 »
http://www.altera.com/literature/ds/ds_nios2_3c25_lcd.pdf  mira este link aca esta la distribucion de los puerto
y los pines de la fpga

Desconectado pastgriot

  • PIC10
  • *
  • Mensajes: 5
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #13 en: 23 de Marzo de 2012, 13:48:27 »
Maldición, se me borró todo lo que escribí  :5]

Te decia que de manejarme en esto nada, tomé el tema porque hace semana y media me pidieron hacer una controladora ATA para un disco duro y hasta ahora ni idea como  :oops: y para esto me dieron 2 meses 1/2  :?

Sobre NIOSII o QUARTUS, hasta donde yo se el NIOS II EDS es un compilador (y otras cosas mas) que trabaja sobre la IDE de Eclipse donde puedes programar en un lenguaje de alto nivel como C el procesador (y sus perifericos) que hayas programado y sintetizado en el Quartus II, ya sea mediante la herramienta Qsys o bien Sopc builder.

Te recomiendo darle una mirada a algunos de estos videos tutoriales, especialmente a los que hacen referencia al NIOSII:

http://www.altera.com/education/training/curriculum/embedded_sw/trn-embedded_sw.html
http://www.altera.com/education/training/curriculum/embedded_hw/trn-embedded_hw.html

Además en youtube, vi un video del mismo tipo que hace estas placas dar un pequeño tutorial sobre como construir una solución con niosii se llama algo asi como "My first nios II"

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: FPGA NiosII para control de matriz (cubo) de LEDs.
« Respuesta #14 en: 08 de Abril de 2012, 13:39:59 »
Hola, me da gusto saber que esto de las FPGA ya está abarcando más usuarios.

Yo estuve trabajando con Altium y su sintetizador VHDL pero es una cosa del demonio... funciona cuando quiere, sintetiza lo que quiere, el micro TSK3000A es sumamente espacioso (65% de elementos lógicos de una Cyclone de 12000), y el compilador en C repleto de bugs y nada respetuoso del ANSI C. Simplemente horrible.

Un amigo me enseñó a usar el Nios II con el SOPC de Quartus. Esta joya de procesador sólo consumió el 25% de la FPGA y el ambiente Eclipse y todas las librerías que trae lo hacen tan fácil de usar como nada.

Splasma2, no soy experto en VHDL pero hay forma de decirle a Quartus que use la RAM on-chip de la FPGA, de hecho puedes verlo en el MegaWizard de Quartus... ahí hay generadores de RAM de donde puedes sacar el código para usarla. Ahorita no tengo mi código ni Quartus a la mano, pero en cuanto lo tenga te lo puedo mostrar.

Para practicar, un amigo me consiguió este kit con un Cyclone IV  :mrgreen:

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=139&No=593



 

anything