![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)