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