Autor Tema: Informacion acceso sram externa  (Leído 6920 veces)

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

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Informacion acceso sram externa
« en: 07 de Mayo de 2006, 16:43:28 »
Hola, alguien me puede dar algun enlace o codigo para leer/escribir en una ram externa en VHDL?

He estado leyendo y recopilando informacion para generar video con una FPGA. Tengo la placa de la spartan 3 starter kit. De momento he generado una imagen de 800x600, con un patron (8 columnas una de cada color) como el de las teles cuando no se emitia ningun programa.

Ahora, queria sacar por pantalla en lugar de un color fijo segun la coordenada X de la pantalla, pues un dibujo guardado en la ram externa de esta placa. Para empezar por ej. queria leer de esta ram durante el dibujado de pantalla y durante los tiempos de los pulsos de sincronismo vertical por ej. pues escribir en esa ram otra cosa (por ej. un cuadrado verde), para ver que luego me la dibuja en el siguiente refresco.

Bueno eso para empezar...poco a poco... que estoy  aprendiendo conforme leo y hago pruebas....

Un saldudo. Dani.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Informacion acceso sram externa
« Respuesta #1 en: 08 de Mayo de 2006, 16:40:02 »
En http://www.opencores.org/browse.cgi/by_category hay varios proyectos de ese tipo que te pueden servir.
Saludos

Desconectado whingel

  • PIC10
  • *
  • Mensajes: 1
Re: Informacion acceso sram externa
« Respuesta #2 en: 09 de Mayo de 2006, 04:31:40 »
Hola, yo en breves me metere con algo parecido...he comenzado a echarle un ojo a la informacion de la placa demo con la que "juego" http://www.digilentinc.com/Software/MMU.cfm?Nav1=Software&Nav2=MMU para ir sacando ideas y ver por donde podrian ir los tiros.
Un saludo.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Informacion acceso sram externa
« Respuesta #3 en: 11 de Mayo de 2006, 01:29:13 »
He estado leyendo y recopilando informacion para generar video con una FPGA. Tengo la placa de la spartan 3 starter kit. De momento he generado una imagen de 800x600, con un patron (8 columnas una de cada color) como el de las teles cuando no se emitia ningun programa.
¿Podrías compartir lo que tienes? Estoy buscando información sobre lo del VGA, me parece que tengo la misma tarjeta de evaluación que tú :).

Para leer la memoria, supongo que se tendría que buscar la información y datos técnicos de la misma.

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Informacion acceso sram externa
« Respuesta #4 en: 11 de Mayo de 2006, 05:22:42 »
Hola Geo, te paso el nombre algunos archivos para que los busques en el google:
- Practica2_0405.pdf
- vga.pdf
- vgaoutfiles.zip (adjunto, de aqui vgacore.vhd es el que me gusto y en el que me he basado)

Salen directos, si no, dimelo y ya te paso por privado (aqui solo se puede adjuntar 250kb si no me equivoco). Si quieres te puedo pasar otros, pero ya no llevan codigo fuente explicativo.

Muchas gracias Modulay por tu  enlace.

Ahora mismo estoy sacando por pantalla (800x600) lo que leo de la sram externa (sin inicializarla, valores aleatorios). Y ademas copio en esa sram 2 rectangulos rellenos de un color en 2 zonas de la pantalla (en los tiempos muertos), para ver que luego salen por pantalla (lee y escribe bien la sram).
El controlador de sram al final lo he hecho yo (no he encontrado nada que me gustara para copiarlo :)), mirando los tiempos de la sram en el datasheet.
El codigo esta muy sucio, ya que voy de prueba en prueba investigando. Intentare pasartelo lo antes que pueda (Geo), ya que tienes la misma placa y asi vamos probando cosas.

Mi intencion es (en esta placa): que la fpga controle todo el dibujado (lea de una rom (supongo que unida por un conector exterior) los graficos y los copia en sram). Un ram para sacar por pantalla y otra para dibujar la siguiente pantalla (compartiendo el tiempo, ya que comparten bus de direcciones). Y que tenga algun tipo de interface sencillo para que un micro cualquiera externo, simplemente le de las ordenes de dibujado (por ej: grafico 1 en tales coordenadas, grafico2...... etc...)

Un saludo. Dani.

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Informacion acceso sram externa
« Respuesta #5 en: 11 de Mayo de 2006, 17:11:42 »
Hola, zassssss no estaba leyendo/escribiendo tan bien la memoria como pensaba  :(.
Me he hecho una maquina de estados de 4 estados. El reloj asociado es de 200Mhz, luego realizamos una lectura cada 20ns (50Mhz). Es una sram de 10ns. He tratado de cumplir con los tiempos que muestra en el pdf de la IS61LV25616 (256kx16).

Estos son los estados que a mi parecer hace el programa que he escrito:
[

Este es el trozo de codigo fuente relacionado:

Código: VHDL
  1. fsm_sram: process(clk_ram, reset, mem_cycle, acc_copia, hcnt)
  2. begin
  3.         if reset = '0' then
  4.                 mem_cycle <= nop;
  5.                 do_xsram <= "00000000";
  6.                 -- inicilizamos dibujo
  7.                 -- AKI INICIALIZO 'DIBUJO' que seria una imagen de 64x16 pixel
  8.         elsif clk_ram'event and clk_ram = '1' then
  9.                 case mem_cycle is
  10.                         when write1 => mem_cycle <= write2;
  11.                         when write2 => mem_cycle <= write3;
  12.                         when write3 => mem_cycle <= nop;
  13.                         when read1 => mem_cycle <= read2;
  14.                         when read2 => mem_cycle <= read3;
  15.                         when read3 => mem_cycle <= nop;
  16.                         when nop =>
  17.                                 if enable = '1' then
  18.                                         --addr <= "00000000000" & vcnt(8 downto 6) & hcnt(9 downto 6);
  19.                                         addr <= vcnt(7 downto 0) & hcnt;
  20.                                         mem_cycle <= read1;
  21.                                 elsif acc_copia ='1' then       -- boton = '1' es apretado
  22.                                         mem_cycle <= write1;
  23.                                         addr <= dir_y(7 downto 0) & dir_x;
  24.                                         pixel_dibujo <= dibujo1(conv_integer(dir_y(3 downto 0)));
  25.                                         do_xsram <= "0000000" & pixel_dibujo(conv_integer(dir_x(5 downto 0)));
  26.                                         --do_xsram <= "00000" & dir_x(2 downto 0);
  27.                                 end if;
  28.                 end case;              
  29.         end if;
  30. end process;
  31.  
  32.  
  33. output_fsm_sram: process(mem_cycle)
  34. begin
  35.         case mem_cycle is
  36.                 when write1 =>  we_auxi <=      '0'; oe_auxi <= '1';    ce1_auxi <= '0'; ce2_auxi <= '1';
  37.                 when write2 =>  we_auxi <=      '0'; oe_auxi <= '1';    ce1_auxi <= '0'; ce2_auxi <= '1';
  38.                 when write3 =>  we_auxi <=      '1'; oe_auxi <= '1';    ce1_auxi <= '0'; ce2_auxi <= '1';
  39.                 when read1 =>   we_auxi <=      '1'; oe_auxi <= '0';    ce1_auxi <= '0'; ce2_auxi <= '1';
  40.                 when read2 =>   we_auxi <=      '1'; oe_auxi <= '0';    ce1_auxi <= '0'; ce2_auxi <= '1';
  41.                 when read3 =>   we_auxi <=      '1'; oe_auxi <= '0';    ce1_auxi <= '0'; ce2_auxi <= '1';
  42.                 when others =>  we_auxi <=      '1'; oe_auxi <= '1';    ce1_auxi <= '1'; ce2_auxi <= '1';
  43.         end case;
  44. end process;
  45.  
  46.         we <= we_auxi;
  47.         oe <= oe_auxi;
  48.         ce1 <= ce1_auxi;
  49.         ce2 <= ce2_auxi;
  50.         data <= do_xsram when mem_cycle <= write2 and mem_cycle <= write3 else (others => 'Z');
  51.         di_xsram <= data when mem_cycle = read2 else di_xsram;
  52.  
  53.         r_auxi <= di_xsram(2);
  54.         g_auxi <= di_xsram(1);
  55.         b_auxi <= di_xsram(0);

Breve explicacion: es la parte del codigo relacionada...
- di_xsram almacena la lectura de la sram
- do_xsram almacena el valor que vamos a grabar en la sram
- data es el bus exterior (inout)
- enable = 1 cuando se esta dibujando en pantalla y vale 0 en los descansos (sincronismos). Cuando es 1, lee de sram y dibujo en pantalla (a 50Mhz ambas cosas). Cuando es 0, aprovecho para copiar en la misma ram el 'dibujo'.
En otra maquina de esta con la signal acc_copia le digo cuando y donde debe grabar en la memoria.

La cuestion es que el dibujo no sale bien definido (como lecturas erroneas aleatorias).  PEROOOO si le bajo la frecuencia de reloj al acceso a la sram (100Mhz) entonces si me lee y escribe perfecto. Como cada pixel es a 50Mhz y el acceso a sram es 25Mhz, solo lee un pixel de ram cada 2 (repite en pantalla de 2 en 2 pixels), pero la imagen sale como debe ser (lo que supuestamente he grabado en ram).

El problema lo tenemos cuando la intento mover a 50Mhz (20ns cada lectura/escritura): Supuestamente es de 10ns, y me he fijado en los tiempos del pdf para hacer mi maquina de estados. Creo que los cumple  :?

Cual puede ser mi problema? lo estoy probando en la spartan 3 kit. Si alguien quiere el codigo para probarlo, me lo dice.
Yo seguire dandole vueltas, que posiblemente haya algun fallo tonto (a veces me esta pasando que no hace lo que yo pienso que debia hacer y es que no estoy muy acostumbrado a este lenguaje y son cosas de concepto).

Un saludo. Dani.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Informacion acceso sram externa
« Respuesta #6 en: 11 de Mayo de 2006, 20:28:40 »
Holas damago.
Sólo una pequeña apreciación que creo nada tiene que ver con la causa de tu problema:
Creo que deberías implementar los if del proceso principal así

Código: VHDL
  1. fsm_sram: process(clk_ram, reset, mem_cycle, acc_copia, hcnt)
  2.  
  3. begin
  4.  
  5.   if reset = '0' then
  6.  
  7.     mem_cycle <= nop;
  8.     do_xsram <= "00000000";
  9.  
  10. -- inicilizamos dibujo
  11.  
  12. -- AKI INICIALIZO 'DIBUJO' que seria una imagen de 64x16 pixel
  13.  
  14.   else
  15.     if clk_ram'event and clk_ram = '1' then
  16.       case mem_cycle is
  17.         when write1 => mem_cycle <= write2;
  18.         when write2 => mem_cycle <= write3;
  19.         when write3 => mem_cycle <= nop;
  20.         when read1 => mem_cycle <= read2;
  21.         when read2 => mem_cycle <= read3;
  22.         when read3 => mem_cycle <= nop;
  23.         when nop =>
  24.         if enable = '1' then
  25.             --addr <= "00000000000" & vcnt(8 downto 6) & hcnt(9 downto 6);
  26.             addr <= vcnt(7 downto 0) & hcnt;
  27.             mem_cycle <= read1;
  28.           elsif acc_copia ='1' then-- boton = '1' es apretado
  29.             mem_cycle <= write1;
  30.             addr <= dir_y(7 downto 0) & dir_x;
  31.             pixel_dibujo <= dibujo1(conv_integer(dir_y(3 downto 0)));
  32.             do_xsram <= "0000000" & pixel_dibujo(conv_integer(dir_x(5 downto 0)));
  33.             --do_xsram <= "00000" & dir_x(2 downto 0);
  34.         end if;
  35.       end case;
  36.     end if;
  37.   end if;
  38. end process;

Así te aseguras de cubrir todos los posibles casos que se puedan dar y te quitas de problemas por no implementar el caso en que tengas reset a 1 y clk a 0

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Informacion acceso sram externa
« Respuesta #7 en: 11 de Mayo de 2006, 20:52:51 »
Hola Modulay, en principio tenia un fallo 'tonto' de los que me esperaba. La linea:

Código: VHDL
  1. data <= do_xsram when mem_cycle <= write2 AND mem_cycle <= write3 else (others => 'Z');

Me habia equivado.....era un OR (no un AND, no puede ser los 2 estados a la vez :?). Lo que no se es como casi funcionaba.
Ahora ya me sale bien la imagen, pero aun tengo bastantes dudas (del tipo de que a veces cambio una linea y se me fastidia algo....la razon?: pues ni idea jeje...asi que tendre que darle mas vueltas).

Respecto a lo del IF....mmmm no veo clara la diferencia de tu codigo. Es el ELSE no? pero en cualquier caso tambien existe el caso que reset sea 1 y no haya flanco. Creo que es lo mismo no? nose, yo por los pocos ejemplos que he vsito siempre suelen usar un elsif despues del reset para el flanco del reloj. Si hay alguna razon que no veo dimelo please.

Un saludo. Dani.
« Última modificación: 16 de Mayo de 2006, 07:17:29 por damago »

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Informacion acceso sram externa
« Respuesta #8 en: 12 de Mayo de 2006, 11:41:20 »
ahora que lo dices tienes razón,pero creo que en el caso de que hagas un reset también entraría en la parte del proceso correspondiente al evento en clk ¿no?
Con el elsif no excluyes de que no entre aunque se haya cumplido la condicion del primer "if"
En el caso de un reset y un evento en clk simultáneos ejecutarías ambas ramas ¿no?
toy en la duda...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Informacion acceso sram externa
« Respuesta #9 en: 12 de Mayo de 2006, 11:47:50 »
Me enseñaron que hay que dejar bien atadas este tipo de sentencias y asegurarse de dejar cubiertas todas las posibilidades porque aunque funcionalmente un proceso y la arquitectura en sí sean correctos,según tengo entendido,te puede llevar a una síntesis no demasiado buena.

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Informacion acceso sram externa
« Respuesta #10 en: 16 de Mayo de 2006, 07:06:30 »
Hola modulay,
"ahora que lo dices tienes razón,pero creo que en el caso de que hagas un reset también entraría en la parte del proceso correspondiente al evento en clk ¿no?
Con el elsif no excluyes de que no entre aunque se haya cumplido la condicion del primer "if"
En el caso de un reset y un evento en clk simultáneos ejecutarías ambas ramas ¿no?
toy en la duda..."

Poner 'elsif' es lo mismo que 'else + if' (si se cumple el primer 'if', no entra en el 'elsif'). Al menos en C por ej, no se si VHDL es particular en esto.

He pasado de resolucion  800x600 (72Hz) a 640x480 (60Hz) y me dibuja bien el contenido de la ram (ahora la frecuencia del reloj de la ram es la mitad, 100Mhz por estado.). Mi problema (estoy casi seguro) esta en los retrasos internos de las señales. He leido el report que hace y ciertamente algunas señales tenian un delay mayor que el peridodo del reloj (5ns para 800x600).

Voy a reordenar un poco el codigo y lo escribire  aqui, para ver si alguien puedo reencaminarme. Seguro que no estoy
codificando de manera optima el controlador de ram (lo digo por que si he visto una spartan 2 funcionar a 800x600).

Cuando pueda posteare el codigo fuente del controlado de ram y el report

Otra duda: el otro dia me instale el modelsim y trate de simular el controlador. Pero la simulacion era totalmente ideal, sin retrasos internos. Como se puede simular el sintetizado real??


Un saludo. Dani.
« Última modificación: 16 de Mayo de 2006, 07:17:05 por damago »


Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Informacion acceso sram externa
« Respuesta #12 en: 24 de Mayo de 2006, 01:34:42 »
Pues como comenté en el post que abrí sobre lo de la máquina digital, ahora pienso ponerme con esto :P.

Busqué lo que me comentaste, pero no obtuve resultados, sólo para lo del vga.pdf, ahorita lo estoy descargando. Cualquier cosa que quieras/puedas enviarme, te la agradezco. Ahorita estoy buscando info para ponerme a leer y a probar.

Una cosa, el programa de prueba de la tarjeta hace algunas cosas interesantes con lo del VGA, ¿ya lo checaste? El problema es que no veo el código por ningún lado, todavía no le agarro bien la onda a esto de los FPGAs, voy a seguir leyendo y luego comento/pregunto.

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Informacion acceso sram externa
« Respuesta #13 en: 29 de Mayo de 2006, 17:18:27 »
Por lo pronto voy a olvidarme del uso de la memoria, lo que planeo hacer es muy simple y no la requiero :P.

Por cierto, para quienes tengan la Starter Board, ¿han hecho algo conectando un teclado?

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/


 

anything