En la segunda parte del proyecto CPU sencilla con FPGA, veremos cómo describir los registros.
Crearemos tres registros A, B y C cuyas salidas sacaremos por los displays de 7 segmentos de la BASYS 3 para verificar que el código funciona como se espera.
Los registros A y B son los que almacenan los datos de la ALU y el registro C simula la propia ALU.
El código Verilog del registro queda:
En el módulo top, instanciamos los tres registros y el driver del display de 7 segmentos.
module sap_register_top (clk, reset, a_latch, b_latch, c_latch, data_sw, seg, an);
input clk, reset; // generic inputs
input a_latch, b_latch, c_latch;
input [7:0] data_sw;
output [6:0] seg;
output [3:0] an;
wire [7:0] a_reg_bus, b_reg_bus, c_reg_bus, ssd_bus;
//******************
// Structural coding
//******************
// a register
sap_register a_register (
.clk(clk),
.reset(reset),
.DATA_IN(data_sw),
.latch(a_latch),
.REG_OUT(a_reg_bus));
// b register
sap_register b_register (
.clk(clk),
.reset(reset),
.DATA_IN(data_sw),
.latch(b_latch),
.REG_OUT(b_reg_bus));
// c register
sap_register c_register (
.clk(clk),
.reset(reset),
.DATA_IN(data_sw),
.latch(c_latch),
.REG_OUT(c_reg_bus));
// mux for seven segment display
mux4_1 MUX41 (
.clk(clk),
.in_0(c_reg_bus),
.in_1(b_reg_bus),
.in_2(a_reg_bus),
.in_3(data_sw),
.out(ssd_bus),
.gates(an));
// Seven segnent display driver
ssd_driver SSDD (
.in(ssd_bus),
.seg(seg));
endmodule
Lo subimos a la BASYS 3 y comprobamos el funcionamiento.
Con los switches 8 a 15 seleccionamos el dato a introducir en los registros y con los pulsadores BtnL, BtnC y BtnR los introducimos en los registros A, B y C.
Por simplicidad sólo se tienen en cuenta los 4 bits menos significativos tanto para introducir un dato, como para mostrarlo en los displays de 7 segmentos.
Descarga el código Verilog de este tutorial aquí abajo.