TODOPIC

Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: Geo en 21 de Mayo de 2006, 20:30:54

Título: Máquina digital simple
Publicado por: Geo en 21 de Mayo de 2006, 20:30:54
Esta semana estamos por entregar una pequeña máquina digital (de 4 bits), faltan las pruebas finales, grabarla en la tarjeta (tenemos una Spartan-3 Starter Kit Board), y crear el reporte. Comento porque tengo la intención de poner todo lo que hicimos por aquí, una vez concluido me pondré a tratar algo con lo de VGA (por eso es que he andado de "metiche" en los otros posts :P).

saludos,
José Jorge (Geo).
Título: Re: Máquina digital simple
Publicado por: Chaly29 en 21 de Mayo de 2006, 23:13:47
Hola Geo, todo aporte es bienvenido, desde ya muchas gracias en nombre de todos.

Un saludo.

Atte. CARLOS.

Título: Re: Máquina digital simple
Publicado por: Geo en 24 de Mayo de 2006, 02:25:50
Hoy la entregamos ya programada en la tarjeta, y el profesor nos comentó si no teníamos problemas en que usara el proyecto para posiblemente elaborar algún artículo (más que nada desde el punto de vista didáctico) :). Todavía nos falta hacer el reporte, pero por lo pronto pongo una captura de una de las pruebas.

De lo que se puede observar, dato_entrada (el dato de entrada a la memoria cuando esté en modo de escritura) no se usa (sólo se está observando cómo corre el "programa", la memoria ya está programada).
El montón de ctrl_X son las señales de control (si, ya sé, se pueden meter en un vector, de hecho, la señal auxiliar en el código es un std_logic_vector :P).
Lo demás, son las salidas de cada uno de los registros, visualizados para ir observando el comportamiento, en lo que presentamos el único que interesa es el acumulador (salida_AC), que es donde se observa el resultado de las distintas operaciones.

La primera instrucción del programa es borrar el acumulador (bueno, allí se ve que también se puso a 0 por el reset :P); luego, cargar un 4 al acumulador; posteriormente sumar al acumulador el dato ubicado en la posición 13 de la memoria (que es un 5), por lo que se observa un 9 en el acumulador ( 4 + 5 :P); a continuación complementa el contenido del acumulador( 9=1001 -> 0110=6); y así va... Esas instrucciones las va obteniendo de la memoria (16x4).

A ver si lo siguiente que pongo es el diagrama a bloques, y alguna breve explicación de qué es esto :P.

Por cierto, ¿alguien conoce algún programa para hacer diagramas a bloques? (Cajitas con flechas, comentarios al lado, texto, etc.)

Saludos,
José Jorge (Geo).
Título: Re: Máquina digital simple
Publicado por: Geo en 10 de Septiembre de 2006, 19:11:35
¡Fiuuu, cuánto tiempo :P! Bueno, no puedo quedar mal así que aquí empiezo :P.

Diseño de una máquina digital con VHDL
Resumen.

Una computadora digital en VHDL es un dispositivo de uso general que puede ejecutar diversas operaciones y, además, que se le puede instruir en cuanto a las operaciones específicas que debe efectuar. El usuario de una computadora puede controlar el proceso por medio de un programa. Un programa es un conjunto de instrucciones que especifica las operaciones, operandos y la secuencia en que ocurrirá el procesamiento. La tarea de procesamiento se puede alterar especificando un programa nuevo con instrucciones diferentes o bien especificando las mismas instrucciones con datos distintos. Los códigos de instrucciones, junto con los datos, se almacenan en la memoria. El control lee cada instrucción de la memoria y la coloca en un registro de control. Después, el control interpreta la instrucción y procede a ejecutarla emitiendo una secuencia de microoperaciones. Toda computadora tiene un conjunto de instrucciones propio y único. La capacidad de almacenar y ejecutar instrucciones es la propiedad más importante de la computadora de uso general.

Estas son las instrucciones que puede realizar la máquina digital que aquí se describe, la arquitectura es de acumulador (todos los resultados de las operaciones quedan en el acumulador):

Bueno, ahora sigue la tabla de las señales de control y el diagrama a bloques, pero los pondré luego porque ahorita no tengo Office en la computadora porque acabo de reinstalar TODO (estoy usando AbiWord en lo que consigo Word u OpenOffice y no se ven las imágenes del reporte :P). Después de eso pondré el código de cada unidad/registro. Nos vemos :D.

Saludos,
JJ (Geo).
Título: Re: Máquina digital simple
Publicado por: lous en 11 de Septiembre de 2006, 07:54:47
 :-/ Codigo Codigo, Yo quiero ver el codigo
Título: Re: Máquina digital simple
Publicado por: Geo en 15 de Septiembre de 2006, 02:10:17
Este es el diagrama a bloques :D.
Título: Re: Máquina digital simple
Publicado por: Geo en 15 de Septiembre de 2006, 02:14:51
Código del registro de datos (DR)

Código: VHDL
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. entity RegDR is
  7.     Port ( RST : in std_logic;
  8.            Clk : in std_logic;
  9.            LDDR : in std_logic;
  10.            DR_in : in std_logic_vector(3 downto 0);
  11.            DR_out : out std_logic_vector(3 downto 0));
  12. end RegDR;
  13.  
  14. architecture Behavioral of RegDR is
  15.  
  16.         signal DRLD: std_logic_vector(3 downto 0);
  17.  
  18. begin
  19.  
  20.         process(Clk)
  21.           begin
  22.              if clk'event and clk='1' then
  23.                 if RST='1' then
  24.                DRLD <= (others =>'0');
  25.                 elsif LDDR = '1' then
  26.                   DRLD <= DR_in;
  27.                 end if;
  28.              end if;
  29.         end process;
  30.  
  31.         DR_out <= DRLD;
  32.  
  33. end Behavioral;

Registro de direcciones (AR)
Código: VHDL
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. entity RegAR is
  7.     Port ( RST : in std_logic;
  8.            Clk : in std_logic;
  9.            LDAR : in std_logic;
  10.            AR_in : in std_logic_vector(3 downto 0);
  11.            AR_out : out std_logic_vector(3 downto 0));
  12. end RegAR;
  13.  
  14. architecture Behavioral of RegAR is
  15.  
  16.         signal ARLD: std_logic_vector(3 downto 0);
  17.  
  18. begin
  19.        
  20.         process(Clk)
  21.              begin
  22.              if clk'event and clk='1' then
  23.                    if RST='1' then
  24.                    ARLD <= (others =>'0');
  25.                    elsif LDAR = '1' then
  26.                      ARLD <= AR_in;
  27.                    end if;
  28.                 end if;
  29.         end process;
  30.  
  31.         AR_out <= ARLD;
  32.  
  33. end Behavioral;
Como puede observarse, son exactamente iguales. Esta fué una primera implementación con muchas cosas que pueden mejorarse (jeje, así pueden meterle mano quien se anime a programarla), yo lo hice con un sólo registro instanciándolo las veces que fuera necesario :).

Saludos,
JJ (Geo).
Título: Re: Máquina digital simple
Publicado por: Geo en 20 de Septiembre de 2006, 18:24:16
Registro de instrucciones:
Código: VHDL
  1. library IEEE;
  2.            use IEEE.STD_LOGIC_1164.ALL;
  3.        use IEEE.STD_LOGIC_ARITH.ALL;
  4.        use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6.        entity RegIR is
  7.            Port ( RST : in std_logic;
  8.                   Clk : in std_logic;
  9.                   LDIR : in std_logic;
  10.                   IR_in : in std_logic_vector(3 downto 0);
  11.                   IR_out : out std_logic_vector(3 downto 0));
  12.        end RegIR;
  13.  
  14.        architecture Behavioral of RegIR is
  15.  
  16.         signal IRLD: std_logic_vector(3 downto 0);
  17.  
  18.        begin
  19.  
  20.           process(Clk)
  21.          begin
  22.             if clk'event and clk='1' then
  23.                if RST='1' then
  24.                       IRLD <= (others =>'0');
  25.                elsif LDIR = '1' then
  26.                   IRLD <= IR_in;
  27.                end if;
  28.             end if;
  29.           end process;
  30.  
  31.         IR_out <= IRLD;
  32.  
  33.        end Behavioral;

Contador de programa
Código: VHDL
  1. library IEEE;
  2.        use IEEE.STD_LOGIC_1164.ALL;
  3.        use IEEE.STD_LOGIC_ARITH.ALL;
  4.        use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6.        entity RegPC is
  7.            Port ( RST : in std_logic;
  8.               Clk : in std_logic;
  9.               INCPC : in std_logic;
  10.                   PC_out : out std_logic_vector(3 downto 0));
  11.        end RegPC;
  12.  
  13.        architecture Behavioral of RegPC is
  14.  
  15.         signal Conta: std_logic_vector(3 downto 0);
  16.  
  17.        begin
  18.  
  19.           process(Clk)
  20.              begin
  21.             if clk'event and clk='1' then
  22.                if RST='1' then
  23.                       Conta <= (others =>'0');
  24.                elsif     INCPC='1' then
  25.                   Conta <= Conta + 1;
  26.                end if;
  27.             end if;
  28.           end process;
  29.  
  30.         PC_out <= Conta;
  31.        
  32.        end Behavioral;
Título: Re: Máquina digital simple
Publicado por: Geo en 20 de Septiembre de 2006, 18:26:01
Acumulador
Código: VHDL
  1. library IEEE;
  2.          use IEEE.STD_LOGIC_1164.ALL;
  3.          use IEEE.STD_LOGIC_ARITH.ALL;
  4.          use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6.          entity RegAC is
  7.               Port ( RST : in std_logic;
  8.                  CLRA : in std_logic;
  9.                      Clk : in std_logic;
  10.                      LDAC : in std_logic;
  11.                      AC_in : in std_logic_vector(3 downto 0);
  12.                      AC_out : out std_logic_vector(3 downto 0));
  13.           end RegAC;
  14.  
  15.           architecture Behavioral of RegAC is
  16.  
  17.         signal ACLD: std_logic_vector(3 downto 0);
  18.  
  19.            begin
  20.  
  21.               process(Clk)
  22.              begin
  23.                  if clk'event and clk='1' then
  24.                     if RST='1' or CLRA='1' then
  25.                            ACLD <= (others =>'0');
  26.                     elsif LDAC = '1' then
  27.                        ACLD <= AC_in;
  28.                     end if;
  29.                  end if;
  30.               end process;
  31.  
  32.         AC_out <= ACLD;
  33.  
  34.             end Behavioral;
Título: Re: Máquina digital simple
Publicado por: Geo en 20 de Septiembre de 2006, 18:28:46
ALU

Código: VHDL
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. entity ALU4 is
  7.     Port ( A : in std_logic_vector(3 downto 0);
  8.            B : in std_logic_vector(3 downto 0);
  9.            S0 : in std_logic ;
  10.               S1 : in std_logic ;
  11.            S2: in std_logic ;
  12.            G : out std_logic_vector(3 downto 0));          
  13. end ALU4;
  14.  
  15. architecture Behavioral of ALU4 is
  16.  
  17. begin
  18.  
  19.         process(A, B, S0, S1, S2)
  20.            begin
  21.               if S2='0' and S1='0' and S0='1' then
  22.                  G <= A + B;
  23.               elsif S2='0' and S1='1' and S0='0' then
  24.                  G <= A - B;
  25.               else
  26.                  G <= not A;
  27.               end if;
  28.         end process;
  29.  
  30. end Behavioral;

Falta la unidad de control y la instanciación de componentes (hecha en código VHDL, no en esquemático).
Título: Re: Máquina digital simple
Publicado por: lous en 29 de Septiembre de 2006, 02:13:21
GRACIAS :-/
Título: Re: Máquina digital simple
Publicado por: flightcontroller en 26 de Octubre de 2006, 19:03:19
Q tal!,
tengo en mi poder el uso de una tarjeta de desarrollo Sparten-3e, me parece que es la misma que la del compañero Geo y este foro es buena opción para hecharla a andar y empezar con pequeños proyectillos,
..estamos en contacto compañeros..

Saludos.