Skip to content

buffer de entrada

Diogo Valadares Reis dos Santos edited this page Aug 26, 2025 · 4 revisions

[English]

[← Página Anterior | Próxima Página →]

O Buffer de Entrada

O Buffer de Entrada no DRISC-V é um resquício dos circuitos do RISC I original, que permite que os dados carregados da memória sejam deslocados e estendidos com sinal. Isso significa que instruções de carga utilizam esse componente para selecionar uma parte da palavra (4 bytes) que está sendo carregada da memória e, após essa seleção, ela é estendida para 32 bits, mantendo o sinal.

O Buffer de Entrada

A tabela a seguir mostra todas as possibilidades de transformação que esse componente permite, considerando a entrada 0xfafbfcfd:

Tipo Deslocamento Saída (hex) Saída (decimal)
palavra 0 0xfafbfcfd -84.148.995
short sem sinal 0 0xfcfd 64.765
short sem sinal 1 0xfbfc 64.508
short sem sinal 2 0xfafb 64.251
short com sinal 0 0xfffffcfd -771
short com sinal 1 0xfffffbfc -1028
short com sinal 2 0xfffffafb -1285
byte sem sinal 0 0xfd 253
byte sem sinal 1 0xfc 252
byte sem sinal 2 0xfb 251
byte sem sinal 3 0xfa 250
byte com sinal 0 0xfffffffd -3
byte com sinal 1 0xfffffffc -4
byte com sinal 2 0xfffffffb -5
byte com sinal 3 0xfffffffa -6

O tipo de dado é codificado da seguinte forma: o bit mais significativo indica se o dado é com sinal, enquanto os dois bits restantes indicam o tamanho — 00 para byte, 01 para short, e 1x para palavra.

Dentro do Buffer de Entrada

Quando o buffer de entrada recebe dados, eles precisam ser armazenados em seu registrador para serem decodificados. Esse registrador é sempre escrito durante a Fase 2 do pipeline, durante o acesso à MEM nas instruções de carga. No ciclo seguinte, os dados são deslocados usando múltiplos multiplexadores. Em seguida, as linhas de byte e short são estendidas para 32 bits e, por fim, um dos três tamanhos de dados é escolhido como saída.

Circuito Interno do Buffer de Entrada

Código SystemVerilog

`timescale 1s/1s
//Entradas e Saídas
module input_buffer(
    input clock,
    input write,
    input [2:0] data_type,
    input [1:0] data_offset,
    input [31:0] io_in,
    output logic [31:0] cpu_out
);
//Registrador
    reg [31:0] data_reg;
//Lógica de atualização do registrador
    always@(posedge clock) begin
        if(write) begin
            data_reg <= io_in;
        end
    end
//Deslocamento e extensão de dados
   always@(*) begin
        case (data_type)
            3'b100: cpu_out = {24'h0, data_reg[data_offset*8+7 -: 8]};
            3'b101: cpu_out = {16'h0, data_reg[data_offset*8+15 -: 16]};
            3'b000: cpu_out = {{24{data_reg[data_offset*8+7]}}, data_reg[data_offset*8+7 -: 8]};
            3'b001: cpu_out = {{16{data_reg[data_offset*8+15]}}, data_reg[data_offset*8+15 -: 16]};
            default: cpu_out = data_reg;
        endcase
    end
endmodule

Clone this wiki locally