-
Notifications
You must be signed in to change notification settings - Fork 0
buffer de entrada
[English]
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.
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.
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.
`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-
- 1.1 Introduction
- 1.2 RISC-V Implementation
- 1.2.1 Available Instruction Set
- 1.2.2 Available Non-ISA Features
-
- 2.1 ALU
- 2.2 Register File
- 2.3 Program Counter
- 2.4 Input Buffer
- 2.5 RAM
- 2.6 Operation Controller
- 2.7 CSR Controller
-
- 3.1 Input Devices
- 3.1.1 Keyboard
- 3.1.2 Switches and Joystick
- 3.1.3 Random Number Generator
- 3.1.4 Real-Time Device
- 3.2 Output Devices
- 3.2.1 Screen
- 3.2.2 Terminal
- 3.2.3 Software Interrupt Register
- 3.1 Input Devices