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