Advertisement
Mercedes

Untitled

Nov 3rd, 2015
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. -- Microprocesador sencillo
  2.  
  3. --Esta linea habilita la libreria IEEE, de la cual usamos los "package" del std_logic_1164,
  4. --IEEE.STD_LOGIC_ARITH y IEEE.STD_LOGIC_UNSIGNED, que me permiten operar con variables del
  5. --tipo standard_logic
  6.  
  7. LIBRARY IEEE;
  8. USE IEEE.STD_LOGIC_1164.ALL;
  9. USE IEEE.STD_LOGIC_ARITH.ALL;
  10. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  11.  
  12.  
  13. --Definición de las entradas y las salidas del microprocesador
  14. ENTITY microsencill IS
  15. PORT(clock, reset : IN STD_LOGIC;
  16. we : OUT STD_LOGIC;
  17. address_out, program_counter_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  18. register_A_out, memory_data_register_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
  19. memory_data_register_int : IN STD_LOGIC_VECTOR(15 DOWNTO 0));
  20. END microsencill;
  21.  
  22. --Arquitectura interna del mircoprocesador, consta de una unidad de control con
  23. --descrita en modo comportamental
  24.  
  25. ARCHITECTURE a OF microsencill IS
  26. -- Definimos un tipo de variable STATE_TYPE que me indica los posibles estados en los que
  27. -- puede estar el microprocesador
  28. TYPE STATE_TYPE IS (reset_pc, fetch, decode, execute_add, execute_nop , execute_load, execute_store, --excecute_nop agregado
  29. execute_store3, execute_store2, execute_jump, execute_sub, execute_and, execute_jzero);
  30. --Definición de señales, la variable state me indica el estado del procesador
  31. SIGNAL state : STATE_TYPE;
  32. SIGNAL instruction_register, memory_data_register,memory_data_register_input, memory_data_register_in, register_A : STD_LOGIC_VECTOR(15 DOWNTO 0); --memory_data_register_in agrregado memory_data_register_input agregado
  33. SIGNAL program_counter, memory_address_register : STD_LOGIC_VECTOR(7 DOWNTO 0);
  34. -- Si memory_write=1 entonces escribiremos en memoria, si memory_write=0 lo que hacemos es leer
  35. SIGNAL memory_write : STD_LOGIC;
  36.  
  37. BEGIN
  38.  
  39. -- Relación entre señales internas y la salida del micro (register_A_out me muestra el contenido
  40. -- del acumulador, memory_data_register_out me muestra la salida a memoria, address_out indica la dirección
  41. -- a acceder y program_counter_out indica el punto del programa en el que me encuentro
  42. address_out <= memory_address_register;
  43. program_counter_out <= program_counter;
  44. register_A_out <= register_A;
  45. we <= memory_write;
  46.  
  47. --A continuación detallo el comportamiento de la unidad de control
  48. PROCESS (CLOCK, RESET)
  49. BEGIN
  50. IF reset = '1' THEN
  51. state <= reset_pc;
  52. -- La unidad de control me ejecuta una instruccion a partir de cada flanco de subida.
  53. ELSIF clock'EVENT AND clock = '1' THEN
  54. CASE state IS
  55. -- dependiendo del estado hacemos una u otra operación, reset_pc me pone los registros a 0
  56. WHEN reset_pc =>
  57. program_counter <= "00000000";
  58. memory_address_register <= "00000000";
  59. register_A <= "0000000000000000";
  60. memory_write <= '0';
  61. state <= fetch;
  62. -- El estado "fetch" es el estado de búsqueda de instrucciones, carga de la memoria
  63. --al registro de instrucciones e incrementa el contador de programa en 1
  64. WHEN fetch =>
  65. instruction_register <= memory_data_register_input;
  66. program_counter <= program_counter + 1;
  67. memory_write <= '0';
  68. state <= decode;
  69. -- Segidamente se pasaria al estado de decodificación (en el siguiente
  70. -- ciclo de reloj).
  71. WHEN decode =>
  72. --Cargamos el contenido del registro de instrucciones (últimos 8 bits)
  73. -- en el registro de direcciones de la memoria (por si se ha de hacer algún acceso
  74. -- al decodificar luego una instrucción
  75. memory_address_register <= instruction_register(7 Downto 0);
  76. CASE instruction_register(15 downto 8) IS
  77. WHEN "00000011" =>
  78. state <= execute_add;
  79. WHEN "00000001" =>
  80. state <= execute_store;
  81. WHEN "00000010" => --Se cambio condicion del case´para que no se repitan casos
  82. state <= execute_load;
  83. WHEN "00000000" =>
  84. state <= execute_jump;
  85. WHEN "00000110" =>
  86. state <= execute_sub;
  87. WHEN "00000100" =>
  88. state <= execute_and;
  89. WHEN "00000101" =>
  90. state <= execute_jzero;
  91. WHEN "00000111" =>
  92. state <= execute_nop;
  93. WHEN OTHERS =>
  94. state <= fetch;
  95. END CASE;
  96. -- Ejecuta la función add
  97. WHEN execute_add =>
  98. register_a <= register_a + memory_data_register_in;
  99. memory_address_register <= program_counter;
  100. state <= fetch;
  101.  
  102. -- Ejecuta la función store (en tres ciclos para escribir en memória)
  103. WHEN execute_store =>
  104. -- write register_A to memory
  105. memory_write <= '1';
  106. state <= execute_store2;
  107. -- Este estado se asegura que la dirección de la memoria es válido hasta que acaba el ciclo
  108. -- de escritura
  109. WHEN execute_store2 =>
  110. memory_write <= '0';
  111. state <= execute_store3;
  112. WHEN execute_store3 =>
  113. memory_address_register <= program_counter;
  114. state <= fetch;
  115.  
  116. -- Ejecuta la instrucción load en donde se carga el contenido de la memoria
  117. -- en el acumulador.
  118. WHEN execute_load =>
  119. register_a <= memory_data_register_in;
  120. memory_address_register <= program_counter;
  121. state <= fetch;
  122.  
  123. -- Ejecuta la instrucción JUMP incrementando el contador de programa
  124. -- hasta donde diga el registro de instrucciones
  125. WHEN execute_jump =>
  126. memory_address_register <= instruction_register(7 Downto 0);
  127. program_counter <= instruction_register(7 Downto 0);
  128. state <= fetch;
  129.  
  130.  
  131. -- Ejecuta la función sub (resta del registro el contenido de la memoria
  132. WHEN execute_sub =>
  133. register_a <= register_a - memory_data_register_in;
  134. memory_address_register <= program_counter;
  135. state <= fetch;
  136.  
  137.  
  138. -- Ejecuta la función AND
  139. WHEN execute_and =>
  140. register_a <= register_a AND memory_data_register_in;
  141. memory_address_register <= program_counter;
  142. state <= fetch;
  143.  
  144. -- Ejecuta la función NOP
  145. WHEN execute_nop =>
  146. state <= fetch;
  147.  
  148.  
  149. -- Ejecuta la función jzero (salta si el acumulador es cero)
  150. WHEN execute_jzero =>
  151. IF register_A = "0000000000000000" THEN
  152. memory_address_register <= instruction_register(7 Downto 0);
  153. program_counter <= instruction_register(7 Downto 0);
  154. ELSE
  155. memory_address_register <= program_counter;
  156. END IF;
  157. state <= fetch;
  158.  
  159. END CASE;
  160. END IF;
  161. END PROCESS;
  162. END a;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement