# os-it1/minirisc architecture

> Architecture diagram of the GitHub repository os-it1/minirisc, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/os-it1/minirisc
- Repository: https://github.com/os-it1/minirisc

## Overview

MiniRISC is a Verilog CPU with branch control, synchronous instruction/data memories, and MUL/MAC support, plus an assembler that produces instruction images. The main workflow is program assembly and loading, instruction fetch/decode, execution and memory access, then write-back or HALT; the Assignment 6 wrapper also exposes a stored result and done signal. The README documents the CPU integrations and behavior, while the only sampled RTL-adjacent source is the assembler, so internal RTL connections are shown only where documented.

Main entry points: [`register_file_16x32.v`](https://github.com/os-it1/minirisc/blob/main/register_file_16x32.v) (Register file), [`instruction_decoder.v`](https://github.com/os-it1/minirisc/blob/main/instruction_decoder.v) (Instruction decoder), [`FastBoothMultiplier_58/fast_booth_multiplier_32.v`](https://github.com/os-it1/minirisc/blob/main/FastBoothMultiplier_58/fast_booth_multiplier_32.v) (Booth multiplier), [`pc_unit.v`](https://github.com/os-it1/minirisc/blob/main/pc_unit.v) (PC and selection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_programming["Program preparation"]
  node_assembly["Assembly source<br/>[input.txt]"]
  node_assembler["Assembler<br/>[assembler.cpp]"]
  node_image["Instruction image<br/>[program.coe]"]
end

subgraph group_cpu["CPU control and datapath"]
  node_cpu_top["MiniRISC core<br/>[minirisc32_top.v]"]
  node_pc["PC and selection<br/>[pc_unit.v]"]
  node_decoder["Instruction decoder"]
  node_control["Control FSM"]
  node_registers[("Register file")]
  node_immediate["Immediate generator"]
  node_alu_mux["ALU input mux<br/>[alu_input_mux.v]"]
  node_alu["ALU<br/>[alu32.v]"]
  node_branch["Branch unit<br/>[branch_unit.v]"]
  node_pc_mux["PC selection mux<br/>[pc_select_mux.v]"]
end

subgraph group_memory["Memory system"]
  node_rom[("Instruction ROM adapter")]
  node_data_ram[("Data BRAM adapter<br/>[data_bram_ram.v]")]
end

subgraph group_multiply["Multiply unit"]
  node_multiplier["Booth multiplier"]
  node_mult_datapath["Multiplier datapath"]
end

subgraph group_interface["Top-level interface"]
  node_autonomous["Autonomous wrapper<br/>[minirisc32_top.v]"]
  node_result["Done and result<br/>[minirisc32_top.v]"]
end

node_programmer(("Program author"))

node_programmer -->|"writes"| node_assembly
node_assembly -->|"reads"| node_assembler
node_assembler -->|"generates"| node_image
node_image -->|"initializes"| node_rom
node_cpu_top -->|"uses"| node_pc
node_pc -->|"addresses"| node_rom
node_rom -->|"supplies instruction"| node_decoder
node_decoder -->|"decodes for"| node_control
node_control -->|"controls writes"| node_registers
node_decoder -->|"provides fields"| node_immediate
node_registers -->|"supplies operands"| node_alu_mux
node_immediate -->|"supplies immediate"| node_alu_mux
node_alu_mux -->|"selects operands"| node_alu
node_alu -->|"writes back"| node_registers
node_registers -->|"supplies comparisons"| node_branch
node_branch -->|"selects branch"| node_pc_mux
node_pc_mux -->|"selects next PC"| node_pc
node_registers -->|"supplies store data"| node_data_ram
node_data_ram -->|"returns load data"| node_registers
node_registers -->|"supplies operands"| node_multiplier
node_multiplier -->|"writes result"| node_registers
node_multiplier -.->|"uses"| node_mult_datapath
node_autonomous -->|"wraps"| node_cpu_top
node_autonomous -->|"exposes store result"| node_result

click node_assembly "https://github.com/os-it1/minirisc/blob/main/Assembler/input.txt"
click node_assembler "https://github.com/os-it1/minirisc/blob/main/Assembler/assembler.cpp"
click node_image "https://github.com/os-it1/minirisc/blob/main/program.coe"
click node_cpu_top "https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v"
click node_pc "https://github.com/os-it1/minirisc/blob/main/pc_unit.v"
click node_rom "https://github.com/os-it1/minirisc/blob/main/instruction_bram_rom.v"
click node_decoder "https://github.com/os-it1/minirisc/blob/main/instruction_decoder.v"
click node_control "https://github.com/os-it1/minirisc/blob/main/baseline_control_unit.v"
click node_registers "https://github.com/os-it1/minirisc/blob/main/register_file_16x32.v"
click node_immediate "https://github.com/os-it1/minirisc/blob/main/immediate_extension_logic.v"
click node_alu_mux "https://github.com/os-it1/minirisc/blob/main/alu_input_mux.v"
click node_alu "https://github.com/os-it1/minirisc/blob/main/alu32.v"
click node_branch "https://github.com/os-it1/minirisc/blob/main/branch_unit.v"
click node_pc_mux "https://github.com/os-it1/minirisc/blob/main/pc_select_mux.v"
click node_data_ram "https://github.com/os-it1/minirisc/blob/main/data_bram_ram.v"
click node_multiplier "https://github.com/os-it1/minirisc/blob/main/FastBoothMultiplier_58/fast_booth_multiplier_32.v"
click node_mult_datapath "https://github.com/os-it1/minirisc/blob/main/FastBoothMultiplier_58/booth_multiplier_datapath.v"
click node_autonomous "https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v"
click node_result "https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_assembly,node_assembler,node_image toneBlue
class node_cpu_top,node_pc,node_decoder,node_control,node_registers,node_immediate,node_alu_mux,node_alu,node_branch,node_pc_mux toneAmber
class node_rom,node_data_ram toneMint
class node_multiplier,node_mult_datapath toneRose
class node_autonomous,node_result,node_programmer toneIndigo
```

## Components

### Program preparation

- [Assembly source](https://github.com/os-it1/minirisc/blob/main/Assembler/input.txt): `Assembler/input.txt`
- [Assembler](https://github.com/os-it1/minirisc/blob/main/Assembler/assembler.cpp): `Assembler/assembler.cpp`
- [Instruction image](https://github.com/os-it1/minirisc/blob/main/program.coe): `program.coe`

### CPU control and datapath

- [MiniRISC core](https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v): `minirisc32_top.v`
- [PC and selection](https://github.com/os-it1/minirisc/blob/main/pc_unit.v): `pc_unit.v`
- [Instruction decoder](https://github.com/os-it1/minirisc/blob/main/instruction_decoder.v): `instruction_decoder.v`
- [Control FSM](https://github.com/os-it1/minirisc/blob/main/baseline_control_unit.v): `baseline_control_unit.v`
- [Register file](https://github.com/os-it1/minirisc/blob/main/register_file_16x32.v): `register_file_16x32.v`
- [Immediate generator](https://github.com/os-it1/minirisc/blob/main/immediate_extension_logic.v): `immediate_extension_logic.v`
- [ALU input mux](https://github.com/os-it1/minirisc/blob/main/alu_input_mux.v): `alu_input_mux.v`
- [ALU](https://github.com/os-it1/minirisc/blob/main/alu32.v): `alu32.v`
- [Branch unit](https://github.com/os-it1/minirisc/blob/main/branch_unit.v): `branch_unit.v`
- [PC selection mux](https://github.com/os-it1/minirisc/blob/main/pc_select_mux.v): `pc_select_mux.v`

### Memory system

- [Instruction ROM adapter](https://github.com/os-it1/minirisc/blob/main/instruction_bram_rom.v): `instruction_bram_rom.v`
- [Data BRAM adapter](https://github.com/os-it1/minirisc/blob/main/data_bram_ram.v): `data_bram_ram.v`

### Multiply unit

- [Booth multiplier](https://github.com/os-it1/minirisc/blob/main/FastBoothMultiplier_58/fast_booth_multiplier_32.v): `FastBoothMultiplier_58/fast_booth_multiplier_32.v`
- [Multiplier datapath](https://github.com/os-it1/minirisc/blob/main/FastBoothMultiplier_58/booth_multiplier_datapath.v): `FastBoothMultiplier_58/booth_multiplier_datapath.v`

### Top-level interface

- [Autonomous wrapper](https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v): `minirisc32_top.v`
- [Done and result](https://github.com/os-it1/minirisc/blob/main/minirisc32_top.v): `minirisc32_top.v`

### Other components

- **Program author**

## Connections

- Program author → Assembly source: writes (evidence: `README.md`)
- Assembly source → Assembler: reads (evidence: `Assembler/assembler.cpp`)
- Assembler → Instruction image: generates (evidence: `Assembler/assembler.cpp`)
- Instruction image → Instruction ROM adapter: initializes (evidence: `README.md`)
- MiniRISC core → PC and selection: uses (evidence: `README.md`)
- PC and selection → Instruction ROM adapter: addresses (evidence: `README.md`)
- Instruction ROM adapter → Instruction decoder: supplies instruction (evidence: `README.md`)
- Instruction decoder → Control FSM: decodes for (evidence: `README.md`)
- Control FSM → Register file: controls writes (evidence: `README.md`)
- Instruction decoder → Immediate generator: provides fields (evidence: `README.md`)
- Register file → ALU input mux: supplies operands (evidence: `README.md`)
- Immediate generator → ALU input mux: supplies immediate (evidence: `README.md`)
- ALU input mux → ALU: selects operands (evidence: `README.md`)
- ALU → Register file: writes back (evidence: `README.md`)
- Register file → Branch unit: supplies comparisons (evidence: `README.md`)
- Branch unit → PC selection mux: selects branch (evidence: `README.md`)
- PC selection mux → PC and selection: selects next PC (evidence: `README.md`)
- Register file → Data BRAM adapter: supplies store data (evidence: `README.md`)
- Data BRAM adapter → Register file: returns load data (evidence: `README.md`)
- Register file → Booth multiplier: supplies operands (evidence: `README.md`)
- Booth multiplier → Register file: writes result (evidence: `README.md`)
- Booth multiplier → Multiplier datapath: uses
- Autonomous wrapper → MiniRISC core: wraps (evidence: `README.md`)
- Autonomous wrapper → Done and result: exposes store result (evidence: `README.md`)
