Site icon ndoWare

FUNCTION dalam VHDL

FUNCTION dan PROCEDURES seringkali dikategorikan sebagai sebuah subprogram. Bila dilihat dari bentuknya, baik function maupun procedures hampir mirip dengan PROCESS. Persamaan ketiganya adalah merupakan potongan kode VHDL dan juga ketiganya mengandung beberapa pernyataan sekuensial (misal if, case, loop). Walaupun sepintas hampir mirip, procedures dan function memiliki perbedaan dengan process. Sebuah process pada umumnya digunakan secara langsung dalam kode utamanya. Sedangkan procedures dan function, berdasarkan tempatnya di dalam lokasi LIBRARY, merupakan potongan kode tersendiri sehingga dapat digunakan lagi atau dibagi-bagi (share) untuk project lain. Walaupun demikan, jika dibutuhkan, sebuah function atau procedures dapat juga ditempatkan sebagai kode utama.

Function
Function adalah sebuah bagian potongan dari kode sekuensial. Sebuah function dibuat dengan tujuan membuat sebuah bundel atau berkas yang baru sebagai penyelesaian masalah, seperti perubahan tipe data, operasi logika, perhitungan artimetika, dan operator baru beserta perubahannya. Bila menulis kode dalam bentuk function, maka kode tersebut akan dapat dibagi-bagikan dan juga digunakan lagi untuk project lain. Selain itu, kode tersebut akan jauh lebih singkat dan lebih mudah untuk dipahami.
Seperti yang telah dicontohkan, sebuah function mirip dengan process. Pernyataan yang sama (misal if, wait, case, dan loop) dapat digunakan untuk function, kecuali untuk wait. Selain wait, hal lain yang tidak boleh digunakan dalam sebuah function adalah deklarasi signal dan inisiasi component. Untuk meyusun dan menggunakan function, perlu diperhatikan dua hal yang penting yakni deklarasi function itu sendiri dan cara pemanggilan function tersebut. Syntaxnya ditunjukkan sebagai berikut :

Dari syntax di atas, <parameter list> merupakan masukan parameter khusus bagi sebuah function. Misalnya :

<parameter list> = [constant] constant_name: constant_type; // parameternya berupa constant

<parameter list> = SIGNAL signal_name:signal_type ;  // parameternya berupa signal

Seperti yang diketahui, semua angka bisa dijadikan parameter (termasuk 0). Selain itu, <parameter list> seperti yang ditunjukkan di atas hanya berupa constant (default) atau signal (sedangkan variable tidak diijinkan). Tipe-tipe <parameter list> tersebut merupakan tipe data synthesizable. Di sisi lain, hanya ada sebuah nilai kembalian, yakni tipe yang dikhususkan untuk jenis data_type. Sedangkan function dapat dipanggil dengan hanya mendeklarasikan nama function tersebut.

Function Location

Sebuah function (atau procedures) biasanya ditempatkan seperti gambar di atas. Pertama, sebuah function ditempatkan pada sebuah package (sebagai kode yang dapat dibagi-bagi, penggunaan ulang kode). Selain itu, juga dapat ditempatkan pada kode utama (di dalam architecture atau di dalam entity). Ketika ditempatkan dalam sebuah package, maka package body dibutuhkan, yang haruslah berisi tiap-tiap function (atau procedures) yang dideklarasikan sebagai bagian dari package. Perbandingan penempatan sebuah function sebagai bagian dari package atau sebagai kode utama dapat dicontohkan berikut :

  1. Function yang diletakkan sebagai kode utama.

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY dff IS

PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC);

END dff;

ARCHITECTURE my_arch OF dff IS

——————————————

FUNCTION positive_edge(SIGNAL s: STD_LOGIC)  // tempat function sebagai kode utama disisipkan

RETURN BOOLEAN IS

BEGIN

RETURN s’EVENT AND s=’1′;

END positive_edge;

——————————————

BEGIN

PROCESS (clk, rst)

BEGIN

IF (rst=’1′) THEN q <= ‘0’;

ELSIF positive_edge(clk) THEN q <= d; // pemanggilan function (positive_edge)

END IF;

END PROCESS;

END my_arch;

  1. Fungsi yang diletakkan pada sebuah packages

——- Package: —————————–  // penyusunan package //

LIBRARY ieee;

USE ieee.std_logic_1164.all;

———————————————-

PACKAGE my_package IS

FUNCTION positive_edge(SIGNAL s: STD_LOGIC) RETURN BOOLEAN; // penyusunan function dalam package //

END my_package;

———————————————-

PACKAGE BODY my_package IS

FUNCTION positive_edge(SIGNAL s: STD_LOGIC)

RETURN BOOLEAN IS

BEGIN

RETURN s’EVENT AND s=’1′;

END positive_edge;

END my_package;

———————————————-

—— Main code: —————————-

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE work.my_package.all;

———————————————-

ENTITY dff IS

PORT ( d, clk, rst: IN STD_LOGIC;  q: OUT STD_LOGIC);

END dff;

———————————————-

ARCHITECTURE my_arch OF dff IS

BEGIN

PROCESS (clk, rst)

BEGIN

IF (rst=’1′) THEN q <= ‘0’;

ELSIF positive_edge(clk) THEN q <= d; // pemanggilan function dalam package

END IF;

END PROCESS;

END my_arch;

Referensi :

Exit mobile version