TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: elpedro17 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;
-
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...