Este projeto tem como base o processador RISC-V single-cycle, precisamente o RV32I com Immediate Encoding Variants (The RISC-V Instruction Set Manual Volume I: Unprivileged ISA, v. 20240411, p. 2.3)
Requisitos do projeto:
docs
Disciplina: Laboratório de Organização e Arquitetura de Computadores (CCMP0250) UNIVASF Campus Juazeiro 2025.1
Discente desenvolvedor: Pedro Giovanni Ventura
Na atual versão do repositório, o processador segue a seguinte arquitetura:
Considerações:
- Os componentes estão todos agrupados para melhor manutenção.
- Textos em vermelho são entradas (input);
- Textos em azul são saídas (output);
- quando tiver
indice (texto), interpreteindicecomorelação entre os componetesetextocomoo nome dado ao instanciar o componente;
0 - testbench.vhd
1.0 - design.vhd
fig 1: arquitetura do design
1.1 - Instruction Memory (IM)
1.2 - Data Memory (DM)
- 1.2.0 - ram.vhd
1.3 - myRISCVv1 (myRV)
fig 2: arq. do myRISCVv1
- 1.3.0 - myRISCVv1.vhd
- 1.3.1 - controller.vhd (
CONTROLLER) - 1.3.2 - Datapath (
DATAPATH)- 1.3.2.0 - datapath.vhd
- 1.3.2.1 - mux332.vhd (
MUX_3) - 1.3.2.2 - ifetch (
IFE)-
1.3.2.2.0 - ifetch.vhd

fig 3: arq. do ifetch
-
1.3.2.2.1 - rreg32.vhd (
PC) -
1.3.2.2.2 - addr32.vhd (
PLUS4) -
obs.: mux332 já adicionado (
MUX_1)
-
- 1.3.2.3 - idecoder (
ID)-
1.3.2.3.0 - idecoder.vhd

fig 4: arq. do idecoder
-
1.3.2.3.1 - register.vhd (
REG_FILE) -
1.3.2.3.2 - extend.vhd (
EXTEND)
-
- 1.3.2.4 - executer (
EX)-
1.3.2.4.0 - execute.vhd

fig 5: arq. do executer
-
1.3.2.4.1 - alu.vhd (
ULA) -
1.3.2.4.2 - mux232.vhd (
MUX_2)
-
obs.: também está assim na organização dos arquivos na pasta cod_vhdl.
| Sintaxe | Operação |
|---|---|
jal rd, label |
Salva o endereço pc + 4 em rd e salta para o endereço label. |
jalr rd, rs1, imm |
Salva pc + 4 em rd e salta para o endereço calculado por rs1 + imm. |
beq rs1, rs2, label |
Salta para label se o valor de rs1 for igual ao de rs2. |
bne rs1, rs2, label |
Salta para label se o valor de rs1 for diferente do de rs2. |
| Sintaxe | Operação |
|---|---|
lw rd, imm(rs1) |
Carrega a palavra do endereço rs1 + imm da memória e armazena em rd. |
sw rs2, imm(rs1) |
Armazena a palavra do registrador rs2 no endereço rs1 + imm da memória. |
| Sintaxe | Operação |
|---|---|
addi rd, rs1, imm |
Soma rs1 com o valor imm e armazena o resultado em rd. |
slti rd, rs1, imm |
Se rs1 é menor que imm (com sinal), armazena 1 em rd; senão, 0. |
xori rd, rs1, imm |
Realiza rs1 XOR imm e armazena o resultado em rd. |
ori rd, rs1, imm |
Realiza rs1 OR imm e armazena o resultado em rd. |
andi rd, rs1, imm |
Realiza rs1 AND imm e armazena o resultado em rd. |
| Sintaxe | Operação |
|---|---|
add rd, rs1, rs2 |
Soma rs1 com rs2 e armazena o resultado em rd. |
sub rd, rs1, rs2 |
Subtrai rs2 de rs1 e armazena o resultado em rd. |
slt rd, rs1, rs2 |
Se rs1 é menor que rs2 (com sinal), armazena 1 em rd; senão, 0. |
xor rd, rs1, rs2 |
Realiza rs1 XOR rs2 e armazena o resultado em rd. |
or rd, rs1, rs2 |
Realiza rs1 OR rs2 e armazena o resultado em rd. |
and rd, rs1, rs2 |
Realiza rs1 AND rs2 e armazena o resultado em rd. |
Só simulei através do site EDA Playground, usando o Aldec Riviera Pro 2023.04, então talvez precise fazer adaptações no código para funcionar em outros ambientes. Ademais, basta adicionar os arquivos com os códigos VHDL de cada componente explicado na seção módulos.
Em relação as instruções, você deve aplicar no arquivo prog.bin o código binário com a disposição dos bits de uma instrução de 32'b no seguinte formato:
format: (31 downto 0)
instr: vutsrqponmlkjihgfedcba9876543210
obs.: só '0' e '1', os outros digitos e letras são meramente ilustrativos ._.prog.bin:
76543210 [7:0]
fedcba98 [15:8]
nmlkjihg [23:15]
vutsrqpo [31:24]
Exemplo
instr: addi x9, x0, 10
bin: 00000000101000000000010010010011prog.bin:
10010011
00000100
10100000
00000000
Observações:
- Lembre que o processador atual somente aceitas as instruções dadas na seção lista de instruções.
- Além disso, há exemplos de binários (
.bin) para teste com seus respectivos códigos assembly (.asm) na pasta exemplos_bin.


