Autor Tema: AYUDA CON MEMORIA  (Leído 2780 veces)

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

Desconectado elpedro17

  • PIC10
  • *
  • Mensajes: 3
AYUDA CON MEMORIA
« en: 16 de Junio de 2006, 06:53:42 »
hola a todos... estoy intentando implementar una memoria con la Spartan3, en principio es una memoria muy sencilla de 24 posiciones por 72 bits. Lo que pasa que al simularla con MODELSIM, no hace nada....Os pongo aquí el código, me podreis decir si la he hecho bien ... Gracias !!!

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


entity memoria is
    Port (
           Entrada :       in std_logic_vector(7 downto 0);--entrada de datos
           versesion1:      in  std_logic;--elige sesion a visualizar
           btn1:            in  std_logic;--boton para incrementar la visualización
           sesion :         in std_logic;--dice que sesion empezamos '1'sesion1...'0'sesion2
           clk:            in std_logic;--reloj de la placa
           activo:          in std_logic;--entrada para saber si esta listo para recibir datos
           sensor :         in std_logic_vector(3 downto 0);
           modo:           in std_logic_vector(2 downto 0);
           tic :             in std_logic;--entrada de la captura de datos
           fin   :            out std_logic;--nos dice si ha terminado el proceso de descarga de datos.
           fin5   :         out std_logic;--dice si ha terminado de iniciar una sesión'1'fin--'0'no fin
           fin7   :         out std_logic;--'1' termina descarga en serie, '0'no ha terminado
           salidapara :    out std_logic_vector(7 downto 0);--salida de datos
           salidaver  :      out std_logic_vector(7 downto 0);--salida de datos
           salidaserie :    out std_logic;--salida en serie
           finborrar:      out std_logic);--nos dice que ya ha terminado de resetear la memoria.

end memoria;


architecture Behavioral of memoria is
type RAM_type is array (23 downto 0) of std_logic_vector (71 downto 0);--creamos la
signal RAM : RAM_type;                                                  --matriz de memoria
signal clk1:std_logic;

begin

--------------------------------------------------
process(clk)
                      --9600baudios --
variable CUENTA:std_logic_vector(12 downto 0);   --
begin                                             --
                                                --
     if clk'event and clk='1'then                --
              if CUENTA=50 then --5208                   --
             CLK1<='1';                            --
             CUENTA:=(OTHERS=>'0');                --
            else                                 --
            CLK1<='0';                           --
             CUENTA:=CUENTA+ 1;                  --
        end if;                                 --
   end if;                                       --
end process;                                    --
                                                --
----------------------------------------------------------------




           
process(tic,clk1,activo)
----------------------------------------------------
variable sensor1  :std_logic_vector(7 downto 0);
variable sensor2  :std_logic_vector(7 downto 0);
variable sensor3  :std_logic_vector(7 downto 0);
variable sensor4  :std_logic_vector(7 downto 0);
variable sensor5  :std_logic_vector(7 downto 0);
variable sensor6  :std_logic_vector(7 downto 0);
variable sensor7  :std_logic_vector(7 downto 0);
variable sensor8  :std_logic_vector(7 downto 0);
variable sensor9  :std_logic_vector(7 downto 0);
variable aux      :std_logic_vector(7 downto 0);
variable datover  :std_logic_vector(7 downto 0);
-----------------------------------------------------
variable temporal :std_logic_vector(71 downto 0);
variable temporal2 :std_logic_vector(71 downto 0);
variable temporal3 :std_logic_vector(71 downto 0);
variable temporal4 :std_logic_vector(71 downto 0);
variable temporal5 :std_logic_vector(71 downto 0);
variable temporal8 :std_logic_vector(71 downto 0);
variable direccion:std_logic_vector(4 downto 0):="00000";
variable direccion2:std_logic_vector(4 downto 0):="00000";
variable direccion3:std_logic_vector(4 downto 0):="00000";
variable direccion4:std_logic_vector(4 downto 0):="00000";
variable direccion7:std_logic_vector(4 downto 0):="00000";
variable tempdes  :std_logic_vector(71 downto 0);
-----------------------------------------------------
variable numsens  :std_logic_vector(3 downto 0);
variable temp     :std_logic_vector(2 downto 0);
variable solobit  :std_logic;
variable dir      :std_logic:='0';
variable n        :std_logic_vector(6 downto 0);
variable dir1     :std_logic:='0';
variable dir4     :std_logic:='0';
variable dir5     :std_logic:='0';
variable bandera  :std_logic:='0';
variable bandera2 :std_logic:='0';
variable bandera3 :std_logic:='0';
variable bandera4 :std_logic:='0';
variable bandera5 :std_logic:='0';
begin
--------------------------------------------------
--MODO CAPTURA DE DATOS Y GUARDAR EN MEMORIA NORMAL
--------------------------------------------------
if activo='1' then

if (tic='1') then--3
          numsens:=numsens+1;--cada ciclo de reloj incrementamos
                if numsens=10 then--LEEMOS TODOS LOS SENSORES--4
                temporal2:=sensor1&sensor2&sensor3&sensor4&sensor5&sensor6&sensor7&sensor8&sensor9;
                ram(conv_integer(direccion)) <= temporal2;
                direccion:=direccion+1;
                numsens:="0000";
                      if direccion=24 then   --5
                        direccion:=(others=>'0');
                     end if; --5
                end if; --4
                     
case (numsens) is               
when "0001"=> sensor1:=entrada;
when "0010"=> sensor2:=entrada;
when "0011"=> sensor3:=entrada;
when "0100"=> sensor4:=entrada;
when "0101"=> sensor5:=entrada;
when "0110"=> sensor6:=entrada;
when "0111"=> sensor7:=entrada;
when "1000"=> sensor8:=entrada;
when "1001"=> sensor9:=entrada;
when others=> null;
end case;
end if;--3--tic='1'
----------------------------------------------------------
else --activo='0';
   
   
--------------------------------------------   
    if(clk1='1' and clk1'event) then --7
--------------------------------------------
--RESETEO DE LA MEMORIA
------------------------
       if modo="000"then   --1
       RAM<=(OTHERS=>"000000000000000000000000000000000000000000000000000000000000000000000000");
       finborrar<='1';
       end if;
------------------------
--DESCARGA EN PARALELO
------------------------ 
      if(modo="001")then --volcamos los datos al exterior  --2
      -- finborrar<='0';
         
         if dir='0' then
            direccion:=(OTHERS=>'0');
            dir:='1';
         end if;
                   
           if bandera3='0' then
             temporal3:=ram(conv_integer(direccion));
             bandera3:='1';
         end if;

      --   if(clk1='1' and clk1'event) then --7
            
              aux(0):=temporal3(0);
              aux(1):=temporal3(1);
              aux(2):=temporal3(2);
              aux(3):=temporal3(3);
              aux(4):=temporal3(4);
              aux(5):=temporal3(5);
              aux(6):=temporal3(6);
             aux(7):=temporal3(7);
              temp:=temp+1;
              salidapara<=aux;
              temporal3:=temporal3(71 downto 8)&"00000000";
                 if temp=9 then--8
                    direccion:=direccion+1;
                  temporal3:=ram(conv_integer(direccion));
                       if direccion=23 then--9
                        fin<='1';
                        dir:='0';
                     else--9
                        fin<='0';
                       end if;--9
                end if;--8
       end if;--7    
------------------------
--DESCARGA EN SERIE
------------------------
        if(modo="010")then
            finborrar<='0';
         if dir1='0' then   --iniciamos direccion a 0
            direccion:=(OTHERS=>'0');
            dir1:='1';
         end if;
         
           if bandera2='0' then     --pasamos la primera vez
             temporal:=ram(conv_integer(direccion));
             bandera2:='1';
         end if;
         
      --   if(clk1='1' and clk1'event) then --7
          salidaserie<=temporal(71);
          temporal:=temporal(71 downto 1)&'0';
          n:=n+1;
           if n=71 then
            direccion:=direccion+1;
            temporal:=ram(conv_integer(direccion));
            n:=(OTHERS=>'0');
            if direccion=23 then
            fin7<='1';
            else
            fin7<='0';
            end if;--direccion=23
          end if;--n=71      
         end if; --clk   

------------------------
--inicia sesión
------------------------
if modo="011" then--nueva sesión
finborrar<='0';
temporal :=(OTHERS=>'0');
------------------------
--inicia sesión    1
------------------------
   if sesion='1' then
       
         if dir4='0' then   --iniciamos direccion a 0
            direccion3:=(OTHERS=>'0');
            dir4:='1';
         end if;         
------------------------
--inicia sesión 2
------------------------
   elsif sesion='0' then
            
            if dir5='0' then   --iniciamos direccion a 12
            direccion3:="01100";
            dir5:='1';
            end if;
      
      --  if(clk1='1' and clk1'event ) then
           direccion3:=direccion3+1;
           ram(conv_integer(direccion3))<=temporal ;
                 if direccion3=23 then
               fin5<='1';
               else
               fin5<='0';
                end if;

    
           end if;
    
end if; --modo    
--end if;
------------------------------------
--visualizar datos
------------------------------------
if modo=101 then
 finborrar<='0';
         if versesion1='1' then
         direccion7:=(OTHERS=>'0');

         else
         direccion7:="01101" ;
         end if;
    
        if btn1='1' then
        direccion7:=direccion7+1;
        temporal8:=ram(conv_integer(direccion7));
        else
        salidaver<=datover;
        end if;




case sensor is               
when "0001"=> datover:=temporal8(71 downto 64);
when "0010"=> datover:=temporal8(63 downto 56);
when "0011"=> datover:=temporal8(55 downto 48);
when "0100"=> datover:=temporal8(47 downto 40);
when "0101"=> datover:=temporal8(39 downto 32);
when "0110"=> datover:=temporal8(31 downto 24);
when "0111"=> datover:=temporal8(23 downto 16);
when "1000"=> datover:=temporal8(15 downto  8);
when "1001"=> datover:=temporal8( 7 downto  0);
when others =>null;
end case   ;

salidaver<=datover;    

end if;--activo='0'

end if;
end if;

end process;
            
end Behavioral;

Desconectado Bruno_AR

  • PIC12
  • **
  • Mensajes: 89
Re: AYUDA CON MEMORIA
« Respuesta #1 en: 26 de Diciembre de 2006, 16:22:39 »
Ni de casualidad alguien va a leer tu codigo de esa manera, mandamelo a zappia_andres@hotmail.com, y cuando pueda lo corrigo y te lo envio....

Trata de fijarte las tabulaciones asi se ve mejor...
Un saludo, desde Argentina