---
# System prepended metadata

title: TP_PSD8_ReinathanEzkhielKurniawan_2406397675

---

![Banner](https://i.imgur.com/zaxuK1J.png)  
# TP Modul 8 - Microprogramming (Finite State Machine)

> Pembuat Soal: MF

```txt
Nama : Reinathan Ezkhiel Kurniawan
NPM  : 2406397675
```

## Teori (25 pts)

### 1. Jelaskan apa itu Finite State Machine (FSM) serta jenis-jenisnya dan kegunannya masing-masing! (10 pts)

FSM (*Finite State Machine*) adalah sebuah sebuah model mesin yang mempunyai sejumlah kondisi (*states*) terbatas dan berpindah antar kondisi tersebut berdasarkan *input* dan/atau *state* sekarang. Saat berada di suatu *state*, keluaran (**output**) dan *next state* ditentukan oleh keadaan sekarang dan input. 

Jenis - jenis FSM adalah : 
* **Moore Machine** : **Output** hanya bergantung pada *state* sekarang, bukan langsung pada *input*. Kegunaan tipe ini adalah untuk membuat prediksi *output* lebih sederhana, lebih aman dari *glitch* karena *output* tidak tergantung langsung pada kombinasi *input*. 
* **Mealy Machine** : **Output** pada mesin ini bergantung pada *state* dan *input* saat ini. Kegunaannya adalah untuk bisa merespon *input* lebih cepat (sering satu siklus lebih cepat daripada *Moore* untuk keadaan yang sama) dan kadang *state*nya lebih sedikit. 
* **Algorithmic State Machine**/**Finite State Machine with Datapath** : Kombinasi FSM dengan Datapath (*register*, *ALU*, *multiplexer*). Dalam tipe ini, *state* mengontrol operasi *datapath*. Kegunaannya adalah untuk algoritma sekeuensial yang kompleks, misalnya kalkulasi, pemrosesan data, kontrol *loop* dalam *hardware*. 

### Referensi:
- GeeksforGeeks, “Mealy and Moore Machines in TOC,” GeeksforGeeks. [Online]. Available: https://www.geeksforgeeks.org/theory-of-computation/mealy-and-moore-machines-in-toc/. [Diakses: 7-Nov-2025]
- Jan Weeks, “Lecture Notes Week 3.1 — FSM and ASM,” Department of Informatics & Mathematical Modelling, Technical University of Denmark. [Online]. Available: https://www2.imm.dtu.dk/courses/02131/02131/web/jan_week3_1.pdf. [Diakses: 7-Nov-2025]
- GeeksforGeeks, “Introduction of Algorithmic State Machines (ASMs),” GeeksforGeeks. [Online]. Available: https://www.geeksforgeeks.org/digital-logic/introduction-of-algorithmic-state-machines-asms/. [Diakses: 7-Nov-2025]
 

### 2. Jelaskan keyword-keyword berikut dalam konteks VHDL! (5 pts) <ul><li>Record</li><li>Alias</li><li>Aggregate</li></ul> 

**Record** adalah tipe komposit variabel yang terdiri dari beberapa elemen (atau *field*) dengan nama masing-masing. Contohnya seperti:
```vhdl
type Data_Siswa is record
   NoAbsen : integer;
   Name : string(1 to 8);
end record;
```
Variabel atau sinyal dari tipe `record` kemudian bisa dideklarasikan. Penggunaannya memudahkan pengelompokan data berbeda tipe dalam satu *container*.

**Alias** digunakan untuk meberikan nama alternatif(alias) terhadap elemen pada kode sumber yang sudah dideklarasikan sebelumnya (sinyal,*port*,variabel, atau bagian dari `record`/`array`). Dengan `alias`, kita bisa mengakses atau menetapkan nilai melalui nama yang lebih mudah diingat atau lebih pendek. 
Contohnya seperti:
```vhdl
alias ConnectorBus : std_logic_vector(7 downto 0) is B(15 downto 8);
```

**Aggregate** adalah konstruksi untuk menetapkan nilai ke seluruh atau sebagian elemen dari `array` atau `record` dalam satu penugasan. Dengan `aggregate` kita bisa menetapkan nilai ke beberapa elemen atau seluruh elemen lebih ringkas.

Contohnya seperti:
```vhdl
variable DS : Data_Siswa := (NPM => 69, Name => "Rei");
```

### Referensi:
- FPGA Tutorial, “VHDL Records, Arrays, and Custom Types,” FPGA Tutorial. [Online]. Available: https://fpgatutorial.com/vhdl-records-arrays-and-custom-types/. [Diakses: 7-Nov-2025]
- J. Moorkan, “Alias Declaration in VHDL,” Department of Information and Computer Science, University of California, Irvine. [Online]. Available: https://ics.uci.edu/~jmoorkan/vhdlref/aliasdec.html. [Diakses: 7-Nov-2025]
- HDLWorks, “Aggregate – VHDL Reference,” HDLWorks. [Online]. Available: https://www.hdlworks.com/hdl_corner/vhdl_ref/VHDLContents/Aggregate.htm. [Diakses: 7-Nov-2025]

### 3. Apa itu microprogramming? Apa itu datapath dan control unit? (10 pts)

**Microprogamming** merupakan teknik pengendalian (*control*) sebuah *processor* atau *digital unit* dengan menggunakan **microinstsruction** atau **micro-program** yang tersimpan dalam memori kontrol (*control-store*). *Controller* di desain adalah sebagai mesin mikroinstruksi yang menjalankan **micro-operations** untuk setiap instruksi mesin tingkat atas.

**Datapath** adalah bagian dari sistem digital atau prosesor yang menangani aliran data dan operasi aritmetika/logika (ALU), register, *multiplexers*, dan jalur data (*buses*). **Datapath** melakukan pengolahan data berdasarkan instruksi kontrol.

**Control Unit** merupakan bagian dari sistem yang menghasilkan sinyal kontrol untuk mengatur *datapath* seperti pada keadaan memiliki operasi ALU, mengaktifkan penulisan register, memilih *multiplexer*, dan sebagainya. *Control Unit* menentukan urutan operasi (*state*), memutuskan kapan *datapath* melakukan tindakan tertentu. 

### Referensi:
- GeeksforGeeks, “Microprogramming — Basics,” GeeksforGeeks. [Online]. Available: https://www.geeksforgeeks.org/computer-organization-architecture/microprogramming-basics-1/. [Diakses: 7-Nov-2025]
- GeeksforGeeks, “Introduction of Control Unit and Its Design,” GeeksforGeeks. [Online]. Available: https://www.geeksforgeeks.org/computer-organization-architecture/introduction-of-control-unit-and-its-design/. [Diakses: 7-Nov-2025]
- GeeksforGeeks, “Differences Between Data Paths,” GeeksforGeeks. [Online]. Available: https://www.geeksforgeeks.org/computer-organization-architecture/differences-between-data-paths/. [Diakses: 7-Nov-2025]

## Praktik (35)
> Tidak perlu referensi

### Diketahui state diagram dari sebuah FSM dengan input 2 bit Q (Q1Q0) berikut:

![FSM](https://i.imgur.com/8dtmaiR.png)  

### FSM mulai pada `S0` dan setiap state juga menghasilkan output 3 bit O (O2O1O0) dengan spesifikasi berikut:

| State | OUTPUT |
|-------|--------|
| S0    | 000    |
| S1    | 001    |
| S2    | 100    |
| S3    | 101    |
| S4    | 010    |

#### A. Buatlah state transition table berdasarkan spesifikasi-spesifikasi tersebut! (10 pts)

| State |   Input (Q1Q0)  | Next State | Output |
|-------|-----------|------------|--------|
|  S0   |    00     |   S0       |  000   |
|  S0   |    11     |   S1       |  001   |
|  S1   |    00     |   S1       |  001   |
|  S1   |    10     |   S2       |  100   |
|  S1   |    11     |   S0       |  000   |
|  S2   |    00     |   S2       |  100   |
|  S2   |    10     |   S3       |  101   |
|  S2   |    11     |   S0       |  000   |
|  S3   |    00     |   S3       |  101   |
|  S3   |    10     |   S4       |  010   |
|  S3   |    11     |   S0       |  000   |
|  S4   |    00     |   S4       |  010   |
|  S4   |    10     |   S1       |  001   |
|  S4   |    11     |   S0       |  000   |


#### B. Lengkapi kode berikut untuk mengimplementasikan FSM tersebut dalam VHDL! (20 pts)

```vhdl
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity fsm_tp_8 is
    port (
        CLK : in std_logic;
        RST : in std_logic;
        Q   : in std_logic_vector(1 downto 0);
        O   : out std_logic_vector(2 downto 0)
    );
end entity fsm_tp_8;

architecture rtl of fsm_tp_8 is
    type t_State is (S0, S1, S2, S3, S4);
    signal State     : t_State := S0;
    signal NextState : t_State;
begin

    STATE_TRANSITION: process(CLK)
    begin
        if rising_edge(CLK) then
            if RST = '1' then
                State <= S0;
            else
                State <= NextState;
            end if;
        end if;
    end process;

    STATE_OUTPUT: process(State)
    begin
        case State is
            when S0 =>
                O <= "000";
            when S1 =>
                O <= "001";
            when S2 =>
                O <= "100";
            when S3 =>
                O <= "101";
            when S4 =>
                O <= "010";
        end case;
    end process;

    STATE_CONDITION: process(State, Q)
    begin
        case State is
            when S0 =>
                if Q = "00" then
                    NextState <= S0;
                elsif Q = "11" then
                    NextState <= S1;
                else
                    NextState <= S0;
                end if;
            when S1 =>
                if Q = "00" then
                    NextState <= S1;
                elsif Q = "10" then
                    NextState <= S2;
                elsif Q = "11" then
                    NextState <= S0;
                else
                    NextState <= S1;
                end if;
            when S2 =>
                if Q = "00" then
                    NextState <= S2;
                elsif Q = "10" then
                    NextState <= S3;
                elsif Q = "11" then
                    NextState <= S0;
                else
                    NextState <= S2;
                end if;
            when S3 =>
                if Q = "00" then
                    NextState <= S3;
                elsif Q = "10" then
                    NextState <= S4;
                elsif Q = "11" then
                    NextState <= S0;
                else
                    NextState <= S3;
                end if;
            when S4 =>
                if Q = "00" then
                    NextState <= S4;
                elsif Q = "10" then
                    NextState <= S1;
                elsif Q = "11" then
                    NextState <= S0;
                else
                    NextState <= S4;
                end if;
        end case;
    end process;

end architecture rtl;
```

#### C. Jalankan rangkaian dengan input dan timing yang sesuai sehingga output menghasilkan perubahan state 
##### S0 -> S1 -> S2 -> S2 -> S0 -> S1 -> S1 -> S2 -> S3 -> S4 -> S4 -> S1 -> S0
#### Screenshot! (5 pts)

| State |   Input (Q1Q0)  | Next State | Output |
|-------|-----------|------------|--------|
|  S0   |    11     |   S1       |  001   |
|  S1   |    10     |   S2       |  100   |
|  S2   |    00     |   S2       |  100   |
|  S2   |    11     |   S0       |  000   |
|  S0   |    11     |   S1       |  001   |
|  S1   |    00     |   S1       |  001   |
|  S1   |    10     |   S2       |  100   |
|  S2   |    10     |   S3       |  101   |
|  S3   |    10     |   S4       |  010   |
|  S4   |    00     |   S4       |  010   |
|  S4   |    10     |   S1       |  001   |
|  S1   |    11     |   S0       |  000   |

![image](https://hackmd.io/_uploads/HygGruaybg.png)
![image](https://hackmd.io/_uploads/Sy5GB_6kZl.png)


## Pre-CS (40 pts)

### Perhatikan diagram arsitektur CPU sederhana 8 bit berikut!
![CPU Architecture](https://hackmd.io/_uploads/rJ9DRF_yWx.png)


### CPU tersebut memiliki 8 buah komponen yang terhubung dengan satu bus 8 bit serta 14 sinyal kontrol (control signals) untuk microprogram. CPU menggunakan instruction word 8 bit yang terdiri atas 4 bit opcode serta 4 bit operand yang dapat berupa baik address maupun immediate value. CPU tersebut memiliki RAM dengan addressing 4 bit yang mampu menyimpan 16 buah data 8 bit.

### Penjelasan Arsitektur
<details>
<summary>
Click to expand.
</summary>

#### Register (A & B)
##### Keterangan
- Menyimpan data 8 bit. 
##### Control Signals
- RXO: Menulis data dari register X ke bus.
- RXI: Membaca data dari bus ke register X.

#### Arithmatic Logic Unit (ALU)
##### Keterangan
- Menjumlahkan atau mengurangi register A dengan B. 
##### Control Signals
- SUB: Jika diset ke 1, output berupa A - B, sebaliknya akan menghasilkan A + B.
- ALO: Menulis output dari ALU ke bus.
##### Flags
- Zero Flag: Diset ke 1 jika output berupa nol.
- Carry Flag: Diset ke 1 jika operasi aritmatika menghasilkan carry/borrow.

#### Program Counter (PC)
##### Keterangan
- Counter dari lokasi memori instruksi.
- Dapat melakukan increment untuk instruksi selanjutnya ataupun melakukan jump dengan membaca dari bus.
##### Control Signals
- PCI: Mengambil data instruksi selanjutnya dari bus. Dapat digunakan untuk melakukan jump.
- PCO: Menulis data dari PC ke bus.
- CNT: Melakukan increment counter instruksi di dalamnya.

#### Memory Address Register (MAR)
##### Keterangan
- Menyimpan lokasi memori 4 bit untuk RAM.
- Mempengaruhi lokasi data yang diubah dalam RAM.
##### Control Signals
- MRI: Menulis 4 least significant bits (4 bit terakhir) dari bus ke dalamm MAR.

#### Program Counter (RAM)
##### Keterangan
- Menyimpan data 8 bit dalam lokasi 4 bit.
- Mampu menyimpan 16 buah data 8 bit.
##### Control Signals
- RMI: Membaca data dari bus dan menyimpannya ke lokasi memori yang diset oleh MAR.
- RMO: Menulis data dari lokasi memori yang diset MAR ke bus.

#### Instruction Register (IR)
##### Keterangan
- Menyimpan instruction byte yang diambil dari RAM berdasarkan PC.
- Instruction byte terdiri atas 4 bit MSB opcode dan 4 bit LSB operand.
##### Control Signals
- IRI: Menyimpan data dari bus ke IR.
- IRO: Menulis 4 bit LSB dari IR ke bus.

#### Control Unit (CU)
##### Keterangan
- Merupakan pengendali keseluruhan control signal dari datapath setiap component sebelumnya.
- Melakukan decoding instruksi yang ada di IR dan mengatur microprogram yang sesuai.
- Mengandung state machine yang mengatur urutan control signal microprogram untuk setiap siklus clock.

</details>

### CPU memiliki siklus fetch - execute. Untuk setiap instruksi yang ada di dalam instruction set, CPU melakukan fetching dengan microprogram berikut:

#### MP - Fetch
| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |  1  |  0  |  0  |  0  |  0  |
| 2  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |  1  |  0  |

### dilanjutkan dengan instruksi yang sesuai dengan opcode yang ada pada IR.

### Set Instruksi
#### Instruksi 1 - LDA [MEM]
##### Opcode: 0001 MMMM
##### Keterangan: Menyimpan data dari memori berlokasi `MEM` ke register A.
##### Microprogram:
MP - Fetch lalu...
| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |  0  |  0  |  1  |
| 2  |  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |  0  |  1  |  0  |  0  |

`CNT` diset ke 1 untuk melakukan increment PC agar mengeksekusi instruksi selanjutnya pada siklus clock setelah ini.

### Tugas anda adalah mengimplementasikan Control Unit dengan menerapkan instruction set CPU ini.

```vhdl
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity control_unit is
    port (
        CLK             : in std_logic;
        enable          : in std_logic;
        RST             : in std_logic;
        carry_flag      : in std_logic;
        zero_flag       : in std_logic;
        opcode          : in std_logic_vector(3 downto 0);
        control_signals : out std_logic_vector(13 downto 0)
    );
end entity control_unit;

architecture rtl of control_unit is
    type t_State is (IDLE, FETCH, DECODE, LDA1, LDA2);
    signal State : t_State := IDLE;
    signal NextState : t_State;
begin

    STATE_TRANSITION: process(CLK) is
    begin
        if enable = '1' and rising_edge(CLK) then
            if RST = '1' then
                State <= IDLE;
            else
                State <= NextState;
            end if;
        end if;
    end process;
    
    STATE_OUTPUT: process(State)
    begin
        case State is
            when IDLE =>
                control_signals <= "00000000000000";
            when FETCH =>
                control_signals <= "00000001010000";
            when DECODE =>
                control_signals <= "00000000000110";

            when LDA1 =>
                control_signals <= "00000000010001";
            when LDA2 =>
                control_signals <= "01000000100100";
        end case;
    end process STATE_OUTPUT;

    STATE_CONDITION: process(State, carry_flag, zero_flag)
    begin
        case State is
            when IDLE =>
                NextState <= FETCH;

            when FETCH =>
                NextState <= DECODE;

            when DECODE =>
                case opcode is
                    when "0001" =>
                        NextState <= LDA1;
                    -- when OPCODE LAIN => ... (kembangkan)
                    when others =>
                        NextState <= IDLE;
                end case;

            when LDA1 => 
                NextState <= LDA2;
            when LDA2 =>
                NextState <= FETCH;

            -- Kembangkan untuk instruksi lebih lanjut
        end case;
    end process STATE_CONDITION;
end architecture rtl;
```

### Kerjakan sejumlah instruksi berikut dan lalu cantumkan kode VHDL akhir anda!

#### Instruksi 2 - STA [MEM] (5 pts)
##### Opcode: 0010 MMMM
##### Keterangan: Mengambil data dari MEM ke register A.
##### Microprogram:

| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2  |  0  | 0   | 0   | 0   | 0   | 0   |  0  | 0   |  0  | 1   | 0   |  0  | 1   | 0   |
| 3  |  1  | 0   | 0   | 0   | 0   |  0  | 0   | 0   |0    |0    |  1  | 0   | 0   | 0   |
|....|     |     |     |     |     |     |     |     |     |     |     |     |     |     |

#### Instruksi 3 - LDB [MEM] (5 pts)
##### Opcode: 0101 MMMM
##### Keterangan: Mengambil data dari MEM ke register B.
##### Microprogram:

| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2  |  0  |  0  |  0  | 0   |   0 |  0  | 0   | 0   | 0   | 1   | 0   |  0  |  0  |  1  |
| 3  |  0  |  0  |  0  | 1   |  0  |   0 |  0  |  0  | 0   |  0  | 0   | 1   | 0   |  0  |
|....|     |     |     |     |     |     |     |     |     |     |     |     |     |     |

#### Instruksi 4 - STB [MEM] (5 pts)
##### Opcode: 0110 MMMM
##### Keterangan: Menyimpan data dari memori berlokasi `MEM` ke register B.
##### Microprogram:

| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2  |  0  |  0  |  0  |  0  |  0  | 0   | 0   | 0   | 0   |1    | 0   | 0   | 0   | 1   |
| 3  | 0   |  0  | 1   |  0  |  0  |  0  |  0  |   0 | 0   |  0  | 1   |0    |  0  |  0  |
|....|     |     |     |     |     |     |     |     |     |     |     |     |     |     |

#### Instruksi 5 - MAB (5 pts)
##### Opcode: 0100 XXXX
##### Keterangan: Memindahkan data register A ke register B.
##### Microprogram:

| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2  |  1  |  0  |   0 | 1   | 0   | 0   |  0  |  0  |  0  |  0  |   0 |  0  |  0  |  0  |
| 3  |  0  |   0 |   0 |   0 |   0 |  0  |  0  |   0 | 0   | 0   |  0  |   0 |  0  |   0 |
|....|     |     |     |     |     |     |     |     |     |     |     |     |     |     |

#### Instruksi 6 - MBA (5 pts)
##### Opcode: 0111 XXXX
##### Keterangan: Memindahkan data register B ke register A.
##### Microprogram:

| CC | RAO | RAI | RBO | RBI | SUB | ALO | PCI | PCO | CNT | MRI | RMI | RMO | IRI | IRO |
|----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2  |  0  |  1  |  1  |  0  |  0  |  0  |  0  |  0  | 0   |  0  |  0  |  0  |  0  |  0  |
| 3  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  | 0   |  0  | 0   |  0  |  0  |  0  |
|....|     |     |     |     |     |     |     |     |     |     |     |     |     |     |

### Cantumkan kode VHDL akhir anda! (10 pts)
```vhdl
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity control_unit is
    port (
        CLK             : in std_logic;
        enable          : in std_logic;
        RST             : in std_logic;
        carry_flag      : in std_logic;
        zero_flag       : in std_logic;
        opcode          : in std_logic_vector(3 downto 0);
        control_signals : out std_logic_vector(13 downto 0)
    );
end entity control_unit;

architecture rtl of control_unit is
    type t_State is (IDLE, FETCH, DECODE, LDA1, LDA2, STA1, STA2, LDB1, LDB2, STB1, STB2, MAB1, MAB2, MBA1, MBA2);
    signal State : t_State := IDLE;
    signal NextState : t_State;
begin

    STATE_TRANSITION: process(CLK) is
    begin
	if enable = '1' and rising_edge(CLK) then
    		if RST = '1' then
        		State <= IDLE;
    	elsif enable = '1' then
        	State <= NextState;
    		end if;
	end if;
    end process;
    
    STATE_OUTPUT: process(State)
    begin
        case State is
            when IDLE =>
                control_signals <= "00000000000000";
            when FETCH =>
                control_signals <= "00000001010000";
            when DECODE =>
                control_signals <= "00000000000110";
            when LDA1 =>
                control_signals <= "00000000010001";
            when LDA2 =>
                control_signals <= "01000000100100";
            when STA1 =>
                control_signals <= "00000000010001";
            when STA2 =>
                control_signals <= "10000000001000";
            when LDB1 =>
                control_signals <= "00000000010001";
            when LDB2 =>
                control_signals <= "00010000000100";
            when STB1 =>
                control_signals <= "00000000010001";
            when STB2 =>
                control_signals <= "00100000001000";
            when MAB1 =>
                control_signals <= "10010000000000";
            when MAB2 =>
                control_signals <= "00000000000000";
            when MBA1 =>
                control_signals <= "01100000000000";
            when MBA2 =>
                control_signals <= "00000000000000";
        end case;
    end process STATE_OUTPUT;

    STATE_CONDITION: process(State, carry_flag, zero_flag,opcode)
    begin
        case State is
            when IDLE =>
                NextState <= FETCH;

            when FETCH =>
                NextState <= DECODE;

            when DECODE =>
                case opcode is
                    when "0001" =>
                        NextState <= LDA1;
                    when "0010" =>        
                        NextState <= STA1;
                    when "0101" =>        
                        NextState <= LDB1;
                    when "0110" =>       
                        NextState <= STB1;
                    when "0100" =>       
                        NextState <= MAB1;
                    when "0111" =>       
                        NextState <= MBA1;
                    when others =>
                        NextState <= IDLE;
                end case;

            when LDA1 => 
                NextState <= LDA2;
            when LDA2 =>
                NextState <= FETCH;

            when STA1 =>
                NextState <= STA2;
            when STA2 =>
                NextState <= FETCH;

            when LDB1 =>
                NextState <= LDB2;
            when LDB2 =>
                NextState <= FETCH;

            when STB1 =>
                NextState <= STB2;
            when STB2 =>
                NextState <= FETCH;

            when MAB1 =>
                NextState <= MAB2;
            when MAB2 =>
                NextState <= FETCH;

            when MBA1 =>
                NextState <= MBA2;
            when MBA2 =>
                NextState <= FETCH;
        end case;
    end process STATE_CONDITION;
end architecture rtl;
```

### Dengan kode testbench berikut, cantumkan screenshot hasil jalan rangkaian anda! (5 pts)
```vhdl
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity control_unit_tb is
end entity control_unit_tb;

architecture sim of control_unit_tb is

    component control_unit is
        port (
            CLK             : in std_logic;
            enable          : in std_logic;
            RST             : in std_logic;
            carry_flag      : in std_logic;
            zero_flag       : in std_logic;
            opcode          : in std_logic_vector(3 downto 0);
            control_signals : out std_logic_vector(13 downto 0)
        );
    end component;

    signal CLK             : std_logic := '0';
    signal enable          : std_logic := '0';
    signal RST             : std_logic := '0';
    signal carry_flag      : std_logic := '0';
    signal zero_flag       : std_logic := '0';
    signal opcode          : std_logic_vector(3 downto 0) := (others => '0');
    signal control_signals : std_logic_vector(13 downto 0);

    constant CLK_PERIOD : time := 10 ns;

begin
    DUT: control_unit
        port map (
            CLK             => CLK,
            enable          => enable,
            RST             => RST,
            carry_flag      => carry_flag,
            zero_flag       => zero_flag,
            opcode          => opcode,
            control_signals => control_signals
        );

    CLK_PROCESS : process
    begin
        while true loop
            CLK <= '0';
            wait for CLK_PERIOD / 2;
            CLK <= '1';
            wait for CLK_PERIOD / 2;
        end loop;
    end process;

    STIM_PROC: process
    begin
        enable <= '1';
        RST <= '1';
        wait for 2 * CLK_PERIOD;
        RST <= '0';
        
        -- LDA
        opcode <= "0001";
        wait for 6 * CLK_PERIOD;

        -- MAB
        opcode <= "0100";
        wait for 6 * CLK_PERIOD;

        -- STA
        opcode <= "0010";
        wait for 6 * CLK_PERIOD;

        -- LDB
        opcode <= "0101";
        wait for 6 * CLK_PERIOD;

        -- MBA
        opcode <= "0111";
        wait for 6 * CLK_PERIOD;

        -- STB
        opcode <= "0110";
        wait for 6 * CLK_PERIOD;

        enable <= '0';

        wait;
    end process;

end architecture sim;
```
> Pastikan setiap bit control unit terlihat. Expand supaya kelihatan.

![image](https://hackmd.io/_uploads/ByHQTsklZg.png)


