miércoles, 18 de mayo de 2011

  • Pequeño procesador en VHDL

    Buenas noches, me llego un correo desde peru pidiendo un procesador en vhdl.. y pues como curse la materia de etn821 con el ingeniero Leon. y avanzamos el SIC (small integer computador), pues sabia de lo que trataba, Bueno aca les presento este ejemplo de un procesador a manera de introduccion y para que observen como se va trabajando en vhdl con varios modulos, y que realice tareas especificas.
    FIg. Pequeño procesador

    En la figura se muestra un pequeño procesador que contiene una serie de registros (R0, R1,...R7) de 16 bits, un multiplexor , un modulo sumador/restador, un contador y una unidad de control.
    Los datos de 16 bits son introducidos a traves de Din, y guardados en cualquier registro R y A, a traves de el multiplexor. El multiplexor tambien permite que los datos sean transferidos de un registro a otro,
    ademas observar que se utiliza un BUS de 16 bits, para tal cometido.
    La operacion de suma/resta se utilizan 2 numeros uno guardado previamente en A y otro presente en el bus, para luego ser transferido a cualesquiera de los registros R.
    La unidad de control determina que operacion realizar en cada momento segun la tabla de a continuacion:

    Operación
    Función que Realiza
    mv Rx,Ry
    mvi Rx,#D
    add Rx,Ry
    sub Rx,Ry
    Rx [Ry]
    Rx D
    Rx [Rx] + [Ry]
    Rx [Rx] [Ry]

    por ejemplo: si MV Rx, Ry indica mover contenido de Ry a Rx, una transferencia (similar al ahpl).
    mviRx,#D se refiere a un movimiento inmediato de la entrada de 16 bits a un registro x.

    Codificando.- utilizaremos un registro IR de 9 bits, para las instrucciones de la siguiente manera 
    IR0,IR1,IR2 : Instruccion
    IR3,IR4,IR5: da paso registro RX
    IR6,IR7,IR8: da paso registro RY
    cabe aclarar que solo necesitariamos 2 bits para realizar cada operacion de la tabla mostrada arriba. pero se pone 3 bits ir0,ir1,ir2 para mas instrucciones  que se pueda aumentar posteriormente.
    la operacio de Suma/resta, toma mas de un ciclo de reloj en ser realizadam, por lo que se utiliza al contador counter para que pueda realizar todas las operaciones para sumar o restar.
    El procesador comienza a ejecutar las instrucciones de la entrada Din, cuando se le da señal de habilitacion Run y el procesador afirma salida.
    CODIGO VHDL
    Ejemplo practrico:

    ------------------------------------------------------------------------------------
    -- pequeño procesador ejemplo
    ------------------------------------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    USE ieee.std_logic_signed.all;
    ENTITY procesador IS
    PORT ( DIN : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
    Resetn, Clock, Run : IN STD_LOGIC;
    Done : BUFFER STD_LOGIC;
    BusWires : BUFFER STD_LOGIC_VECTOR(15 DOWNTO 0));
    END procesador;

    ARCHITECTURE rtl OF procesador IS
    -- delcarar señales
    -- declarar componentes
    BEGIN
    High <= ’1’;
    Clear <= --definir
    Tstep: upcount PORT MAP (Clear, Clock, Tstep_Q);
    I <= IR(1 TO 3);
    decX: dec3to8 PORT MAP (IR(4 TO 6), High, Xreg);
    decY: dec3to8 PORT MAP (IR(7 TO 9), High, Yreg);
    controlsignals: PROCESS (Tstep_Q, I, Xreg, Yreg)
    BEGIN
    --especificar valores iniciales
    CASE Tstep_Q IS
    WHEN "00" => - - store DIN in IR as long as Tstep_Q = 0
    IRin <= ’1’;
    WHEN "01" => - - define signals in time step T1
    CASE I IS
    . . .
    END CASE;
    WHEN "10" => - - define signals in time step T2
    CASE I IS
    . . .
    END CASE;
    WHEN "11" => - - define signals in time step T3
    CASE I IS
    . . .
    END CASE;
    END CASE;
    END PROCESS;
    reg_0: regn PORT MAP (BusWires, Rin(0), Clock, R0);
    -- otras instancias como los registros
    -- instancia bus
    END Behavior;
    -----------------------------------------------------------

    sub programa 1
    -----------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    USE ieee.std_logic_signed.all;
    ENTITY upcount IS
    PORT ( Clear, Clock : IN STD_LOGIC;
    Q : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
    END upcount;
    ARCHITECTURE Behavior OF upcount IS
    SIGNAL Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
    BEGIN
    PROCESS (Clock)
    BEGIN
    IF (Clock’EVENT AND Clock = ’1’) THEN
    IF Clear = ’1’ THEN
    Count <= "00";
    ELSE
    Count <= Count + 1;
    END IF;
    END IF;
    END PROCESS;
    Q <= Count;
    END Behavior;
    -----------------------------------------------------------

    sub programa 2
    -----------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    ENTITY dec3to8 IS
    PORT ( W : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
    En : IN STD_LOGIC;
    Y : OUT STD_LOGIC_VECTOR(0 TO 7));
    END dec3to8;
    ARCHITECTURE Behavior OF dec3to8 IS
    BEGIN
    PROCESS (W, En)
    BEGIN
    IF En = ’1’ THEN
    CASE W IS
    WHEN "000" => Y <= "10000000";
    WHEN "001" => Y <= "01000000";
    WHEN "010" => Y <= "00100000";
    WHEN "011" => Y <= "00010000";
    WHEN "100" => Y <= "00001000";
    WHEN "101" => Y <= "00000100";
    WHEN "110" => Y <= "00000010";
    WHEN "111" => Y <= "00000001";
    END CASE;
    ELSE
    Y <= "00000000";
    END IF;
    END PROCESS;
    END Behavior;
    -----------------------------------------------------------

    sub programa 3
    -----------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    ENTITY regn IS
    GENERIC (n : INTEGER := 16);
    PORT ( R : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);
    Rin, Clock : IN STD_LOGIC;
    Q : BUFFER STD_LOGIC_VECTOR(n-1 DOWNTO 0));
    END regn;
    ARCHITECTURE Behavior OF regn IS
    BEGIN
    PROCESS (Clock)
    BEGIN
    IF Clock’EVENT AND Clock = ’1’ THEN
    IF Rin = ’1’ THEN
    Q <= R;
    END IF;
    END IF;
    END PROCESS;
    END Behavior;
    -----------------------------------------------------------

    añadir los sub modulos segun la imagen del procesador, utilizando de muestra el primer programa  mostrado en estos codigos.
    Espero que les sirva como una pequeña guia cuando realizen circuitos mucho mas complejos. saludos


  • 4 comentarios:

    Ing. Ruiz dijo...
    Este comentario ha sido eliminado por el autor.
    Ing. Ruiz dijo...
    Este comentario ha sido eliminado por el autor.
    Ing. Ruiz dijo...

    hola ke tal a ver si me podrias ayudar con una practica ke tengo en proceso..... usando el vhdl con spartan 3a.... estoy asiendo una practica la cual es utilizando la lcd de la tarjeta esparta lo ke kiero o e intenta es hacer ke muestre un mensaje ejemplo. "Practica" o ya sea" Ing Electroica ". Si me podrias ayudar te lo agradeceria mucho.. mi email es servtec.ruiz@gmail.com

    Saludos....y GRACIAS.

    ReTo dijo...

    Buen dia,
    pues hay bastante informacion de como utilizar el modulo LCD de la tarjeta Xilinx spartan 3e, te recomiendo empezar leendo el manual started kit spartan 3e, ahi encuentras el datasheet del modulo LCD ademas de varios otros recursos utiles que te seran de gran utilidad

    Copyright @ 2009 AmericoAlvarezSurci.