-
Notifications
You must be signed in to change notification settings - Fork 0
Arquivo de Registradores
[English]
O Arquivo de Registradores é o componente responsável por gerenciar os registradores de uso geral do processador. Ele armazena os dados utilizados pela maioria das instruções. O arquivo contém 32 registradores, cada um com rótulos e funções específicas conforme descrito anteriormente. Também inclui conexões com os barramentos A, B e C, além de uma entrada para os endereços dos registradores atualmente ativos.
O sinal de escrita do Arquivo de Registradores está ativo durante a segunda fase de cada instrução, exceto nas instruções de store, branch e load. A instrução load é uma exceção, pois sua fase de escrita é atrasada em um ciclo, conforme explicado em Temporização e Pipeline.
No Logisim, o Arquivo de Registradores é simplesmente uma encapsulação do Banco de Registradores genérico. Essa escolha de design foi feita para permitir a reutilização do Banco de Registradores em um futuro Arquivo de Registradores de Ponto Flutuante, embora esse recurso ainda não tenha sido implementado na versão atual do DRISC-V.
A imagem a seguir mostra parte do circuito dentro do Banco de Registradores:
- O endereço C é decodificado em 32 sinais, cada um correspondente à entrada de habilitação de escrita de um registrador.
- O decodificador só é ativado se receber um sinal da entrada de escrita.
- Quando o clock transita de 0 para 1 e o sinal de escrita está ativo, o registrador selecionado recebe os dados da entrada C.
- A saída de cada registrador está conectada a dois multiplexadores:
- Um para o barramento A
- Um para o barramento B
- Cada multiplexador recebe um endereço para determinar qual registrador será selecionado para saída.
`timescale 1s/1s
//entradas e saídas
module register_file(
input clock,
input reset,
input write,
input [4:0] a_address,
input [4:0] b_address,
input [4:0] c_address,
input [31:0] c_in,
output [31:0] a_out,
output [31:0] b_out
);
//registradores
reg [31:0] registers [0:31];
assign a_out = registers[a_address];
assign b_out = registers[b_address];
always @(posedge clock) begin
//define todos os registradores como 0.
if (reset) begin
integer i;
for (i = 0; i < 32; i = i + 1) begin
registers[i] <= 32'b0;
end
end
//na versão SystemVerilog, em vez de fixar o registrador x0 como 0, simplesmente não escrevemos nele
else if (write && c_address != 5'd0) begin
registers[c_address] <= c_in;
end
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