En el siguiente tutorial veremos un ejemplo de aplicación del uso de un monitor VGA para visualizar información.
Sintetizaremos en la BASYS 3 el procesador MIPS que vimos en el Tema 8 y conectaremos los buses de datos al módulo VGA que vimos en el capítulo 15. De esa forma visualizaremos en el monitor VGA las señales del Controller y la información que circula por los buses de datos del procesador.
La siguiente imagen muestra el esquema del circuito que vamos a implementar.
Agrandes rasgos consta de los módulos Controller y Datapath del procesador MIPS, una señal de reloj customizada de 1Hz que conectaremos al datapath para ralentizar la ejecución de las instrucciones a una velocidad visible para el ojo humano, de otro modo veríamos los datos cambiar a toda velocidad y no serviría de nada mostrarlos en el monitor. Y por último el módulo VGA que hace las veces de driver del monitor.
En la siguiente imagen se puede ver un esquema detallado del procesador MIPS para instrucciones tipo J y la conexión de los diferentes buses de datos y señales de la Unidad de Control con el driver VGA.
La selección de los buses de datos a mostrar en el monitor es personalizable; he seleccionado los que a mi entender son más interesantes para verificar el correcto funcionamiento del procesador.
Modificando el tamaño de letra se puede añadir una segunda columna a la derecha y mostrar más información si fuera necesario. Revisa el capítulo 14 para ver cómo añadir nuevas instancias en el módulo top_vga y mostrar más información en el monitor VGA.
A continuación puedes ver el código Verilog del módulo top donde se instancia el Controlador y el Datapath del procesador MIPS, la señal de reloj customizada de 1 Hz y en driver del monitor VGA. El resto de módulos los puedes descargar al final de la página.
// Procesador MIPS para instrucciones tipo-J + monitor VGA
//
module mips_processor_top_module (
input clk, reset_n,
output VGA_HS, VGA_VS,
output [3:0] VGA_R, VGA_G, VGA_B);
wire [31:0] INSTRUCTION_bus, COUNTER_bus, READ_DATA1_bus, READ_DATA2_bus;
wire [31:0] DATA_RESULT_bus, READ_DATA_bus, ALU_RESULT_bus, SIGN_EXTEND_bus;
wire [2:0] ALU_control_bus;
wire w_mem_to_reg, w_alu_src, w_reg_dst, w_mem, w_reg, w_pc_source, w_zero, w_jump;
wire w_clk_out;
wire [7:0] flag_wire;
assign flag_wire = {w_jump, w_mem_to_reg, w_alu_src, w_reg_dst, w_mem, w_reg, w_pc_source, w_zero};
// CUSTOM CLK
custom_clk_top C_CLK (
.clk(clk),
.clk_out(w_clk_out));
// controller
controller CONTROLLER (
.INSTRUCTION(INSTRUCTION_bus),
.mem_to_reg_out(w_mem_to_reg),
.alu_src_out(w_alu_src),
.reg_dst_out(w_reg_dst),
.write_enable_m_out(w_mem),
.write_enable_r_out(w_reg),
.pc_source_out(w_pc_source),
.jump_out(w_jump),
.zero(w_zero),
.ALU_ctrl_out(ALU_control_bus));
// datapath jump instrucción
datapath_jump DATAPATH (
.clk(w_clk_out),
.reset_n(reset_n),
.jump_dp(w_jump),
.reg_dst_dp(w_reg_dst),
.we_r_dp(w_reg),
.pc_source_dp(w_pc_source),
.alu_src_dp(w_alu_src),
.ALU_control_dp(ALU_control_bus),
.zero_dp(w_zero),
.we_m_dp(w_mem),
.mem_to_reg_dp(w_mem_to_reg),
.COUNTER(COUNTER_bus), // vga
.INSTRUCTION(INSTRUCTION_bus), // vga
.READ_DATA1(READ_DATA1_bus), // vha
.READ_DATA2(READ_DATA2_bus), // vga
.DATA_RESULT(DATA_RESULT_bus),
.READ_DATA(READ_DATA_bus),
.ALU_RESULT(ALU_RESULT_bus),
.SIGN_EXTEND(SIGN_EXTEND_bus));
// modulo VGA
top_vga VGA (
.clk(clk),
.data_bus_in1(COUNTER_bus), // PROGRAM COUNTER
.data_bus_in2(INSTRUCTION_bus), // INSTRUCTION TO EXECUTE
.data_bus_in3(READ_DATA1_bus), // RD1 del REG. FILE
.data_bus_in4(READ_DATA2_bus), // RD2 del REG. FILE
.data_bus_in5(DATA_RESULT_bus), // RESULT_BUS
.data_bus_in6(READ_DATA_bus), // RD del DATA MEMORY
.data_bus_in7(ALU_RESULT_bus), // ALU RESULT
.data_bus_in8(SIGN_EXTEND_bus), // SIGN EXTEND
.flag_bus(flag_wire), // control signals from the Controller module
.VGA_HS(VGA_HS),
.VGA_VS(VGA_VS),
.VGA_R(VGA_R),
.VGA_G(VGA_G),
.VGA_B(VGA_B));
endmodule
Genera el bitstream y programa la BASYS 3. Si todo va bien verás ocho líneas de información en tu monitor VGA representando siete buses de datos y las ocho señales binarias del Control Unit.
Buses de datos del procesador MIPS conectado a un monitor VGA
De arriba a abajo el monitor muestra la información que discurre por los buses:
Valor del PROGRAM COUNTER
Próxima INSTRUCCION a ejecutar
Salida RD1 del Register File
Salida RD2 del Register File
Resultado de la ALU
Salida READ DATA del Data Memory
valor del SIGN EXTEND
Flag de estado de las señales de control generadas por la Unidad de Control
Puedes descargar las fuentes empleadas en este tutorial en el enlace de aquí abajo.