VHDL #10: Kode Program Sequential dalam Pemrograman VHDL

December 26, 2025

 

Sahabat Robonesia, pada dasarnya, kode program VHDL bersifat concurrent  atau parallel. PROCESS, FUNCTION, dan PROCEDURE adalah bagian kode yang dieksekusi secara sequential (berurutan). Namun, secara keseluruhan, setiap blok program PROCESS, FUNCTION, dan PROCEDURE tetap concurrent dengan pernyataan pendukung lain yang ditempatkan di luar blok program.

Salah satu aspek penting dari kode program sequential adalah bahwa ia tidak terbatas pada logika sequential. Dengannya kita dapat membangun rangkaian sequential maupun rangkaian kombinasional. Kode program sequential juga disebut kode behavioral (perilaku).

Pernyataan yang dibahas dalam bagian ini semuanya adalah sequential, artinya, hanya diperbolehkan digunakan di dalam blok program PROCESS, FUNCTION, dan PROCEDURE. Pernyataan-pernyataan tersebut adalah: IF, WAIT, CASE, dan LOOP. Pernyataan tersebut digunakan untuk mengontrol aliran eksekusi program VHDL. Dalam bahasa pemrograman C atau C++, pernyataan-pernyataan ini disebut dengan pernyataan “Kontrol program.”

Penggunaan VARIABEL juga dibatasi hanya digunakan di dalam kode program sequential, yaitu di dalam blok program PROCESS, FUNCTION, atau PROCEDURE. Dengan demikian, berbeda dengan SIGNAL, VARIABEL tidak pernah bisa bersifat global, sehingga nilainya tidak dapat diteruskan (Passing) secara langsung antar blok program FUNCTION atau PROCEDURE.

Pada artikel ini, kita akan berfokus pada penjelasan mengenai blok program PROCESS. Untuk blok program FUNCTION dan PROCEDURE akan dijelaskan para artikel terpisah (Klik link!).

 

10.1 PROCESS

PROCESS adalah blok utama untuk kode sequential pada kode program VHDL. Semua kode sequential harus berada dalam blok PROCESS. Blok PROCESS ditandai dengan adanya IF, WAIT, CASE, atau LOOP, dan daftar sensitivitas (kecuali jika pernyataan WAIT digunakan). PROCESS harus ditulis di dalam kode utama, dan dieksekusi setiap kali sinyal dalam daftar sensitivitas berubah (atau kondisi yang terkait dengan pernyataan WAIT terpenuhi). Sintaksnya ditunjukkan di bawah ini.

Syntax PROCESS 1:

Syntax PROCESS 2:

Syntax PROCESS 3:

Ada 3 model syntax untuk blok program PROCESS (Syntax PROCESS 1 hingga 3) yang dapat dipilih sesuai dengan kebutuhan saat membuat kode program VHDL. Untuk syntax ke-3 di atas, VARIABEL bersifat opsional. Jika digunakan, variabel tersebut harus dideklarasikan pada bagian deklaratif PROCESS, sebelum kata BEGIN. Nilai awal (Initial value) tidak dapat disintesis, karena hanya dipertimbangkan penggunaannya dalam simulasi. Penggunaan “label” juga bersifat opsional. Tujuannya adalah untuk meningkatkan keterbacaan kode. Label dapat berupa kata apa pun, kecuali kata-kata yang sudah reserved (tidak boleh digunakan) dalam pemrograman VHDL.

10.1.1 Membuat Rangkaian Synchronous

Untuk membangun rangkaian sinkron, pemantauan sinyal (misalnya, sinyal clock) diperlukan. Cara umum untuk mendeteksi perubahan sinyal adalah melalui atribut EVENT. Misalnya, jika clk adalah sinyal yang akan dipantau, maka clk’EVENT akan mengembalikan TRUE ketika terjadi perubahan pada clk (naik atau turun). Contoh 1 berikut ini mengilustrasikan penggunaan EVENT dan PROCESS.

 

Contoh 10.1: D-Flip-Flop (DFF) dengan Reset Asinkron (1)
Flip-flop tipe-D (Gambar 1) adalah blok penyusun paling dasar dalam rangkaian logika sekuensial. Di dalamnya, keluaran harus menyalin masukan pada transisi positif atau negatif sinyal clock (Rising edge atau turun). Dalam kode yang disajikan pada Program 1, kita menggunakan pernyataan IF untuk merancang DFF dengan reset asinkron. Jika rst = ‘1’, maka keluaran harus q = ‘0’ (baris 13–14), terlepas dari status clk. Jika tidak, keluaran harus menyalin masukan (yaitu, q = d) pada positive_edge clk (baris 15–16). Atribut EVENT digunakan pada baris 15 untuk mendeteksi transisi clock. PROCESS (baris 11–18) dijalankan setiap kali sinyal yang muncul dalam daftar sensitivitasnya (clk dan rst, baris 11) berubah.

Gambar 1. D-Flip-Flop (DFF) dengan reset asinkron (1)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 132

 

Program 1: Untuk contoh 10.1 – DFF dengan reset asinkron (1)

Hasil simulasi yang mengonfirmasi fungsionalitas rangkaian hasil sintesis disajikan pada gambar 2.

Gambar 2. Hasil simulasi D-Flip-Flop (DFF) dengan reset asinkron (1)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 92

 

10.2 SIGNAL dan VARIABEL

SIGNAL dan VARIABEL akan dipelajari secara detail pada artikel berjudul “VHDL #11: CONSTANT, SIGNAL, dan VARIABLE dalam Pemrograman VHDL”. Namun, mustahil membahas kode sekuensial tanpa mengetahui setidaknya karakteristik paling dasar dari SIGNAL dan VARIABEL.

VHDL memiliki dua cara untuk meneruskan nilai non-statis: melalui SIGNAL atau melalui VARIABEL. SIGNAL dapat dideklarasikan dalam PACKAGE, ENTITY, atau ARCHITECTURE (pada bagian deklaratifnya), sementara VARIABEL hanya dapat dideklarasikan di dalam bagian kode sekuensial (dalam blok PROSES, misalnya).

Oleh karena itu, meskipun nilai yang pertama dapat bersifat global, nilai yang kedua selalu bersifat lokal. Nilai VARIABEL tidak dapat diteruskan langsung dari blok PROCESS, jika perlu, maka harus ditugaskan ke SIGNAL. Di sisi lain, pembaruan VARIABEL bersifat langsung, artinya, kita dapat segera mengetahui nilai barunya di baris kode berikutnya. Hal ini tidak berlaku untuk SIGNAL (ketika digunakan dalam blok PROCESS), karena nilai barunya umumnya hanya dijamin tersedia setelah proses pada blok PROCESS selesai.

Hal penting terkait SIGNAL dan VARIABEL yang perlu diingat bahwa:
Operator penugasan untuk SIGNAL adalah ‘‘<=‘’ (contoh: sig <= 5)
Operator penugasan untuk VARIABEL adalah ‘‘:=‘’ (contoh: var := 5)

 

10.3 Pernyataan IF

Seperti yang telah disebutkan sebelumnya, IF, WAIT, CASE, dan LOOP adalah pernyataan yang ditujukan untuk kode sekuensial. Oleh karena itu, pernyataan-pernyataan ini hanya dapat digunakan di dalam PROSES, FUNGSI, atau PROSEDUR. Kecenderungan alami orang adalah menggunakan IF lebih sering daripada pernyataan lainnya. Meskipun pada prinsipnya, hal ini dapat berdampak negatif (karena pernyataan IF/ELSE dapat menyiratkan konstruksi dekoder prioritas yang tidak diperlukan), synthesizer akan mengoptimalkan struktur dan menghindari penggunaan perangkat keras tambahan. Sintaks IF ditunjukkan di bawah ini.

Syntax pernyataan IF satu kondisi:

Syntax pernyataan IF lebih dari satu kondisi:

 

Contoh 10.2: Counter 1-Digit (1)
Parogram 2 di bawah ini mengimplementasikan penghitung (counter) desimal 1-digit progresif (0 –> 9 –> 0). Diagram tingkat atas rangkaian ditunjukkan pada Gambar 3. Diagram ini berisi masukan 1-bit (clk) dan keluaran 4-bit (digit). Pernyataan IF digunakan dalam contoh ini. Sebuah variabel, “temp”, digunakan untuk membuat 4 buah flip-flop yang diperlukan untuk menyimpan sinyal keluaran 4-bit.

Gambar 3. Counter 1-digit
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 94

 

Program 2: Untuk contoh 10.2 – Counter 1-digit

Komentar program 2:
Perhatikan bahwa kode di atas tidak memiliki masukan reset maupun skema inisialisasi internal untuk temp (dan digit). Oleh karena itu, nilai awal temp dalam rangkaian fisik dapat berupa nilai 4-bit apa pun. Jika nilai tersebut di bawah 10 (lihat baris 16), rangkaian akan menghitung dengan benar dari sana. Di sisi lain, jika nilainya di atas 10, sejumlah siklus clock akan digunakan hingga temp mencapai hitungan penuh (yaitu, 15, atau “1111”), yang kemudian secara otomatis direset ke nol, dan dari sana operasi yang benar dimulai. Kemungkinan terbuangnya beberapa siklus clock di awal umumnya tidak menjadi masalah. Namun, jika ingin menghindari hal itu, temp = 10, pada baris 16, dapat diubah menjadi temp => 10, tetapi ini akan meningkatkan beban perangkat keras. Namun, jika memulai tepat dari 0 selalu diperlukan, maka input reset harus disertakan.

Perhatikan dalam kode di atas bahwa kita menaikkan temp dan membandingkannya dengan 10, dengan tujuan mereset temp setelah mencapai 10. Ini adalah pendekatan umum yang digunakan dalam counter. Perhatikan bahwa 10 adalah konstanta, sehingga kompilator menyimpulkan pembanding terhadap konstanta tersebut, yang merupakan rangkaian yang relatif sederhana untuk dibangun. Namun, jika bukan konstanta, kita menggunakan parameter yang dapat diprogram, maka pembanding penuh perlu diimplementasikan, yang membutuhkan logika yang jauh lebih banyak daripada pembanding terhadap konstanta. Dalam hal ini, solusi yang lebih baik adalah memuat temp dengan parameter tersebut, lalu menurunkannya, dan memuat ulang temp ketika nilai 0 tercapai. Dalam hal ini, pembanding kita akan membandingkan temp dengan 0 (sebuah konstanta), sehingga tidak perlu lagi membuat pembanding penuh.

Hasil simulasi, yang mengonfirmasi operasi rangkaian yang disintesis dengan benar, ditunjukkan pada Gambar 4.

Gambar 4. Hasil simulasi program 2 – Counter 1-digit
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 95

 

Contoh 10.3: Shift Register
Gambar 5 menunjukkan register geser 4-bit. Bit keluaran (q) harus berada empat sisi clock positif di belakang bit masukan (d). Register ini juga berisi reset asinkron, yang harus memaksa semua keluaran flip-flop ke ‘0’ ketika diaktifkan. Dalam contoh ini, pernyataan IF kembali digunakan.

Gambar 5. Shift register
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 96

 

Program 3: Untuk contoh 10.3 – Shif register

Hasil simulasi program 3, ditunjukkan pada Gambar 6. Seperti yang dapat kita lihat, q memang memiliki empat sisi clock positif di belakang d.

Gambar 6. Hasil simulasi program 3 – Shift register
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 97

 

10.4 Pernyataan WAIT

Operasi pernyataan WAIT terkadang mirip dengan IF. Namun, terdapat lebih dari satu bentuk WAIT. Selain itu, berbeda dengan penggunaan IF, CASE, atau LOOP, PROCESS tidak dapat memiliki daftar sensitivitas ketika pernyataan WAIT digunakan. Sintaksnya (ada tiga bentuk WAIT) ditunjukkan di bawah ini.

10.4.1 Pernyataan WAIT UNTIL

Syntax:

Pernyataan WAIT UNTIL hanya menerima satu sinyal, sehingga lebih sesuai untuk kode sinkron daripada asinkron. Karena PROCESS tidak memiliki daftar sensitivitas dalam kasus ini, WAIT UNTIL harus menjadi pernyataan pertama dalam PROCESS. PROCESS akan dieksekusi setiap kali kondisi terpenuhi.

Contoh : Register 8-bit dengan reset sinkron

 

10.4.2 Pernyataan WAIT ON

Syntax:

Di sisi lain, WAIT ON menerima beberapa sinyal. PROSES ditunda hingga salah satu sinyal yang tercantum berubah. Dalam contoh di bawah ini, PROSES akan melanjutkan eksekusi setiap kali terjadi perubahan pada rst atau clk.

Contoh : Register 8-bit dengan reset asinkron.

 

10.4.3 Pernyataan WAIT FOR

Syntax:

Terakhir, WAIT FOR hanya dapat digunakan untuk simulasi (pembuatan bentuk gelombang untuk testbench). Kegunaan pernyataan WAIT FOR adalah untuk melakukan penundaan waktu (Delay) dari suatu proses.

Contoh: WAIT FOR

 

Contoh 10.4: DFF dengan Reset Asinkron (2)
Kode di bawah ini mengimplementasikan DFF yang sama dengan contoh 1 (gambar 1 dan 2). Namun, di sini, pernyataan WAIT ON digunakan, bukan hanya pernyataan IF saja.

Program 4: Untuk contoh 10.4

 

Contoh 10.5: Counter 1-Digit (2)
Kode program 5 di bawah ini mengimplementasikan counter (Penghitung) desimal progresif 1-digit yang sama seperti pada contoh 2 (gambar 3 dan 4). Namun, pernyataan WAIT UNTIL digunakan, bukan hanya pernyataan IF saja.

Program 5: Untuk contoh 10.5

 

10.5 Pernyataan CASE

Pernyataan CASE adalah pernyataan lain yang ditujukan khusus untuk kode sekuensial (bersama dengan pernyataan IF, LOOP, dan WAIT). Sintaksnya adalah sebagai berikut:

Syntax CASE:

 

Contoh 10.6: DFF dengan Reset Asinkron (3)
Kode program 6 di bawah ini mengimplementasikan D-Flip-Flop (DFF) yang sama dengan contoh 1 (gambar 1 dan 2). Namun, di sini pernyataan CASE digunakan, bukan hanya pernyataan IF. Perhatikan bahwa beberapa deklarasi yang tidak perlu sengaja dimasukkan ke dalam kode untuk mengilustrasikan penggunaannya.

Program 6: Untuk contoh 10.6

 

Pernyataan CASE (Sequential) sangat mirip dengan WHEN (Combinational). Di sini, semua permutasi juga harus diuji, sehingga kata kunci OTHERS seringkali berguna. Kata kunci penting lainnya adalah NULL (padanan dari UNAFFECTED), yang harus digunakan ketika tidak ada tindakan yang akan dilakukan. Misalnya, WHEN OTHERS => NULL;. Namun, pernyataan CASE memungkinkan beberapa penugasan untuk setiap kondisi pengujian (seperti yang ditunjukkan pada contoh 9 di atas), sementara WHEN hanya memungkinkan satu penugasan. Seperti dalam kasus WHEN, di sini juga, “WHEN value” dapat mengambil tiga bentuk:

 

Contoh 10.7: Counter 2-Digit dengan Output Tampilan Seven-Segment

Gambar 7. Counter 2-Digit dengan output tampilan seven-segment
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 102

 

Kode program 7 di bawah ini mengimplementasikan penghitung desimal 2-digit (0 -> 99 -> 0), dengan pengaturan ulang asinkron eksternal ditambah konversi binary code decimal (BCD) ke tampilan seven-segment. Diagram rangkaian dan tampilan seven-segment ditunjukkan pada Gambar 7.

Blok program pernyataan CASE (baris 30–56) digunakan untuk menentukan sinyal keluaran yang akan mengumpan tampilan seven-segment. Perhatikan bahwa kita telah memilih koneksi berikut antara rangkaian dan tampilan seven-segment: xabcdefg (yaitu, MSB mengumpan titik desimal, sementara LSB mengumpan segmen g).

Seperti yang dapat dilihat, rangkaian ini merupakan perluasan langsung dari rangkaian yang disajikan pada Contoh 2 (Counter 1-Digit), dengan perbedaan bahwa sekarang diperlukan dua digit, bukan satu, dan bahwa keluaran harus dihubungkan ke tampilan seven-segment.

Program 7: Untuk contoh 10.7

Operasi rangkaian counter 2-digit dapat diverifikasi pada hasil simulasi pada Gambar 8.

Gambar 8. Hasil simulasi – Counter 2-Digit dengan output tampilan seven-segment
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 102

 

Komentar: Perhatikan pada program 7 di atas. Tampak bahwa blok program rutin yang sama diulang dua kali (menggunakan pernyataan CASE). Pada artikel terpisah (Klik link!), Kita akan mempelajari cara menulis dan mengompilasi potongan kode program yang sering digunakan ke dalam pustaka (library) yang ditentukan pengguna, sehingga pengulangan tersebut dapat dihindari.

 

10.6 Pernyataan LOOP

Sesuai namanya, LOOP berguna ketika suatu kode program VHDL harus diinstansiasi atau diulangi beberapa kali. Seperti pernyataan IF, WAIT, dan CASE, LOOP ditujukan khusus untuk kode sekuensial, sehingga hanya dapat digunakan di dalam blok program PROCESS, FUNCTION, atau PROCEDURE.

Ada beberapa cara penggunaan pernyataan LOOP, seperti yang ditunjukkan pada sintaks di bawah ini.

 

10.6.1  Perulangan FOR – LOOP

Perulangan FOR – LOOP digunakan untuk melakukan perulangan terhadap satu atau beberapa baris kode program dengan jumlah perulangan yang ditetapkan (definitif) oleh programmer.

Syntax FOR – LOOP:

Contoh:

Pada contoh kode program di atas, loop akan diulang tanpa syarat hingga i mencapai 5 (yaitu, enam kali perulangan).

Satu catatan penting mengenai perulangan FOR-LOOP (mirip dengan yang dibuat untuk GENERATE, klik link artikel!) adalah bahwa kedua batas rentang harus statis. Dengan demikian, deklarasi bertipe “FOR i IN 0 TO x LOOP”, di mana “x” adalah parameter input (nonstatis), umumnya tidak dapat disintesis.

 

10.6.2 Perulangan WHILE – LOOP

Perulangan WHILE – LOOP digunakan untuk melakukan perulangan terhadap satu atau beberapa baris kode program hingga kondisi tidak lagi terpenuhi.

Syntax WHILE – LOOP:

Contoh:

Pada contoh di atas, LOOP akan terus berulang selama kondisi i < 10.

 

10.6.3 Kata Kunci EXIT

Kata kunci EXIT digunakan untuk mengakhiri atau keluar dari sebuah perulangan LOOP.

Syntax EXIT:

Contoh:

Pada contoh kode program di atas, kata kunci EXIT bukan digunakan untuk keluar dari perulangan LOOP saat ini karena rentang data perulangan sudah selesai dihitung untuk perulangan kode program, melainkan keluar secara pasti dari perulangan LOOP meskipun nilai i masih dalam rentang data (belum selesai terhitung) sehingga pernyataan LOOP akan dianggap selesai. Artinya perulangan LOOP akan berakhir segera setelah nilai yang berbeda dari ‘0’ ditemukan dalam vektor data.

 

10.6.4 Kata Kunci NEXT

Kata kunci NEXT digunakan untuk untuk melewatkan (skip) langkah atau proses perulangan LOOP.

Syntax NEXT:

Contoh:

Dalam contoh kode program di atas, kata kunci NEXT menyebabkan LOOP melewatkan satu perulangan ketika i = skip.

 

10.7 Pernyataan CASE vs IF

Meskipun pada prinsipnya keberadaan kata kunci ELSE dalam pernyataan IF – ELSE dapat menyiratkan implementasi dekoder prioritas (yang tidak akan pernah terjadi dengan pernyataan CASE), namun hal ini umumnya tidak akan terjadi.

Misalnya, ketika pernyataan IF (pernyataan sekuensial) digunakan untuk mengimplementasikan rangkaian kombinasional penuh, sebuah multiplekser mungkin akan disimpulkan sebagai gantinya. Oleh karena itu, setelah optimasi, kecenderungan umumnya adalah rangkaian yang disintesis dari kode VHDL berbasis pernyataan IF tidak akan berbeda dengan rangkaian yang berbasis CASE.

Contoh kode program di bawah ini mengimplementasikan rangkaian multiplexer fisik yang sama, namun satu menggunakan pernyataan IF dan satunya menggunakan pernyataan CASE.

 

Contoh kode rangkaian multiplexer menggunakan pernyataan IF:

 

Contoh kode rangkaian multiplexer menggunakan pernyataan CASE:

 

10.8 Pernyataan CASE vs WHEN

Pernyataan CASE dan WHEN sangat mirip. Namun, meskipun yang satu bersifat konkuren/parallel (WHEN), yang lainnya bersifat sekuensial/berurutan (CASE). Persamaan dan perbedaan utama keduanya dirangkum dalam Tabel 1.

Tabel 1. Perbandingan antara WHEN dan CASE

Dari sudut pandang fungsional, kedua contoh kode program di bawah ini adalah setara.

Contoh: Program dengan pernyataan WHEN

 

Contoh: Program dengan pernyataan CASE

 

10.9 Bad Clocking

Kompiler umumnya tidak akan dapat mensintesis kode yang berisi penugasan ke sinyal yang sama pada kedua transisi sinyal referensi (clock) yaitu, pada rising-edge dan falling-edge. Hal ini khususnya berlaku ketika teknologi target hanya berisi single-edge flip-flop (CPLD, misalnya). Dalam hal ini, kompiler mungkin menampilkan pesan, “signal does not hold value after clock edge” atau yang serupa.

Sebagai contoh, mari kita perhatikan kasus counter yang harus dinaikkan pada setiap transisi clock (rising-edge dan falling-edge). Salah satu alternatifnya adalah sebagai berikut:

Dalam kasus ini, selain pesan-pesan yang telah dijelaskan, kompiler mungkin juga mengeluh bahwa sinyal counter digerakkan oleh dua sinyal transisi (multiple driven) yang berbeda, yaitu transisi sinyal rising-edge dan falling-edge. Apabila hal ini terjadi, maka proses kompilasi program akan ditangguhkan.

Aspek penting lainnya adalah atribut EVENT harus terkait dengan kondisi pengujian. Misalnya, pernyataan IF(clk’EVENT AND clk=’1′) sudah benar, tetapi menggunakan IF(clk’EVENT) saja akan membuat kompiler mengambil nilai pengujian default (misalnya, “AND clk=’1′”) atau menampilkan pesan, “clock not locally stable”. Sebagai contoh, mari kita pertimbangkan kembali kasus counter yang harus dinaikkan pada kedua transisi “clk”. Kita dapat menulis:

Karena blok program PROCESS di atas seharusnya dijalankan setiap kali “clk” berubah, kita mungkin berharap counter akan bertambah dua kali per siklus clock. Namun, karena alasan yang telah disebutkan, hal ini tidak akan terjadi. Jika kompiler mengasumsikan nilai default, rangkaian yang salah akan disintesis, karena hanya satu sisi “clk” yang akan dipertimbangkan; jika tidak ada nilai default yang diasumsikan, maka pesan kesalahan dan kompilasi tidak akan terjadi.

Terakhir, jika sebuah sinyal didefinisikan dalam daftar sensitivitas, tetapi tidak muncul dalam penugasan apa pun yang menyusun blok program PROCESS, maka kemungkinan kompiler akan mengabaikannya. Fakta ini dapat diilustrasikan dengan penghitung sisi ganda yang dijelaskan di atas sekali lagi. Misalkan kode berikut digunakan:

Kode ini menjadikan sinyal counter bertambah setiap kali suatu peristiwa terjadi pada “clk” (rising-edge plus falling-edge). Namun, pesan seperti “Ignored unnecessary pin clk” mungkin akan muncul sebagai gantinya. Hal ini disebabkan karena sinyal “clk” yang didefinisikan di dalam daftar sensitivitas blok program PROCESS tidak di gunakan dalam penugasan apa pun dalam program.

Contoh: Berbeda dengan kasus yang dijelaskan di atas, dua buah blok kode PROCESS yang ditunjukkan di bawah ini akan disintesis dengan benar oleh kompiler mana pun. Namun, perhatikan bahwa kita telah menggunakan sinyal yang berbeda di setiap proses, yaitu sinyal “x” dan sinyal “y”.

 

Contoh 10.11: Random Access Memory (RAM)
Di bawah ini adalah contoh lain yang menggunakan kode sekuensial, khususnya pernyataan IF. Pada contoh ini adalah kita akan membuat rangkaian Random Memory Access  (RAM). Seperti yang dapat dilihat pada Gambar 9(a), rangkaian ini memiliki bus masukan data (data_in), bus keluaran data (data_out), bus alamat (addr), plus clock (clk), dan write enable (wr_ena) pin. Ketika wr_ena ditetapkan, pada “clk” rising-edge berikutnya, vektor yang ada di data_in harus disimpan pada posisi yang ditentukan oleh “addr”. Di sisi lain, keluaran, data_out, harus terus-menerus menampilkan data yang dipilih oleh “addr”. Dari sudut pandang register, rangkaian dapat diringkas seperti pada Gambar 9(b).

Gambar 9. Rangkaian Random Access Memory (RAM)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 116

 

Ketika wr_ena rendah, q terhubung ke masukan flip-flop, dan terminal d terbuka, sehingga tidak ada data baru yang akan ditulis ke dalam memori. Namun, ketika wr_ena dinaikkan ke tinggi, d terhubung ke masukan register, sehingga pada “clk” rising-edge berikutnya, d akan menimpa nilai sebelumnya.

Kode VHDL yang mengimplementasikan rangkaian pada Gambar 9 ditunjukkan pada program 11 di bawah ini. Kapasitas yang dipilih untuk RAM adalah 16 words dengan panjang masing-masing 8 bit. Perhatikan bahwa kode tersebut sepenuhnya generik.

 

Program 11: Untuk contoh 10.11

Hasil simulasi untuk program 11 dapat kita lihat pada gambar 10.

Gambar 10. Hasil simulasi – Random Access Memory (RAM)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 118

 

10.10 Menggunakan Kode Sekuensial untuk Membuat Rangkaian Kombinasional

Kita telah melihat bahwa kode sekuensial dapat digunakan untuk mengimplementasikan rangkaian sekuensial (kasus pertama) maupun rangkaian kombinasional (kasus kedua). Dalam kasus pertama, register diperlukan, sehingga akan disimpulkan oleh kompiler. Namun, hal ini seharusnya tidak terjadi dalam kasus kedua.

Lebih lanjut, jika kode ditujukan untuk rangkaian kombinasional, maka tabel kebenaran lengkap harus dinyatakan dengan jelas dalam kode. Untuk memenuhi kriteria di atas, aturan berikut harus diperhatikan:

  • Aturan 1: Pastikan semua sinyal input yang digunakan (dibaca) di definisikan di dalam blok program PROCESS pada daftar sensitivitasnya.
  • Aturan 2: Pastikan semua kombinasi sinyal masukan/keluaran disertakan dalam kode; yaitu, pastikan bahwa, dengan melihat kode, tabel kebenaran lengkap rangkaian dapat diperoleh (Ini berlaku untuk kode sequential maupun concurrent).

 

Kegagalan mematuhi aturan 1 umumnya akan menyebabkan kompiler hanya mengeluarkan peringatan yang menyatakan bahwa sinyal input tertentu tidak termasuk dalam daftar sensitivitas, dan kemudian melanjutkan seolah-olah sinyal tersebut disertakan. Meskipun tidak ada kerusakan yang terjadi pada desain dalam kasus ini, merupakan praktik desain yang baik untuk selalu mempertimbangkan aturan 1.

Namun, terkait aturan 2, konsekuensinya bisa lebih serius karena spesifikasi sinyal output yang tidak lengkap dapat menyebabkan synthesizer menyimpulkan pengunci (Latch) untuk mempertahankan nilai sebelumnya. Hal ini diilustrasikan dalam contoh di bawah ini.

Gambar 11. Contoh rangkaian untuk contoh 10.12
(a) Diagram tingkat atas, (b) Spesifikasi yang diberikan, (c) Tabel kebenaran yang diterapkan,
(d) Pendekatan yang tepat.
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 119

 

Contoh 10.12: Desain Kombinasional yang Buruk
Mari kita perhatikan rangkaian pada Gambar 11, yang spesifikasinya telah diberikan: x harus berperilaku sebagai multiplexer; artinya, harus sama dengan input yang dipilih oleh sel. y, di sisi lain, harus sama dengan ‘0’ ketika sel = ’00’, atau ‘1’ jika sel = ’01’. Spesifikasi ini dirangkum dalam tabel kebenaran pada Gambar 11(b).

Perhatikan bahwa ini adalah rangkaian kombinasional. Namun, spesifikasi yang diberikan untuk y tidak lengkap, seperti yang dapat diamati pada tabel kebenaran pada Gambar 11(b). Dengan hanya menggunakan spesifikasi ini, kodenya dapat menjadi sebagai berikut:

 

Program 12: Untuk contoh 10.12

Setelah mengompilasi kode ini, berkas laporan menunjukkan bahwa tidak ada flip-flop yang disimpulkan (seperti yang diharapkan). Namun, ketika kita melihat hasil simulasi (Gambar 12), kita melihat sesuatu yang ganjil tentang y. Amati bahwa, untuk nilai input yang sama (sel = 3 = “11”), dua hasil yang berbeda diperoleh untuk y (ketika sel = 3 didahului oleh sel = 0, y = “0” dihasilkan, sementara y = “1” diperoleh ketika sel = 3 didahului oleh sel = 1).

Ini menandakan bahwa semacam memori memang diimplementasikan oleh kompilator. Bahkan, jika kita melihat persamaan yang diperoleh dengan Quartus II, misalnya (Lampiran D), kita memverifikasi bahwa y dihitung sebagai y = (sel(0) AND sel(1)) OR (sel(0) AND y) OR (sel(1) OR y). Oleh karena itu, sebuah latch (menggunakan gerbang AND/OR) diimplementasikan, yang menghasilkan tabel kebenaran pada Gambar 11(c).

Untuk menghindari logika tambahan yang dibutuhkan oleh latch, spesifikasi pada Gambar 11(d) harus digunakan (‘X’ digunakan untuk semua nilai yang tidak diketahui atau nilai “don’t care”). Oleh karena itu, baris y<=’X’; harus disertakan di bawah baris 22 dan 24 dalam kode di atas. Sekarang, y dapat sesederhana y = sel(0).

 

Gambar 12. Hasil simulasi – Contoh 10.12
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 120

 

Author

Taufiq Dwi Septian Suyadhi

Degrees from electronics and industrial engineering. Enthusiast on electronics, embedded systems, and robotics. Motivation: “Never ending learning and sharing valuable knowledge to the others”.

Leave a Reply

Post Related

error: Content is protected !!