Anda di halaman 1dari 42

1

VHDL

Very High Speed Integrated Circuit (VHSIC)


Hardware Description Language (HDL)

I. Apa itu HDL ?


Apabila seorang desainer membuat suatu sistem kontrol berbasiskan komputer maka
disamping membuat rangkaian interface yang diperlukan, desainer tersebut juga akan
membuat suatu program untuk mengontrol peralatan interfacing yang dibuat. Dalam hal ini,
program komputer tersebut akan dibuat dalam suatu standar bahasa tertentu, misalnya : C,
C++, Pascal, Basic, dan sebagainya. Program tersebut akan mendiskripsikan hal-hal apa saja
yang perlu dilakukan oleh komputer terhadap rangkaian interfacing yang telah dibuat guna
melakukan pengontrolan pada sistem. Pada waktu yang lain, seorang desainer mungkin akan
membuat sistem kontrol berbasiskan mikrokontroler, misalnya AT89S252 buatan Atmel.
Dalam hal ini, desainer tersebut juga akan membuat program (dalam bahasa Assembly 8952)
untuk mengontrol sistem yang dibuat.
Pada dasarnya untuk membuat suatu sistem kontrol diperlukan sesuatu yang akan
mendeskripsikan apa-apa yang harus dikerjakan oleh sistem pada suatu kondisi tertentu.
Pada dua kondisi diatas, program yang dibuat dapat pula disebut dengan Software Description
Language (SDL). Pada prinsipnya, pembuatan suatu sistem kontrol dengan SDL harus
mengikuti aturan yang sangat ketat dari basis atau dasar dimana sistem kontrol tersebut akan
diimplementasikan. Aturan-aturan tersebut antara lain : alokasi port, jenis-jenis layanan yang
dapat didukung oleh sistem dasar, application programming interface (API) untuk melakukan
pemrograman dengan bahasa tingkat tinggi (C, C++, Pascal, Basic, dan sebagainya) dan lainlain. Adalah tidak mungkin bagi seorang pemrogram untuk mengubah konfigurasi sistem
dasar, terlebih lagi konfigurasi dari Central Processing Unit (CPU) yang dipakai karena
kesemuanya itu telah ditetapkan oleh pabrik pembuatnya.
Dengan semakin berkembangnya dunia elektronika, seorang desainer sistem dituntut
untuk dapat menciptakan suatu sistem yang semakin cepat dan optimal. Penggunaan SDL
tidaklah akan membawa hasil yang optimal untuk hal-hal tertentu, misalnya : sistem kontrol
portabel akan menjadi tidak efisien apabila harus selalu dihubungkan dengan PC atau laptop.
Penggunaan mikrokontroler mungkin dapat menjadi pilihan, namun untuk sistim yang
kompleks dan besar maka akan diperlukan suatu mikrokontroler yang kompleks dan cepat.
Kelemahan lain sistem berbasis SDL adalah pada umumnya mereka memproses seuatu secara

2
sekuensial, ini akan mengakibatkan kelambatan proses apabila diperlukan pengontrolan
banyak proses real time secara bersamaan.
Untuk mengatasi masalah diatas maka digunakan desain kontrol dengan hardware
secara langsung, misalnya : implentasi finite state machine dengan IC-IC digital (TTL,
CMOS, HCMOS, dan lain-lain). Namun, ini akan sangat menyulitkan apabila sistem kontrol
yang dirancang berukuran sangat besar. Pada sistem skala besar dengan ratusan sampai
ribuan, bahkan puluhan ribu gate seorang perancang akan kesulitan untuk melakukan tracking
dan debugging pada sistem yang telah atau sedang dirancang, yang pada akhirnya
mengakibatkan perancangan dan penyempurnaan sistem memerlukan waktu yang lama.
Berdasarkan hal-hal diatas maka lahirlah apa yang disebut dengan Hardware
Description Language (HDL). Pada prinsipnya HDL akan mirip dengan SDL, yaitu
mendeskripsikan proses-proses kontrol yang diinginkan dengan menggunakan suatu bahasa
yang enak dibaca dan mudah dipahami. Namun, apabila dengan SDL seorang desainer harus
terikat secara ketat pada aturan-aturan tertentu maka dengan HDL seorang desainer akan
sedikit banyak dapat lebih bebas. Secara sederhana, apabila SDL adalah deskripsi
(pernyataan-pernyataan) program atau perintah yang akan dieksekusi oleh mesin dasar atau
CPU maka HDL adalah deskripsi dari hardware itu sendiri.

II. Mengapa Harus Memakai HDL ?


Adalah sulit untuk mendesain suatu sistem digital tanpa memahami komponenkomponen pembangun dasarnya seperti gate dan flip-flop. Sebelum adanya HDL, kebanyakan
rangkaian rangkaian digital didesain menggunakan persamaan-persamaan boolean. Cara
desain seperti ini mengharuskan seseorang menulis semua persamaan-persamaan logika yang
dibutuhkan lalu melakukan optimasi. Pada sistem berskala besar maka akan terdapat ratusan
bahkan mungkin ribuan persaman-persamaan logika yang akan mempersulit proses desain
sistem. Cara desain semacam ini juga memiliki sebuah kelemahan mendasar, yaitu proses dan
hubungan-hubungan yang dilakukan antara sistem dan sub-sistem menjadi tidak jelas. Apabila
seseorang mendesain suatu sistem maka yang pertama kali dilakukan adalah mendeskripsikan
apa saja yang akan dilakukan oleh sistem dan sub-sistemnya, lalu kemudian melakukan
implementasi, proses ini dapat dilihat pada gambar 1.

Gambar 1. Proses desain sistem digital konvensional

Pada gambar diatas, apabila suatu sistem telah selesai disusun maka akan sangat sulit
bagi perancang untuk memperbaiki atau meningkatkan unjuk kerja sistem mereka di
kemudian hari tanpa harus meyimpan semua berkas-berkas perancangan secara lengkap mulai
dari nol. Apabila pada suatu kondisi maka ada sedikit berkas (misalnya diagram blok sistem
atau sebagian persamaan logika yang hilang) maka perancang akan menjadi kesulitan untuk
mempelajari ulang atau mengembangkan sistemnya.
Akanlah sangat menguntungkan apabila terdapat suatu cara untuk dapat secara implisit
(atau bahkan eksplisit) menyertakan deskripsi sistem secara jelas pada rancangan. Namun, hal
ini tidaklah mungkin pada desain konvensional. Berdasarkan kenyataan itulah maka
dikembangkan HDL yang mirip bahasa pemrograman tingkat tinggi sehingga suatu sistem
yang dirancang akan menjadi lebih mudah dibaca ulang dan dikembangkan dikemudian hari.
Proses densain menggunakan HDL dapat dilihat pada gambar 2.

Gambar 2. Proses desain sistem dengan HDL

Pada prosedur desain diatas, spesifikas sistem dengan HDL akan berbentuk seperti
bahasa pemrogram tingkat tinggi sehingga mudah untuk dipahami dan dimodifikasi di
kemudian hari. Pada gambar diatas, proses synthesis dan implementation dilakukan secara
otomatis oleh oleh tool-tool yang dipakai oleh desainer.

III. VHDL
VHDL merupakan salah satu standar pemrograman berorientasi HDL yang digunakan
untuk merepresentasikan fungsi hardware untuk tujuan permodelan, simulasi test, dan
perencanaan dari sebuah sistem digital. Dengan menggunakan VHDL sebagai salah satu HDL
maka dapat dibuat ribuan gate dan fungsi-fungsi logika lain yang akan memakan waktu lama
bila perancangannya dilakukan dengan cara-cara yang konvensional. Pada prinsipnya,
deskripsi dari suatu sistem dapat ditulis dalam beberapa tingkatan kompleksitas yang berbedabeda seperti yang ditunjukkan pada gambar 3, pada gambar itu ditunjukkan pula jangkauan
(scope) dari VHDL.

Gambar 3. Deskripsi sistem berdasarkan tingkat kompleksitas dan cakupan VHDL

VHDL memiliki beberapa kelebihan, yang dapat dijelaskan secara singkat sebagai berikut :
1. Efisiensi dan Kecepatan Design. Dengan menggunakan VHDL dapat dibuat
kode-kode untuk fungsi logika yang kompleks dan juga simulasi hasilnya.
Pembuatan kode-kode program tersebut dapat dilakukan dengan menggunakan
pustaka desain (design library) yang telah ada atau dengan menggabungkan
komponen dari desain-desain lainnya. Dengan menggunakan VHDL dapat
dilakukan pembuatan desain peralatan dimana pemilihan peralatan dan
implementasinya dapat ditentukan kemudian sehingga perancang dapat lebih
berkonsentrasi pada tingkat perancangan sikap dan kelakuan (behaviour) sistem.
2. Fleksibilitas. VHDL memungkinkan beberapa cara pendeskripsian suatu desain
yang dapat digunakan. Seorang desainer dapat memilih satu atau beberapa yang
sesuai. Untuk lebih jelasnya, lihat gambar 4.
3. Kompatibilitas dan Portabilitas Dengan menggunakan VHDL yang merupakan
standar, maka dapat digunakan deskripsi desain yang sama pada berbagai macam
simulator dan berbagai macam alat sintesa pada berbagai macam platform. Suatu
source code VHDL yang sama dapat disintesa ulang untuk digunakan pada
berbagai macam arsitektur.
4. Ekonomis. Dengan menggunakan VHDL maka kecepatan proses desain dapat
ditingkatkan dengan biaya yang lebih kecil. Dengan menggunakan VHDL, dapat
dedesain fungsi-fungsi logika kompleks yang dapat menggantikan fungsi-fungsi
dari banyak IC logika biasa pada satu desain yang lebih murah dibandingkan
dengan perancangan desain IC yang spesifik. Dengan VHDL maka time-to-market
dapat dipersingkat sehingga kebutuhan konsumen akan lebih cepat terpenuhi.

Netlist
(structural)

u1: xor2 port map(a(0), b(0), x(0));


u2: xor2 port map(a(1), b(1), x(1));
u3: nor2 port map(x(0), x(1), rslt);

Boolean equations

rslt <= (a(0) XOR b(0)) NOR (a(1) XOR

(bool)

b(1));

Concurrent
statements

rslt <= '1' when (a = b) else '0';

(dataflow)

if(a = b) then
Sequential
statements

rslt <= '1';


else

(behavioral)

rslt <= '0';


end if;

Gambar 4. Berbagai macam cara untuk mendesain komparator 2-bit dengan VHDL

IV. Memulai Desain dengan VHDL


Untuk melakukan desain dengan mengunakan VHDL diperlukan beberapa tahapan
sebagai berikut :
1. Mendeskripsikan desain
Langkah pertama adalah untuk menentukan spesifikasi dari suatu sistem yang akan
didesain dengan selengkap-lengkapnya lalu memilih metodologi yang sesuai.
Metodologi desain dapat dibagi menjadi empat jenis, yaitu : flat, top-down,
bottom-up dan mixed. Metoda flat tidak melakukan proses desain bertingkat
(hierarchical design) dan melakukan pencampuran keseluruhan bagian sistem
pada satu kesatuan. Metoda desain ini cocok untuk sistem tipe kecil karena
kompleksitasnya yang rendah serta proses desainnya yang lebih cepat. Metoda top-

7
down menerapkan hierarchical design dengan cara membuat modul utama (modul
pengikat) suatu sistem terlebih dahulu, lalu dilanjutkan dengan menyusun sub-submodulnya. Metoda bottom-up menerapkan hierarchical design yang sedikit
berbeda dengan metoda sebelumnya, yaitu dengan cara membuat dan melakukan
tes secara menyeluruh pada komponen-komponen (sub-modul) sampai dipastikan
dapat berfungsi dengan baik, lalu kemudian membuat suatu modul pengikat untuk
modul-modul tersebut. Metoda mixed menerapkan hierarchical design yang
merupakan kombinasi antara metoda top-down dan bottom-up. Setelah
menentukan metodologi, langkah selanjutnya adalah membuat diagram blok dari
sistem yang akan didesain, hal ini akan berguna terutama untuk sistem yang besar.
2. Melakukan pengkodean
Dengan melihat spesifikasi dan diagram blok yang telah dirancang maka seorang
desainer dapat memulai melakukan pengkodeaan dengan VHDL. Hal terpenting
dalam melakukan pengkodeaan adalah memilih jenis kode yang dapat
direalisasikan (disintesa). Kode VHDL yang dirangcang untuk simulasi bisa jadi
tidak akan pernah dapat untuk disintesa sedangkan kode VHDL yang dirancang
untuk disintesa hampir pasti dapat disimulasikan
3. Melakukan simulasi fungsional
Dengan melakukan simulasi atas kode-kode VHDL yang telah ditulis maka akan
dapat diketahui apakah kode-kode tersebut telah dapat bekerja dengan baik.
Apabila terdapat kesalahan maka proses perbaikan akan lebih cepat dengan adanya
simulasi.
4. Melakukan sintesa, optimasi dan implementasi
Pada bagian ini maka tool-tool sintesa akan bekerja untuk mengubah deskripsi
pada kode-kode VHDL menjadi susunan gerbang, flip-flop, multiplekser, dan
sebagainya yang sesuai untuk device yang menjadi target. Proses optimasi dapat
dilakukan secara otomatis oleh tool yang digunakan, walau sebenarnya dengan
merancang kode-kode VHDL yang optimal maka akan dapat menghasilkan sintesa
yang lebih optimal disbanding apabila hanya mengandalkan alat sintesa. Proses
implementasi berguna untuk menempatkan komponen-komponen digital dasar
yang telah disintesa dalam device target.
5. Simulasi lanjutan (timing)
Walaupun tidak selalu diperlukan, pada desain yang menuntut kecepatan proses
yang tinggi dan tepat simulasi ini dapat membantu. Berbeda dengan simulasi

8
fungsional yang hanya melakukan simulai terhadap fungsi-fungsi logika yang
dibuat, maka simulasi ini juga akan melakukan simulasi terhadap delay-delay yang
terjadi dalam dunia nyata. Suatu desain yang berfungsi secara fungsional belum
tentu dapat berfungsi dalam dunia nyata dengan adanya delay sinyal ataupun
glitch.
6. Memprogram device
Apabila segalanya telah sesuai spesifikasi maka dapat dilanjutkan dengan
melakukan pemrograman device target.

IV.1 Entitas dan Arsitektur


Entitas (entity) dan arsitektur (architecture) adalah dua hal yang paling dasar dalam
desain menggunakan VHDL. Untuk lebih jelasnya, lihat contoh kode untuk komparator 4-bit
dibawah ini :
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 -- eqcomp4 is a four bit equality comparator
5 entity eqcomp4 is
6 port (a : in

std_logic_vector(3 downto 0);

b : in

std_logic_vector(3 downto 0);

e : out std_logic);

9 end eqcomp4;
10
11 architecture dataflow of eqcomp4 is
12 begin
13

e <= '1' when (a = b) else '0';

14 end dataflow;

Nomor-nomor baris pada kode diatas tidak perlu dituliskan pada pengkodean yang
sesungguhnya. Penjelasan dari kode-kode diatas adalah sebagai berikut :
1. Garis tengah ganda (--) menunjukkan awal komentar, semua huruf dibelakang setalah
tanda tersebut pada baris yang sama adalah komentar dan akan diabaikan dalam
sintesa.

9
2. Baris 5 sampai 9 mendefinisikan suatu entitas yang bernama eqcomp4. Suatu entitas
secara sederhana dapat dianggap sebagai sebuah komponen elektronika yang
memiliki pena-pena (kaki) yang didefinisikan oleh pernyataan port. Dalam hal ini
komponen elektronika eqcomp4 memiliki dua pena masukan bus (a dan b) dan
sebuah pena keluaran tunggal (e). Secara singkat, entitas mendefinisikan susunan I/O.
3. Baris 11 sampai 14 mendefinisikan apa yang akan dikerjakan oleh entitas eqcomp4.
Bagian ini disebut dengan architecture body. Dalam hal ini arsitektur ini diberi nama
dataflow, penamaan ini sebenarnya adalah terserah desainer, namun akan cukup
membantu apabila penamaan disesuaikan dengan cara deskripsi yang digunakan (lihat
kembali gambar 3). Secara singkat, arsitektur mendefinisikan fungsi dari entitas yang
telah dideskripsikan.

IV.2 Port
Semua sinyal I/O dalam sebuah entitas dirujuk dengan sebuah port yang analog
dengan sebuah pena pada suatu komponen elektronikan. Setiap port dapat dideklarasikan
dengan beberapa mode, yaitu :
1. In. Sinyal dari luar masuk dan akan diproses oleh entitas.
2. Out. Entitas akan menggunakan port ini untuk mengirim sinyal ke luar. Port jenis ini
tidak dapat digunakan dalam proses untuk dibaca.
3. Buffer. Port jenis ini sama dengan jenis out tetapi sinyal padanya dapat dibaca untuk
proses tetapi tidak dapat digunakan untuk membaca sinyal eksternal.
4. Inout. Port jenis ini merupakan port untuk sinyal dua arah murni (bi-directional).
Perhatikan contoh kode dibawah ini :
1 entity cum4 is
2 port (din
3

: in

std_logic_vector(3 downto 0);

dout : out std_logic_vector(3 downto 0));

4 end cum4;
5
6 architecture dataflow of cum4 is
7 begin
8

dout <= dout + din;

9 end dataflow;

10
Pada contoh diatas maka akan terjadi kesalahan pada baris 8 karena dout tidak dapat dibaca.
Untuk memperbaikinya maka baris 3 perlu ditulis ulang sebagai berikut :
dout : buffer std_logic_vector(3 downto 0));

Dibawah ini disajikan penulisan arsitektur untuk eqcomp4 dalam bentuk-bentuk yang lain :
architecture structural of eqcomp4 is
signal x : std_logic_vector(3 downto 0);
begin
u0: xnor2 port map(a(0), b(0), x(0));
u1: xnor2 port map(a(1), b(1), x(1));
u2: xnor2 port map(a(2), b(2), x(2));
u3: xnor2 port map(a(3), b(3), x(3));
u4: and4

port map(x(0), x(1), x(2), x(3), e);

end structural;
architecture bool of eqcomp4 is
begin
e <=

not(a(0) xor b(0))


and not(a(1) xor b(1))
and not(a(2) xor b(2))
and not(a(3) xor b(3));

end bool;
architecture behavioral of eqcomp4 is begin
process(a, b) begin
if(a = b) then
e <= '1';
else
e <= '0';
end if;
end process;
end behavioral;

11
IV.3 Desain untuk Simulasi atau untuk Sintesa
Untuk memperjelas konsep desain untuk simulasi ataupun untuk sintesa, perhatikan
contoh kode dibawah ini :
architecture for_simulation_only of an_example is
begin
pulse_generator: process begin
loop
PulseOut <= '0';
wait for 13 uS;
PulseOut <= '1';
wait for 13 uS;
end loop;
end process;
end for_simulation_only;

Bila diperhatikan maka kode-kode diatas tidak akan pernah bisa disintesa. Suatu tool
synthetizer tidak akan dapat mengerti dengan apa dia akan menghasilkan waktu tunda sebesar
13uS tersebut, ditambah lagi pada arsitektur diatas tidak ada sinyal clock yang dapat dipakai.
Pada prinsipnya untuk dapat disintesa suatu kode harus dapat dideskripsikan secara jelas
untuk dapat diubah menjadi susunan gerbang-gerbang dan flip-flop.

Perhatikan pula kode dibawah ini :


architecture can_not_synthesized of an_example is begin
process(in1, in2) begin
if(in1 > in2) then
rout <= '0';
elsif(in1 < in2) then
rout <= '1';
else
rout <= 'X';
end if;
end process;
end can_not_synthesized;

12
Pada kode diatas terdapat simbol X yang pada VHDL berarti dont know. Suatu simulator
VHDL akabn menghasilkan kode X apabila ia tidak bisa memutuskan apa hasil dari
simulasi, semisal karena terjadinya short-circuit karena dihubungkannya dua port output yang
berbeda pada hierarchical design. Namun, pada contoh diatas, proses sintesa akan
menghasilkan error karena sinyal X adalah tidak ada pada kondisi nyata. Namun, terdapat
sebuah kode lain, yaitu - atau dont care yang dapat sangat berguna dalam desain
menggunakan VHDL. Untuk lebih jelasnya, perhatikan potongan kode dibawah ini :
architecture logic_minimization of an_example is
begin
process(s) begin
if(s = "00") or (s = "11") then
y <= '1';
elsif(s = "01") then
y <= '0';
else
y <= '-';
end if;
end process;
end logic_minimization;
Pada contoh diatas, harga - berguna agar alat sintesa menghasilkan keluaran :

dan bukan :

IV.4 Tipe-Tipe Objek


Terdapat tiga jenis objek pada VHDL, yaitu constant, signal, dan variable. Sebuah
konstanta hanya dapat menampung sebuah harga saja yang tidak data dirubah oleh proses
yang terjadi pada kode, dibawah ini adalah contoh konstanta :
constant WIDTH : integer := 8;
constant FLACK : std_logic_vector(2 downto 0) := "010";
Sebuah konstanta dapat dideklarasikan pada deklarasi process, architecture, entity ataupun
package.

13
Sebuah sinyal dapat dianggap sebagai sebuah jalur kabel yang menghubungkan
berbagai bagian pada modul ataupun antar modul, dibawah ini adalah contoh sinyal :
signal STATE : STATE_TYPE;
signal DBuff : std_logic_vector(7 downto 0);
signal Cmdn

: std_logic;

signal Code

: integer range 10 to 5;

Sebuah nilai awal dapat diisikan pada deklarasi sinyal, seperti :


signal DBuff : std_logic_vector(3 downto 0) := "1101";

Namun, kondisi diatas hanya berguna bagi simulasi dan tidak akan berguna bagi sintesa
karena saat suatu device diprogram maka kondisi (state) dari flip-flop pada device itu bisa
berada dalam kondisi reset (0), set (1) ataupun tidak menentu, jadi tidak dapat dipastikan
bahwa sinyal DBuff pada contoh diatas pasti berisi "11010110" pada saat device di-power up.
Sinyal dapat dideklarasikan baik pada deklarasi entity ataupun architecture, hanya saja
apabila pada deklarasi entitas maka sinyal akan secara eksplisit memiliki mode (in, out, buffer
atau inout), namun apabila pada deklarasi arsitektur maka sinyal akan secara langsung
memiliki mode inout.
Suatu variabel hanya dapat dideklarasikan pada bagian proses dari suatu arsitektur.
Variabel digunakan untuk menampung angka sementara dalam perhitung dan tidak
mencerminkan sebuah kabel. Dibawah ini adalah contoh deklarasi dan pemakaian sebuah
variabel :
architecture use_of_variable of my_and is
begin
process(in_bus)
variable tmp : std_logic;
begin
tmp := '1';
for i in 3 downto 0 loop
tmp := in_bus(i) and tmp;
end loop;

14
qout <= tmp;
end process;
end use_of_variable;

Pada contoh diatas akan dilakukan proses sebagai berikut :


qout <= in_bus(0) AND in_bus(1) AND
in_bus(2) AND in_bus(3);

IV.5 Tipe-Tipe Data


Terdapat banyak tipe data dalam VHDL, yang akan dibahas disini adalah tipe-tipe
sederhana yang sering dipakai dalam pemrograman. Dibawah ini diberikan contoh deklarasi
sinyal menggunakan tipe-tipe data sederhana (didefinisikan pada IEEE 1164) :
signal Input

: bit;

signal Flag

: std_logic;

signal Position : integer range 10 to 5;


signal Level

: integer range 0 to 10;

signal Status

: bool;

Selain itu dapat didefinisikan pula suatu tipe yang disebut dengan enumerasi (enumeration)
seperti berikut :
type STATE_TYPE is (IDLE, READ, WRITE, ERROR);
signal PState : STATE_TYPE;
signal NState : STATE_TYPE;

Pendefinisian suatu enumerasi akan sangat berguna pada pembuatan finie state machine. Pada
contoh-contoh diatas juga terlihat suatu tipe yang disebut array, misalnya :
signal Buffer : std_logic_vector(7 downto 0);

15
Sebenarnya std_logic_vector didefinisikan IEEE 1164 sebagai :
type std_logic_vector(natural range <>) of std_logic;

Dengan demikian, dapat dibuat suatu tipe array user-defined sebagai berikut :
type table4x2 is array(0 to 3, 0 to 2) of bit;
constant x_or : table4x2 := ("00_0",
"01_1",
"10_1",
"11_0");

Pada contoh diatas, isi dari tabel x_or ditulis secara vertical agar mudah dibaca, tetapi
tentunya tidak harus seperti itu. Terlihat simbol _ pada potongan kode diatas, kebanyakan
program sintesa VHDL dapat menerima simbol _ yang ditambahkan pada sembarang dua
digit yang berjajar. Dimasukkannya simbol - pada contoh diatas adalah agar tabel menjadi
lebih mudah dibaca. Namun, perlu diketahui bahwa tidak semua program sintesa VHDL dapat
menerima _.

V. Desain Kombinasional
Suatu desain kombinasional dapat secara mudah dinyatakan dalam bentuk bool,
dataflow ataupun behavioral. Perhatikan contoh desain sebuah muliplexer 2 to 1 pada gambar
dibawah ini.

Gambar 5. Sebuah multiplexer 2 to 1 dalam bentuk skematik

16
Arsitektur dataflow untuk rangkaian diatas dapat ditulis sebagai berikut :

Sedangkan dalam bentuk behavioral dapat ditulis sebagai berikut :

Perlu diketahui sekali lagi, bahwa nama dari arsitektur dapat apa saja (tidak harus bool,
dataflow ataupun behavioral). Untuk selanjutnya, perhatikan pula contoh dibawah ini :

Gambar 6. Sebuah rangkaian programmable gate

Arsitektur dataflow untuk rangkaian diatas dapat ditulis sebagai berikut :

17
Sedangkan dalam bentuk behavioral dapat ditulis sebagai berikut :

Contoh terakhir untuk desain kombinasional adalah sebuah dekoder tertentu yang akan
menghasilkan keluaran alamat tertentu untuk kode yang diberikan :
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity LCDAddrDec is
port(Code : in

std_logic_vector(3 downto 0);


-- Code input

AOut : out std_logic_vector(8 downto 0));


-- Address output
end LCDAddrDec;
architecture Behavioral of LCDAddrDec is
begin
with Code select
AOut <= "000000000" when "0000", -- 00 : address #0
"010001101" when "0001", -- 01 : address #1
"011001110" when "0010", -- 10 : address #2
"011110110" when "0011", -- 11 : address #3
"100100101" when "0100", -- 12 : address #4
"100111110" when "0101", -- 13 : address #5
"101100001" when "0110", -- 20 : address #6
"110010001" when "0111", -- 21 : address #7

18
"110110101" when "1000", -- 22 : address #8
"111011001" when "1001", -- 23 : address #9
"---------" when others;
end Behavioral;

VI. Desain Sequensial


Semua desain sekuensial dengan VHDL pasti memiliki setidaknya sebuah arsitektur
bertipe behavioral. Sebagai contoh pertama, perhatikan gambar operasi interrupt pada
mikroprosesor 8088 pada gambar dibawah ini.

Gambar 7. Operasi interrupt mikroprosesor 8088

Dari gambar 7 diatas akan dibuat sebuah interrupt controller sederhana yang dapat
mengkodekan 8 jenis interrupt yang berbeda. Bentuk simbolik yang melambangkan kontroler
tersebut dapat dilihat pada gambar dibawah ini.

Gambar 8. Kontroler interupsi yang didesain

Dari gambar 7 dan gambar 8 maka dapat diimplementasikan dengan kode VHDL sebagai
berikut :

19
library ieee;
use ieee.std_logic_1164.all;
entity interupt is port (
inta : in std_logic;
b_in : in std_logic_vector(7 downto 0);
b_ot : out std_logic_vector(7 downto 0);
intr : buffer std_logic
);
attribute part_name of interupt

: entity is "22V10";

attribute pin_numbers of interupt : entity is


"inta:1 intr:15 "
& "b_in(0):2 b_in(1):3 b_in(2):4 b_in(3):5"
& "b_in(4):6 b_in(5):7 b_in(6):8 b_in(7):9"
& "b_ot(0):23 b_ot(1):22 b_ot(2):21 b_ot(3):20"
& "b_ot(4):19 b_ot(5):18 b_ot(6):17 b_ot(7):16";
end interupt;
architecture interupt of interupt is
signal buf : std_logic_vector(7 downto 0);
begin
process(b_in)
begin
intr <= not(b_in(0) and b_in(1) and
b_in(2) and b_in(3) and
b_in(4) and b_in(5) and
b_in(6) and b_in(7));
end process;
process(b_in, intr, inta)
begin
if intr = '1' then
if b_in(0) = '0' then

20
buf <= "11111000";
elsif b_in(1) = '0' then
buf <= "11111001";
elsif b_in(2) = '0' then
buf <= "11111010";
elsif b_in(3) = '0' then
buf <= "11111011";
elsif b_in(4) = '0' then
buf <= "11111100";
elsif b_in(5) = '0' then
buf <= "11111101";
elsif b_in(6) = '0' then
buf <= "11111110";
elsif b_in(7) = '0' then
buf <= "11111111";
end if;
end if;
end process;
b_ot <= buf when (inta = '0') else "ZZZZZZZZ";
end interupt;

Program interrupt controller diatas akan diimplementasikan pada IC PALCE22V10 dengan


alokasi pena yang sudah ditentukan, sesuai dengan pernyataan :
attribute part_name of interupt

: entity is "22V10";

attribute pin_numbers of interupt : entity is


"inta:1 intr:15 "
& "b_in(0):2 b_in(1):3 b_in(2):4 b_in(3):5"
& "b_in(4):6 b_in(5):7 b_in(6):8 b_in(7):9"
& "b_ot(0):23 b_ot(1):22 b_ot(2):21 b_ot(3):20"
& "b_ot(4):19 b_ot(5):18 b_ot(6):17 b_ot(7):16";
end interupt;

21
Untuk selanjutnya akan dibahas sebuah desain modul pembagi frekuensi yang
diadaptasi dari :
EDN Access
VHDL code implements 50%-duty-cycle divider
Brian Boorman, Harris RF Communications, Rochester, NY
http://archives.e-insite.net/archives/ednmag/reg/
1997/081597/17di_01.htm
Modul ClkDiv ini akan memerima masukan parameter generic, N, yang merupakan
konstanta pembagi dan diracang untuk melakukan pembagian frekuensi baik dengan bilangan
genap ataupun ganjil. Modul komponen ini tersusun atas 4 buah pernyataan if <kondisi>
generate yang masing-masing bertanggung jawab untuk menghasilkan kode spesifik untuk N
= 1, N = 2, N > 2 dan ganjil serta untuk N > 2 dan genap

Gambar 9. Modul ClkDiv


Berikut ini ditunjukkan proses pembagian frekuensi clock untuk berbagai nilai
pembagi (N) :

Gambar 10a. Pembagian dengan N = 1

Gambar 10b. Pembagian dengan N = 2

Gambar 10c. Pembagian dengan N = 5

22

Gambar 10d. Pembagian dengan N = 6

Sesuai gambar 10c diatas, Counter0 adalah sinyal yang melakukan perhitungan dari 0
sampai N-1. TFF Div1 diaktifkan pada saat Counter0 = 0. TFF Div2 diaktifkan pada saat
Counter0 berada pada nilai ((N 1) / 2 + 1) = 3. Dengan melakukan logika XOR atas
keluaran TFF1 dan TFF2 maka diperoleh clock keluaran dengan frekuensi 1/5 dari frekuensi
clock masukam.
Sedangkan sesuai dengan gambar 10d, TFF Div1 diaktifkan pada saat Counter0 = 0
dan pada saat Counter0 = (N / 2). Frekuensi clock keluaran adalah persis 1/6 dari frekuensi
clock masukan. Implementasi modul pembagi tersebut dalam VHDL adalah sebagi berikut :
library ieee;
use IEEE.STD_LOGIC_1164.all;
package CLK_CTRL is
component ClkDiv
generic(N : natural);
port(En

: in

std_logic;

-- Reset

ClkI : in

std_logic;

-- Clock input

ClkO : out std_logic); -- Clock Output


end component;
end CLK_CTRL;
library ieee;
use IEEE.STD_LOGIC_1164.ALL;
entity ClkDiv is
Generic(N : natural);
port(En

: in

std_logic;

-- Enable signal

23
ClkI : in

std_logic;

-- Clock input

ClkO : out std_logic); -- Clock output


end ClkDiv;
architecture Behavioral of ClkDiv is
-- Internal signals
subtype DIV_TYPE is natural range 0 to N - 1;
signal

Counter : DIV_TYPE;

-- Division counter

signal

En_TFF1 : std_logic; -- TFF 1 enable signal

signal

En_TFF2 : std_logic; -- TFF 2 enable signal

signal

Div1

: std_logic; -- TFF 1

signal

Div2

: std_logic; -- TFF 2

begin
--- Divide by 1
gOne:
if(N = 1) generate
ClkO <= ClkI when En = '1' else '0';
end generate gOne;
--- Divide by 2
gTwo:
if(N = 2) generate
pTwo: process(En, ClkI, Div1) begin
if En = '0' then
Div1 <= '0';
elsif(ClkI'event and ClkI = '1') then
Div1 <= not(Div1);
end if;
end process;
ClkO <= Div1;
end generate gTwo;
--- Divide by Odd Number > 2
gOdd:

24
if(((((N / 2) * 2)) = (N - 1)) and (N > 2)) generate
pOdd: process(En, ClkI, Counter) begin
if(En = '0') then
Counter <= 0;
elsif(ClkI'event and ClkI = '1') then
if(Counter = (N - 1)) then
Counter <= 0;
else
Counter <= Counter + 1;
end if;
end if;
end process;
En_TFF1 <= '1' when Counter = 0 else '0';
En_TFF2 <= '1' when Counter = (((N - 1) / 2) + 1)
else '0';
pOddDiv1: process(En, ClkI, En_TFF1, Div1) begin
if(En = '0') then
Div1 <= '1';
elsif(ClkI'event and ClkI = '1') then
if(En_TFF1 = '1') then
Div1 <= not(Div1);
end if;
end if;
end process;
pOddDiv2: process(En, ClkI, En_TFF2, Div2) begin
if(En = '0') then
Div2 <= '1';
elsif(ClkI'event and ClkI = '0') then
if(En_TFF2 = '1') then
Div2 <= not(Div2);
end if;

25
end if;
end process;
ClkO <= Div1 xor Div2;
end generate gOdd;
--- Divide by Even Number > 2
gEven:
if(((((N / 2) * 2)) = N) and (N > 2)) generate
pEvenDiv: process(En, ClkI, Counter) begin
if(En = '0') then
Counter <= 0;
elsif(ClkI'event and ClkI = '1') then
if(Counter = (N - 1)) then
Counter <= 0;
else
Counter <= Counter + 1;
end if;
end if;
end process;
En_TFF1 <= '1' when ((Counter = 0) or
(Counter = (N / 2)))
else '0';
pEvenDiv1: process(En, ClkI, En_TFF1, Div1) begin
if(En = '0') then
Div1 <= '0';
elsif(ClkI'event and ClkI = '1') then
if(En_TFF1 = '1') then
Div1 <= not(Div1);
end if;
end if;
end process;

26

ClkO <= Div1;


end generate gEven;
end Behavioral;

Modul ClkDiv diatas adalah modul yang bersifat umum. Dalam pemrograman
komputer, modul seperti diatas adalah seperti sebuah library. Dibawah ini adalah contoh kode
VHDL untuk menggunakan library (package) diatas :
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.CLK_CTRL.all;
entity ClkDiv20 is
port(En

: in

std_logic;

-- Enable input

ClkI : in

std_logic;

-- Clock input

ClkO : out std_logic); -- Clock output


end CLKDiv20;
architecture Behavioral of CLKDiv20 is
begin
U1: ClkDiv generic map(20) port map(En, ClkI, ClkO);
end Behavioral;

Contoh desain sekuensial selanjutnya adalah sebuah serial transmitter module. Modul
serial TX ini akan menerima masukan serial clock dengan frekuensi 16 kali dari baud rate
yang diinginkan. Modul TX ini dirancang dengan menggunakan state machine dan memiliki
flow chart untuk proses mengirim data serial sebagai berikut :

27
Start (Reset)

Send = '1' ?
Y
Simpan DIn

CTS = '0' ?
Y
RX = '0'
Tunggu 16 clock
RX = D0
Tunggu 16 clock
RX = D1
Tunggu 16 clock
RX = D2
Tunggu 16 clock
RX = D3
Tunggu 16 clock
RX = D4
Tunggu 16 clock
RX = D5
Tunggu 16 clock
RX = D6
Tunggu 16 clock
RX = D7
Tunggu 16 clock
RX = '1'

Gambar 11. Flowchart proses mengirim data serial pada modul SerialTX

Atau secara grafik :

Gambar 12. Timing diagram untuk modul SerialTX

28
Modul ini memiliki bentuk simbolik sebagai berikut :

Gambar 13. Modul SerialTX

Fungsi pena-pena pada modul SerialTX diatas dapat dijelaskan sebagai berikut :
1. En

: pena masukan sinyal enable, apabila pena ini diberi logika 0 maka modul
akan reset

2. ClkSX

: pena masukan clock dengan frekuensi 16 x baud rate

3. DIn

: pena masukan data parallel

4. Send

: pena masukan sinyal perintah untuk mengirim data serial

5. CTS

: pena masukan sinyal yang menyatakan bahwa penerima (PC) siap


menerima data

6. Busy

: pena keluaran yang menyatakan bahwa modul sedang sibuk

7. TXD

: pena keluaran data serial

Dengan memperhatikan gambar 11-13, maka implementasi dalam VHDL :


library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity SerialTX is
port(En

: in std_logic;

-- Enable signal

ClkSX : in

std_logic;

DIn

std_logic_vector(7 downto 0);

: in

-- Clock input (baud rate)


-- Data input to send

Send

: in

std_logic;

CTS

: in

std_logic;

-- Send command signal

-- CTS handshake signal (inv)


Busy

: out std_logic;

-- Busy indicator signal

TXD

: out std_logic);

-- Serial data output

end SerialTX;

29

architecture Behavioral of SerialTX is


-- Internal signals
type

STATE_TYPE is (SREADY, SLATCH, SCCTS, SSTART, SD0,


SD1, SD2, SD3, SD4, SD5, SD6, SD7,
SSTOP);

signal PSTATE : STATE_TYPE;

-- Present state

signal NSTATE : STATE_TYPE;

-- Next state

signal DBuff

: std_logic_vector(7 downto 0);


-- Data buffer

signal DlyCnt : integer range 0 to 15; -- Delay counter


signal DCNRst : std_logic;

-- Reset DlyCnt to zero

signal DCNInc : std_logic;

-- Increment DlyCnt

signal IBusy

-- Internal busy signal

: std_logic;

begin
-- Main process (combinatorial)
process(Send, CTS, DBuff, DlyCnt, PSTATE) begin
-- Default values
DCNRst <= '0';
DCNInc <= '0';
IBusy

<= '1';

TXD

<= '1';

-- State machine
case PSTATE is
-- Wait for send signal
when SREADY => IBusy <= '0';
if(Send = '1') then
NSTATE <= SLATCH;
else
NSTATE <= SREADY;
end if;
-- Latch the data
when SLATCH => NSTATE <= SCCTS;
-- Make sure the remote receiver is ready

30
when SCCTS

=> if(CTS = '0') then


DCNRst <= '1';
NSTATE <= SSTART;
end if;

-- Send the start bit


when SSTART => TXD <= '0';
if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD0;
else
DCNInc <= '1';
end if;
-- Send the data
when SD0

=> TXD <= DBuff(0);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD1;
else
DCNInc <= '1';
end if;

when SD1

=> TXD <= DBuff(1);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD2;
else
DCNInc <= '1';
end if;

when SD2

=> TXD <= DBuff(2);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD3;
else
DCNInc <= '1';
end if;

31
when SD3

=> TXD <= DBuff(3);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD4;
else
DCNInc <= '1';
end if;

when SD4

=> TXD <= DBuff(4);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD5;
else
DCNInc <= '1';
end if;

when SD5

=> TXD <= DBuff(5);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD6;
else
DCNInc <= '1';
end if;

when SD6

=> TXD <= DBuff(6);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SD7;
else
DCNInc <= '1';
end if;

when SD7

=> TXD <= DBuff(7);


if(DlyCnt = 15) then
DCNRst <= '1';
NSTATE <= SSTOP;
else
DCNInc <= '1';

32
end if;
-- Send the stop bit
when SSTOP

=> TXD <= '1';


if(DlyCnt = 15) then
NSTATE <= SREADY;
else
DCNInc <= '1';
end if;

-- Others, just go to the first state


when others => NSTATE <= SREADY;
end case;
end process;
Busy <= IBusy or CTS;
-- Main process (clocked)
process(En, ClkSX, DlyCnt, DCNRst, DCNInc, PSTATE,
NSTATE) begin
-- Reset
if(En = '0') then
-- Reset all
DlyCnt <= 0;
DBuff

<= (others => '0');

PSTATE <= SREADY;


elsif(ClkSX'event and ClkSX = '1') then
-- Do state specific operations
if(PSTATE = SLATCH) then
DBuff <= DIn;
end if;
-- Update state machine
PSTATE <= NSTATE;
-- Update DlyCnt
if(DCNRst = '1') then
DlyCnt <= 0;

33
elsif(DCNInc = '1') then
DlyCnt <= DlyCnt + 1;
end if;
end if;
end process;
end Behavioral;

Setelah merancang transmitter maka untuk selanjutnya akan dibahas sebuah serial
receiver module. Modul serial RX ini menerima masukan serial clock dengan frekuensi 16
kali dari baud rate yang diinginkan. Apabila dibutuhkan kecepatan transfer 2400 bps, maka
diperlukan clock dengan frekuensi 38400 Hz. Penggunaan serial clock dengan frekuensi 16
kali baud rate ini sesuai dengan standart UART pada umumnya. Modul RX ini dirancang
dengan menggunakan state machine dan memiliki bentuk simbolik dan timing diagram :

Gambar 14. Modul SerialRX

Fungsi pena-pena pada modul SerialRX diatas dapat dijelaskan sebagai berikut :
1. ClkSX

: pena masukan clock dengan frekuensi 16 x baud rate

2. Clear

: pena masukan sinyal clear yang akan mengosongkan keseluruhan buffer

3. Read

: pena masukan sinyal yang menyatakan bahwa data terlama telah dibaca

4. RXD

: pena masukan data serial

5. DOut

: pena keluaran data paralel

6. Strb

: pena keluaran yang menunjukkan bahwa ada data di buffer

7. RTS

: pena keluaran yang menyatakan bahwa modul masih dapat menerima data

Gambar 15. Timing diagram untuk modul SerialRX

34
Flowchart untuk modul adalah sebagai berikut :

Start (Reset)

RX = '0' ?
Y
Tunggu 20 clock
D0 = RX
Tunggu 16 clock
D1 = RX
Tunggu 16 clock
D2 = RX
Tunggu 16 clock
D3 = RX
Tunggu 16 clock
D4 = RX
Tunggu 16 clock
D5 = RX
Tunggu 16 clock
D6 = RX
Tunggu 16 clock
D7 = RX
Tunggu 16 clock

RX = '1' ?

Simpan ke buffer

T
T

RX = '1' ?

Gambar 16. Flowchart proses membaca data serial pada modul SerialRX

Modul ini dirancang dengan memiliki buffer data sebesar 4 byte. Selama data yang
berada pada buffer masih kurang dari 2 byte maka modul ini akan mengirim sinyal siap
menerima data selanjutnya (RTS = 0). Apabila data pada buffer sudah mencapai atau lebih
dari 2 byte maka modul ini akan menyatakan sudah penuh (RTS = 1). Ini diperlukan agar
modul tidak kehilangan data karena seluruh buffer sudah terisi dan PC masih terus mengirim
data. Dengan memperhatikan gambar 14 dan gambar 16, maka implementasi dalam VHDL :

35
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity SerialRX is
port(ClkSX : in

std_logic;

-- Clock input (16 x baud)

RXD

: in

std_logic;

-- Serial data input

Read

: in

std_logic;

-- Read 1 byte signal

Clear : in

std_logic;

-- Clear all bytes signal

Strb

: out std_logic;

-- Data available signal

DOut

: out std_logic_vector(7 downto 0);


-- Data output

RTS

: out std_logic);
-- RTS handshake signal (inv)

end SerialRX;
architecture Behavioral of SerialRX is
-- Internal signals
type

STATE_TYPE is (SWAIT, SWAITD, SD0, SD0D, SD1,


SD1D, SD2, SD2D, SD3, SD3D, SD4,
SD4D, SD5, SD5D, SD6, SD6D, SD7,
SD7D, SSTOP, SSTOPD, SLATCH);

signal PSTATE : STATE_TYPE; -- Present state


signal NSTATE : STATE_TYPE; -- Next state
signal DBuffT : std_logic_vector(7 downto 0);
-- Tmp data buffer
signal DBuff0 : std_logic_vector(7 downto 0);
-- Data buffer 1
signal DBuff1 : std_logic_vector(7 downto 0);
-- Data buffer 2
signal DBuff2 : std_logic_vector(7 downto 0);
-- Data buffer 3
signal DBuff3 : std_logic_vector(7 downto 0);
-- Data buffer 4
signal DBPos

: integer range 0 to 3;

36
-- Data buffer position
signal DlyCnt : integer range 0 to 31; -- Delay counter
signal DCNRst : std_logic;

-- Reset DlyCnt to zero

signal DCNInc : std_logic;

-- Increment DlyCnt

signal FRead

-- Read flag

: std_logic;

begin
-- Main process (combinatorial)
process(RXD, Read, FRead, DBuffT, DlyCnt, PSTATE) begin
-- Default values
DCNRst <= '0';
DCNInc <= '0';
-- State machine
case PSTATE is
-- Wait for incoming start bit
when SWAIT

=> DCNRst <= '1';


if(RXD = '0') then
NSTATE <= SWAITD;
else
NSTATE <= SWAIT;
end if;

when SWAITD => if(DlyCnt = 19) then


NSTATE <= SD0;
else
DCNInc <= '1';
end if;
-- Get D0
when SD0

=> DCNRst <= '1';


NSTATE <= SD0D;

when SD0D

=> if(DlyCnt = 15) then


NSTATE <= SD1;
else
DCNInc <= '1';
end if;

37
-- Get D1
when SD1

=> DCNRst <= '1';


NSTATE <= SD1D;

when SD1D

=> if(DlyCnt = 15) then


NSTATE <= SD2;
else
DCNInc <= '1';
end if;

-- Get D2
when SD2

=> DCNRst <= '1';


NSTATE <= SD2D;

when SD2D

=> if(DlyCnt = 15) then


NSTATE <= SD3;
else
DCNInc <= '1';
end if;

-- Get D3
when SD3

=> DCNRst <= '1';


NSTATE <= SD3D;

when SD3D

=> if(DlyCnt = 15) then


NSTATE <= SD4;
else
DCNInc <= '1';
end if;

-- Get D4
when SD4

=> DCNRst <= '1';


NSTATE <= SD4D;

when SD4D

=> if(DlyCnt = 15) then


NSTATE <= SD5;
else
DCNInc <= '1';
end if;

38
-- Get D5
when SD5

=> DCNRst <= '1';


NSTATE <= SD5D;

when SD5D

=> if(DlyCnt = 15) then


NSTATE <= SD6;
else
DCNInc <= '1';
end if;

-- Get D6
when SD6

=> DCNRst <= '1';


NSTATE <= SD6D;

when SD6D

=> if(DlyCnt = 15) then


NSTATE <= SD7;
else
DCNInc <= '1';
end if;

-- Get D7
when SD7

=> DCNRst <= '1';


NSTATE <= SD7D;

when SD7D

=> if(DlyCnt = 15) then


NSTATE <= SSTOP;
else
DCNInc <= '1';
end if;

-- Check the stop bit


when SSTOP

=> if(RXD = '1') then


NSTATE <= SLATCH;
else
NSTATE <= SSTOPD;
end if;

when SSTOPD => if(RXD = '1') then


NSTATE <= SWAIT;
end if;

39
-- Latch the data
when SLATCH => if(Read = '0' or FRead = '1') then
NSTATE <= SWAIT;
end if;
-- Others, just go to the first state
when others => NSTATE <= SWAIT;
end case;
end process;
-- Main process (clocked)
process(ClkSX, RXD, Clear, DlyCnt, DCNRst, DCNInc,
PSTATE, NSTATE) begin
-- Clear signal
if(Clear = '1') then
-- Reset all
DlyCnt <= 0;
PSTATE <= SWAIT;
elsif(ClkSX'event and ClkSX = '1') then
-- Do state specific operations
case PSTATE is
when SD0

=> DBuffT(0) <= RXD;

when SD1

=> DBuffT(1) <= RXD;

when SD2

=> DBuffT(2) <= RXD;

when SD3

=> DBuffT(3) <= RXD;

when SD4

=> DBuffT(4) <= RXD;

when SD5

=> DBuffT(5) <= RXD;

when SD6

=> DBuffT(6) <= RXD;

when SD7

=> DBuffT(7) <= RXD;

when others => null;


end case;
-- Update state machine
PSTATE <= NSTATE;

40
-- Update DlyCnt
if(DCNRst = '1') then
DlyCnt <= 0;
elsif(DCNInc = '1') then
DlyCnt <= DlyCnt + 1;
end if;
end if;
end process;
-- Data latch process
process(ClkSX, Read, FRead, Clear, DBuffT, DBuff0,
DBuff1, DBuff2, DBuff3, DBPos, PSTATE)
-- Clear
if(Clear = '1') then
-- Reset all
DBuff0 <= (others => '0');
DBuff1 <= (others => '0');
DBuff2 <= (others => '0');
DBuff3 <= (others => '0');
DBPos

<= 0;

FRead

<= '0';

elsif(ClkSX'event and ClkSX = '1') then


-- Flush 1 byte
if(Read = '1' and FRead = '0') then
if(DBPos > 0) then
DBuff0 <= DBuff1;
DBuff1 <= DBuff2;
DBuff2 <= DBuff3;
DBPos

<= DBPos - 1;

FRead

<= '1';

end if;
end if;
if(Read = '0') then
FRead <= '0';

begin

41
end if;
-- Latch the data
if(PSTATE = SLATCH and (Read = '0' or FRead = '1'))
then
case DBPos is
when 0

=> DBuff0 <= DBuffT;

when 1

=> DBuff1 <= DBuffT;

when 2

=> DBuff2 <= DBuffT;

when 3

=> DBuff3 <= DBuffT;

when others => null;


end case;
DBPos <= DBPos + 1;
end if;
end if;
end process;
-- Data output control
process(Clear, DBuff0, DBuffT, DBPos, PSTATE) begin
if(Clear = '1') then
Strb <= '0';
RTS

<= '1';

else
if(PSTATE /= SLATCH and DBPos > 0) then
Strb <= '1';
else
Strb <= '0';
end if;
if(DBPos < 2) then
RTS <= '0';
else
RTS <= '1';
end if;
end if;
DOut <= DBuff0;

42
end process;
end Behavioral;

VII. Daftar Pustaka

---, 1996, EVITA : Enhanced VHDL Tutorial with Applications, Aldec (www.aldec.com).

Skahill, Kevin & March, 1996, VHDL for Programmble Logic, Cypress Semiconductor,
Sunnyvale, California Addison-Wesley Publishing, Inc.