user avatar
user avatar
user avatar
Candid Moe
  • Member for 1 year
  • Last seen more than 1 year ago
  • Springfield
Stats
239
reputation
0
reached
0
answers
0
questions
Loading…
About

Programando desde 1975.

Hardware: Arduino, ESP8266, ESP32, FPGA.

Software: Python, Linux, Verilog.

Estoy implementando una CPU LC3 con Verilog. Lo implemento usando microcódigo. Este es el corazón de la CPU, encargado de ejecutar el microcódigo:

 17 module micropgma (
 18     input clk,
 19     input rstn,
 20     input [3:0] op,
 21     output reg [SIG_NUMBER-1:0] signal
 22     );
 23 
 24 `include "common.inc"
 25 reg [SIG_NUMBER-1:0] mp [0:256];
 26 reg [6:0] step = 0;
 27 
 28 always @ (negedge clk) begin
 29     if (~rstn) 
 30         step <= 0;
 31     else begin
 32         step[6:3] = op;
 33         signal = mp[step];  
 34         if (signal[0] == 0)
 35             step = 0;
 36         else
 37             step = step + 1;
 38     end 
 39 end
 40 
 41 endmodule

Y eso es todo. El microprograma es una tabla. Por cada operación (como ADD), hay lista de señales que implementan la operación. Desde la CPU recibe el código de operación, que da la base desde donde ejecutar el microprograma.

Una instrucción de Assembler como

LD R0, MY_VALUE ; load the value at MY_VALUE into R0

Se ejecuta en una serie de microinstrucciones:

PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0000 0000 0000 2003 0000 0000 0000 0000 0000 0000 0000 0000 0000
SIG_PC_OUT
SIG_ADDR_IN
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0000 0000 0000 2003 0000 0000 0000 0000 0000 0000 0000 0000 0000
SIG_MEM_OUT
SIG_IR_IN
SIG_PC_INC
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0001 2003 0000 2003 0000 0000 0000 0000 0000 0000 0000 0000 0000
SIG_PC_OUT
SIG_ALU_IN
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0001 0001 0001 2003 0000 0000 0000 0000 0000 0000 0000 0000 0000
SIG_OFFSET_OUT
SIG_ALU_ADD
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0001 0003 0004 2003 0000 0000 0000 0000 0000 0000 0000 0000 0000
SIG_ALU_OUT
SIG_ADDR_IN
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0001 0004 0004 2003 0004 0000 0000 0000 0000 0000 0000 0000 0000
SIG_MEM_OUT
SIG_DST_IN
PC   BUS  ALU  IR   ADDR R0   R1   R2   R3   R4   R5   R6   R7
0001 ff85 0004 2003 0004 ff85 0000 0000 0000 0000 0000 0000 0000

Tengo una CPU funcionando ...

Badges
This user doesn’t have any gold badges yet.
1
silver badge
3
bronze badges
Posts

This user hasn’t posted yet.