# Sinais

## Core

```verilog
Core #(
    .BOOT_ADDRESS() // Endereço de boot - 32 bits
) Core(
    /* controle */
    .clk(), // Sinal de clock - 1 bit
    .reset(), // Sinal de reset - 1 bit
    /* Dados */
    .memory_read(), // Habitilita leitura na memoria - 1 bit
    .memory_write(), // Habitilita escrita na memoria - 1 bit
    .write_data(), // Valores saindo do core - 32 bits
    .read_data(), // Valores vindo da memoria - 32 bits
    .address() // Endereço de memoria - 32 bits
);
```

## Memoria

```verilog
Memory #(
    .MEMORY_SIZE(), // Tamanho da memoria - int
    .MEMORY_FILE() // Arquivo de inicialização da memoria - str
) Memory(
    /* controle */
    .clk(), // Sinal de clock - 1 bit
    .reset(), // Sinal de reset - 1 bit
    /* Dados */
    .memory_read(), // Habitilita leitura na memoria - 1 bit
    .memory_write(), // Habitilita escrita na memoria - 1 bit
    .write_data(), // Valores vindo do core - 32 bits
    .read_data(), // Valores saindo da memoria - 32 bits
    .address() // Endereço de memoria - 32 bits
);
```

## ALU

```verilog
ALU Alu(
    .operation(), // Codigo da operação a ser realizada pela ALU - 4 bits
    .ALU_in_X(), // Entrada A da ALU - 32 bits
    .ALU_in_Y(), // Entrada B da ALU - 32 bits
    .ALU_out_S(), // Saida da ALU - 32 bits
    .ZR() // Fica ativo caso a saida sejá igual a 0 - 1 bit
);
```

## Banco de registradores

```verilog
Registers RegisterBank(
    .clk(), // Sinal de clock - 1 bit
    .reset(), // Sinal de reset - 1 bit
    .regWrite(), // Habilita escrita nos registradores - 1 bit
    .readRegister1(), // Dados saindo do registrador "A" - 32 bits
    .readRegister2(), // Dados saindo do registrador "B" - 32 bits
    .writeRegister(), // Dados a serem escritos no registrador = 32 bits
    .writeData(), // Endereço do registrador a ser escrito - 5 bits
    .readData1(), // Endereço do registrador "A" a ser lido - 5 bits
    .readData2() // Endereço do registrador "B" a ser escrito - 5 bits
);
```

## MUX

```verilog
MUX MUX(
    .option(), // Opção a ser escolhida - 2 bits
    .A(), // Entrada A - 32 bits - opção 00
    .B(), // Entrada B - 32 bits - opção 01
    .C(), // Entrada C - 32 bits - opção 10
    .D(), // Entrada D - 32 bits - opção 11
    .S() // Saída no multiplexador
);
```

## Gerador de imediato

```verilog
Immediate_Generator Immediate_Generator(
    .instruction(), // instrução - 32 bits
    .immediate() // imediato gerado - 32 bits
);
```

## ALU Control

```verilog
ALU_Control ALU_Control(
    .aluop_in(), // Opção da instrução - 2 bits
    .func7(), // Função 7 - 7 bits
    .func3(), // Função 3 - 3 bits
    .aluop_out(), // Opção para a ALU - 4 bits
    .is_immediate() // Ativo se a instrução for de imediato
);
```

## PC

```verilog
PC Pc(
    .clk(), // Sinal de clock - 1 bit
    .reset(), // Sinal de reset - 1 bit
    .load(), // Habilita carregar novo valor ao PC - 1 bit
    .Input(), // Entrada do PC - 32 bits
    .Output() // Saida do PC - 32 bits
);
```

## Unidade de controle

```verilog
Control_Unit Control_Unit(
    .clk(), // Sinal de clock - 1 bit
    .reset(), // Sinal de reset - 1 bit
    .instruction_opcode(), // Opção da instrução - 7 bits
    .pc_write_cond(),
    .pc_write(), // Habilita escrita no PC - 1 bit
    .lorD(),
    .memory_read(), // Habitilita leitura na memoria - 1 bit
    .memory_write(), // Habitilita escrita na memoria - 1 bit
    .memory_to_reg(),
    .ir_write(), // Habilita escrita no registrador de instrução - 1 bit
    .pc_source(),
    .aluop(),
    .alu_src_b(),
    .alu_src_a(),
    .reg_write(), // Habilita escrita nos registradores - 1 bit
    .is_immediate() // Ativo se a instrução for de imediato
);
```
