Ir. Djogi Lubis M.A.P FTIK-UHT VHDL-Sederhana Referensi I. PRIMARY DESIGN UNIT MODEL STRUCTURE 1. Struktur Model Unit Rancangan Utama Setiap unit rancangan VHDL terdiri dari suatu deklarasi “entity” dan satu atau lebih “architectures”. Setiap architecture mendifinisikan implementasi atau model yang berbeda dari suatu unit rancangan yang diberikan. Difinisi entity menetapkan semua masukan ke, dan keluaran dari modul, dan setiap “generic” parameter yang digunakan oleh implementasi yang berbeda dari suatu modul.
2. Entity Declaration Format entity name is port( port definition list );-- input/output signal ports generic( generic list); -- optional generic list end name;
Format deklarasi port: port_name: mode data_type; Mode dari suatu port menentukan arah dari sinyal-sinyal pada port tersebut, menggunakan salah satu dari mode sbb; in, out, buffer, atau inout.
Mode dari port: in port dapat dibaca tetapi tidak dapat diperbaharui (updated) dari dalam modul, membawa informasi kedalam modul. (suatu in port tidak dapat muncul pada sebelah kiri dari suatu signal assignment) out port dapat diperbaharui tetapi tidak dapat dibaca dari dalam modul, membawa informasi keluar modul. (suatu out port tidak dapat muncul disebelah kanan dari signal assignment) buffer port Membawa informasi keluar dari modul, dapat dibaca dan diperbaharui dari dalam modul. inout port Saluran dua arah, dapat diperbaharui serta dibaca dari dalam modul, dan memungkinkan penggunaan sumber multi update. Catatan: buffer hanya sebagai suatu output port saja, hanya dapat digerakkan dari dalam modul, sedang inout benar-benar dua arah dengan penggerak (driver) dari dalam dan luar modul Contoh
1
entity counter is port (Incr, Load, Clock: in bit; Carry: out bit; Data_Out: buffer bit_vector(7 downto 0); Data_In: in bit_vector(7 downto 0)); end counter; Generics memungkinkan informasi static dikomunikasikan ke suatu block dilingkungannya ke-semua architecture yang berada dalam satu unit desain. Dalam hal ini termasuk timing information (setup, hold, delay times), part sizes, dan parameterparameter lainnya. Contoh; entity and_gate is port(a,b: in bit; c: out bit); generic (gate_delay: time := 5ns); end and_gate;
3. Architecture Suatu architecture mendifinisikan satu implementasi khusus pada suatu unit desain, kebeberapa bentuk abstraksi.
architecture arch_name of entity_name is ... declarations ... begin ... concurrent statements ... end Declarations mencakup data types, signals, files, components, attributes, subprogram, dan informasi lain yang digunakan untuk diskripsi implementasinya. Concurrent statements menggambarkan suatu unit desain dengan satu atau lebih bentuk abstraksi permodelan, termasuk dataflow, structure, dan / atau behavior. Behavioral Model: dalam bentuk ini tidak ada struktur atau teknologi yang diimplementasikan. Biasanya dituliskan dalam bentuk sequential, atau prosedural. Dataflow Model: menggambarkan semua bentuk aliran data, berikut dengan semua sinyal-sinyal pengontrolnya. Structural Model: sesuai dengan interkoneksi dari komponen-komponen.
II. VHDL PACKAGES Package dalam VHDL berisi subprogram, difinisi konstanta, dan/ atau difinisi type yang digunakan dan yang ada dalam satu atau lebih unit-unit desain. Tiap package berisi suatu “bagian deklarasi (declaration section)”, dan di dalam itu dideklarasikan subprograms (exportable), constants, dan types yang tersedia, serta suatu “package body”, dimana di-dalamnya didifinisikan implementasi subprogram, berikut dengan constants dan types yang digunakan secara internal. Bagian dekalarasi akan merepresentasikan suatu bagian dari package yang “visible” untuk user dari package
2
tersebut atau yang menggunakannya. Implementasi yang sesungguhnya dari subroutines dalam package umumnya tidak terlalu menarik bagi users dari subroutine tersebut.
Declaration and Libraries 1. Format deklarasi Package package package_name is ... exported constant declarations ... exported type declarations ... exported subprogram declarations end package_name; Contoh: package ee530 is constant maxint: integer := 16#ffff#; type arith_mode_type is (signed, unsigned); function minimum(constant a,b: in integer) return integer; end ee530; 2.
Format body dari Package
package body package_name is ... exported subprogram bodies ... other internally-used declarations end package_name; Contoh: package body ee530 is function minimum (constant a,b: integer) return integer is variable c: integer; -- local variable begin if a < b then c := a; -- a is min else c := b; -- b is min end if; return c; -- return min value end; end ee530;
Package Visibility: Untuk membuat semua item dari package “visible” untuk suatu unit desain, selalu didahului dengan “use” statement pada suatu unit desain.
Contoh:
use library_name.package_name.all
3
“use” statement dapat mendahului suatu deklarasi dari setiap entity atau architecture yang digunakan dalam package. Jika “use” statement mendahului deklarasi entity, package menjadi visible juga untuk architecture yang bersangkutan. User-Developed Packages Untuk meng-compile user-developed packages yang ada dalam library kerja yang digunakan saat itu: use package_name.all; Catatan:
dalam library kerja yang digunakan saat itu adalah, ‘std’ dan ‘work’, merupakan dua default libraries. The VHDL ‘library’ statement dibutuhkan untuk membuat ‘ieee’ library dan / atau suatu libraries tambahan menjadi visible.
Contoh:
library lib_name; use lib_name.pkg_name.all;
-- make library visible -- make package visible
VHDL Standard Packages STANDARD - basic type declarations (always visible by default) TEXTIO - ASCII input/output data types and subprograms Untuk membuat TEXTIO visible:
use std.textio.all;
IEEE Standard 1164 Package Package ini berada di dalam ‘ieee’ library untuk mendukung multi-valued sinyalsinyal logika dengan type declaration dan functions. Untuk membuatnya visible: library ieee; -- VHDL Library stmt use ieee.std_logic_1164.all; Special 12-valued data types/functions to interface with QuickSim II and schematic diagrams. library mgc_portable; -- Special Mentor Graphics Library use mgc_portable.qsim_logic.all; -- Quicksim portable data types
VHDL IDENTIFIERS, NUMBERS, STRINGS, AND EXPRESSIONS Identifiers. Identifiers dalam VHDL harus dimulai dengan huruf, dan dapat berisi kombinasi dari huruf, digits, dan underscores. Catatan, secara internal VHDL meng-konversi semua karakter kebentuk huruf besar (Upper-Case) Contoh:
4
Memory1, Adder_Module, Bus_16_Bit
Numeric Constants. Numeric constants dapat didifinisikan dan dapat digunakan untuk setiap base (default pada decimal). Angka dapat disertakan dengan underscores untuk memperjelas pembacaan. Format: base#digits# -- base-nya harus bilangan decimal Contoh 16#9fba# 2#1111_1101_1011# 16#f.1f#E+2
(hexadecimal) (binary) (floating-point, exponent is decimal)
Bit String Literals Bit vector constants dispesifikasikan sebagai literal strings. Contoh x"ffe" (12-bit hexadecimal value) o"777" (9-bit octal value) b"1111_1101_1101" (12-bit binary value)
Arithmetic and Logical Expressions Ekspresi dalam VHDL sama dengan kebanyakan bahasa tingkat-tinggi lainnya. Elemen-elemen data harus dalam bentuk type, atau subtypes dari base type yang sama. Operatornya antara lain sbb: • • • •
Logical: and, or, nand, nor, xor, not (for boolean or bit ops) Relational: =, /=, <, <=, >, >= Arithmetic: +, -, *, /, mod, rem, **, abs (a mod b takes sign of b, a rem b takes sign of a) Concatenate: & (jalinan) (ex. a & b makes one array)
Contoh a <= b nand c; d := g1 * g2 / 3; Bus_16 <= Bus1_8 & Bus2_8;
VHDL DATA TYPES Setiap objek-objek VHDL harus diklasifikasikan sebagai suatu data type yang spesifik. VHDL meliputi suatu bilangan dari data types yang sudah terdifinisi sebelumnya, namun bila diperlukan masih memungkinkan bagi users untuk mendifinisikan data type lain.
5
Predefined Scalar Data Types (single objects) VHDL Standard: • bit values: '0', '1' • boolean values: TRUE, FALSE • integer values: -(231) to +(231 - 1) {SUN Limit} • natural values: 0 to integer'high (subtype of integer) • positive values: 1 to integer'high (subtype of integer) • character values: ASCII characters (eg. 'A') • time values include units (eg. 10ns, 20us) IEEE Standard 1164 (package ieee.std_logic_1164.all) • std_ulogic values: 'U','X','1','0','Z','W','H','L','-' 'U' = uninitialized, 'X' = unknown, 'W' = weak 'X', 'Z' = floating, 'H'/'L' = weak '1'/'0', '-' = don't care • std_logic resolved "std_ulogic" values • X01 subtype {'X','0','1'} of std_ulogic • X01Z subtype {'X','0','1','Z'} of std_ulogic • UX01 subtype {'U','X','0','1'} of std_ulogic • UX01Z subtype {'U','X','0','1','Z'} of std_ulogic
Predefined VHDL Aggregate Data Types • bit_vector array (natural range <>) of bit • string array (natural range <>) of char • text file of "string"
IEEE Standard 1164 Aggregate Data Types (From package: ieee.std_logic_1164.all) • std_ulogic_vector array (natural range <>) of std_ulogic • std_logic_vector array (natural range <>) of std_logic
Contoh
signal dbus: bit_vector(15 downto 0); dbus (7 downto 4) <= "0000"; (4-bit slice of dbus) signal cnt: std_ulogic_vector(1 to 3); variable message: string(0 to 20);
User-Defined Enumeration Types Suatu enumerated data type dapat dibuat sendiri dengan daftar nilai-nilai yang memunginkan untuk digunakan (diperbolehkan). Contoh type opcodes is (add, sub, jump, call); signal instruc: opcodes; ... if instruc = add then ...
-- Type with 4 values -- Signal of this type
-- test for value 'add'
Other user-defined types (tipe-tipe lain yang didifinisikan oleh user) Custom data types dapat mencakup arrays, constrained dan unconstrained, serta record structures. • Constrained array: Menspesifikasikan indeks atas dan bawah.
6
Example type word is array (0 to 15) of bit; •
Unconstrained array: pemberian indeks dispesifikasikan ketika suatu sinyal atau variable dari type dideklarasikan. Contoh
type memory is array (integer range <>) of bit_vector(0 to 7); -- a type which is an arbitrary-sized array of 8-bit vectors variable memory256: memory(0 to 255); -- a 256-byte memory array variable stack: memory(15 downto 0); -- a 16-byte memory array •
Subtype: suatu subset di[pilih dari nilai-nilai type yang diberikan. Elemenelemen subtypes yang berbeda dan mempunyai base type yang sama dapat dikombinasikan dalam berbagai ekspresi (elemen-elemen yang berbeda tidak dapat dikombinasikan). Subtypes dapat digunakan untuk mendeteksi out-ofrange values pada saat simulasi. Contoh subtype byte_signed is integer range -128 to 127; subtype byte_unsigned is integer range 0 to 255;
Aliases “alias” digunakan untuk mendifinisikan suatu pergantian nama dari suatu signal atau bagian dari signal. Aliases sering digunakan sebagai referensi dalam memilih potongan-potongan suatu bit-vector. Contoh. signal instruction: bit_vector(31 downto 0); alias opcode: bit_vector(6 downto 0) is instruction(31 downto 25); ... opcode <= "1010101"; -- Set the opcode part of an instruction code
VHDL OBJECTS: CONSTANTS, VARIABLES, AND SIGNALS Constants Suatu constant berkaitan dengan suatu nilai untuk suatu symbol dari data type yang ada. Penggunaan constants dapat mempermudah pembacaan dari VHDL code dan menekan kesalahan yang sederhana. Deklarasi dari syntax-nya sbb: constant symbol: type := value; Contoh constant constant
Vcc: signal:= '1'; --logic 1 constant zero4: bit_vector(0 to 3) := ('0','0','0','0');
7
Variables Variabel dideklarasikan di-dalam suatu blocks, process, procedure, atau function, dan diperbaharui segera ketika assignment statement dieksekusi. Suatu variable dapat berupa scalar atau aggregate data type, dan digunakan terutama dalam diskripsi behavioral. Secara optional dapat di assign nilai-nilai awal (dilakukan hanya sekali saat mengawali simulasi). Syntax dari deklarasinya sbb: variable symbol: type [:= initial_value]; Contoh process variable variable begin ... count := rega := ... end;
count: integer := 0; rega: bit_vector(7 downto 0); 7; -- assign values to variables x"01";
Signals Signal adalah suatu object dengan suatu histori dari nilai-nilai (terkait dengan waktu – waktu ‘event”, atau waktu saat mana nilai sinyal berubah) Signals dideklarasikan memalui signal declaration statement atau entity port definitions, dan mungkin saja pada setiap data type. Syntax deklarasinya sbb: signal sig_name: data_type [:=initial_value]; Contoh signal signal signal signal
clock: bit; GND: bit := '0'; databus: std_ulogic_vector(15 downto 0); addrbus: std_logic_vector(0 to 31);
setiap signal mempunyai satu atau lebih “penggerak” (drivers) yang menentukan perubahan nilai dan timing dari signal. Setiap penggerak merupakan urutan dari beberapa kejadian (events) yang menunjukkan kapan dan berapa besar signal harus berubah. Masing-masing signal assignment menghasilkan kejadian yang berkaitan dengan urutan yang disesuaikan dengan schedule dari event yang baru. signal 10ns 20ns Event Times
line x '0' Driver of '1' signal x Values
8
Catatan: jika tidak ada delay yang dispesifikasikan, signal event saat itu di-schedulekan untuk ”delta” delay yang sangat kecil. Perubahan signal akan terjadi pada siklus simulai berikutnya. Contoh. (Misalkan current time is T)
clock <= not clock after 10ns; -- change at T + 10ns databus <= mem1 and mem2 after delay; -- change at T + delay x <= '1'; -- change to '1' at time T + "delta";
Model dari elemen delay dapat dispesifikasikan dengan “inertial” atau “transport”. Inertial delay berarti sesuai default, dan dalam banyak hal sering digunakan. • Inertial delay: Suatu urutan kejadian pada kejadian yang sudah ter-schedule dengan waktu T secara otomatis meng-cancels setiap kejadian dalam jadwal urutan untuk muncul lebih dahulu dari waktu T, misalnya setiap kejadian yang lebih pendek dari waktu delay akan ditekan. • Transport delay: event baru dengan mudah disisipkan dalam urutan event, misalnya behavior sebagai suatu delay line. Keyword transport digunakan untuk menunjukkan transport delay. Contoh B <= A after 5ns; -- inertial delay C <= transport A after 5 ns; -- transport delay 5______15 17_________30 A _______| |_| |_____________ ____________________ B ___________| |_________(Inertial Delay) _______ __________ C ___________| |_| |_______ (Transport Delay) 10 20 22 35
Bila ada multi drivers untuk satu signal, suatu “resolution function” harus digunakan untuk menentukan nilai yang akan di-assigned ke signal dari nilai-nilai yang diberi oleh multi drivers. Hal ini memungkinkannya simulasi dari banyak buses dengan multi sources/drivers. Catatan: tipe-tipe std_logic dan std_logic_vector dari ieee library sudah mempunyai pradifinisi resolution function. Contoh: signal data_line: std_logic; begin block1: data_line <= '1'; -- one driver ... block2: data_line <= 'Z'; -- 2nd driver
9
hasilnya adalah ‘1’ karena ‘1’ menindas (overrides) nilai ‘Z’ yang mengambang (floating). Untuk dua nilai ‘1’ dan ‘0’, hasilnya adalah ‘X’, yang menunjukkan hasil yang tidak dikenal (unknown result).
CONCURRENT STATEMENTS Terdiri dari statements: 1) Signal Assignment 2) Process Statement 3) Block Statement 4) Procedure Statement 5) Component Instantiation 6) Concurrent Assertion 7) Generate Statement Concurent statement sudah termasuk di dalam difinisi architecture dan di dalam “block” statements, yang merepresentasikan concurrent behavior di dalam unit rancangan yang dimodelkan. Statement ini dieksekusi secara asinkron, tanpa suatu perintah yang terdifinisi, memodelkan behavior dari elemen perangkat keras yang independent di dalam suatu system.
1). Concurrent Signal Assignment Merupakan suatu signal assignment statement yang merepresentasikan suatu proses yang menetapkan nilai untuk signals. Ada tiga format dasar sbb: 1. A <= B; A <= B when condition1 else C when condition2 else D when 2.
condition3 else E; with expression select A <= B when choice1, C when choice2, D when choice3, E when others;
Bentuk gelombang atau pasangan time-value dapat dispesifikasikan untuk masingmasing pernyataan diatas sbb: Contoh A <= B after 10ns when condition1 else C after 12ns when condition2 else D after 11ns; -- 4-input multiplexer with Choice select Out <= In0 after In1 after In2 after In3 after -- 2-to-4 decoder Y <= "0001" after "0010" after "0100" after "1000" after
(Choice is a 2-bit vector) 2ns 2ns 2ns 2ns
when when when when
(Y = 4-bit 2ns when A 2ns when A 2ns when A 2ns ;
"00", "01", "10", "11";
and A = 2-bit vectors) = "00" else = "01" else = "10" else
-- Tri-state driver: (Y is logic4; X is bit_vector) Y <= '0' after 1ns when En = '1' and X = '0' else
10
'1' after 1ns when En = '1' and X = '1' else 'Z' after 1ns; -- A is a 16-bit vector A <= (others => '0'); -- set all bits of A to '0'
Keyword “others” pada contoh terakhir menyatakan nilai A yang tidak dinyatakan secara eksplisit dalam daftar diatas diberi nilai ‘0’
2). Process Statement Suatu proses sekuensial yang independent untuk menyatakan suatu behavior dari beberapa bagian dari suatu rancangan. Body dari proses adalah suatu daftar dari sequential statements. Syntax: label: process (sensitivity list) ... local declarations ... begin ... sequential statements ... end process label; Contoh; DFF: process (clock) begin if clock = '1' then Q <= D after 5ns; QN <= not D after 5ns; end if; end process DFF; Sequential statement dalam proses dieksekusi mengikuti perintah, dimulai pada awal dari simulasi. Setelah statement terakhir dari suatu proses dieksekusi, proses diulangi lagi dari statement awal, dan berulang sampai selesai. Jika diberi optional sensitivity, seperti wait on …. statement yang disisipkan setelah sequential statement terakhir , akan menyebabkan proses berhenti pada titik tersebut sampai ada event pada satu dari sinyal-sinyal yang ada dalam daftar, dimana time processing menyimpulkan berdasarkan statement awal dalam proses.
3). Block Statement Suatu block adalah suatu kelompok dari concurrent statement terkait yang dapat digunakan dalam merepresentasikan rancangan dalam bentuk herarki. Syntax: label: block (guard expression) ... local declarations ... begin ... concurrent statements ... end block label; Bila diberi suatu guard expression, “guarded” adalah suatu variable Boolean GUARD secara otomatis terdifinisikan dan menetapkan nilai Boolean dari suatu ekspresi 11
guard. GUARD kemudian dapat di test dalam block, pelaksanan signal assignment yang dipilih atau statement lain, hanya jika hasil evaluasi kondisi guard adalah TRUE. Contoh. '1'
-- D Latch: Transfer D input to Q output when Enable = block (Enable = '1') begin Q <= guarded D after 5ns; end block; -- D Flip-flop: Transfer D to Q on falling edge of Clock block (Clock'EVENT and Clock = '0') begin Q <= guarded D after 5ns; end block; -- Tristate driver with input B and output A block (Enable = '1') begin A <= B when GUARD = '1' else 'Z'; end block;
Dalam contoh terakhir, B di-assign ke signal A hanya jika GUARD adalah TRUE, dengan implikasi Enable = ‘1’
4). Concurrent Procedure Call Secara eksternal mendifinisikan procedure/subroutine yang dapat dipanggil, dengan parameter-parameter yang dilewatkan padanya sesuai kepentingannya. Ini memberikan fungsi yang sama dan memiliki cara-cara yang serupa seperti suatu “process” statement, dimana setiap signals dalam sekumpulan parameter yang dilewatkan membentuk suatu sensitivity list. Contoh. ReadMemory (DataIn, DataOut, RW, Clk); (where the ReadMemory procedure is defined elsewhere)
5). Component instantiation Instantiates pradifinisi komponen-komponen dalam suatu rancangan architecture. Setiap komponen pertama kali didifinisikan dalam bagian deklarasi dari architecture, dan kemudian “instantiated” sekali atau beberapa kali di dalam body dari architecture. •
Dalam bagian dekalarasi: daftar dari “component declaration” dan satu atau lebih “configuration specification” . Suatu “component declaration” , mendifinisikan component interface, yang mana ada hubungannya dengan komponen-komponen entity declaration. Hal ini memungkinkan VHDL compiler mengecek kompatibilitas dari signal. Contoh. component adder port(a,b: in bit_vector(7 downto 0); s: out bit_vector(7 downto 0); cin: in bit; cout: out bit); 12
end component; •
Suatu “configuration specification” mengindentifikasikan spesifikasi dari architecture yang digunakan oleh masing-masng instance dari komponen. (dapat juga berbentuk multiple architecture untuk komponen yang ada). Contoh. for ALL: comp1 use entity work.comp1 (equations); for ADDER1: adder use entity work.adder (equations); for ADDER2: adder use entity work.adder (dataflow);
Dari ketiga contoh, prefix work, menunjukkan bahwa working library yang berjalan berisi model-model komponen yang ditunjuk. Pada contoh pertama, architecture equations dari entity comp1 digunakan untuk semua instances dari comp1. Pada contoh lainnya, architecture equations digunakan untuk instance ADDER1 dari komponen adder, dan architecture dataflow digunakan untuk instance ADDER2 dari komponen adder. Component Instantiation: Setiap instance dari komponen-komponen yang dideklarasikan didaftar, diberi nama, dan signals actual dihubungkan ke port tersebut sbb: instance_name: component_name port map (port list);
Port list dapat menggunakan salah satu dari dua format dibawah ini. (1) "Positional association": signals dihububgkan ke port berdasarkan atas dasar daftar perintah dalam deklarasi komponen. Ex. A1: adder port map (v,w,x,y,z) • v,w, and y must be bit_vectors, y and z bits (2) "Named association": each signal-to-port connection is listed explicitly as "signal=>port". Contoh. A1: adder port map(a=>v, b=>w, s=>y, cin->x, cout->z);
(Perintah signal tidak penting dalam format ini) Contoh. architecture r1 of register is component jkff port(J,K,CLK: in bit; Q,QN: out bit); end component; for ALL: jkff use entity work.jkff (equations); -- Use architecture equations of entity jkff for all instances component dff port(D,CLK: in bit; Q,QN: out bit); end component; for DFF1: dff use entity work.dff (equations); for DFF2: dff use entity work.dff (circuit); --Use different architectures of dff for instances DFF1 and DFF2
13
begin JKFF1: JKFF2: DFF1: DFF2: end.
jkff jkff dff dff
port port port port
map map map map
(j1,k1,clk,q1,qn1); (j2,k1,clk,q2,qn2); (d1,clk,q4,qn4); (d2,clk,q5,qn5);
6). Concurrent assertion Suatu concurrent assertion statement untuk mengecek kondisi (munculnya suatu event) dan issues suatu report jika kondisinya not true. Ini dapat digunakan untuk mengecek timing violations, illegal conditions, etc. Suatu pilihan severity level dapat dilaporkan untuk menunjukkan secara alamiah kondisi yang terdeteksi.
Syntax:
assert
(clear /= '1') or (preset /= '1')
report "Both preset and clear are set!"
severity warning;
7). Generate statement Generate statement adalah suatu iterasi atau elaborasi kondisional dari suatu diskripsi. Ini memberikan suatu cara yang compact untuk merepresentasikan apa yang biasanya menjadi suatu kelompok statements Contoh. Generate a 4-bit full adder from 1-bit full_adder stages: add_label: -- Note that a label is required here for i in 4 downto 1 generate FA: full_adder port map(C(i-1), A(i), B(i), C(i), Sum(i)); end generate;
The resulting code would look like: FA4: FA3: FA2: FA1:
full_adder full_adder full_adder full_adder
port port port port
map(C(3), map(C(2), map(C(1), map(C(0),
A(4), A(3), A(2), A(1),
B(4), B(3), B(2), B(1),
C(4), C(3), C(2), C(1),
Sum(4)); Sum(3)); Sum(2)); Sum(1));
SEQUENTIAL STATEMENTS Terdiri dari statements: 1) 2) 3) 4) 5) 6) 7) 8)
Wait Statement Signal Assignment Staetement Variable Assignment Staetement Procedure Call Conditional Statements Loop Statements Procedure Statement Function Statement
Sequential Statements digunakan untuk mendifinisikan algoritma dalam mengekspresikan behavior dari design entity. Statement ini dimunculkan dalam process statement dan dalam subprograms (fungsi dan prosedur). 14
1). Wait statement Penundaan eksekusi dari process/subprogram sampai ada perubahan singal, atau suatu pendifinisiakn perioda waktu yang sudah dilalui. Kombinasi dapat saja dilakukan. Syntax:
wait [on signal_name {,signal_name}] [until condition] [for time expression]
Contoh ; eksekusi ditunda sampai satu atau dua kondisi benar (true), atau setelah 25 nS, yang mana yang duluan. wait until clock = '1' or enable /='1' for 25ns; 2). Signal assignment statement Assign suatu bentuk gelombang ke salah satu signal driver (mengedit kejadian antrian)
Contoh:
A <= B after 10ns; C <= A after 10ns;
-- value of C is current A value
Variable assignment statement
Untuk meng-update suatu process/procedure/fungsi variable dengan ekspresinya. Update bereaksi langsung saat itu. Contoh: A := B and C; D := A;
-- value of D is new A value
3). Procedure call Invoke an externally-defined subprogram in the same manner as a concurrent procedure call.
4). Conditional Statements Standard if..then and case constructs can be used for selective operations. if condition then ... sequence of statements... elsif condition then ... sequence of statements... else ... sequence of statements... end if; NOTE: elsif and else clauses are optional. case expression is when choices => sequence of statements when choices => sequence of statements ... when others => sequence of statements end case; NOTE: case choices can be expressions or ranges.
5). Loop statements Sequences of statements yang dapat di-ulang sampai beberapa kali dibawah control dari while atau for.
label: while condition loop 15
... sequence of statements ... end loop label; label: for loop_variable in range loop ... sequence of statements... end loop label; Catatan: label merupakan sekedar pilihan. Loop termination statements – untuk menghentikan iteration, loop, or procedure. next [when condition]; -- mengakhiri loop iteration yang sedang berjalan saat itu. exit [when condition]; -- exit innermost loop entirely return expression; -- exit from subprogram NOTES:
1. The next/exit condition clause merupakan pilihan. 2. The return expression digunakan untuk functions. 8. Sequential assertion - same format as a concurrent assertion. 6). PROCEDURES procedure adalah suatu subprogram yang melalukan parameter-parameter dan menerima nilai-nilai melalui daftar dari parameter nya. Example procedure
proc_name (signal clk: in vlbit; constant d: in vlbit; signal data: out vlbit) is ... local variable declarations ... begin ... sequence of statements ... end proc_name; Procedure call: proc_name(clk1, d1, dout);
7). FUNCTIONS function adalah suatu subprogram yang melalukan parameter-parameter dan mengembalikan suatu nilai tunggal. Tidak seperti halnya procedures, function utamanya digunakan dalam ekspresi. Contoh; -- Convert bit_vector to IEEE std_logic_vector format -- (attributes LENGTH and RANGE are described below) function bv2slv (b:bit_vector) return std_logic_vector is variable result: std_logic_vector(b'LENGTH-1 downto 0); begin for i in result'RANGE loop case b(i) is when '0' => result(i) := '0'; when '1' => result(i) := '1'; end case; end loop; return result;
16
end; -- Convert bit_vector to unsigned (natural) value function b2n (B: bit_vector) return Natural is variable S: bit_vector(B'Length - 1 downto 0) := B; variable N: Natural := 0; begin for i in S'Right to S'Left loop if S(i) = '1' then N := N + (2**i); end if; end loop; return N; end;
Function Calls: signal databus: vector4(15 downto 0); signal internal: bit_vector (15 downto 0); variable x: integer; .... databus <= bv2slv (internal); x := b2n(internal);
Conversi Data antara ieee types dan bit/bit_vector (functions dalam "ieee.std_logic_1164") To_bit(sul) - from std_ulogic to bit To_bitvector(sulv) - from std_ulogic_vector/std_logic_vector To_StdULogic(b) - from bit to std_ulogic To_StdLogicVector(bv) - from bit_vector or std_ulogic_vector To_StdULogicVector(bv)- from bit_vector or std_logic_vector To_X01(v) - from bit, std_ulogic, or std_logic to X01 To_X01Z(v) - from bit, std_ulogic, or std_logic to X01Z To_UX01(v) - from bit, std_ulogic, or std_logic to UX01 Other "ieee.std_logic_1164" functions rising_edge(s) - true jika rising edge on signal s (std_ulogic) falling_edge(s) - true jika falling edge on signal s (std_ulogic) Additional Mentor Graphics-supplied functions untuk elemen-elemen tipe Bit_vector (diimplementa-sikan sebagai overloaded operator definitions): library mgc_portable; use mgc_portable.qsim_logic.ALL; Arithmetic antara bit_vectors: menggunakan normal binary operator tokens sepert; (a + b, a - b, a * b, a / b, a mod b, a rem b) Logical operations antara semua signal types and vectors dari signal types dalam the "ieee" library. (and, or, nand, nor, xor, xnor, not ) Shift/rotate left/right logical/arithmetic operators: ( sll, srl, sra, rll, rrl )
17
Ex. a := x sll 2; -- "shift left logical" bit_vector x by 2 bits Relational operations: (=,/=,<,>,<=,>= ) Type conversion: to_bit (from integer) to_integer (from bit_vector)
OBJECT ATTRIBUTES object attribute mengembalikan informasi tentang suatu signal atau data type returns information about a signal or data type. Signal Condition Attributes (for a signal S) S'DELAYED(T) - value of S delayed by T time units S'STABLE(T) - true if no event on S over last T time units S'QUIET(T) - true if S quiet for T time units S'LAST_VALUE - value of S prior to latest change S'LAST_EVENT - time at which S last changed S'LAST_ACTIVE - time at which S last active S'EVENT - true if an event has occurred on S in current cycle S'ACTIVE - true if signal S is active in the current cycle S'TRANSACTION - bit value which toggles each time signal S changes
Contoh; if (clock'STABLE(0ns)) then -- change in clock? ... -- action if no clock edge else ... -- action on edge of clock end if; if clock'EVENT and clock = '1' then Q <= D after 5ns; -- set Q to D on rising edge of clock end if; Data Type Bounds (Attributes of data type T) T'BASE - base type of T T'LEFT - left bound of data type T T'RIGHT - right bound T'HIGH - upper bound (may differ from left bound) T'LOW - lower bound Enumeration Data Types (Variable/signal x of data type T) T'POS(x) - position number of value of x of type T T'VAL(x) - value of type T whose position number is x T'SUCC(x) - value of type T whose position is x+1 T'PRED(x) - value of type T whose position is x-1 T'LEFTOF(x) - value of type T whose position is left of x T'RIGHTOF(x) - value of type T whose position is right of x Array Indexes for an Array A (Nth index of array A) A'LEFT(N) - left bound of index A'RIGHT(N) - right bound of index A'HIGH(N) - upper bound of index A'LOW(N) - lower bound of index A'LENGTH(N) - number of values in range of index A'RANGE(N) - range: A'LEFT to A'RIGHT A'REVERSE_RANGE(N) - range A'LEFT downto A'RIGHT
NOTE: Untuk array multi dimensi, indeks ke N harus ditandai dalam attribute yang khusus. N dapat diabaikan untuk array satu dimensi.
18
Contoh; for i in (data_bus'RANGE) loop ... for i in (d'LEFT(1) to d'RIGHT(1)) loop ...
Block Attributes (of a block B) B'BEHAVIOR - true jika di block B tidak ada komponen instantiations B'STRUCTURE - true jika tidak ada signal assignment statements dalam block B
THE TEXTIO PACKAGE TEXTIO merupakan suatu package dari fungsi-fungsi VHDL yang membaca dan menulis text files. Untuk membuat package dikenali:
use std.textio.all; Data Types: text – file dari suatu strings character line - satu string dari text file
Example Declarations file Prog: text is in "file_name"; --text file "file_name" variable L: line; -- read lines from file to L
Reading Values From a File:
readline(F, L)---- untuk membaca satu line dari "text" file F to "line" L read(L, VALUE, GOOD); membaca satu nilai dari line L ke dalam harga variable (variable VALUE) • GOOD is TRUE if successful • Data_type of VALUE can be bit, bit_vector, integer, real, character, string, or time.
Writing values to a file:
writeline(F, L); Menulis satu line "text" file F dari "line" L write(L, VALUE, JUSTIFY, FIELD); menulis satu nilai ke "line" L dari variable VALUE • Data_type of VALUE dapat berupa bit, bit_vector, integer, real, character, string, or time. • JUSTIFY adalah "left" or "right" untuk justify within the field • FIELD adalah desired field width dari written value
19