VHDL Tutorial
User Manual: VHDL-Tutorial
Open the PDF directly: View PDF  .
.
Page Count: 224 [warning: Documents this large are best viewed by clicking the View PDF Link!]
- 1. VHDL – Genel Bakış ve Uygulama Alanı
- 1.1 HDL Uygulamaları (1)
- /1.1.1 HDL Uygulamaları (2)
- 1.1.2 Kullanımın Sıralanması
- 1.2 VHDL ‘e Kısaca Göz Atalım
- VHDL geliştirme ilk olarak Amerikan Savunma Departmanı tarafından başlatılmıştır. Onlar, donanımı tanımlamak için, bilgisayar ve insanlar tarafından aynı anda okunabilir olacak ve geliştiricileri yapısal ve anlaşılır kod yazmaya zorlayacak, yani kay...
- 1987 ‘de, VHDL Amerikan Elektrik ve Elektronik Mühendisleri Enstitüsü(IEEE) tarafından ilk resmi güncelleştirilmesi 1993 yılında yapılarak ilk kez standartlaştırıldı. Dosya işleme prosedürü dışında bu iki standart birbiriyle uyumludur.Dilin standardı...
- 1.2.1 VHDL – Tarihçesi
- 1.2.2 VHDL – Uygulama Alanı
- 1.2.3 ASIC Geliştirme
- /
- 1.3 VHDL’in Kavramları
- 1.3.1 Soyutlama
- 1.3.2 IC Tasarımında Soyutlama Seviyeleri
- /
- Bir sayısal devre tasarımının dört soyutlama seviyesi şekilde gösterilmiştir. Modelin fonksiyonel tanımlaması davranışsal modelde özetlenir. Burada sistem saati yoktur ve sinyal geçişleri anahtarlama zamanına uyacak şekilde asenkrondur. Genellikl...
- 1.3.3 Soyutlama Seviyeleri ve VHDL
- /
- VHDL üstteki üç soyutlama seviyeleri için uygulanabilir. VHDL bir yerleşim tanımlamaya uygun değildir. Davranışsal ve RT seviyedeki tasarım girişi genellikle metin editörleri tarafından yapılır. Grafik araçları da mevcuttur ancak deneyimli kullanıcı...
- 1.3.4 Soyut Seviylerin Tanımlamaları
- /
- Davranış seviyesinde tüm sistem modellenebilir. Veri iletim yolu veya kompleks algoritmalar, sentezlenebilirliği göz önünde bulundurulmadan tanımlanmalıdır. RTL modellerin simülasyonu için tepki(stimuli) davranış seviyesinde tanımlanır. Tepki, model...
- 1.3.5 VHDL’de Davranışsal Tanımlama
- /
- Bir modelin basit bir belirtim(specification) fonksiyonu gösterilmiştir. Çıkış üç giriş değeri i1, i2 ve i3 ‘e bağlıdır.Ayrıca yeni çıkış değeri giriş değeri değiştirildikten sonra 100ns sonunda hazır olmalıdır. Bir davranışsal VHDL tanımlamada, f...
- 1.3.6 VHDL’de RT Seviyesi
- /
- VHDL’de fonksiyonel davranış sözde süreçler ile modellenir. RT seviyesi tanımlamalarında iki farklı tipte süreç bulunmaktadır: tamamen kombinasyonel süreç (combinational process) ve saatsel süreç(clocked process). Tüm saatsel süreçler Flip Floplar o...
- 1.3.7 VHDL’de Kapı Seviyesi
- /
- Bir VHDL kapı seviyesi tanımlaması tasarımda kullanılan bir kapı(bileşenleri) listesi içermektedir.Diğer kısım bileşenlerin gerçek örneklemini ve onların karşılıklı bağlantılarının(interconnection) listesini tutmaktadır. Bir dijital devrenin ka...
- 1.3.8 Soyut Seviyenin Bilgi İçeriği (Information Content of Abstraction Levels)
- /
- Davranış model, bir devrenin davranışını tanımlamanın basit bir yoludur, alışılmış yazılım programlama dilleri PASCAL veya C ‘ye benzer şekilde. Bu tanımlamadan yola çıkarak sadece fonksiyonel davranış VHDL simülatörü ile simüle edilebilinir. Saat...
- 1.4 Modülarite ve Hiyerarşi
- 1.5 Özet
- 2. VHDL Dili ve Sözdizim(Syntax)
- 2.1 Genel Yapısı
- 2.1.1 Tanıtıcı(identifier)
- 2.1.2 İsimlendirme Kuralları
- İsimlendirme kuralları, anahtar sözcükler küçük harfle yazılır, kullanıcı tanımlı tanıtıcılar ise büyük harflerle yazılır. Eğer bir şeye dikkat çekmek isteniyorsa koyu harflerle yazılır. Burada birçok kendini açıklayan ikon vardır. Bunlar VHDL'93 ...
- 2.2 VHDL ‘in Yapısal Elemanları
- VHDL deki temel birimler varlıklar, mimariler, konfigürasyon ve paketlerdir. Bir varlık genelde port listesini içeren bir arayüz tanımlarken,bir mimari ilgili modüllerin fonksiyonlarını tanımlar. Genelde bir konfigürasyon sadece simülasyon süreci ...
- 2.2.1 VHDL Objelerinin Bildirimi-Tanımlanması
- (Declaration of VHDL Objects)
- 2.2.2 Varlık(Entity)
- Yukarıda, bir tam toplayıcı(full adder), iki yarım toplayıcıyı(half adder) ve bir VEYA(OR) kapısını içerecek şekilde adım adım oluşturulmuştur. Kendimizi tamamen yapısal bir tasarımla kısıtlamaktayız, örneğin kapı seviyesi tanımlama kullanıyoruz ve ...
- 2.2.3 Mimari(Architecture)
- Mimari bir davranışsal tanımlama(davranışsal seviye veya eğer sentezlenebiliyorsa RT seviyesi) veya bir yapısal netlist veya bir karışım alternatiflerinden birini bir varlık için gerçekler(implement). Bir mimari kesinlikle belirli bir varlığa bağl...
- 2.2.4 Mimari Yapısı(Architecture Structure)
- Herbir mimari opsiyonel olan bir bildirimsel bölüme ve tanımlama bölümüne ayrılır. Bildirimsel bölüm ' is ' ve ' begin ' anahtar sözcükleri arasında bulunmaktadır. Mimarideki sabitler,veritipleri,sinyaller, altprogramlar,vb. yeni objeler burada bi...
- 2.2.5 Varlık Port Modları
- Bir varlığın portunun modu verinin akış yönünü sınırlar. Port modu ' in ' kullanılan mimairideki bu sinyallerin sadece okunabilir olduğunu belirtir. Bunların değerlerini değiştirmek mümkün değildir. Benzer şekilde ‘out’ port modunda sinyallerin d...
- 2.2.6 Hiyerarşik Model Yerleşimi
- VHDL hiyerarşik model yerleşimine izin vermektedir, bu da bir modül birden fazla altmodülün biraraya getirilmesinden oluşmaktadır anlamına gelmektedir. Alt modüllerin birbiriyle bağlantıları mimari içindeki üst modül tarafından tanımlanmaktadır. Şek...
- 2.2.7 Bileşen Bildirimi
- Tam toplayıcı varlığı blok diyagramdan doğrudan türetilebilir. Girişler A,B ve CARRY_IN gereklidir, bununla birlikte SUM ve CARRY sinyalleri ise çıkışları oluşturmaktadır. Tamtoplayıcı birçok altmodül içermektedir, önce bunlar tamıtılmalıdır. Bir ...
- 2.2.8 Bileşen Örnekleme
- Eğer bir bileşen tanımlandıysa ,bu artık soket tipi sabittir ve gerekli olan yerlerde kullanılabilir demektir. Gerçek soket üretildiğinde bu bileşen örneklemi ile yapılır. PCB(printed circuit board) deki soketlerin yerleşimi için karşılaştırılabilir...
- 2.2.9 Bileşen Örnekleme: İsimlendirilmiş Sinyal İlişkileri
- Bir önceki örnekte konumsal ilişki yerine, mimari sinyallerini doğrudan seçilen portlara bağlamak mümkündür. Bu isimlendirilmiş sinyal ilişkileri ile yapılmaktadır sinyallerin sırası önemli değildir. Bileşen tanımlamadan gelen port ismine “resmile...
- 2.2.10 Konfigürasyon(Configuration)
- Varlıkların tanımlanması ve örneklenmesi gerçekte kullanılan VHDL modellerinden bağımsızdır. VHDL konfigürasyon işinde bileşenlerin ,tam bir tasarım yapmak için, varlık/mimari çiftine bağlantı oluşturulur. Özet olarak,bir bileşen tanımlanması kesin b...
- 2.2.11 Konfigürasyon: İşlemleri ve Uygulaması
- Varlıkla mimari arasındaki ilişki konfigürasyonda kullanılan simülasyonla desteklenir, son tasarım hiyerarşisini oluşturur. Bu en üst seviye varlık mimarisinin seçimini içerir. Konfigürasyon VHDL deki sentezlenebilen ve simüle edilebilen tek objedir...
- Örnek, yapısal mimari için varsayılan konfigürasyonu göstermektedir. Bazı simülatörler bu tip en üst seviye varlıklar için kesin konfigürasyon tanımlamalarına ihtiyaç duymaktadır. Bir konfigürasyon özel bir varlığı tercih eder,burada FULLADDER(tamtopl...
- 2.2.12 Konfigürasyon: Örnek (1)
- Şekilden ve koddan anlaşıldığı üzere bir tamtoplayıcının kodu görülmektedir. Şekille kodu eşleştirmeye çalışın.
- Elemanların portları mimarinin sinyalleriyle, pozisyonları yardımıyla bağlantı kurulmuştur, ör. ilk sinyal ilk portla bağlantılıdır. HALFADDER(yarımtoplayıcı) varlığı kullanılamaz ancak bunun iki varlığı A ve B ‘nin RTL ve GATE diye farklı mimariler...
- 2.2.13 Konfigürasyon: Örnek(2)
- Tekrardan FULLADDER varlığı için STRUCT mimarisi seçilmiştir.Bu for döngüsü içerisinde, varlıklar ve mimariler alt bileşenler için seçilmiştir. Bunun için for ifadesi yeniden kullanılmıştır. ' for ' anahtar sözcüğünden sonra kullanılan ilk isim b...
- 2.2.14 İşlem(Process)
- Bir mimari içindeki ifadeler aynı anda oluşan başka VHDL yapılarını yönetmek için sıralı davranışı gerçekleştirmek için gereklidir. Bir işlem, mimarideki diğer ifadeler gibi davranmaktadır ve geleneksel programlama dillerindeki gibi biri diğerinden...
- 2.2.15 VHDL İletişim Modeli
- 2.2.16 Signals
- Her bir sinyalin önceden tanımlı bir veri tipi vardır bu sinyalin alabileceği değerlerin sayısını kısıtlamaktadır. Sentezlenebilir veri tipleri sadece berlirli sayıda değere izin verir. Bu değerleri bir dizi kabloya atayabilir. Sadece temel veri tipl...
- 2.2.17 Paket(Package)
- Bir paket, veri tiplerinin, altprogramların, sabitlerin, vb tanımlamalardan oluşur. Bu takım çalışması için kullanışlıdır böylece herkes aynı veri tipleri,vb çalışacaktır. Bu farklı tasarımcıların modüllerinin bir araya getirilip VHDL model in oluştu...
- 2.2.18 Kütüphane(Library)
- Bir kütüphanede tüm incelenmiş objeler yani paketler, paket gövdeleri, varlıklar, mimariler ve konfigürasyonları bulabilirsiniz. VHDL ‘de kütüphane, derlenmiş objelerin grup halinde bulunduğu ve referans verilebildiği mantıksal isimdir. Varsayılan k...
- 2.2.19 Tasarım Yapısı: Örnek
- Örnekte görüldüğü gibi tasarım dört modelden oluşmaktadır. En üstte MONITOR modülü bulunmaktadır, bu da üç alt modülü kullanmaktadır. Bunlar; CTRL, DATA_IN ve DATA_OUT alt modülleridir. Verinin formatı için olan veri tipleri package P de tanımlanmış...
- 2.2.20 Derleme Sırası
- Derleme sırası modelin bölümlerinin bağımlılıklarına bağlıdır.Eğer bir bağımlılık ağacı çıkarıldıysa, düşük seviyeden en üsttekine doğru derleme yapılır. İkinci birimler ilk birimlerdeki bilgiler açığa çıkıktan sonra açığa çıkar(arayüz sinyalleri ...
- 2.2.21 Görünüm: Testtezgahı-testbenç (Testbench)
- Stimuli: uyarı Response: yanıt Bir tasarımı doğrulamak için en sık kullanılan metot simülasyondur. VHDL de ilk alanda dijital donanımda simülasyonu sağlamak için geliştirilmiştir, bu dil tarafından iyi bir şekilde desteklenmektedir. Yeni bir en üst...
- 2.2.22 Basit Testbenç Örneği
- Örnek basit bir tasarım için VHDL kodunu ve ona uygun testbenci içermektedir. Test edilecek tasarım bir ADDER(toplayıcı),bir yarım toplayıcıyı gerçekler. RTL mimarisi tam bir kombinasyonel süreci içerir, bu SUM ve CARRY sinyallerini, giriş sinyalleri...
- 2.2.23 Özet
- VHDL çok katı bir dildir. Her bir sinyal,örneğin, kesin bir veri tipi olması gerekmektedir, ve belirtilen yerde belirtilmesi gerekmektedir, sadece aynı veri tipindeki atamaları kabul etmektedir. Bir VHDL modele fonksiyonel bir test uygulamak için, ...
- 2.2.24 Sorular
- CEVAPLAR: 1.1 :HAYIR 1.2:EVET 1.3:EVET 2.1:HAYIR 2.2:EVET
- 2.2.25 Sorular
- 2.2.26 Sorular
- 2.3 Veri Tipleri
- 2.3.1 Standart Veri Tipleri
- 2.3.2 'time'(zaman) Veritipi
- 2.3.3 Dizilerin Tanımlanması
- Diziler(Arrays) aynı tip ve anlamdaki sinyalleri gruplamak için kullanışlıdır. VHDL de öntanımlı olarak bulunan ve sınırlandırılmamış yani boyutları belli olmayan iki dizi veri tipi vardır bunlar ;' bit_vector ' ve ' string ' dir ve bit ve character...
- 2.3.4 'integer' ve 'bit' Tipleri
- Integer(tam sayı) sinyaller sentez sırasında bir dizi kabloyla eşleştirilebilinir. Bu kablolar ' bit_vector ' ile modellenebilir, ' bit_vector ' sinyallerin önceden sayısal bir yorumlamaya gerek yoktur. Bu nedenle sentez iki örnek mimari için aynı şek...
- 2.3.5 Dizi Tipleriyle Atamalar
- Diziler için özellikle dikkat edilmesi gereken şey sinyal atamalarıdır. Bunun için veri tipi ve genişliği uyuşmalıdır, bu dizi elemanlarının sırası için geçerli değildir. Değerler birbirlerine dizideki pozisyonlarına göre atanmaktadır, dizine göre de...
- 2.3.6 'bit' Veri Tipi İçin Atama Şekilleri
- Sinyal değerlerinin belirtimi temel tiplerine göre farklılık göstermektedir, eğer temel tipi 'character' ve'bit' ise bunlara uygun dizi tipi 'string' ve 'bit_vector' ’dür. Tek değerler herzaman (') tek tırnakla verilir, dizi değerlerini girmek için...
- 2.3.7 Birleştirme-Bağlama(Concatenation)
- Sinyalleri atamak için operatörün her iki tarafındaki veri tiplerinin birbiriyle eşleşmesi gerekmektedir. Birleştirme operatörü ' & ' sağındaki ve solundaki aynı veri tipindeki elemanları gruplar. Yine sadece dizinin pozsiyonu önemlidir indisi öneml...
- 2.3.8 Kümeleme(Aggregates)
- Sinyalleri atamanın bir diğer sınırlama derdi olmayan acısız yolu yapıları kümelemektir. Son diziyi oluşturacak sinyalleri '(' ')' arasında belirtilir ve birbirinden ',' ile ayrılır. Basit birleştirme (concatenation) yerine, bunda dizi elemanlarına ...
- 2.3.9 Diziyi Bölümleme
- Birleştirme ve kümelemenin tersi olan bölümleme, bir dizinin bölümlerinin seçilmesi demektir, sadece dizinin bir kısmı kullanılabilinir. Kullanılan dizinin bölümleri parantezlerle belirlenir ve sinyalin belirtim tipine uymalı. Tabiki, bir dizinin te...
- 2.3.10 Sorular
- Sorulara sadece doğru yada yanlış şeklinde cevap verin.
- CEVAPLAR:
- 7.1:EVET 7.2:HAYIR 7.3:HAYIR 8.1:HAYIR 8.2:EVET
- CEVAPLAR: 9.1:EVET 9.2:EVET 9.3:HAYIR
- 9.4:EVET 9.5:HAYIR
- 2.4 Genişletilmiş Veri Tipleri
- 2.4.1 Tip Sınıflama
- 2.4.2 Numaralanmış(Enumeration)Tip
- 2.4.3 Numaralanmış Tip(Enumeration) -Örnek
- 2.4.4 BIT Tipi Sorunları
- 2.4.5 Çok-değerli Tipler
- 2.4.6 IEEE Standart Mantık Tipi (Standard Logic Type)
- 2.4.7 Kararlı ve Kararsız Tipler (Resolved and Unresolved)
- 2.4.8 Std_Logic_1164 Paketi
- 2.4.9 Karar Fonksiyonu
- 2.4.10 STD_LOGIC ile STD_ULOGIC Karşılaştırma
- 2.4.11 NUMERIC_STD Paketi
- 2.4.12 Diziler(Arrays)
- 2.4.13 Çokboyutlu Diziler
- 2.4.14 Kümeleme ve Çok Boyutlu Diziler
- 2.4.15 Kayıtlar(Records)
- 2.4.16 Tip Dönüşümü
- 2.4.17 Alttipler(Subtypes)
- 2.4.18 Takma Ad(Aliases)
- 2.5 Operatörler-İşletmenler
- 2.5.1 Mantıksal Operatörler
- 2.5.2 Dizilerle Mantıksal Operasyonlar-İşlemlşer
- 2.5.3 Kaydırma(Shift) Operatörleri: Örneklerle
- 2.5.4 İlişkisel Operatörler
- 2.5.5 Dizilerle Karşılaştırma İşlemleri
- 2.5.6 Aritmetik Operatörler
- 2.5.8 Sorular
- 2.6 Sıralı-Ardışıl(Sequential) İfadeler
- 2.6.1 IF İfadesi
- 2.6.2 IF İfadesi: Örnek
- 2.6.3 CASE İfadesi
- 2.6.5 Değer Kümesinin(Range) Tanımı
- 2.6.6 FOR Döngüleri
- 2.6.7 Loop Sözdizimi(Syntax)
- 2.6.8 Döngü Örnekleri
- 2.6.9 Bekleme(WAIT) İfadesi
- 2.6.10 WAIT İfadesi: Örnek
- 2.6.11 WAIT İfadeleri ve Davranışsal Modelleme
- 2.6.12 Değişkenler(Variables)
- 2.6.13 Değişkenler (Variables) / Sinyaller (Signals)
- 2.6.14 Değişkenlerin Kullanımı
- 2.6.15 Değişkenler: Örnek
- 2.6.16 Global Değişkenler (VHDL'93)
- 2.7 Koşutzamanlı(Concurrent) İfadeler
- 2.7.1 Koşullu Sinyal Atama
- 2.7.2 Koşullu Sinyal Atama: Örnek
- 2.7.3 Seçilmiş Sinyal Ataması
- 2.7.4 Seçilmiş Sinyal Ataması: Örnek
- 2.7.5 Koşutzamanlı İfadeler: Özet
- 2.8 RTL-Stili
- 2.8.1 Kombinasyonel İşlemler: Hassasiyet Listesi
- 2.8.2 Bekleme WAIT İfadesi <-> Hassasiyet Listesi
- 2.8.3 Kombinasyonel İşlemler: Eksik Atamalar
- Kombinasyonel donanım modellenirken tutucuların üretilmesini engellemek için özel durumlar gereklidir. En soldaki kod örneğinde koşulsuz else dallanması eksiktir. Bu nedenle SEL='0' olduğu durumda giriş sinyali değişsede Z eski değerini korumuş olur....
- 2.8.4 Kombinasyonel İşlem: Kuralları
- 2.8.5 Saat İşlemleri: Saat Kenar Bulma(Clock Edge Detection)
- 2.8.6 Artan Kenarın Fonksiyon Kullanarak Tesbiti
- 2.8.7 Yazmaç Çıkarımı(Register Inference)
- 2.8.8 Asenkron Atama/Yeniden Başlatma (Set/Reset)
- 2.8.9 Saatli İşlemler: Kuralları
- 2.8.10 Sorular
- 2.9 Altprogramlar(Subprogram)
- 2.9.1 Parametreler ve Modlar
- 2.9.2 Fonksiyonlar
- 2.9.3 Prosedürler
- 2.10 Altprogramın Bildirimi ve Aşırı Yüklenmesi(Overloading)
- 2.10.1 Aşırı Yükleme(Overloading) Örneği
- 2.10.2 Aşırı Yükleme(Overloading) – Geçersiz Yeniden Bildirim
- 2.10.3 Aşırı Yüklemede(Overloading) – Muğlaklık(Ambiguity)
- 2.10.4 Operatör Aşırı Yükleme (Overloading)
- 2.10.5 Operatör Aşırı Yükleme - Örneği
- 2.10.6 Sorular
- 3. Simülasyon(Simulation)
- 3.1 Derleme Sırası (Sequence of Compilation)
- Örnek
- 3.2 Simülasyonun Akışı
- Bir VHDL modelinin simülasyonu üç adımda yürütülür. Önce, ayrıntılandırma fazında(elaboration) simülasyon modeli yaratılır. İlklendirme (initialisation) fazında tüm sinyallere bir başlangıç değeri atanır. Gerçekleştirme fazında modelin kendisi gerçe...
- 3.2.1 Ayrıntılandırma (Elaboration)
- 3.2.2 İlklendirme (Initialization)
- 3.2.3 Yürütme(Execution)
- 3.3 İşlem Yürütme(Process Execution)
- 3.3.1 Koşutzamanlı ve Sıralı Yürütmenin Karşılaştırılması
- 3.3.2 Sinyal Güncelleme
- 3.3.3 Delta Dönüşü-Çevrimi (1)
- 3.3.4 Delta Çevrimi(2)
- 3.3.5 Delta Çevrim - Örneği
- 3.3.6 İşlem Davranışı
- 3.3.7 Ertelenmiş İşlemler (Postponed Processes)
- 3.4 Gecikme Modelleri
- 3.4.1 Projelendirilmiş Çıkış DalgaFormları(Projected Output Waveforms (LRM))
- 3.4.2 Taşıma Gecikmesi (Transport Delay) (1)
- 3.4.3 Taşıma Gecikmesi (Transport Delay) (2)
- 3.4.4 Eylemsiz Gecikme(Inertial Delay) (1)
- 3.4.5 Eylemsiz Gecikme(Inertial Delay) (2)
- 3.4.6 Eylemsiz Gecikme(Inertial Delay) (3)
- 3.5 Testbenç(Testbenches)
- 3.5.1 VHDL Testbenç’in Yapısı
- 3.5.2 Örnek
- Saat(Clock) ve YenidenBaşlatma(Reset) Üretimi
- Yanıt-Tepki Analizi(Response Analysis)
- 3.6 Dosya Giriş/Çıkışı(File I/O)
- 3.6.1 Dosya (File)I/O Örnek(1/4)
- Örnek(2/4)
- Örnek(3/4)
- Örnek (4/4)
- 4. Sentez (Synthesis)
- 4.1 • Sentez nedir?
- 4.1.1 Sentezlenebilirlik(Synthesizability)
- 4.1.2 Sentez İçin Farklı Dil Destekleri /
- 4.1.3 Nasıl Yapılır ?
- 4.1.4 Sentez İçin Gerekli Bilgiler
- 4.1.5 Pratikte Sentez Süreci
- 4.1.6 Sentez Araçlarıyla İlgili Problemler
- 4.1.7 Sentez Stratejisi
- 4.2 RTL-stili
- 4.2.1 Objelerin Kombinasyonları (Combinatorics)
- 4.2.2 Tam hassasiyet listesi
- 4.2.3 WAIT ifadesi < - > Hassasiyet Listesi
- 4.2.4 Eksik atamalar
- 4.2.5Kombinasyonel Lojiği Sentezlemek İçin Kurallar
- 4.2.6 Flip Flopların Modellenmesi
- 4.2.7 Sentez İçin Artan Saat Kenarının Tanımı
- 4.2.8 Artan Saat Kenarının Fonksiyon Çağrımı ile Tanımlanması
- 4.2.9 Sayıcı Sentezi
- 4.2.10 FF İle Asenkron Reset(Yeniden Başlatma)
- 4.2.11 Zamanlı İşlemler İçin Kurallar
- 4.2.12 Sorular
- 4.3 Kombinasyonel Lojik(Combinational Logic)
- 4.3.1 Akıcı Kodlama Stili
- 4.3.2 Kaynak Kod Optimizasyonu
- 4.3.3 IF yapısı < - > CASE yapısı
- 4.3.4 Veri Yolunun Gerçekleştirilmesi
- İç Veri Yolu Yapısı Sorunları
- Taşınabilir ve Güvenli Yol Yapısı
- 4.3.5 Bir Çarpan(Multiplier) Örneği
- Çarpan(Multiplier) Fonksiyon Tablosu
- Çarpanların Minterm’leri -- Karnaugh Diyagramı
- Çarpan(Multiplier): Fonksiyon Tablosuyla Oluşturulmuş VHDL Kodu
- Çarpan(Multiplier): Minterm Dönüşümü
- Çarpan : Tamsayı(Integer) Gerçekleştirme
- 4.3.6 Operatörlerin Sentezi
- Sentez Sonuçları
- 4.3.7 Toplama Örneği
- 4.4 Sıralı Mantık(Sequential Logic)
- 4.4.1 RTL – Kombinasyonel Mantık ve Yazmaçlar
- 4.4.2 Zamanlı İşlemlerde Değişkenler
- Örnek
- 4.5 Sonlu Durum Makineleri ve VHDL ( FSM-Finite State Machines)
- 4.5.1 Bir "State"Durum İşlemi /
- 4.5.2 İki "State"Durumlu İşlemler
- 4.5.3 Kaç tane İşlem?
- 4.5.4 Durum Şifreleme-Kodlama (State Encoding)
- 4.5.5 Case İfadesinin Eki
- 4.5.6 Tip Bildirimini Eki
- 4.5.7 Elle Kodlama
- 4.5.8 FSM: Medvedev
- 4.5.9 Medvedev Örneği
- 4.5.10 Medvedev Örneğinin Dalgaformu (Waveform)
- 4.5.11 FSM: Moore
- 4.5.12 Moore Örneği
- 4.5.13 Moore Örneğinin Dalgaformu (Waveform)
- 4.5.14 FSM: Mealy
- 4.5.15 Mealy Örneği
- 4.5.16 Mealy Örneği Dalgaformu (Waveform)
- 4.5.17 Modellemeye Bakış
- 4.5.18 Yazmaçlı Çıkış(Registered Output)
- 4.5.19 Yazmaçlı Çıkış Örneği (1)
- 4.5.20 Yazmaçlı Çıkış Örneği Dalgaformu (1)
- 4.5.21 Yazmaçlı Çıkış Örneği (2)
- 4.5.22 Yazmaçlı Çıkış Örneği Dalgaformu (2)
- 4.6 İleri Düzey Sentezleme
- 4.6.1 Sabitlerle Parametreleştirme
- 4.6.2 Jeneriklerle Parametreleştirme (1) (Generics)
- 4.6.3 Jenerikle Parametreleştirme(2)
- 4.6.4 Üretme(GENERATE)
- 4.6.5 Koşullu Üretme İfadesi (Conditional GENERATE)
- 4.6.6 Parametreleştirme ve Sinyaller
- 5. Proje Yönetimi(Project Management)
- 5.1 Tasarım Bileşenleri
- 5.1.1 Kütüphaneler(Libraries)
- 5.1.2 LIBRARY (Kütüphane) İfadesi
- 5.1.3 USE(Kullanma) İfadesi
- 5.2 Ad Uzayları(Name Spaces)
- 5.3 Dosya Yapısı (File Organisation)
- 5.3.1 Paketler(Packages)
- 5.3.2 Paket Sözdizimi(Package Syntax)
- 5.3.3 Paket Örneği
- 5.3.4 Paketlerin Kullanımı
- 5.3.5 Paket İçeriğinin Görülebilirliği

1. VHDL – Genel Bakış ve Uygulama Alanı  
• Donanım nedir ? 
• Ne tür tanımlamalar yapılır ? 
Donanım Tanımlama Dili [Hardware Description Language (HDL)] = Donanım modelleme 
için programlama dilidir.  
VHDL  bir donanım tanımlama dilidir. Donanım kelimesi,bir taraftan kişisel bilgisayarlar gibi geniş 
bir içeriği tanımlamak için kullanılsada diğer bir taraftan küçük mantık kapıları ve onların içindeki 
entegre devreleri  tanımlamak için de kullanılır.  
Bu nedenle donanımın işlevselliğinin farklı tanımları bulunmaktadır. Kompleks sistemler genellikle 
dışarıdan gözlemlenebilir davranışlarla tanımlanmaktadır. Soyut davranışsal modeller(abstract 
behavioural models) implementasyon detaylarını gizlemek için kullanılır.Bu örneğimizde, yazdırma 
protokolü yazdırma isteği(PRINTREQUEST) geldiğinde gerçekleşir. Bu istek bir buton yada bir 
yazılım komutu,vb.  olabilir.Diğer taraftan temel bir mantık  kapısı sadece bir ikili sistem(boolean) 
eşitliğiyle tanımlanabilir.Bu çok kısa ve kesin bir tanımlamadır. 
VHDL dili,tam bir uygulama dizisinden ve genel olarak bir donanımsal(sayısal) modellemeden 
ibarettir. 

1.1 HDL Uygulamaları (1) 
Donanım tanımlama dilinin uygulama alanına bir göz atalım:  
Uygulamaya en iyi kanıt belkide bir sistemin davranışal gelişiminin biçimsel modellemesidir. 
Sistematik olarak yanlış anlaşılmalar ve yorumlamalar ortadan kaldırılmış olmaktadır. VHDL in kendi 
kendine dokümantasyon(selfdocumenting) özelliği ile VHDL modeli sistem dokümanının standart bir 
biçimde hazırlanmasını sağlar.  
Donanım  tanımlama dilinin büyük avantajlarından biride kodunuzu adım adım çalıştırabilmenizdir. 
Prensipte, özelleşmiş bir programlama dilinden başka bir şey değildir.Biçimsel bir modeldeki kodlama 
hataları yada sistemdeki  kavramsal hatalar simülasyon çalıştırılarak bulunabilmektedir. 
Oluşturduğunuz modeldeki farklı giriş değerlerine göre sisteminizin verdiği yanıt  simülasyonla 
gözlemlenebilir ve analiz edilebilmektedir.  
Geliştirme sürecinde,  tanımlama  biz ürünü üretene kadar bize gittikçe daha kesin sonuçlar 
vermektedir. Genel tanımlamalardan ayrıntılı tanımlara (otomatik)dönüştürme işlemine 
sentez(synthesis) denir.  Mevcut sentez araçları donanım tanımlama dilindeki spesifik elemanları 
tümleşik devrelerdeki standart elemanlarla eşleştirmektedir.Bu açıdan, donanım sisteminin genel 
yapısı önceki çalışmalar kullanılarak oluşturulabilinir.  Yazılımdesteği, bu iyileştirme adımlarını 
desteklemektedir.  

1.1.1 HDL Uygulamaları (2)  
Ek olarak, donanım tanımlama dilleri tasarımın yeniden kullanılabilmesini sağlamaktadır. Basit 
elektronik elemanlara benzer şekilde, dirençler gibi, uygun HDL modeli birçok tasarım/projede 
yeniden kullanılabilinir. Bunun sık olarak kullanım şekli gereken fonksiyon bloklarının(makroların) 
model kütüphanesi altında toplanması şeklindedir. Tasarım mühendisi için tek kısıt varolan modüllerin 
seçimi değildir ayrıca bazen sentez araçları da kısıt olabilir. 

1.1.2 Kullanımın Sıralanması 
Tasarım(design) süreci herzaman belirtim(specification) fazı ile başlar: Tasarlanacak eleman işlevine, 
boyutuna ve arayüzüne uygun şekilde tanımlanmalıdır. Son ürün ne kadar karmaşık olsa da  tasarım 
genelde, basit metotlarla, kağıt kalem kullanılarak yapılır. 
 Daha sonra, sistem seviyesindeki iç içe modüller tanımlanmalıdır.  Kendi içindeki etkileşimleri tam 
olarak tanımlanmalıdır  ve  arayüzler( giriş, çıkış,veri biçimi),  saat hızı ve sıfırlama(reset) 
mekanizması belirlenmelidir.  Bu bilgiler elimizde bulunduğu zaman tam bir devre simülasyon modeli 
geliştirilebilinir.  Standart  bileşenlerin davranış modelleri sisteme ticari model geliştiricilerin 
kütüphaneleri ile entegre ediliebilinir . Böylece tüm sistem hali hazırda simule edilmiştir. 
Mantık seviyesinde(logic level),  tasarlanan modellerin tüm sentezleri tanımlanır.  VHDL yapısının 
tutarlı bir altkümesi kullanıldığı sürece, ticari sentez programları soyut model tanımlamalarından boole 
fonksiyonlarını türetebilir ve onları ASIC kapı kütüphanelerinin elemanları veya FPGA’in  
ayarlanabilen mantık blokları ile eşleştirebilir. 
Son olarak, spesifik ASIC teknolojisi için devrenin yerleşimi netlist tanımlamalarından gelen diğer 
araçlarla oluşturulmuş olunur. 
Herbir düşük soyutlama seviyesi için geçiş, fonksiyonel doğrulama ile kanıtlanmalıdır. Bu maksatla, 
tanımlama simülasyonun alabileceği herbir giriş değeri için modülün verdiği yanıtlar ile 
karşılaştırılarak simule edilir. 
Bu açıdan VHDL, sistem seviyesinden(system level) kapı seviyesine(gate level) dizayn fazı için 
uygundur. 
1.2 VHDL ‘e Kısaca Göz Atalım 
  Çok Yüksek Hızda Tümleşik Devre Donanım Tanımlama Dili  
(Very High Speed Integrated Circuit Hardware Description Language ) 
• Dijital sistem modelleme 
• Koşutzamanlı(concurrent) and ardışık(sequential) deyimler 
• Bilgisayarca okunur (machine-readable) belirtim 
• Tasarım süresi(design lifetime) > Tasarımcı süresi (designer lifetime) 
• Kişi ve makine okunur dokümantasyon 
  Uluslararası Standartlar  
• IEEE Standart 1076-1987 
• IEEE Standart 1076-1993 
  Analog ve karma sinyal uzantısı (Analogue- and mixed-signal): VHDL-AMS  
• IEEE Standart 1076.1-1999 
  LRM(Language Reference Manual) Dil Referans Elkitabındaki dilin salt tanımlanması  
• Uygulama veya metodoloji için standart yoktur 
VHDL geliştirme  ilk olarak Amerikan Savunma Departmanı tarafından başlatılmıştır. Onlar, 
donanımı tanımlamak için, bilgisayar  ve insanlar tarafından aynı anda okunabilir olacak ve 
geliştiricileri yapısal ve anlaşılır kod yazmaya zorlayacak, yani kaynak kodun kendisi bir tür belirtim 
dokümanı (specification document) olarak sunulabilinecek bir dil istemekteydiler. Ayrıca kompakt 
yapıdaki kompleks fonksiyonları modelleyecek ardışık deyimleri desteklemelidir. 
1987 ‘de, VHDL Amerikan Elektrik ve Elektronik Mühendisleri Enstitüsü(IEEE) tarafından ilk resmi 
güncelleştirilmesi 1993 yılında yapılarak ilk kez standartlaştırıldı.  Dosya işleme prosedürü dışında bu 
iki standart birbiriyle uyumludur.Dilin standardı(Language Reference Manual (LRM))  Dil Referans 
Elkitabı ile tanımlanmıştır.  
VHDL‘i analog ve karma sinyal dili elemanları için yükseltme çabaları ile yeni ve zor bir döneme 
girilmiştir. Bu yükseltmeye VHDL-AMS ( a nalogue- m ixed- s ignal) denir ve VHDL onun bir üst 
kümesidir. Sayısal mekanizma ve metotlar  bu eklenti ile değişikliğe uğratılmamıştır. 
Şu ana kadar,sadece analog kısmı için simülasyon yapılabilmiştir çünkü analog sentez  birçok sınırlı 
şartlardan etkilenen çok kompleks bir problemdir. Karma sinyal simulasyonu, şu ana kadar henüz tam 
olarak çözülememiş dijital ve analog simulatörlerin senkronizasyon sorununun üstesinden 
gelebilmelidir. 
1.2.1 VHDL – Tarihçesi 
  70’lerin ilk dönemi: İlk görüşmeler   
  70’lerin sonları: İhtiyaçların tanımlanması  
  82’nin ortaları: IBM Intermetrics ve TI ile geliştirme anlaşması  
  84’ün ortaları: Versiyon 7.2  
  86’nın ortaları: IEEE Standardı  
  1987: DoD IEEE.1076 standardına adapte oldu  
  88’in ortaları: CAE üreticileri desteklerini arttırdı  
  91’in sonları: Revizyon  
  1993:Yeni standart 
  1999: VHDL-AMS eklentisi 
VHDL sürekli gelişen ve değişen bir dildir. Orijinal standarttan resmi IEEE standardına gelmesi 16 yıl 
sürmüştür. Dokümanlar komiteden geçtiğinde standardın her 5 yılda bir güncelleneceğine dair karar 
alınmıştı. İlk gözden geçirmenin sonucu  1993‘deki güncellenmiş standarttı.  
Bu standart gelişim kararı dışında eklentiler için ek çaba harcanmıştır. Bu eklentiler, geniş çapta 
ihtiyaç duyulan veri tipleri ve alt programlara ait  örnek paketler ( std_logic_1164, , numeric_bit, 
numeric_std, ...), veya özel VHDL altkümelerinin örneğin sentez altküme IEEE 1076.6  tanımını 
içermektedir.  
Son eklenti ise VHDL-AMS  adı verilen analog tanımlama mekanizmasını standartlaştıran eklenti idi. 
1.2.2 VHDL – Uygulama Alanı 
  Donanım tasarımı   
• ASIC: teknoloji eşleştirme(mapping) 
• FPGA: CLB eşleştirme 
• PLD: daha küçük yapılar, hemen hemen tüm VHDL kullanımı 
• Standart çözümler, modeller, davranışsal tanımlamalar, ... 
  Yazılım tasarımı  
• VHDL - C arayüzü (araç-spesifik) 
• Temel araştırma odakları (donanım/yazılım etkileşimli tasarımı) 
 VHDL temelde Entegre Devrelerde Spesifik Uygulamaların(Application Specific Integrated Cicuits 
(ASICs)) geliştirilmesinde kullanılır. VHDL koddan kapı seviyesi netlist’e(gate-level netlist) otomatik 
dönüştürme araçları ilk zamanlarda geliştirilmeye başlanmıştı. Bu dönüşüm sentez olarak adlandırılır 
ve  şuanki tasarım sürecinin ayrılmaz bir parçasıdır.  
Programlanabilir aygıtların(Field Programmable Gate Arrays (FPGAs)) kullanımında birçok sorun 
mevcuttur. İlk adımda, boole denklemleri VHDL tanımlamalarından türetilmektedir,hedef teknolojinin 
ASIC mi yoksa FPGA mi olduğunun bir  önemi yoktu.Fakat şimdi, bu boole kodu  FPGA‘in 
ayarlanabilir mantık bloğunun(configurable logic blocks (CLB)) bir parçası olmak zorundadır. Bu, 
ASIC kütüpanesine eşleştirmekten daha zordur. Bir diğer büyük problem FPGA in darboğazı olan 
CLB’nin iç içe bağlı mevcut kaynaklarının yönlendirilmesidir.  
Sentez araçları kompleks tasarımların üstesinden oldukça iyi bir şekilde gelirken, genellikle sadece 
vasat(suboptimal) sonuçlar elde ederler.  Bu nedenle VHDL  neredeyse tamamen fazla karmaşık 
olmayan programlanabilir mantık araçlarının(Programmable Logic Devices (PLDs)) tasarımında 
kullanılır.  
VHDL hedef teknolojilerden bağımsız olarak model sistem davranışlarına uygulanabilir. Standart 
çözümler için bu kullanışlıdır, örneğin; mikrodenetleyiciler(micro controllers), kodlayıcı/kodçözücüler 
için hata düzeltimi ve hedef ortamında yeni bir aygıt(RAM aygıtlarında) benzetimi yapabilmek 
(simulate) için.  
Araştırmanın şu an gelişen alanlarından biri de donanım/yazılım  co-design’dır. En ilginç soru ise 
sistemin hangi bölümü yazılımda gerçekleştirilecek hangi bölümü donanımda gerçekleştirilecektir. 
Kesin kısıtlar ise maliyetleri ve gösterdiği performansıdır. 

1.2.3 ASIC Geliştirme 
VHDL model geliştirme fonksiyonel sınırlarıyla zamanlama davranışının belirtimleriyle başlar. Bazen  
davranışsal VHDL modeli buradan türetilir, çünkü sentezlenebilir koda genelde buradan itibaren 
ihtiyaç duyulur. VHDL kodun fonksiyonaliteye uygunluğu simüle ve kontrol edilebilinir.  
Eğer model beklenen davranışı gösteriyorsa, VHDL  tanımlaması  sentezlenebilecektir. Bir sentez 
aracı  belirlenmiş ASIC kütüpanesinden uygun kapı ve ikidurumluyu(flip-flop) fonksiyonel 
tanımlamaya uyacak şekilde yeniden üretir.Sentez prosedürü için olmazsa olmaz şey en uzun yol 
boyunca bulunan ( herbir flip-flop‘un çıkışıyla diğerinin girişi arasındaki)  kapı bekleme sürelerinin 
saat periyodundan daha kısa olması gerekliliğidir.  
ASIC kütüpanesinin elemanlarıyla oluşturulmuş bir model var olduğu sürece, kapı seviyesinde bir 
simülasyon gerçeklenebilir.  Şimdi kapılar ve yayılma süreleri(propogation delay) hesaba katılmak 
zorundadır.  Bekleme sürelerinin değerleri herbir VHDL model tanımlamasına eklenmelidir, örneğin 
tasarımcının aldığı ilk ipuçları maksimum saat frekansı ve sentez sonrası kritik yollardır.  
Önce sinyal kablolarının gecikme süresi tahmini olarak hesaplanmalıdır çünkü gerçek değerler ancak 
tüm yerleşim bittikten sonra bulunabilir. VHDL modeline bu değerlerin atanması işlemine tersine ek 
açıklama(back annotation) denir. Bu yapıldıktan sonra, devrenin belirlenmiş  zaman kısıtlarına tam 
olarak  uyup uymadığı kontrol edilmelidir. 

1.3 VHDL’in Kavramları 
    Atamaların yürütülmesi(Execution of assignments)  
   Sıralı (Sequential) 
   Koşutzamanlı (Concurrent) 
    Metodolojiler:  
    Soyutlama (Abstraction) 
     Modülerlik (Modularity) 
   Hiyerarşi-Sıradüzen (Hierarchy) 
VHDL kendini atamalar yönünden diğer dillerden ayırır çünkü  bilinen iki temel atama vardır. Bunlar:  
Sıralı ifadeler yazılım programlama dillerindeki gibi biri diğerinden sonra gelecek şekilde  yürütülür.  
Son gelen ifade bir önceki ifadenin etkilerini geçersiz kılabilir. Sıralı ifadeler kullanıldığında 
atamaların sırası göz önünde bulundurulmalıdır.  
Koşutzamanlı ifadeler sürekli aktif durumdadır. Bu yüzden ifadelerin sırası önemli değildir. 
Koşutzamanlı ifadeler özellikle paralel donanımlı modeller için uygundur.  
Aynı zamanda VHDL‘in  üç önemli modelleme tekniği vardır: 
Soyutlama, sistemin farklı bölümleri için farklı miktarda ayrıntıda tanımlama yapılmasına izin verir. 
Modüllere sadece simülasyon için ihtiyaç duyulur, modüllerin  sentezlemedeki gibi ayrıntılı şekilde 
tanımlanmasına gerek yoktur.  
Modülerlik, tasarımcıların büyük fonksiyonel blokların bölünmesine ve herbir bölüm için ayrı bir 
model yazılmasına olanak sağlar.  
Hiyerarşide ise tasarımcılar birçok alt modül içerebilecek altmodüller tasarlarlar. Her bir seviyedeki 
hiyerarşi farklı soyutlama seviyelerinde modüller içerebilirler. Bir modülün alt modülleri bir düşük 
seviyedeki hiyerarşik seviyede bulunurlar. 
1.3.1 Soyutlama 
• Soyutlama ayrıntıları gizler:  Zorunlu ve gereksiz bilgi arasındaki ayrım.  
• Soyut seviyelerin oluşturulması: Her bir soyut seviyede sadece zorunlu bilgiler göz 
önünde bulundurulur, gereksiz bilgiler atılır.  
• Soyutlamanın dengeliliği(equability): Bir soyutlama seviyesinde bulunan bir 
modeldeki tüm bilgiler aynı derecede soyutlama içerir. 
Soyutlama çok ayrıntılı bilgilerin gizlenmesi olarak tanımlanır. Bu nedenle gerekli ve gereksiz 
bilgilerin ayrılması gerekmektedir.   Problemin şu anki durumunda önemsiz olan bilgiler 
tanımlamadan çıkarılabilinir. Soyutlama seviyeleri, aynı seviyedeki tüm modellerdeki ortak bilginin 
türüne göre tanımlanır. 
Eğer,  bir modelin,  her bir  modül  aynı derecede  soyutlamaya sahipse o modele kesin soyutlama 
seviyesi denir. Eğer sahip değilse bu model farklı soyutlama seviyelerinin karışımı olarak 
nitelendirilir. 

1.3.2 IC Tasarımında Soyutlama Seviyeleri  
Bir sayısal devre tasarımının dört soyutlama seviyesi şekilde gösterilmiştir. Modelin fonksiyonel  
tanımlaması davranışsal modelde özetlenir. Burada sistem saati yoktur  ve sinyal geçişleri anahtarlama 
zamanına uyacak şekilde asenkrondur.  Genellikle bu tanımlamalar simüle edilebilir fakat 
sentezlenemezler. 
Bir sonraki adımda, tasarım kombinasyonel mantık ve depolama elemanları olarak bölünür. Buna 
Yazmaç  Transfer Seviyesi(Register Transfer Level (RTL)) denir. Depolama elemanları (flip floplar 
FFs, mandallar(latches) ) sistem saati tarafından kontrol edilir. Senkron tasarımlarda, sadece FF ‘lar 
kullanılabilinirler, çünkü  açık mandallar(transparent latches)(kontrol sinyaliyle sürülen) spike-proof 
değildir. RT seviyedeki tanımlamalar için sadece  yüzde 10-20 arasında VHDL dil yapısı gereklidir ve 
katı bir metodoloji izlenmektedir. RT seviyedeki tanımlamaya sentezlenebilir tanımlama denir.  
Mantık seviyesinde , tasarım lojik kapılarla ve saklama elemanlarıyla bir netlist olarak ifade edilir. Son 
yerleşim hiyerarşinin en altındadır.Hedef teknolojideki farklı hücreler yongaya yerleştirilir ve 
bağlantılar  yönlendirilir(routed). Yerleşimin doğruluğu sağlandığında(verified), devre üretim sürecine 
hazırdır. 

1.3.3 Soyutlama Seviyeleri ve VHDL 
VHDL üstteki üç soyutlama seviyeleri için uygulanabilir. VHDL bir yerleşim tanımlamaya uygun 
değildir. Davranışsal ve RT seviyedeki tasarım girişi genellikle metin editörleri tarafından yapılır. 
Grafik araçları da mevcuttur ancak deneyimli kullanıcılar genellikle kodu elleriyle yazmayı daha kolay 
bulmaktadır. Kapı seviyesinde, VHDL netlist tanımlamalar olarak değiştirilen bir şematik çok yakında 
oldukça karmaşık olmaya meğillidir.  
Bir üst soyutlama seviyesinden daha düşük bir seviyeye geçiş daha çok veya az verimli yazılımlarla 
desteklenir.  
Davranışsal sentez birçok araştırmacıya göre hala bir rüyadan ibaret yalnızca çok basit davranışsal 
modeller sentezlenebilir. Hedef teknoloji için RAM tasarımı yaygın bir uygulamadır, sadece genel 
parametrelerin (genişlik,derinlik,port sayısı,senkronluğu,…) kesinlikle belirtilmesi gerekmektedir.  
Buan rağmen, mantık sentezi, son yıllarda mükemmelleşmiştir. Tasarımcılar kendilerini RT  
seviyesinde tanımlamalar için yeterli olan basit VHDL sınırları içinde  tuttuğu sürece , sentez araçları 
mantık seviyesindeki davranışı üretebilecektir.  
Devam eden araştırmalarım bir sonucu olarak,mantık seviyesinden son yerleşime kadarki adımlar 
verimli alan ve yönlendirme(route) algoritmaları ile dijital standart hücre tasarımı için geniş ölçüde 
otomatikleştirilmiştir. 

1.3.4 Soyut Seviylerin Tanımlamaları 
Davranış seviyesinde tüm sistem modellenebilir. Veri iletim yolu veya kompleks algoritmalar, 
sentezlenebilirliği göz önünde bulundurulmadan tanımlanmalıdır. RTL modellerin simülasyonu için 
tepki(stimuli) davranış seviyesinde tanımlanır. Tepki, modeldeki giriş portlarının sinyal değerleridir ve 
testbençte(testbench) (bazen onaylama bençi de denir) tanımlanır.  
Tasarımcı belirtime(specification) ters düşmeyecek şekilde tutarlı bir giriş tepki kümesi bulma 
konusunda çok fazla dikkat etmeli.Modelden alınan sonuçlar beklenen değerlerle,en basit durumlar 
için,simüle edilmiş sinyal değerlerinin dalga formunun yardımıyla karşılaştırılmalıdır.  
RT seviyesinde, sistem yazmaçlar(registers) ve bellek elemanlarının bir sonraki değerini hesaplayan 
mantık(logic) ile tanımlanır. Kodu iki blok halinde ayırmak mümkündür, tamamen kombinasyonel 
mantıkdan oluşan veya yazmaçlardan oluşan. Yazmaçlar saat sinyalleriyle bağlantılıdır ve 
ardışıl(synchronous) davranışı sağlar. Pratikte, Flip Flopların kombinasyonel mantıktan kesin ayrımı 
genellikle yazmaçları ve uygun güncelleme fonksiyonlarını tanımlayan döngülü ve zamanlı 
işlemlerdir.  
Kapı netlisti RT tnaımlarından sentez araçlarının yardımıyla üretilmiştir. Bu işlem için, hedef teknoloji 
için mevcut kapıları ve onların parametre bilgilerini  tutan bir hücre kütüphanesine ihtiyaç vardır.  
Kapı netlistine dayanarak devrenin yerleşimi üretilmiştir(generated). Sonuçta oluşan kablo uzunlukları 
kapı seviyesi modeldeki karşılığı- yayılma süresine(propagation delay) dönüştürülmelidir. Bu zaman 
simülasyonunun herhangi ek simülatör yazılıma ihtiyaç olmadan gerçekleştirilmesini sağlar. 

1.3.5 VHDL’de Davranışsal Tanımlama  
Bir modelin basit bir belirtim(specification) fonksiyonu gösterilmiştir. Çıkış üç giriş değeri i1, i2 ve i3 
‘e bağlıdır.Ayrıca yeni çıkış değeri giriş değeri değiştirildikten sonra 100ns sonunda hazır olmalıdır.  
Bir davranışsal VHDL tanımlamada, fonksiyon basit bir denklem(ör. i1 + i2 * i3)artı bekleme süresi 
100ns olarak modellenir. En kötü durumda, örneğin 100ns’ye yeni çıkış değerinin hesaplanması için 
ihtiyaç vardır, burada varsayılan.  

1.3.6 VHDL’de RT Seviyesi 
VHDL’de fonksiyonel davranış sözde süreçler ile modellenir. RT seviyesi tanımlamalarında iki farklı 
tipte süreç bulunmaktadır: tamamen kombinasyonel süreç (combinational process) ve saatsel 
süreç(clocked process). Tüm saatsel süreçler Flip Floplar olarak ifade edilir ve durum makinesi 
sözdizimi(state machine syntax) kurallarına göre tanımlanır.  
RT seviyesi modellemede, veri girş ve çıkış sinyaline ek olarak, kontrol sinyali-modül saati 
gibi(CLOCK) ve asenkron sıfırlanabilir FF için sıfırlama (RESET) dikkate alınmalıdır. Senkron 
sıfırlama stratejisi kullanıldığında, sıfırlama girişi sıradan bir veri girişi olarak işleme alınır.  
Buna takiben, RT seviyesi VHDL kodu, depolayabilir ve depolayamayan elemanlar olarak bölünmüş 
fonksiyonel davranışa ek olarak bazı yapısal bilgiler içermektedir. Sinyal değerleri güncellendiğinde 
zamanlama konusu ayrıca göz önünde bulundurulmalıdır. 

1.3.7 VHDL’de Kapı Seviyesi 
Bir VHDL kapı seviyesi tanımlaması  tasarımda kullanılan bir kapı(bileşenleri) listesi 
içermektedir.Diğer kısım  bileşenlerin gerçek örneklemini  ve onların karşılıklı 
bağlantılarının(interconnection) listesini tutmaktadır.  
Bir dijital devrenin kapı yapısının şematiği resmin sol kısmında görülmektedir.Sağ kısım ise uygun 
VHDL tanımlarının bir bölümünü göstermektedir.Devredeki her bir tek eleman(ör: ND2), bağlı 
olduğu uygun sinyallerle(n192, n191, n188) desteklenmektedir. Kullanılan tüm kapılar seçilen 
teknolojinin kütüphanesinin bir parçasıdır ve burada alan(area), yayılma süresi(propagation delay), 
kapasite(capacity), vb. bilgiler kaydedilmiştir. 

1.3.8 Soyut Seviyenin Bilgi İçeriği 
(Information Content of Abstraction Levels) 
Davranış model, bir devrenin davranışını tanımlamanın basit bir yoludur, alışılmış yazılım 
programlama dilleri PASCAL veya C ‘ye benzer şekilde. Bu tanımlamadan yola çıkarak sadece 
fonksiyonel davranış VHDL simülatörü ile simüle edilebilinir.  
Saat darbesi, RT seviyesi tanımlaması için ayırt edici özelliktir. Tüm işlemler saat sinyaliyle 
ilişkilendirilmiştir. RT seviyesi simülasyon gerçek zamanlı davranış hakkında herhangi bir bilgi 
vermez, tüm sinyallere bir saat periyodunda sabit değerler atanmıştır yada atanmamıştır demek 
imkansızdır.  
Model, mantık seviyesinde tanımlandığında, kullanılan kapılara göre bekleme süreleri simülasyon için 
uygulanmıştır. Zamanlama bilgisi sentez kütüpanesinin bir parçasıdır.Bu zamansal davranışın 
onaylanmasını hızlı bir şekilde yapılmasına olanak sağlar. Sinyal kablolarının gecikme sürelerinden 
kaynaklanan kararsız sistemler henüz göz önüne alınmamıştır. Büyük tasarımlardaki tüm beklemeler 
çok iyi makyajlanmıştır.  
Yerleşim tamamlandığında, kablo uzunlukları ve bunlardan kaynaklanan gecikme süreleri bilinmiş 
olmaktadır. Tasarım, tüm devrenin zamanlama davranışı ve gecikme süreleri ile kapı seviyesinde 
simüle edilebilmektedir. Ancak devre hakkında bilgi arttıkça simülasyon süresi gözle görülür şekilde 
artmaktadır bu da kompleks tasarımlardaki küçük parçaların zamanlama simülasyonu için kısıt 
oluşturmaktadır. 

1.4 Modülarite ve Hiyerarşi 
  Tasarımın bölümlere ayrılması  
  Karmaşıklığı sınırlama  
  Takımçalışmasına imkan vermesi  
  Alternatif gerçekleştirmeleri 
çalıştırabilmesi  
  Yazılımsal makrolar  
  Simülasyon modelleri 
Modülarite, büyük fonksiyonel blokların küçük birimler şeklinde parçalara ayrılmasına ve birbiriyle 
yakın ilişki içerisinde olan birbirini içeren parçaları gruplamaya izin verir,bunlara modül denir. Bu 
yönden, karmaşık bir sistem yönetilebilinir alt parçalara bölünebilir. Parçalara ayırmanın metodu 
tasarımdan tasarıma değişebilmektedir. Genelde fonksiyonel durum parçalamadaki kısıt olarak göz 
önünde bulundurulur.İyi tanımlanmış altsistemlerin varlığı aynı proje üzerinde çalışan birçok 
tasarımcıya paralel çalışma imkanı sunar, her bir tasarımcı kendi bölümünü tam bir sistem olarak ele 
alabilir.  
Hiyerarşi, modüllerden oluşmuş bir tasarımın yapılmasını sağlar, bu modeüller de (alt)modüllerden 
oluşmuş olabilir. Bir seviyedeki hiyerarşik tanımlama bir veya birden fazla modül içerebilir, herbir 
modül farklı derecelerde soyutlamaya sahiptir. Bu modüller kendisinden bir alt seviyedeki hiyerarşik 
seviyedeki alt modülleri içermektedir.  
Modülarite ve hiyerarşi bir projenin tasarımının basitleştirilmesinde ve düzenlenmesine yardımcı 
olmaktadır. Bir başka avantajı ise modüller için farklı gerçekleme alternatiflerinin incelenmesini 
sağlamaktadır. Tüm model için sadece belirtilen parçanın örnekleminin değiştirilmesine ihtiyaç 
duyulabilir. Aynı zamanda analog arayüzler VHDL de modellenebilir ve simülasyon için sistem 
modeline eklenebilir. Bazen, araçların simülasyon modelleri , yeni tasarıma bağlanmış olabilir ve test 
aşamasında bir simülasyonun gerçek çalışma ortamı altında testi  kullanılabilinir.  
1.5 Özet 
  Donanım ve yazılım kavramları  
  Sistem tasarımının parçası olarak donanım  
  Davranışsal ve RTL sitili  
  Yapısı  
  Eş zamanlılık (simultaneity)  
  Sıralı ifadeler  
  Zamanlama davranışının tanımlanması mümkündür  
  Model tasarımı ve doğrulanması için bir dildir. 
VHDL’de dijital bir sistemi modellemek için donanım ve yazılım kavramları mevcuttur. Sentez için 
RT seviyesi modelleme ve salt davranışsal model arasında bariz bir fark vardır.  
VHDL dijital bir sistemin yapısal(modüler) ve hiyerarşik tanımlanmasına  izin vermektedir.  
VHDL için uyumluluk önemli bir kavramdır: Birbiriyle uyumlu ifadeler sanal olarak paralel olarak 
yürütülürler. Simülasyon olayların peşpeşe işlemesidir. Eğer kaçınılmaz bir olay gerçekleştiyse , bu 
olayla ilgili işlemler hemen tetiklenir(triggered). Bu işlemler birbiri ardına gerçekleştirilen sıralı 
ifadeleri içerir. Her bir işlem başlı başına koşutzamanlı(concurrent) ifadeler olarak görülebilinir.Bu 
yönden, sinyal değerlerinin değişimine, simülasyonda birçok işlemin aynı zamanda gerçekleştirilmesi 
neden olmaktadır.  
Bununla birlikte, VHDL de zaman davranışını tanımlamak mümkündür. Bu diğer dillerdeki gibi test 
amaçlı uyarıların oluşturulmasını veya son tasarımdaki zamanın doğrulamayı ortadan kaldırmıştır.  

2. VHDL Dili ve Sözdizim(Syntax) 
  Genel Yapısı  
  Tanıtıcılar(Identifiers) 
  İsimlendirme Kuralları(Naming Convention) 
2.1 Genel Yapısı 
---------------------------------- 
-- VHDL Kodu Örneği -- 
---------------------------------- 
signal mySignal: bit;        -- örnek sinyal  
MYsignal <= '0',                           -- '0' dan başlar 
                     '1' AFTER 10 ns,     -- ve diğer duruma geçer  
                     '0' after 10 ns,         -- her 10 ns de bir 
                     '1' afTer 10 ns; 
• Büyük küçük harf duyarlı 
değildir. 
• Açıklamalar: '--' den başlar satır 
sonuna kadar devam eder 
• İfadeler(statement) ';' ile 
sonlandırılır 
(birden fazla satıra yayılabilir) 
• Liste sınırlandırıcısı: ',' 
• Sinyal ataması: '<=' 
• Kullanıcı tanımlı isimler: 
o harfler, sayılar, altçizgi 
o bir harfle başlanır 
VHDL büyük küçük harf duyarlı değildir.Bu da VHDL kaynak kodu için kendi kurallar belirlememiz 
gerekliliğini ortaya koyar.Örneğin, VHDL anahtar sözcükleri(keyword) küçük harflerle, kendi 
tanımladığımız tanıtıcılara(identifier) büyük harfler kullanabiliriz. Bu kural bundan sonraki sayfalar 
için geçerli olacaktır. Böylece anahtar sözcüklerle kendi tanıtıcılarımız arasındaki fark kolaylıkla 
anlaşılacaktır kodu okumak daha kolay olacaktır. 
VHDL‘de ifadeler(statements) noktalı virgül(‘;’) ile sonlandırılırlar. Bu istediğiniz şekilde satır arası 
veya boşluk oluşturabileceğiniz yada silebileceğiniz  anlamına gelmektedir. VHDL 
derleyicisi(compiler) sadece noktalıvirgülü(‘;’) göz önünde bulundurur.  
Liste normalde virgül(‘,’) ile birbirinden ayrılır. Sinyal atamaları  kompozit atama operatörü '<=' ile 
gösterilir.  
VHDL 87 standardında kendi tanımlamalarımız harfleri, sayıları ve altçizgi içerebilir ancak muhakkak 
bir harfle başlamak zorundadır. Hiçbir VHDL anahtar sözcüğü kendi tanımlamamız olarak 
kullanılamaz. VHDL 93 standardı daha esnek tanımlama yapabilmemize olanak sağlamıştır. 

2.1.1 Tanıtıcı(identifier) 
mySignal_23      -- normal tanıtıcı 
rdy, RDY, Rdy    -- özdeş(aynı) tanıtıcılar 
vector_&_vector  --  X : özel karakter ’&’  
last of Zout     --  X : boşluklu(white spaces) 
idle__state      --  X : ardarda altçizgili 
24th_signal      --  X : r a k a ml a  başlayan 
open, register   --  X : VHDL anahtar sözcükler 
X:kullanılamayan yapılardır.   
    * (Normal) Tanıtıcı 
          o Harfler, rakam, altçizgiler 
          o Büyük küçük harf duyarsızdır. 
          o Ardarda iki altçizgi kullanılamaz 
          o Bir harfle başlamak zorundadır 
          o VHDL anahtar sözcükler kullanılamaz 
VHDL 87 standardıyla tanımlanmış basit tanıtıcılar harf, rakam ve altçizgi içerebilir.Bu nedenle 
'mySignal_23' geçerli bir tanıtıcıdır. Bununla birlikte VHDL büyük küçük harf duyarsızcır bu nedenle 
'rdy', 'RDY' ve 'Rdy' birbirinin aynıdır. '24th_signal' geçersiz bir tanıtıcıdır çünkü ilk harfi bir rakamla 
başlamış, ilk harf muhakkak bir harf olmak zorundadır. Ayrıca grafiksel karakterler, boşluk, ardarda 
altçizgiler ve VHDL anahtar sözcüklere izin verilmez.  
VHDL 93 standardında yeni bir tipte tanıtıcılar tanımlanmıştır. Bunlara genişletilmiş(extended) 
tanıtıcılar denmektedir ve bunlar ters kesme işareti’/ ’ arasına alınmıştır. Bu ters kesme işaretleri ile 
herbir karakter, rakam, boşluk ve altçizgi kombinasyonuna izin verilmektedir. Burada önemli olan şey 
ise artık tanıtıcılar büyük küçük harfe duyarlıdır. Böylece'/rdy/', ' / R D Y / ' ve ' / R d y / '  üç farklı tanıtıcı 
haline gelmiştir. 

2.1.2 İsimlendirme Kuralları 
architecture CONVENTION of NOTATION is 
end architecture CONVENTION ; 
• VHDL anahtar sözcükler küçük harfle 
yazılır 
• Önemli yerler koyu harflerle yazılır. 
Anahtar sözcük 'architecture'  'end' anahtar 
sözcüğünden sonra gelebilir 
• VHDL'93 standardırnı açıklayan sözdizimi  
Çıkış(output) portu modları birbirine uymak 
zorundadır 
• Özel konulara yada sorunlara dikkat çekmek 
için kullanılır 
Genellikle sentezlenemez 
• Sentezle ilgili kısıtlara dikkat çekmek için 
kullanılır 
Dizilerin yönü  herzaman aynı yönde 
tanımlanmalıdır. 
• Dili etkili bir biçimde kullanmak için ipucu 
verir 
İsimlendirme kuralları, anahtar sözcükler küçük harfle yazılır, kullanıcı tanımlı tanıtıcılar ise büyük 
harflerle yazılır. Eğer bir şeye dikkat çekmek isteniyorsa koyu harflerle yazılır.  
Burada birçok kendini açıklayan ikon vardır. Bunlar VHDL'93 sözdizimi(syntax) (VHDL'87 ile 
karşılaştırma) hakkında özel konuları gösterirler. 
2.2 VHDL ‘in Yapısal Elemanları  
• Varlık(Entity) : Arayüz(Interface) 
• Mimari(Architecture) : Gerçekleştirim(Implementation), davranış(behaviour), 
fonksiyon 
• Konfigürasyon(Configuration) : Model zincirleme(model chaining), yapı(structure), 
hiyerarşi(hierarchy) 
• İşlem(Process) : Uyumluluk(Concurrency), olay denetimi(event controlled) 
• Paket(Package) : Modüler tasarım, standart çözüm, veri tipleri, sabitler 
• Kütüphane: Derleme(Compilation), obje(nesne) kodu 
VHDL deki temel birimler varlıklar, mimariler, konfigürasyon ve paketlerdir.  
Bir varlık genelde port listesini içeren bir arayüz tanımlarken,bir mimari ilgili modüllerin 
fonksiyonlarını tanımlar. Genelde bir konfigürasyon sadece simülasyon süreci için kullanılır. Aslında 
konfigürasyon, varlık/mimari çiftini tam bir model için seçen VHDL deki tek simüle edilebilir 
objelerdir. Paketler sık kullanılan veri tipleri, sabitler ve altprogramlar için tanımlamaları tutar.  
Bir diğer önemli yapı ise işlemlerdir. VHDL deki ifadeler doğal olarak kendi içinde uyumludur, bu 
yapı atamaların sıralı olarak gerçekleştirilmesine izin verir . İşin kendi,bir obje olarak incelendiğinde 
eşzamanlıdır(uyumludur). Gerçekte, işlem kodu her zaman yürütülemez. Bunun yerine, beklenen olay 
gerçekleşene kadar işlem askıya alınır.  
VHDL deki bir kütüphane bir dizi derlenmiş VHDL birimlerinin(obje kodunun) mantıksal adıdır. Bu 
mantıksal isim kullanılan simülasyon veya sentez aracı tarafından bilgisayarın dosya sistemindeki bir 
fiziksel yola eşleştirilmelidir(mapped). 

2.2.1 VHDL Objelerinin Bildirimi-
Tanımlanması 
(Declaration of VHDL Objects) 
Entity 
Architecture 
Process/Subprogram 
Package 
Subprogram 
x 
x 
x 
x 
Component 
x 
x 
Configuration 
x 
Constant 
x 
x 
x 
x 
Datatype 
x 
x 
x 
x 
Port 
x 
Signal 
x 
x1(Process) 
x 
Variable 
x2(Subprogram) 
Yukarıdaki tablo farklı objelerin bildirimi için geçerli alanları göstermektedir:  
Bir altprogram(subprogram) C deki bir fonksiyona benzer ve VHDL de tasarım yapılırken birçok kez 
çağırılabilinir. Altprogram, bir varlık(entity), m i ma r i ,  işlemin bildirim kısmında  veya başka bir 
altprogram ve paketin içinde tanımlanabilir. Bir altprogram genelde bir pakette tanımlanır ve birçok 
yerde(mimarilerde) kullanılabilinir.  
Bileşenler(Components) bir üst seviyedeki hiyerarşi seviyesindeki mimariye varlık/mimari çiftine 
eklemek için gereklidir. Bu bileşenler sadece bir mimaride veya bir pakette tanımlanabilirler. Bu 
faydalıdır çünkü eğer bir varlık/mimari çifti birçok mimaride kullanılacaksa bir tek tanımlama 
yapılması yeterlidir.  
Konfigürasyonların(Configurations), kendileri eksiksiz bir VHDL tasarım birimidir. Fakat 
konfigürasyon ifadelerini mimarinin bildirilebilir bölümünde tanımlamak mümkündür. Bu olanak çok 
nadir kullanılır, fakat genel modelden bağımsız bir model yaratmak daha iyidir.  
Sabitler ve veri tipleri tüm kullanılan objeler için tanımlanabilir.  
Port bildirimleri sadece varlıkların içinde izin verilir. Bunlar arayüzde diğer modüllerde kullanılan 
mimari sinyallerini listeler. Ek iç sinyaller mimarilerde,işlemlerde, altprogramlarda ve paketlerde 
tanımlanabilirler. Lütfen dikkat edin, bu sinyaller fonksiyonlarda yani özel bir tip olan altprogramlarda 
tanımlanamazlar. 
Genellikle, değişkenler sadece işlemlerde ve altprogramlarda tanımlanabilirler. VHDL'93’de , global 
değişkenler varlıkların, mimarilerin ve paketlerin içinde belirtilmiş şekilde tanımlanmıştır. 
1. Sinyaller fonksiyonların içinde tanımlanamazlar. 
2. Global değişkenler (VHDL '93) varlıkların, mimarilerin ve paketlerin içinde tanımlanabilirler. 

2.2.2 Varlık(Entity) 
entity HALFADDER is 
   port( 
      A, B:                in   bit; 
      SUM, CARRY: out bit); 
end HALFADDER; 
-- VHDL'93: end entity HALFADDER ;  
• Arayüz tanımlama 
• Davranışsal tanımlama yoktur 
entity ADDER is 
    port( 
      A, B:                 in     integer range 0 to 3; 
      SUM:                out integer range 0 to 3; 
      CARRY:            out bit ); 
end ADDER; 
• Port sinyallerini birbirine bağlama 
o Veri tipleri(integer,bit) 
o Sinyal genişliği(range 0 to 3) 
o Sinyal yönü(in,out) 
‘entity’ anahtar sözcüğü ‘end ’anahtar sözcüğü ile sonlandırıldıktan sonra başka yerlerde de 
kullanılabilinir. 
Yukarıda, bir tam toplayıcı(full adder), iki yarım toplayıcıyı(half adder) ve bir VEYA(OR) kapısını 
içerecek şekilde adım adım oluşturulmuştur. Kendimizi tamamen yapısal bir tasarımla kısıtlamaktayız, 
örneğin kapı seviyesi tanımlama kullanıyoruz ve herhangi bir sentez aracına ihtiyaç duymuyoruz. 
Temel fikir farklı VHDL objeleri arasındaki ilişkiyi hiçbirşey açıkta kalmayacak şekilde tanıtmak.  
Bir modülle onun çevresi arasındaki arayüz varlık bildirimi ' entity ' anahtar sözcüğü ile tanımlanır. 
Bunu kullanıcı tanımlı bir (tanıtıcı)tanımlayıcı isim takip eder, burada: HALFADDER kullanılmıştır . 
Arayüz tanımlama ‘is’ anahtar sözcüğü aralarına yerleştirilir ve varlık ifadesinin sonlandırılması ‘end’ 
anahtar sözcüğü ve varlığın ismiyle sağlanır. VHDL’93 standardında ‘entity’ gerekirse ‘end’ den 
sonra yeniden kullanılabilir.  
Giriş ve çıkış sinyalleri ve onların tipleri port ifadelerinde ' port ' anahtar sözcüğü ile tanımlanır. 
Portların listesi '(' ')' içerisinde bulunur.Listedeki her bir eleman için önce portun adı daha sonra da‘:’ 
kullanılır. Listenin içinde ';' sembolü elemanları bölmek için kullanılır, bir ifadeyi sonlandırmak için 
değil. Bu nedenle listenin son elemanından sonra ';' ge l m e z !   
Aynı moddaki birçok port ve veri tipi port adları ',' ile ayrılarak tek bir port ifadesiyle tanımlanabilir. 
Port modu veri akışını tanımlar(in:input(giriş),sinyal modülün davranışını etkiler;  out:output(çıkış), 
sinyal değeri modül tarafından üretilir), veri tipleri ise sinyalin simülasyonda kullanılırken alacağı 
değerlerin aralıklarını tanımlar. 

2.2.3 Mimari(Architecture) 
entity HALFADDER is 
   port( 
      A, B:                in   bit; 
      SUM, CARRY: out bit); 
end HALFADDER; 
architecture RTL of HALFADDER is 
begin 
   SUM      <= A xor B; 
   CARRY <= A and B; 
end RTL; 
-- VHDL'93: end architecture RTL ;  
• Tasarımın gerçekleştirilmesi 
• Herzaman belirli bir varlık ile bağlıdır 
o Bir varlık birçok mimariye sahip olabilir 
o Varlık portları mimarideki sinyaller olarak 
kullanılabilinirler. 
• Koşutzamanlı(aynı zamanda olan) ifadeler içerirler 
'architecture' anahtar sözcüğü 'end' ile sonlandırıldıktan sonra tekrar edebilir. 
Mimari bir davranışsal tanımlama(davranışsal seviye veya eğer sentezlenebiliyorsa RT seviyesi) veya 
bir yapısal netlist veya bir karışım alternatiflerinden birini bir varlık için gerçekler(implement).  
Bir mimari kesinlikle belirli bir varlığa bağlanmalıdır. Bir varlık, içerisinde birden fazla mimari 
barındırabilir, örneğin aynı algoritmanın farklı gerçekleştirmeleri veya farklı soyutlama seviyesi. Aynı 
varlığın farklı mimarileri farklı şekilde isimlendirilmelidir ki ayırt edilebilir olsun. İsim 'architecture'  
anahtar sözcüğünden sonra gelmelidir. 'RTL' bu açıdan seçilmiştir.  
Bunu takiben ' of ' anahtar sözcüğü kullanılır  ve varlığın ismi arayüz('HALFADDER') olarak 
kullanılır. Mimarinin başlığı  ' is ' ile sonlandırılır, varlık ifadelerindeki gibi. Bu açıdan ' begin '  
anahtar sözcüğü ifade sonlandırılmadan önce biryerlere koyulmalıdır. Buvarlık ifadelerindeki gibi 
yapılır: ' end ' anahtar sözcüğü mimari isminden sonra kullanılır. Bir kez daha VHDL'93 ‘de ' 
architecture '  anahtar sözcüğü ‘end’ kullanıldıktan sınra gerektiğinde tekrarlanabilir.  
VHDL kodu sentezlenebildiği zaman, RTL bir mimari ismi olarak seçilmiştir.Bu basit fonksiyon 
olduğu takdirde,davranışsal(algoritmik) tanımlama ile arasında bir fark yoktur. Biz 'BEHAVE', 'RTL', 
'GATE', 'STRUCT' ve 'TEST' ‘i sırayla soyutlama seviyesini ve gerçeklenmiş davranışını belirtmek 
için kullanacağız. 'EXAMPLE' ismi, mimari özel bir varlıkla ilişkisi olmayan yeni VHDL elemanı 
gösterdiği zaman kullanılacaktır.  

2.2.4 Mimari Yapısı(Architecture Structure) 
architecture  EXAMPLE  of  STRUCTURE  is 
   subtype DIGIT is integer range 0 to 9; 
   constant BASE: integer := 10; 
   signal DIGIT_A, DIGIT_B: DIGIT; 
   signal CARRY:                DIGIT; 
begin 
   DIGIT_A <= 3; 
   SUM <= DIGIT_A + DIGIT_B; 
   DIGIT_B <= 7; 
   CARRY <= 0 when SUM < BASE else 
                   1; 
end EXAMPLE ; 
• Bildirimsel(Declarative) bölüm: 
o Veri tipleri(data types) 
o Sabitler(constants) 
o Ek sinyaller(additional signals) 
("actual" signals) 
o Bileşenler(components) 
o ... 
• Tanımlama(Definition) bölümü ('begin' den sonraki): 
o Sinyal atamaları(signal assignments) 
o İşlemler(processes) 
o Bileşen örnekleme(component 
instantiations) 
o Koşutzamanlı ifadeler(concurrent 
statements): sıranın önemli olmadığı 
Herbir mimari opsiyonel olan bir bildirimsel bölüme ve tanımlama bölümüne ayrılır.  
Bildirimsel bölüm ' is ' ve ' begin ' anahtar sözcükleri arasında bulunmaktadır. Mimarideki 
sabitler,veritipleri,sinyaller, altprogramlar,vb. yeni objeler burada bildirilir.  
Tanımlama kısmı ' begin '  anahtar sözcüğü ile başlar ve koşutzamanlı(concurrent) ifadeleri 
bulundurur. Bunlar basit sinyal atamaları, işlem durumları, grup olarak birleştirilmiş sıralı ifadeler, ve 
bileşen örneklemleridir. Koşutzamanlılık(aynı anda kullanım-concurrency) demek VHDL kodundaki 
görünme sırası önemli değil demektir. Örneğin SUM sinyali, DIGIT_A ve DIGIT_B nin 
atamalarından bağımsız olarak herzaman (3+7) sonucunu almaktadır.  
Sinyal atamaları ' <= ' operatörü ile sağlanır. Bu sembol veri akış yönünü gösterir, sol taraftaki değeri 
değişecek olan sinyal, sağ taraftaki ise yeni sinyal değerini gösterir.Sağ taraftaki ve sol taraftaki veri 
tipleri birbirinin aynı olmalıdır. Şunu unutmayın ki örnekte kullanılan sinyaller tamamen varlığın port 
bildiriminde tanımlanmıştır. 

2.2.5 Varlık Port Modları 
• in: (giriş) 
o sinyal değerleri yalnızca okunabilir 
• out: (çıkış) 
o sinyal değerleri sadece yazılabilir 
o çoklu sürücüler 
• buffer: (arabellek) 
o çıkış için karşılaştırılabilinir 
o sinyal değerleri okunabilir 
o sadece 1 sürücü 
• inout: (girişçıkış) 
o çiftyönlü(bidirectional) port 
Çıkış portlarının modları birbiriyle eşleşmek zorundadır 
Bir varlığın portunun modu verinin akış yönünü sınırlar. Port modu ' in '   kullanılan mimairideki bu 
sinyallerin sadece okunabilir olduğunu belirtir. Bunların değerlerini değiştirmek mümkün değildir.  
Benzer şekilde ‘out’ port modunda sinyallerin değerleri mimari tarafından üretilir. Portun değerleri 
herhangi bir şekilde davranışı etkileyecek biçimde kullanılmaz. Eğer o anki çıkış değeri bir sonraki 
sinyalin değerini hesaplamak için kullanılacaksa, örneğin bir sayıcı modülü, bir geçiş sinyali 
tanımlanmalıdır. İç sinyallerin onlarla ilgili bir veri akış yönü yoktur.  
Buna alternatif olarak, port modu olarak ' buffer ' kullanılabilinir. Bu ek bir sinyalin tnaımlanma 
gerekliliğini ortadan kaldırır. Ancak, bu sinyaller için sadece bir kaynak kullanılabilir.  
Model yolu için ,çoklu birimler aynı veri hattına ulaşacaksa,’out’ port modu kullanılmalıdır, eğer 
herbir birim sadece bu veri yoluna yazacaksa, port modu ' inout ' çok yönlü veri akışına izin verir. 
Lütfen unutmayın ki port modları birbiriyle uyuşmalıdır, bir altmodülün çıkış portu doğrudan bir üst 
seviyedeki varlığın çıkış portuna bağlanmış olmalıdır.  En kötü olasılıkta, ara sinyaller derleme 
hatalarını önlemek için tanımlanmalıdır. 

2.2.6 Hiyerarşik Model Yerleşimi 
VHDL hiyerarşik model yerleşimine izin vermektedir, bu da bir modül birden fazla altmodülün 
biraraya getirilmesinden oluşmaktadır anlamına gelmektedir. Alt modüllerin birbiriyle bağlantıları 
mimari içindeki üst modül tarafından tanımlanmaktadır. Şekilde görüldüğü gibi ,bir tamtoplayıcı iki 
yarım toplayıcı(module1,module2) ve bir VEYA(OR) kapısının(module3) yardımıyla 
oluşturulmaktadır.  
Yalnızca bir yapısal mimari hiçbir fonksiyonaliteyi tanımlamaz, ve sadece bileşenlerin listesini verir, 
onların örneklemleri ve içbağlantılarının tanımlarını verir. 

2.2.7 Bileşen Bildirimi 
entity FULLADDER is 
   port (A,B, CARRY_IN: in   bit; 
           SUM, CARRY:     out bit); 
end FULLADDER; 
architecture STRUCT of FULLADDER is 
   signal W_SUM, W_CARRY1, W_CARRY2 : bit; 
    component  HALFADDER 
      port (A, B :                in   bit; 
              SUM, CARRY : out bit); 
    end component; 
    component  ORGATE 
      port (A, B : in   bit; 
              RES : out bit); 
    end component; 
begin 
. . . 
• Mimarinin bildirimsel bölümündedir 
• `socket`-tipi için karşılaşılaştırılabilir  
Bileşen port listesi bağlantı sinyallerinin bildirimi ile değiştirilemez 
Tam toplayıcı varlığı blok diyagramdan doğrudan türetilebilir. Girişler A,B ve CARRY_IN gereklidir, 
bununla birlikte SUM ve CARRY sinyalleri ise çıkışları oluşturmaktadır.  
Tamtoplayıcı birçok altmodül içermektedir, önce bunlar tamıtılmalıdır. Bir bileşen bildiriminde tüm 
modül tipleri kullanılacaktır,kullanılmıştır. Bu bildirim mimari ifadesinin ‘begin’ anahtar sözcüğünden 
önce olmak  zorundadır. Şuna dikkat edin ki burada sadece modüllerin arayüzleri verilmektedir, 
onların nasıl kullanıldığı henüz belirtilmemiştir. Bu açıdan bileşen tanımlanması soket 
tanımlanmasıyla karşılaştırılabilinir, eğer uygun varlık daha önce eklendiyse bir yada birden fazla kez 
kullanılabilinir. Bileşenlerin port listesi elemanları lokal elemanlar olarak adladırılırlar, bu onların 
sinyal olmadığı anlamına gelmektedir.  
Bu durumda şunu söyleyebiliriz ki, sadece iki farklı sokete, HALFADDER(yarımtoplayıcı) ve 
ORGATE(VEYAKAPISI) ihtiyacımız vardır. Bileşenlerin isimlerini istediğimiz gibi seçebiliriz ama 
size önerim varlığın adını kullanmanız olacaktır. Buna ek olarak, port tanımlanması birbiriyle aynı 
olmalı. Tasarım birleştirildiğinde , yazılım VHDL konfigürasyonlarını reddedecek ve varsayılan 
kuralları uygulayacaktır bu açıdan kesinlikle gereklidir. 

2.2.8 Bileşen Örnekleme 
architecture STRUCT of FULLADDER is 
  component HALFADDER 
    port (A, B :                in   b it; 
            SUM, CARRY : out bit); 
  end component; 
  component ORGATE 
    port (A, B : in   bit; 
            RES : out bit); 
  end component; 
  signal W_SUM, W_CARRY1, W_CARRY2: bit; 
begin 
    MODULE1: HALFADDER 
     port m a p (  A, B, W_SUM, W_CARRY1 ); 
    MODULE2: HALFADDER 
     port m a p  ( W_SUM, CARRY_IN,  
                     SUM, W_CARRY2 ); 
    MODULE3: ORGATE 
     port m a p  ( 
W_CARRY2, W_CARRY1, CARRY ); 
end STRUCT; 
• Soketleri üret  
• Kaç tane ihtiyacı m   v a r ?  
• Mimarinin tanımlama bölümünün örneklemi  
('begin' den sonra) 
• PCB’de soketleri yerleştir 
• Kablo sinyalleri: 
o Varsayılan:konumsal ilişki 
Eğer bir bileşen tanımlandıysa ,bu artık soket tipi sabittir ve gerekli olan yerlerde kullanılabilir 
demektir. Gerçek soket üretildiğinde bu bileşen örneklemi ile yapılır. PCB(printed circuit board) deki 
soketlerin yerleşimi için karşılaştırılabilir. Varlık/mimari çifti VHDL tasarımı gerçekleştirilirken 
bileşenler sokete yerleştirildiğinde fonksiyonaliteyi sağlar.  
Herbir bileşen örneğine tasarımcı tarafından bileşenin kendi ismiyle birlikte benzersiz bir isim(etiket ) 
daha verilir. Bileşen örnekleme mimarinin tanımlama bölümünde gerçekleşir(‘begin’ den sonra). 
Bileşenlerin seçimi belirtimsel bölümde veya paketteke daha önce tanımlanmış bileşenlerle sınırlıdır.  
Bileşenlerin portları veya soket pinleri  devreye bağlanması için bir port harita ifadesi gereklidir. 
Kullanılacak mimari sinyallerinin isimlerini listelemelidir. Varsayılan olarak, konumsal ilişki kuralları 
uygulanır, örneğin port haritasının ilk sinyali bileşen tanımlamadaki ilk porta bağlanır . 

2.2.9 Bileşen Örnekleme: İsimlendirilmiş 
Sinyal İlişkileri 
entity FULLADDER is 
   port (A,B, CARRY_IN: in   bit; 
           SUM, CARRY:     out bit); 
end FULLADDER; 
architecture STRUCT of FULLADDER is 
   component HALFADDER 
      port (A, B :                 in bit; 
              SUM, CARRY : out bit); 
   end component; 
. . . 
   signal W_SUM, W_CARRY1, W_CARRY2 : bit; 
begin 
    MODULE1: HALFADDER 
                     port m a p  (  A           => A, 
                                     SUM     => W_SUM,  
                                     B           => B, 
                                     CARRY => W_CARRY1 
); 
   . . . 
end STRUCT; 
• İsimsel ilişki: 
o Sol taraf: "resmi" (bileşen tanımlamadan 
gelen port isimleri) 
o Sağ taraf: "şuanki" 
(mimari sinyalleri) 
• Bileşen tanımlama sıralamadan bağımsızdır. 
Bir önceki örnekte  konumsal ilişki yerine, mimari sinyallerini doğrudan seçilen portlara bağlamak 
mümkündür. Bu isimlendirilmiş sinyal ilişkileri ile  yapılmaktadır sinyallerin sırası önemli değildir. 
Bileşen tanımlamadan gelen port ismine “resmiler”(“formals”) ' => ' ile varlığın sinyalleriyle 
”şuankiler” ("actuals") ilişkilendirilirler.  
Örnekte görüldüğü üzere , SUM’ın çıkış portu bileşen tamımlamasında üçüncü sırada yer almaktadır. 
Fakat port haritası ifadesinde, port W_SUM sinyaliyle bağlantısı ikinci sırada yapılmıştır. Unutmayın 
ki port tanımlamasındaki liste elemanları ‘,’ sembolü ile birbirinden ayrılır. 

2.2.10 Konfigürasyon(Configuration)  
entity HALFADDER is 
   port(A, B:                 in   bit; 
           SUM, CARRY: out bit); 
end HALFADDER; 
. . . 
   component HALFADDER 
      port(A, B:                in   bit; 
             SUM, CARRY: out bit); 
   end HALFADDER; 
   signal W_SUM, W_CARRY1, W_CARRY2: bit; 
· · · 
    MODULE1 : HALFADDER 
      port map(A, B, W_SUM, W_CARRY1); 
Varlıklar daha önce belirtilmiş bir bileşen belirtimi olmadan doğrudan 
örneklenebilir. 
Varlıkların tanımlanması ve örneklenmesi gerçekte kullanılan VHDL modellerinden bağımsızdır. 
VHDL konfigürasyon işinde bileşenlerin  ,tam bir tasarım yapmak için, varlık/mimari çiftine bağlantı 
oluşturulur. Özet olarak,bir bileşen tanımlanması kesin bir soket tipinin bileşen örneklenmesi ile 
belirlenmesi demektir. Bir aygıtın örneklenmiş sokete gerçekten eklenmesi konfigürasyon ile 
yapılmaktadır.  
VHDL'93  de varlıklar daha önce belirtilmiş bir bileşen belirtimi olmadan doğrudan 
örneklenebilir. 

2.2.11 Konfigürasyon: İşlemleri ve 
Uygulaması 
entity FULLADDER is 
. . . 
end FULLADDER; 
architecture STRUCT of FULLADDER is 
. . . 
end STRUCT; 
configuration CFG_FULLADDER of 
FULLADDER is 
    for STRUCT   -- select architecture STRUCT 
      -- use default configuration rules 
    end for; 
end configuration CFG_FULLADDER ;  
• En üst seviyedeki, varlık için mimariyi seç 
• Örneklenmiş bileşenler için varlık/mimari 
çiftini seç 
• Hiyerarşiyi oluştur 
• Simüle edilebilir objeler yarat 
• Varsayılan bağlama kuralları: 
o Bileşenle aynı isimdeki varlığı seç 
o Sinyaller isimleriyle ilişkilendirilir 
o Son derlenmiş mimari kullanılır 
'configuration' (konfigürasyon) anahtar sözcüğü 'end' kullanıldıktan sonra tekrarlanabilir. 
Varlıkla mimari arasındaki ilişki konfigürasyonda kullanılan simülasyonla desteklenir, son tasarım 
hiyerarşisini oluşturur. Bu en üst seviye varlık mimarisinin seçimini içerir. Konfigürasyon VHDL deki 
sentezlenebilen ve simüle edilebilen tek objedir. Konfigürasyon sürecinin simülasyon amaçlı elle 
kontrolü mümkün olduğunda, sentez araçları herzaman varsayılan kural kümesini uygular.  
Bunu başarılı bir şekilde gerçekleştirmek için bileşen isimleri ile varolan varlık isimleri birbiriyle 
uyuşmalıdır. Buna ek olarak, port isimleri, modlar ve veri tipleri birbiriyle uyumlu olmalıdır-bileşen 
tanımlamadaki portların sırası önemli değildir.  
Örnek, yapısal mimari için varsayılan konfigürasyonu göstermektedir. Bazı simülatörler bu tip en üst 
seviye varlıklar için kesin konfigürasyon tanımlamalarına ihtiyaç duymaktadır. Bir konfigürasyon özel 
bir varlığı tercih eder,burada FULLADDER(tamtoplayıcı). Mimari STRUCT(yapı) ilk 'for'  ifadesiyle 
seçilmiştir. Bundan başka herhangi bir konfigürasyon komutu verilemediği için, diğer bileşenler için 
varsayılan kurallar uygulanacaktır. 

2.2.12 Konfigürasyon: Örnek (1) 
entity FULLADDER is 
   port(A, B, CARRY_IN: in   bit; 
          SUM, CARRY:      out bit); 
end FULLADDER; 
architecture STRUCT of FULLADDER is 
   component HALFADDER 
      port(A, B:                in   bit; 
             SUM, CARRY: out bit); 
   . . . 
   signal W_SUM, W_CARRY1, W_CARRY2: bit; 
begin 
   MODULE1: HALFADDER 
      port map (A, B, W_SUM, W_CARRY1); 
   MODULE2: HALFADDER 
      port map(W_SUM, CARRY_IN, SUM, W_CARRY2); 
   . . . 
end STRUCT; 
entity A is 
   port(A, B:                in   bit; 
          SUM, CARRY: out bit); 
end A; 
architecture RTL of A is 
· · · 
entity B is 
   port(U,V: in   bit; 
          X,Y: out bit); 
end B; 
architecture GATE of B is 
· · · 
Şekilden ve koddan anlaşıldığı üzere bir tamtoplayıcının kodu görülmektedir. Şekille kodu 
eşleştirmeye çalışın. 
Elemanların portları mimarinin sinyalleriyle, pozisyonları yardımıyla bağlantı kurulmuştur, ör. ilk 
sinyal ilk portla bağlantılıdır. 
HALFADDER(yarımtoplayıcı) varlığı kullanılamaz ancak bunun iki varlığı A ve B ‘nin RTL ve 
GATE diye farklı mimarileri vardır ve bunlar kullanılabilinir.Her iki varlık da eleman tanımlamasıyla 
uyuşmaktadır. 

2.2.13 Konfigürasyon: Örnek(2)  
configuration CFG_FULLADDER of 
FULLADDER is 
   for STRUCT 
       for MODULE2: HALFADDER 
          use entity work.B(GATE); 
          port map ( U => A, 
                          V => B, 
                          X => SUM, 
                          Y => CARRY ); 
       end for; 
       for others : HALFADDER 
          use entity work.A(RTL); 
       end for; 
   end for; 
end CFG_FULLADDER; 
• Varlık/mimari çifti aşağıdakiler kullanılarak seçilir: 
o Örnek isimleri 
o 'all':kullanılan eleman için tüm örneklemler 
o 'others': tam olarak bahsedilmemiş tüm 
örneklemler 
• Eğer port isimleri farklıysa  
=> port harita ifadesi 
• Varolan bir altmodülün konfigürasyonuna referans 
gösterebilme 
Tekrardan FULLADDER varlığı için STRUCT mimarisi seçilmiştir.Bu for döngüsü içerisinde, 
varlıklar ve mimariler alt bileşenler için seçilmiştir.  
Bunun için for ifadesi yeniden kullanılmıştır. ' for ' anahtar sözcüğünden sonra kullanılan ilk isim  
bileşen örnekleminin adıdır,bunu takiben ‘: ’ kullanılır ve bileşenin adı kullanılır.’all’ anahtar sözcüğü 
eğer bir bileşenin tüm örnekleri adreslenmişse kullanılabilir. For döngüsü içinde use ifadesi belirtilen 
objeye kadar olan yoldan varlığı seçer. Açıkça değiştirilmediği sürece, tüm VHDL objeleri kütüphane 
işi üzerinde derlenir.Seçilen varlık için mimari, '('  ')' çifti içine alınır.  
B varlığının port isimleri bileşen tanımlamasına uymadığı için port haritası ifadesine gerek vardır. 
Haritayı sırayla yapmak mümkündür ancak okunabilirlik açısından resmi parametrelerle kullanılan 
isimler eşleştirilmelidir.  
Ayrıca henüz konfigüre edilmemiş diğer bileşenler ‘others’ anahtar sözcüğüyle tanımlanabilir. 
MODULE2 için RTL mimarisi kullanılmıştır bunun için port haritasına gerek yoktur çünkü others 
kullanılmıştır.  
Diğer tüm bileşenler varsayılan konfigürasyon kurallarıyla ele alınırlar.  
Büyük tasarımlarım hiyerarşi tanımlamasını  kolaylaştırmak için, altmodüllerin konfiügrasyonlarını 
tanımlamak ve en üst seviyedeki bu konfigürasyonlara referans vermek gerekir. 

2.2.14 İşlem(Process) 
entity AND_OR_XOR is 
  port (A,B :                                in    bit; 
           Z_OR, Z_AND, Z_XOR : out bit); 
end AND_OR_XOR; 
architecture RTL of AND_OR_XOR is 
begin 
   A_O_X:  process  (A, B)   
    begin 
      Z_OR   <= A or    B; 
      Z_AND <= A and B; 
      Z_XOR <= A xor  B; 
     end process  A_O_X ; 
end RTL; 
• Sıralı olarak yürütülen ifadeler içerir 
• Sadece bir mimarinin içinde bulunur 
• Birçok iş aynı zamanda yürütülebilir 
• Yürütüm (Execution) şunlarla kontrol edilir: 
o Hassaslık listesi(sensitivity list) 
(tetikleyici sinyallerini içerir), veya 
o Bekleme ifadeleri 
• İşlem etiketi isteğe bağlıdır 
Bir mimari içindeki ifadeler aynı anda oluşan başka VHDL yapılarını yönetmek için  sıralı davranışı 
gerçekleştirmek için gereklidir. Bir işlem, mimarideki diğer ifadeler gibi davranmaktadır ve geleneksel 
programlama dillerindeki gibi biri diğerinden sonra gelen ifadeler içerirler. Aslında işlem ifadelerini 
VHDL ifadelerindeki koşutzamanlı tek ifade olarak kullanmak mümkündür.  
Bir işlemin gerçekleştirilmesi olayların tetiklenmesiyle ilgilidir. Olası olay kaynakları hassasiyet 
listesinde veya kesin bekleme ifadelerinde listelenmiştir ve gerçekleştirmenin akışını kontrol etmek 
için kullanılır. Bu iki seçenek birbiriyle karşılıklı ilişkilidir birinden biri olabilir yalnızca,hassaslık 
listesinde bekleme ifadesi olamaz. Hassasiyet listesi sentez araçları tarafında yok sayılır, bir VHDL 
simülatörü listelenmiş sinyallerden biri değiştiğinde işlem kodunu çağırır. Tüm sinyaller 
kombinasyonel süreç içerisinde okunmuştur, bu davranışı etkiler,hassasiyet listesinde bahsedilmiş 
olmalıdır ki sentezlenmiş donanım simülasyonla aynı sonucu üretsin. Elbette aynısı zamanlı işlemler 
içinde geçerlidir, yeni girilmiş değerler herbir aktif saat darbesinde hesaplanırlar. Bu nedenle 
hassasiyet listesi saat sinyallerini ve asenkron kontrol sinyallerini de içerir(reset-sıfırlama).  
Bir işlem ifadesi isteğe bağlı bir etiketle başlar ve ‘:’ sembolünden sonra  ' process ' anahtar sözcüğü 
takip eder. Hassasiyet listesi isteğe bağlıdır ve '(' ')' çifti arasında tanımlanır. Mimari ifadesine benzer 
olarak , tanıtılan bölüm başlık kodu ile ‘begin’ anahtar sözcüğü arasında bulunmaktadır. Sıralı ifadeler  
' begin ' ve ' end process ' arasında bulunmaktadır. Anahtar sözcük ' process ' tekrarlanmalıdır. Eğer 
bir etiket bir işlem için seçildiyse son ifadede tekrarlanmalıdır. 

2.2.15 VHDL İletişim Modeli 
• İşlemler koşutzamanlı(aynı zamanda olan-
concurrent) ifadelerdir 
• Birçok işlem 
o Paralel çalışır 
o Hassasiyet listesindeki sinyallerle 
birbirine bağlıdır 
o İfadeler sıralı olarak gerçekleştirilirler 
• Diğer bir varlık/mimari çiftinin işlemine 
bağlantı varlık arayüzü ile sağlanır 
2.2.16 Signals 
• Her bir sinyalin kendine belirli bir veri tipi olmalıdır 
o Olası değerlerinin sayısı 
• Önceden tanımlı veri tipleri 
o bit, bit_vector, integer, real, ... 
• Kullanıcı tanımlı veri tipleri 
o Donanım modeline daha uyumlu 
o Okunabilirliği daha gelişmiş 
o Gelişmiş hata tesbiti 
 Her bir sinyalin önceden tanımlı bir veri tipi vardır bu sinyalin alabileceği değerlerin sayısını 
kısıtlamaktadır. Sentezlenebilir veri tipleri sadece berlirli sayıda değere izin verir. Bu değerleri bir dizi 
kabloya atayabilir. Sadece temel veri tipleri önceden tanımlanmıştır VHDL de, bit, bit vektörü ve tam 
sayılar(integer) gibi.  
Kullanıcı kendi veri tipini tanımlayabilir,bu modelin daha iyi gelişmiş bir yapıda olmasını 
sağlar(üçdurumlu sürücüler,ör. Yüksek düşük voltaj seviyesi yerine yüksek empedans kurulabilir), 
daha okunabilirdir ve otomatik hata tesbitine izin verir(ör. Alabileceği değer aralığını kısıtlayarak). 

2.2.17 Paket(Package)  
• Bir dizi tanımlama,veritipi,altprogramdan oluşur 
• Referans tasarım ekibi tarafından yapılır  
• Herhangi bir değişikliği tasarım ekibi derhal öğrenir 
o Aynı veri tipleri ("downto vs. to") 
o Herkes için genişletilmiş fonksiyonlar 
o Herkesin hataları temizlenir 
 Bir paket, veri tiplerinin, altprogramların, sabitlerin, vb tanımlamalardan oluşur. Bu takım çalışması 
için kullanışlıdır böylece herkes aynı veri tipleri,vb çalışacaktır. Bu farklı tasarımcıların modüllerinin 
bir araya getirilip VHDL model in oluşturulmasını kolaylaştırmaktadır.  
Bir paketi başlık(header) ve gövde(body) olarak bölümlere ayırmak mümkündür. Paketin başlığı, 
fonksiyon veya prosedürün prototip belirtimi, gerekli tüm veri tiplerinin,vb tanımlanamsını içerir. 
Altprogramın gerçek implementasyonu(gerçekleştirimi) gövdede yer almaktadır. Bu derleme sürecini 
kolaylaştırmaktadır, çünkü kısa paket başlıkları kullanılan VHDL kodunun belirtim / tanımlamalarına 
(declarations/definitions) uyumlu olmalıdır  .  
Bir pakete bir kullanım ifadesiyle referans verilir. Anahtar sözcük ' use '  ‘u seçilen isim “selected 
name” takip eder. Bu isim paketin yer aldığı kütüphanenin ismini içerir, paket isminin kendisi ve obje 
ismi referans gösterilmiş olunur. Genellikle  ' all ' anahtar sözcüğü pakette görünen tüm objelere 
referans göstermek için kullanılır. 

2.2.18 Kütüphane(Library) 
Bir kütüphanede tüm incelenmiş objeler yani paketler, paket gövdeleri, varlıklar, mimariler ve 
konfigürasyonları bulabilirsiniz. VHDL ‘de kütüphane, derlenmiş objelerin grup halinde bulunduğu ve 
referans verilebildiği mantıksal isimdir. Varsayılan kütüphaneye “work”(“çalışma”) denir. Bu 
mantıksal isim diğer mantıksal kütüphane isimlerine şekildeki gibi eşlenmiş olabilir, fakat mutlaka bir 
depolama aygıtına fiziksel yolla eşlenmiş olmalıdır.   
Genellikle her bir tasarımcı kendi çalışma kütüphanesi üzerinde çalışır. Ancak diğer kütüphanedeki 
birimleri de kullanabilir, örneğin veri tutmak için (PROJECT_1 ve PROJECT_XY), kullanılan proje 
paketleri(USERPACK). Eğer WORK den başka bir kütüphane kullanılacaksa, bu VHDL derleyici 
tarafından görülebilir hale getirilmeli. Bu da kütüphane ifadesinin  ‘ library ‘ anahtar sözcüğünden 
sonra kütüphanenin mantıksal ismi kullanılarak yapılır. Örneğin IEEE sıklıkla kullanılır çünkü birçok 
standartlaşmış paketi içerir. 

2.2.19 Tasarım Yapısı: Örnek 
 Örnekte görüldüğü gibi tasarım dört modelden oluşmaktadır. En üstte MONITOR modülü 
bulunmaktadır, bu da üç alt modülü kullanmaktadır. Bunlar; CTRL, DATA_IN ve DATA_OUT alt 
modülleridir. 
Verinin formatı için olan veri tipleri package P de tanımlanmıştır. Ayrıca bölünmüş paket gövdesi 
package body P yazılmıştır. Package P ‘yi referans gösteren MONITOR, DATA_IN ve DATA_OUT 
modülleri yeni veri tiplerini kullanacaktır. CTRL modülü kontrol sinyallerini işleyecektir, önceden 
tanımlanmış veri tipleriyle modellenmiştir. MONITOR, DATA_IN ve DATA_OUT varlıklarının 
herbiri mimari A(architecture A)’ya sahiptir. İki farklı mimari (SIM ve GATE) CTRL varlığı için 
bulunmaktadır. Simülasyon için bir konfigürasyona ihtiyaç vardır. 
İkinci birimler paket gövdesi ve mimariler gibi doğrudan temel birimlerle(paketler ve varlıklarla) 
bağlantı kurmuştur. Diğer bağlantılar dışarıdan yapılmalıdır. Bu nedenle package P bir use ifadesiyle 
varlıklar belirtilmeden önce referans edilmelidir, uyumlu bir mimari olmasınada gerek yoktur. Son 
tasarımın montajı konfigürasyon ile yapılır, örneğin uyumsuz arayüz gibi hiyerarşi hataları 
konfigürasyon analiz edilirken anlaşılır. Eğer bir varlık için birden fazla mimari varsa , konfigürasyon 
şuan simülasyonun kullandığı mimariyi seçer. 

2.2.20 Derleme Sırası 
• İlk birimler ikinci birimlerden önce analiz edilir  
o Mimariden önce varlıklar gelir 
o Paket gövdesinden önce paket gelir 
• Tüm birimler önce analiz edilmiş olmalıdır  
o Paketten sonra varlıklar 
o Varlık/mimariden sonra konfigürasyon  
Derleme sırası modelin bölümlerinin bağımlılıklarına bağlıdır.Eğer bir bağımlılık ağacı çıkarıldıysa, 
düşük seviyeden en üsttekine doğru derleme yapılır.  
İkinci birimler ilk birimlerdeki bilgiler açığa çıkıktan sonra açığa çıkar(arayüz sinyalleri bir mimari 
için bilinmelidir), ikincil birimlerin derlenmesi için birincil birimler derlenmiş olmalıdır.  
Aynı şey referans için de geçerlidir. Bir paket, bu pakete referans gösteren varlıktan önce analiz 
edilmelidir, paket önceden derlenmiş olmalıdır, çünkü varlık veya onun mimarisi, veri tipleri,vb. 
şeyler hakkında bilgiye ihtiyacı vardır. Modülleri derlemek için ikinci kural ise onu referans gösteren  
modüller tarafından referans gösterilmelidir. Bu nedenle konfigürasyon, hiyerarşiyi tasarlar, son olarak 
analiz edilmelidir. 

2.2.21 Görünüm: Testtezgahı-testbenç  
      (Testbench) 
• En üst seviye için VHDL kodu 
• Arayüz sinyali yoktur 
• Tasarımın örneklenmesi  
• Uyarı üretilmesi için ifadeler 
• Basit testbenç (testbench): yanıt analizinin dalga formu denetimi 
ile yapılması 
• Teferruatlı testbenç toplam proje kaynağının %50 den fazlasına 
ihtiyaç duyabilir 
 Stimuli: uyarı 
Response: yanıt 
Bir tasarımı doğrulamak için en sık kullanılan metot simülasyondur. VHDL de ilk alanda dijital 
donanımda simülasyonu sağlamak için geliştirilmiştir, bu dil tarafından iyi bir şekilde 
desteklenmektedir. 
Yeni bir en üst seviye, genellikle testbenç olarak adlandırılır, Test Altında Tasarlama (Design Under 
Test  (DUT)) örneklemek ve çevresini modellemek için oluşturulmuştur. Bu nedenle, en üst seviyenin 
varlığının hiç arayüz sinyali yoktur. Mimari ayrıca bazı işlemleri ve DUT için uyarı üreten 
altmodülleri ve bazende DUT’ın yanıtının analizini kolaylaştıran ek işlemleri veya altmodülleri 
içermektedir.  

2.2.22 Basit Testbenç Örneği  
entity ADDER IS 
port (A,B :                in   bit; 
CARRY,SUM : out bit); 
end ADDER; 
architecture RTL of ADDER is 
begin 
ADD: process (A,B) 
begin 
SUM <= A xor B; 
CARRY <= A and B; 
end process ADD; 
end RTL; 
entity TB_ADDER IS 
end TB_ADDER; 
architecture TEST of TB_ADDER is 
   component ADDER 
port (A, B:                in   bit; 
CARRY, SUM: out bit); 
   end component; 
   signal A_I, B_I, CARRY_I, SUM_I : bit; 
begin 
   DUT: ADDER port map (A_I, B_I, CARRY_I, SUM_I); 
   STIMULUS: process 
   begin 
      A_I <= ´1´; B_I <= ´0´; 
      wait for 10 ns; 
      A_I <= ´1´; B_I <= ´1´; 
      wait for 10 ns; 
      -- and so on ... 
   end process STIMULUS; 
end TEST; 
configuration CFG_TB_ADDER of TB_ADDER is 
f or   T ES T 
end for; 
end CFG_TB_ADDER; 
 Örnek basit bir tasarım için VHDL kodunu ve ona uygun testbenci içermektedir. Test edilecek tasarım 
bir ADDER(toplayıcı),bir yarım toplayıcıyı gerçekler. RTL mimarisi tam bir kombinasyonel süreci 
içerir, bu SUM ve CARRY sinyallerini, giriş sinyalleri A veya B değiştiğindeki anda sonuçlarını 
hesaplar. 
Testbenç sağ tarafta gösterilmektedir. Önce boş varlık TB_ADDER tanımlanır. Bir arayüze ihtiyaç 
yoktur bu nedenle port listesi yoktur. Testbençin TEST mimarisinde, ADDER bileşeni ve ara sinyaller 
bildirilmektedir. Ara sinyaller (*_I) bileşen örnekleminin port haritasındaki bileşenlerle bağlantılıdır. 
ADDER bileşeninin giriş portuna bağlı olan sinyaller değerlerini  STIMULUS işleminden almaktadır. 
Yeni değerler her 10ns da bir atanmaktadır. DUT’ın tepkisi, simülatörün dalgaformu gösteriminden 
gözlenebilir.  
VHDL kaynak kodunun en altında, konfigürasyon listelenmiştir. Sadece TB_ADDER varlığı için 
TEST mimarisi belirtilmiştir ve geri kalanlar bileşenlerin isimleri ve varlıklarla özdeş olarak 
varsayılan kurallarla belirtilmiştir. 

2.2.23 Özet 
• VHDL çok kusursuz bir dildir 
o Sinyal tipleri ve yönleri mutlaka uyuşmalıdır 
o Tüm objeler belirtilmelidir 
o Tasarım ve sağlama için uygun bir dildir 
• Sağlama(validation) demek TESTBENCH  
        (testbenç) 
o Uyarı ve buna uygun tepkiyi sağlar  
o En üst hiyerarşi seviyesi 
o Giriş-/çıkış portu yoktur 
VHDL çok katı bir dildir. Her bir sinyal,örneğin, kesin bir veri tipi olması gerekmektedir, ve belirtilen 
yerde belirtilmesi gerekmektedir, sadece aynı veri tipindeki atamaları kabul etmektedir.  
Bir VHDL  modele fonksiyonel bir test uygulamak için, VHDL de bir testbenç yazılmıştır, bu model 
için doğrulama ortamını sağlar. İçinde, uyarılar model için giriş sinyalleri olarak tanımlanırlar , buna 
karşılık modelin verdiği  yanıt test edilir. Testbenç en üst hiyerarşi seviyesinde  bulunmaktadır,ve bu 
nedenle ne giriş ne de çıkış portu vardır. 
2.2.24 Sorular  
Aşağıdaki sorulara sadece evet yada hayır şeklinde cevap verin. 
1.Bir mimari ...  
1.1. ... kendi başına bulunabilir (EVET/HAYIR) 
1.2. ... sadece onunla birlikte olan tasarım varlığıyla bulunabilir. (EVET/HAYIR) 
1.3. ... modülün davranışını içeren bir tanımlama içerir(EVET/HAYIR) 
2. VHDL’de , sıralı ifadeler… 
2.1. ... mimaride tanımlanır (EVET/HAYIR) 
2.2. ... işlemde tanımlanır (EVET/HAYIR) 
CEVAPLAR: 
1.1 :HAYIR   1.2:EVET  1.3:EVET 
2.1:HAYIR  2.2:EVET 
2.2.25 Sorular 
3. Konfigürasyon...  
3.1. ... simüle edilebilir obje üretir. (EVET/HAYIR)  
3.2. ... mimari içinde belirtilir. (EVET/HAYIR)  
3.3. ... belirli bir mimari için varlık seçer. (EVET/HAYIR) 
4. Bileşen bildirimi…  
4.1. ... belirli bir varlık, önceden ayarlanmış bir sokete entegre edilebilir. (EVET/HAYIR)  
4.2. ... sadece soket tiplerini belirler . (EVET/HAYIR)  
4.3. ... varsayılan konfigürasyon için belirli varlıklarla aynı isimde olmalı. (EVET/HAYIR) 
CEVAPLAR: 
3.1:EVET  3.2:HAYIR  3.3: HAYIR 
4.1:HAYIR  4.2:EVET  4.3:EVET 
2.2.26 Sorular 
5. Bileşen örnekleme...  
5.1. ... bileşen tipinin soketini üretir. (EVET/HAYIR)  
5.2. ... soket (=bileşen) den PCB(=varlık)’ye kablo döşer(bağlantı sağlar). (EVET/HAYIR) 
6. Koşutzamanlı(eşzamanlı) ifadeler...  
6.1. ... sadece mimaride bildirilirler. (EVET/HAYIR)  
6.2. ... sadece altprogramlarda bildirilirler. (EVET/HAYIR) 
6.3. ... ard arda yürütülürler. (EVET/HAYIR) 
CEVAPLAR: 
5.1:EVET    5.2:EVET 
6.1:EVET    6.2:HAYIR    6.3:HAYIR 

2.3 Veri Tipleri 
entity FULLADDER is 
   port(A, B, CARRY_IN: in   bit; 
          SUM, CARRY:      out bit); 
end FULLADDER; 
architecture MIX of FULLADDER is 
   component HALFADDER 
      port(A, B:                 in   bit; 
              SUM, CARRY: out bit); 
   signal W_SUM, W_CARRY1, W_CARRY2: bit; 
begin 
   HA1: HALFADDER 
      port map(A, B, W_SUM, W_CARRY1); 
   HA2: HALFADDER 
      port map(CARRY_IN, W_SUM, SUM, W_CARRY2); 
   CARRY <= W_CARRY1 or W_CARRY2; 
end MIX; 
• Her sinyalin bir tipi vardır 
• Tip, mümkün olan değerleri belirtir 
• Tip, sinyal belirtimi yapılırken tanımlanmalıdır… 
• ...ya da… 
o Varlık:port bildiriminde veya 
o Mimari:sinyal bildiriminde 
• Tipler birbiriyle uyuşmalıdır 
VHDL de,sinyallerin alabilecekleri değerleri sınırlamak için bir tip belirlenmesi gerekmektedir. Sinyal 
bidlirilirken bu tip sabitlenmiş olmalıdır, bu da varlık portu yada bir iç mimari sinyali ile yapılabilir. 
Tipler çalışma zamanında değiştirilemezler. Sinyal değerleri değiştirilirken  '<=' atama operatörünün 
her iki tarafının veri tipi birbiriyle uyuşmalıdır. 

2.3.1 Standart Veri Tipleri 
package STANDARD is 
   t y p e  BOOLEAN is (FALSE,TRUE); 
   t y p e  BIT is (`0`,`1`); 
   t y p e  CHARACTER is (-- ascii set); 
   t y p e  INTEGER is range 
                               -- implementation_defined 
   t y p e  REAL is range 
                              --  implementation_defined 
   -- BIT_VECTOR, STRING, TIME 
end STANDARD; 
• Herbir tipin alabileceği olası değerler vardır 
• Standart tipler dil tarafından tanımlanmıştır 
• Kullanıcı kendi tiplerini tanımlayabilir 
Yeni tipler standart pakete eklenmiştir, ör. umlauts. 
Bir dizi veri tipi standart pakette öntanımlı olarak bulunmaktadır. VHDL ‘in yürütülmesinin kontorlü 
için genelde ' boolean '(boole) cebri kullanılmaktadır (' false ', ' true ' ) ( ‘yanlış’,’doğru’) yerine ‘bit’ 
kullanılmaktadır ve (' 0 ', ' 1 ') ile ifade edilmektedir. Sayı değerleri ‘integer’(tamsayılar) veya 
‘real’(reel sayılar) ile ifade edilir. Gerçek değerleri ve doğruluğu platforma göre değişmektedir, 
sadece alt sınır tanımlanır, ör. Tamsayılar(integer) en az 32 bit genişliği garanti eder. Floating 
point(virgüllü sayıların) işlemleri otomatik olarak sentezlenemezler, testbenç uygulamalarında ‘real’ 
veri tipinin kullanımı kısıtlandırılmıştır. Aynı şey ‘character ’(karakter ) ve ‘time’ (zaman) içinde 
geçerlidir.   
' time ' (zaman) özel bir veri tipidir, fiziksel birimden çıkan sayısal değeri içerir. Bir ifadenin 
gerçekleştirilmesini belirli bir zamanda bekletmek için kullanılır, ör. Testbençde veya model kapılar 
için ve gecikme süreleri (propagation delays) için. ' time ' veri tipindeki sinyaller bir ' integer ' ve 
‘real'   ile çarpılıp bölünebilir.  Sonuç yine ' time ' olarak bulunmaktadır. 

2.3.2 'time'(zaman) Veritipi 
architecture EXAMPLE of TIME_TYPE 
is 
  signal CLK : bit := `0'; 
  constant PERIOD : time := 50 ns; 
begin 
  process 
  begin 
    w a i t  for 50 ns; 
    . . . 
    w a i t  for  PERIOD ; 
    . . . 
    w a i t  for 5 *  PERIOD ; 
    . . . 
    w a i t  for  PERIOD  * 5.5; 
  end process; 
· · · 
  -- concurrent signal assignment 
  CLK <= not CLK after 0.025 us; 
  -- or with constant time 
  -- CLK <= not CLK after PERIOD/2; 
end EXAMPLE; 
• Kullanım alanları 
o testbençler 
o kapı beklemeleri 
• Ç a r p m a / b ö l m e  
o integer/real sayılarla çarpılıp bölünebilir 
o geri dönüş tipi yine TIME tipindedir 
o içerden en küçük birimi femto-seconds (fs)’dir 
• Kullanılabilir zaman birimleri 
fs, ps, ns, us, ms, sec, min, hr 

2.3.3 Dizilerin Tanımlanması 
• Aynı tipteki sinyallerin biraraya toplanmasından oluşur 
• Öntanımlı diziler 
o bit_vector (array of bit)(bitlerden oluşmuştur) 
o string (array of character)(karakterlerden oluşmuştur) 
• Sınırlandırılmamış diziler: gerçek boyutu sinyal/port bildiriminde 
ortaya çıkar 
Diziler(Arrays) aynı tip ve anlamdaki sinyalleri gruplamak için kullanışlıdır. VHDL de öntanımlı 
olarak bulunan ve sınırlandırılmamış yani boyutları belli olmayan iki dizi veri tipi vardır bunlar ;' 
bit_vector ' ve ' string ' dir ve bit ve character(karakter) değerlerinden oluşmuştur. Ancak şunu 
unutmayın ki sinyal bildirimi sırasında dizilerin sınırları belirlenmek zorundadır, örneğin 'bit_vector(3 
downto 0)'. Sadece sınırlandırılmış diziler varlık portu veya mimari sinyali olarak kullanılabilinir. 
Integer(tam sayı) sinyaller sentez sırasında bir dizi kabloyla eşleştirilebilinir. Bu kablolar ' bit_vector '  
ile modellenebilir, ' bit_vector ' sinyallerin önceden sayısal bir yorumlamaya gerek yoktur. Bu 
nedenle sentez iki örnek mimari için aynı şekilde sonuçlanmaktadır. İşlem modeli basit bir 
multiplexer(çoklayıcı) için çıkışa(outputZ) gönderilecek giriş değeri seçim(select) sinyaline(SEL) göre 
belirlenir eğer sinyal ‘1’ ise  A girişi (inputA) değilse yani ‘0’sa B girişi (inputB) seçilir.  
Diziler için özellikle dikkat edilmesi gereken şey sinyal atamalarıdır. Bunun için veri tipi ve genişliği 
uyuşmalıdır, bu dizi elemanlarının sırası için geçerli değildir.  Değerler birbirlerine dizideki 
pozisyonlarına göre atanmaktadır, dizine göre değil. Bunun için tasarımınızda (donanım 
uygulamalarında) sadece tek yönde (aşağıya doğru) kullanım önerilir. 

2.3.4 'integer' ve 'bit' Tipleri  
architecture EXAMPLE_1 of DATATYPES is 
   signal SEL :      bit ; 
   signal A, B, Z :  integer  range 0 to 3; 
begin 
   A <= 2; 
   B <= 3; 
   process(SEL,A,B) 
   begin  
      if SEL = '1' then 
         Z <= A; 
      else 
         Z <= B; 
      end if; 
   end process; 
end EXAMPLE_1; 
VEYA:  
architecture EXAMPLE_2 of DATATYPES is 
   signal SEL :       bit ; 
   signal A, B, Z:    bit_vector (1 downto 0); 
begin 
   A <= "10"; 
   B <= "11"; 
   process(SEL,A,B) 
   begin 
      if SEL = '1' then 
         Z <= A; 
      else 
         Z <= B; 
      end if; 
   end process; 
end EXAMPLE_2; 
• ' bit'  ve ' integer' kullanımıyla ilgili örnek 
Integer(tam sayı) sinyaller sentez sırasında bir dizi kabloyla eşleştirilebilinir. Bu kablolar ' bit_vector '  
ile modellenebilir, ' bit_vector ' sinyallerin önceden sayısal bir yorumlamaya gerek yoktur. Bu 
nedenle sentez iki örnek mimari için aynı şekilde sonuçlanmaktadır.  İşlem modeli basit bir 
multiplexer(çoklayıcı)  için çıkışa(outputZ) gönderilecek giriş değeri seçim(select) sinyaline(SEL) 
göre belirlenir eğer sinyal ‘1’ ise  A girişi (inputA) değilse yani ‘0’sa B girişi (inputB) seçilir. 
Multiplexer (çoklayıcı )her iki veri tipindede işlem yapabilmektedir. 
2.3.5 Dizi Tipleriyle Atamalar 
architecture EXAMPLE of ARRAYS is 
   signal Z_BUS : bit_vector (3 downto 0); 
   signal C_BUS : bit_vector (0 to 3); 
begin 
   Z_BUS <= C_BUS; 
end EXAMPLE; 
Elemanlar pozisyonlarına göre atanırlar , dizin sayılarına göre değil 
Dizilerin yönlerinin herzaman aynı yönde olacak şekilde tanımlanması önerilir 
 Diziler için özellikle dikkat edilmesi gereken şey sinyal atamalarıdır. Bunun için veri tipi ve genişliği 
uyuşmalıdır, bu dizi elemanlarının sırası için geçerli değildir. Değerler birbirlerine dizideki 
pozisyonlarına göre atanmaktadır, dizine göre değil. Bunun için tasarımınızda (donanım 
uygulamalarında) sadece tek yönde (aşağıya doğru) kullanım önerilir. 

2.3.6 'bit' Veri Tipi İçin Atama Şekilleri 
architecture EXAMPLE of ASSIGNMENT is 
   signal Z_BUS :     bit_vector (3 downto 0); 
   signal BIG_BUS : bit_vector (15 downto 0); 
begin 
   -- legal assignments: 
   Z_BUS(3) <= `1`; 
   Z _ B U S       <= ``1100``; 
   Z_BUS      <=  b`` 1100 ``; 
   Z_BUS      <=  x`` c ``; 
   Z_BUS      <=  X`` C ``; 
   BIG_BUS  <=  B``0000 _ 0001_0010_0011 ``; 
end EXAMPLE; 
• Tek bit değerleri '.' arasında verilir 
• Vektör değerleri "..." arasında verilir 
o Taban belirtimi kişiye bağlıdır 
(öntanımlı:   b i n a r y)  
o Değerler  altçizgi ile bölünebilir 
okunabilirliğini kolaylaştırmak için 
Tek bit ile bit vektörlerinin belirtimi farklıdır 
'bit'  veri tipi için geçerli olan atamalar tüm karakter dizileri için de geçerlidir, ör. 'std_(u)logic_vector' 
Sinyal değerlerinin belirtimi temel tiplerine göre farklılık göstermektedir, eğer temel tipi 'character' 
ve'bit' ise bunlara uygun dizi tipi  'string' ve 'bit_vector' ’dür. Tek değerler herzaman (') tek tırnakla 
verilir, dizi değerlerini girmek için ise (") çift tırnak kullanılır.  
Bit vektörleri genellikle rakamsal değerleri göstermek için kullanılır, VHDL size bit vektörlerin 
atamalarının okunabilirliğini arttırmak için birçok olasılık sunar. İlk olarak, kullanılacak sayı için bir 
taban belirtilmelidir. Varsayılan olarak ikili(binary) veriler ‘0’ ve ‘1’ düşünülür. Eğer birden fazla 
temel girilecekse kesinlikle çift tırnakla girilmelidir. Ek olarak okunabilirliği arttırmak için 
altçizgiler(_) eklenebilir. 
VHDL’93 standardıyla, aynı özellikler daha gelişmiş bit vektör tipi ' std_(u)logic_vector ' içinde 
geçerlidir, bu tip ilerde daha iyi açıklanacaktır. 

2.3.7 Birleştirme-Bağlama(Concatenation) 
• Concatenation operator: & 
Birleştirme operatörü 
• Resulting signal assignment: 
Sinyal atamasının sonucu 
architecture EXAMPLE_1 of CONCATENATION is 
   signal BYTE                 : bit_vector (7 downto 0); 
   signal A_BUS, B_BUS : bit_vector (3 downto 0); 
begin 
   BYTE   <= A_BUS & B_BUS; 
end EXAMPLE; 
architecture EXAMPLE_2 of CONCATENATION is 
   signal Z_BUS : bit_vector (3 downto 0); 
   signal A_BIT, B_BIT, C_BIT, D_BIT : bit; 
begin 
   Z_BUS <= A_BIT & B_BIT & C_BIT & D_BIT; 
end EXAMPLE; 
Birleşme operatörüne '&' sadece '<=' atama operatörünün sağında kullanıldığı zaman izin 
verilir. 
 Sinyalleri atamak için operatörün her iki tarafındaki veri tiplerinin birbiriyle eşleşmesi gerekmektedir.  
Birleştirme operatörü ' & ' sağındaki ve solundaki aynı veri tipindeki elemanları gruplar. Yine sadece 
dizinin pozsiyonu önemlidir indisi önemli değildir. Birleşme operatörüne '&'  sadece '<=' atama 
operatörünün sağında kullanıldığı zaman izin verilir.  
Sinyalleri atamanın bir diğer sınırlama derdi olmayan acısız yolu, yapıları toplamaktır. Son diziyi 
oluşturacak sinyalleri '(' ')' arasında belirtilir ve birbirinden ',' ile ayrılır. Basit birleştirme 
(concatenation) yerine, bunda dizi elemanlarına kendi indisleriyle erişmek mümkündür.  Henüz adresi 
bilinmeyen indisleri seçmek için de ‘others’ anahtar sözcüğü  kullanılabilir. 

2.3.8 Kümeleme(Aggregates) 
architecture EXAMPLE of AGGREGATES is 
   signal BYTE :  bit_vector (7 downto 0); 
   signal Z_BUS : bit_vector (3 downto 0); 
   signal A_BIT, B_BIT, C_BIT, D_BIT : bit; 
begin 
   Z_BUS <= ( A_BIT, B_BIT, C_BIT, D_BIT ) ; 
    ( A_BIT, B_BIT, C_BIT, D_BIT ) <= bit_vector'(``1011``); 
    ( A_BIT, B_BIT, C_BIT, D_BIT ) <= BYTE(3 downto 0); 
   BYTE <= ( 7 => `1`, 5 downto 1 => `1`, 6 => B_BIT, others 
=> `0`) ; 
end EXAMPLE; 
• Kümeleme sinyalleri bir araya 
toplar 
• Atamanın her iki tarafında da 
kullanılabilinir 
• 'other' anahtar sözcüğü geriye kalan 
tüm elemanları seçmek için 
kullanılır 
Bazı kümeleme yapıları sentez aracı tarafından desteklenmeyebilir  
Bir vektörün genişliği ne olursa olsun tüm bitlerine `0` atamak için:  VECTOR <= (others => '0'); 
Sinyalleri atamanın bir diğer sınırlama derdi olmayan acısız yolu yapıları kümelemektir. Son diziyi 
oluşturacak sinyalleri '(' ')' arasında belirtilir ve birbirinden ',' ile ayrılır. Basit birleştirme 
(concatenation) yerine, bunda dizi elemanlarına kendi indisleriyle erişmek mümkündür.  Henüz adresi 
bilinmeyen indisleri seçmek için de ‘others’ anahtar sözcüğü kullanılabilir. 

2.3.9 Diziyi Bölümleme  
architecture EXAMPLE of SLICES is 
   signal BYTE : bit_vector (7 downto 0); 
   signal A_BUS, Z_BUS : bit_vector (3 downto 0); 
   signal A_BIT : bit; 
begin 
   BYTE (5 downto 2) <= A_BUS; 
   BYTE (5 downto 0) <= A_BUS;                -- y a n l ı ş  
   Z_BUS (1 downto 0) <= `0` & A_BIT; 
   Z_BUS                      <= BYTE (6 downto 3); 
   Z_BUS (0 to 1)          <= `0` & B_BIT;      -- y a n l ı ş  
   A_BIT   <= A_BUS (0); 
end EXAMPLE; 
• Bölme işlemi dizinin elemanlarını seçmektir 
Bölme işlemi “slice” ile dizinin yönü uyuşmalıdır 
Birleştirme ve kümelemenin tersi olan bölümleme, bir dizinin bölümlerinin seçilmesi demektir, sadece 
dizinin bir kısmı kullanılabilinir. Kullanılan dizinin bölümleri parantezlerle belirlenir ve sinyalin 
belirtim tipine uymalı. Tabiki, bir dizinin tek tek elemanlarını seçmek mümkündür. 
İlk yanlışın nedeni A_BUS ın boyutu ile bölümün parçası uyumlu değildir. İkinci yanlışın nedeni ise 
yönleri uyuşmamaktadır. 
2.3.10 Sorular 
Sorulara sadece doğru yada yanlış şeklinde cevap verin. 
7. Dizi atamaları aşağıdaki şekilde yapılır …  
7.1. ...pozisyona göre .(EVET/HAYIR)  
7.2. ...indeksine göre . (EVET/HAYIR)  
7.3. ...opsiyoneldir yerine göre değişir. (EVET/HAYIR) 
8. Bir BIT_VECTOR ‘ün ataması aşağıdaki gibi yapılabilir …  
8.1. ... <= "000111XXUUU00";(EVET/HAYIR)  
8.2. ...<= "0000111000111";(EVET/HAYIR) 
CEVAPLAR: 
7.1:EVET    7.2:HAYIR    7.3:HAYIR 
8.1:HAYIR    8.2:EVET 
9. Aşağıdaki tanımlamalar için hangi atamalar doğrudur? 
   signal A_BUS, B_BUS, Z_BUS :        bit_vector (3 downto 0); 
   signal A_BIT, B_BIT, C_BIT, D_BIT :  bit; 
   signal BYTE :                                     bit_vector (7 downto 0);  
9.1. BYTE  <= (others => `1`); (EVET/HAYIR)  
9.2. BYTE(7 downto4)   <= A_BIT & B_BIT & A_BIT & B_BIT; (EVET/HAYIR)  
9.3. Z_BUS                      <= A_BIT & B_BIT; (EVET/HAYIR)  
9.4. BYTE (3 downto 0) <= (`1`, B_BIT, `0`, D_BIT); (EVET/HAYIR)  
9.5. A_BUS (0 to 1)        <= (others => `0`);(EVET/HAYIR) 
CEVAPLAR: 
9.1:EVET    9.2:EVET    9.3:HAYIR     
9.4:EVET    9.5:HAYIR 

2.4 Genişletilmiş Veri Tipleri 
Standart veri tipleri modelleme işlemlerini yapmak için kısıtlı kalmaktadır. Elbette RAM ve ROM 
hücrelerinin davranışlarını gerçeklemek mümkün olmalıdır, VHDL bu açıdan biraz hantal görülebilir. 
Eğer diğer veri tipleri için diziler kullanılabilirse ,kodlama daha kolay olur.  
Diğer bir durum, ek tipler okunabilirliği arttırmak içindir. VHDL kodu dokümantasyon kadar 
kullanılışı iyi olmalıdır. Sembolik, sinyal değerleri için tanımlama isimleri genellikle kendi kendine 
belgelenebilir kodlara neden olmaktadır. Bu açıklamaların gerekli olmadığı anlamına gelmez.  
Varolan bu iki problem doğrultusunda, veri yolu sisteminin modellenmesi öntanımlı veri tipleriyle bir 
kâbusa dönüşmektedir. Bir veri yolunun ana karakteristiği varolan çoklu yol katılımına bağlıdır, aynı 
sinyal telleri birçok modül tarafından kullanılabilir. Eğer bir araç hiçbirşey iletmiyorsa, çıkış sürücüsü 
diğer değerleri yoketmeyecek şekilde bir değer atanmalıdır. 

2.4.1 Tip Sınıflama 
• Sayısal(Scalar) tipler: 
o Kesin bir değer içerir 
o integer, real, bit, enumerated,physical 
• Birleşik-karma(Composite) tipler: 
o Bir değerden fazla değer içerebilir 
o Dizi(array) : sadece bir tipteki değerler 
o Kayıt(record ): farklı tipteki değerler 
• Diğer tipler O t h e r   t y p e s :  
o “dosya”(file) 
o "giriş"( access) 
VHDL de veri tipleri üç kategoride sınıflandırılmaktadır: sayısal tipleri,birleşik tipler ve diğer tipler. 
Sayısal tiplerin yalnızca bir değeri vardır. Örnekleri öntanımlı integer,real ve bit değerleridir. Fiziksel 
veri tipleri(zaman) bu kategori içindedir , hem de kullanıcı tanımlı veri tiplerinin değer aralıkları 
numaralama(enumeration) bildirilmiş olanları bu kategori içindedir. Sayısal tiplerin ayırt edilebilir 
elemanları yoktur. Diğer taraftan, birleşik tipler, genellikle bir dizi değere sahiptir. Eğer bu değerler 
aynı tipte ise bunlara dizi(array) denir, farklı tiplerde ise kayıt(record) denir.  
Dosya(FILE) ve giriş(ACCESS) tipleri diğer objelere ulaşmayı sağlayan veri tipleridir. Dosya tipi bir 
dosyadan veri okumak veya yazmak için kullanılır; giriş(ACCESS) tipi işaretçilerle (pointers) 
benzerlik göstermektedir. 

2.4.2 Numaralanmış(Enumeration)Tip 
architecture EXAMPLE of ENUMERATION is 
    type T_STATE is (RESET, START, EXECUTE, 
FINISH); 
   signal CURRENT_STATE, NEXT_STATE : 
T_STATE ; 
   signal TWO_BIT_VEC : bit_vector(1 downto 0); 
begin 
   -- valid signal assignments 
   NEXT_STATE         <= CURRENT_STATE; 
   CURRENT_STATE <= RESET; 
   -- invalid signal assignments 
   CURRENT_STATE <= "00"; 
   CURRENT_STATE <= TWO_BIT_VEC; 
end EXAMPLE; 
• Tasarımcı kendi tiplerini tanımlayabilir 
o Gelişmiş okunabilirlik  
(Genelde durum makinelerinin 
durumlarını tanımlamak için 
kullanılır) 
o Kısıtlanmış değerler 
Sentez araçları numaralamayı(enumerations ) uygun bit şablonuyla eşleştirir 
VHDL de yeni bir sayısal veri tipi tanımlamak mümkündür. Bunlara numaralanmış(enumeration) tip 
denir çünkü tüm olası obje (constant-sabit, signal-sinyal, variable-değişkenler)  değerleri tip 
tanımlamada bir listede belirtilmelidir. Kullanıcı tanımlı veri tipleri okunabilirliği arttırmak için sık sık 
kullanılır.  Sabitlenmiş bit şablonları yerine, veri tiplerinin değerlerinin sembolik isimleri kullanılır, 
bunlar bit seviyesi gösterimde sentez esnasında eşleştirilir.  
Örnekte, yeni bir veri tipi dört farklı durumu belirtecek şekilde(RESET, START, EXECUTE, 
FINISH) tanımlanmıştır. Bu tip iki sinyal (CURRENT_STATE ve NEXT_STATE )için kullanılmıştır 
ve belirtilmiş dört tip değeri doğrudan atanmıştır. Elbette sentezden sonra, her bir sinyal için 2 bit 
gereklidir, fakat doğrudan iki bitlik bir vektör atamasına izin verilmez. Bir sinyal ataması sadece 
numaralanmış değerler kullanıldığında yapılabilir.  
Bazı sentez araçları numaralamayı(enumerations ) uygun bit şablonuyla eşleştirir. 

2.4.3 Numaralanmış Tip(Enumeration) -
Örnek 
architecture RTL of TRAFFIC_LIGHT is 
   t y p e   T_STATE is  
          ( INIT,RED,REDYELLOW,GREEN,YELLOW ); 
   signal STATE, NEXT_STATE : T_STATE; 
   signal COUNTER: integer; 
   constant END_RED      : integer := 10000; 
   constant END_GREEN : integer := 20000; 
begin 
   LOGIC : process (STATE, COUNTER) 
   begin 
      NEXT_STATE <= STATE; 
      case STATE is 
         w h e n   RED                    => 
            if COUNTER = END_RED then 
               NEXT_STATE <=  REDYELLOW ; 
            end if; 
         w h e n   REDYELLOW     => -- statements 
           when  GREEN               => -- statements 
         w h e n   YELLOW            => -- statements 
           when  INIT                    => -- statements 
      end case; 
   end process LOGIC; 
end RTL; 
Şekildeki örnekte kullanıcı tanımlı veri tipinin okunabilirliğe olan etkisi gösterilmektedir. Mantık 
bloğu bir trafik lambasının davranışını gerçeklemektedir. Veri tipi T_STATE mimarinin bildirimsel 
bölümünde tanımlanmaktadır ve STATE  ve NEXT_STATE sinyalleri için kullanılmıştır.  
Algoritmadaki fonksiyonel davranışta oldukça açık sembolik isimler kullanılmaktadır. Bu amaçla, kod 
içerisinde kontrol edilen uygun sayıcı değerleri için ek sabitler  tanımlanmıştır. 

2.4.4 BIT Tipi Sorunları  
type BIT is ('0', '1')  
• Sadece `0` ve `1`, değerleri kullanılabilmektedir 
o Varsayılan değer `0`dır 
• Simülasyon ve sentez için ek ihtiyaçlar vardır: 
o Başlangıç durumuna getirilmemiş(uninitialized) 
o Yüksek empedans-özdirenç 
o Tanımlanmamış  
o Önemsiz durumu(`don`t care`) 
o Farklı sürücü güçlüğü 
Bit veri tipi değer olarak yalnızca 0 ve 1 almaktadır. Basit mantık modelleri için bu normaldir bir 
teldeki değer ya yüksek yada düşük seviyededir. VHDL de objelerinin başlangıç değerleri herzaman 
varsayılan değerlerdir. Bu nedenle simülasyona başlandığında tüm bit tipindeki sinyal yada 
değişkenler ‘0 ’ değerini alır. Bu da bir tasarımının yeniden başlatma davranışını belirlemeyi imkansız 
kılmaktadır, eğer bir yazmacın(register) yeniden başlatma değeri de ‘0’ ise . 
Eğer gerçek donanım sürücüleri modellenecekse farklı sürücü güçlükleri veya yüksek empedans 
çıkışları için ek geçerli kablo durumları gereklidir.  
Başlangıçta, birçok uyumsuz çok-değerli mantık sistemleri farklı yazılım firmaları tarafından 
tanımlanmıştı. Bu sorunu çözmek için, IEEE tarafından  1992’de standart bir 9-değerli sistem 
tanımlanmış ve kabul edilmiştir. 
2.4.5 Çok-değerli Tipler 
• Çok değerli mantık tipleri yeni veri tipleri ile tanımlanmıştır 
o Uninitialized(başlangıç değeri olmayan)  
o Unknown(bilinmeyen) 
o high impedance(yüksek empedanslı) 
o ... 
• Yapımcı bağımlı gerçeklemeler 
o mvl4, mvl7, mvl9, ..., mvl46 
• 1992 den önce ortak bir standart yoktu 
• IEEE-standardı 
o 9-değerli mantık sistemi tanımlandı ve IEEE tarafından kabul edildi 
o IEEE 1164 (STD_LOGIC_1164) standardı 

2.4.6 IEEE Standart Mantık Tipi 
   (Standard Logic Type) 
type STD_ULOGIC is ( 
                 ` U `,   -- uninitialized 
                 ` X `,   -- strong 0 or 1 (= unknown) 
                 ` 0 `,   -- strong 0 
                 ` 1 `,   -- strong 1 
                 ` Z `,   -- high impedance 
                 ` W `,  -- weak 0 or 1 (= unknown) 
                 ` L `,   -- weak 0 
                 ` H `,   -- weak 1 
                  ` - `,   -- don`t care); 
• 9 farklı sinyal durumu vardır 
• Daha kaliteli simülasyon 
sonuçları alınmıştır 
• İletim yolu modelleme 
• ASCII karakterleri("ASCII-
characters") 
• 'IEEE.std_logic_1164' paketi içerisinde tanımlanır. 
• 'std_logic' deki benzer veri tipleriyle aynı değerler sahiptir 
• Dizi veri tipleri: 'std_(u)logic_vector', 'bit_vector' e benzer şekildedir 
• Tüm bit operasyonları kullanılabilir 
 VHDL tasarımında IEEE standardı kullanılmıştır 
 Yeni veri tipi 'std_ulogic' olarak adlandırılır ve IEEE kütüphanesi içerisindeki 'std_logic_1164' paketi 
içinde tanımlanmıştır('use IEEE.std_logic_1164.all' ifadesi eklenerek kullanılabilinir). Yeni tip 
numaralandırılmış tipteki ‘0’ ve ‘1’ e ek olarak ek ASCII karakterlerini içerir. 

2.4.7 Kararlı ve Kararsız Tipler 
 (Resolved and Unresolved) 
• Sinyal atamaları sürücülerle  
simgelenmiştir 
• Kararsız veri tipleri: sadece bir sürücü 
• Kararlı veri tipi: bir sinyal için birçok 
sürücü vardır 
architecture EXAMPLE of ASSIGNMENT is 
   signal A, B, Z: bit; 
   signal INT:      integer; 
begin 
   Z <= A; 
   Z <= B; 
   Z <= INT;      -- w r o n g  
end EXAMPLE; 
• Geçerli atama şartları 
o Tipler uyuşmalı  
o Kararlı tip olmalı, eğer aynı 
zamanlı 1 den fazla atama varsa 
Eğer birden fazla sürücü bir sinyalinde değerini değiştirmeye çalışıryorsa bir karar fonksiyonuna 
ihtiyaç vardır çelişkiyi önlemek için. Unutmayın ki karar çelişkileri derleme sırasında anlaşılmaz 
çalışma zamanında anlaşılır. 

2.4.8 Std_Logic_1164 Paketi 
P AC K AGE  std_logic_1164 IS 
   -------------------------------------------------- 
   -- logic state s y s t e m   (unresolved) 
   -------------------------------------------------- 
    TYPE   STD_ULOGIC  IS ( 
                    `U`,      -- uninitialized 
                    `X`,     -- Forcing  Unknown 
                    `0`,     -- Forcing  0 
                    `1`,     -- Forcing  1 
                    `Z`,     -- High Impedance 
                    `W`,    -- Weak Unknown 
                    `L`,     -- Weak 0  
                    `H`,      -- Weak 1 
                    `-`,      -- don`t care); 
   --------------------------------------------------  
   -- unconstrained array of std_ulogic for use  
   -- with the resolution function 
   --------------------------------------------------- 
    TYPE   std_ulogic_vector  IS  
     AR R AY  ( NATURAL R A N G E  <> ) OF std_ulogic; 
   --------------------------------------------------- 
   -- resolution function 
   --------------------------------------------------- 
    FUNCTION resolved ( s : std_ulogic_vector ) 
                                                  RETURN std_ulogic; 
   --------------------------------------------------- 
   -- *** industry standard logic type *** 
   --------------------------------------------------- 
    S UB T Y PE  std_logic IS resolved std_ulogic; 
   --------------------------------------------------- 
   -- unconstrained array of std_logic  
   -- fo r use in declaring signal a r r a y s  
   --------------------------------------------------- 
    TYPE std_logic_vector  IS  
      AR R AY  ( NATURAL R A N G E <>) OF std_logic; 
END std_logic_1164; 
Standart ‘bit’ veri tipi yerine IEEE standardında çok değerli mantık sistemlerini kullanmanızı önerilir. 
Yeni tip 'std_ulogic' olarak isimlendirilir ve IEEE standardında olan 'std_logic_1164' paketi tarafından 
tanımlanmıştır.  
Burada en çok ihtiyaç duyulan sinyal değerleri tanımlanmıştır. Bit değerleri için ‘0’ ve ‘1’ 
sembolleriyle birlikte ASCII karakterleri de eklenmiştir, bunlardan en önemli olanları 'u' 
(uninitialized-başangıç değeri olmayan) ve 'x' (unknown value-bilinmeyen değer)dir.  
'std_logic_1164' paketindeki 'std_ulogic' tip tanımlamasıyla birlikte 'std_logic' benzer tipler 
kullanılabilmektedir yani 'std_logic' ile aynı değer kümesine sahiptir ortak tip tanımlamaları. 
'bit_vector'dizi veri tipleri gibi 'std_(u)logic_vector' de kullanılabilmektedir. Yani, yeni pakette eski 
paketteki tüm standart ‘bit’ tanımlamaları desteklemektedir.  
'std_ulogic' veri tipi ("u" = "unresolved"-kararsız) kararlı 'std_logic' veri tiplerine  temel 
oluşturmaktadır. 'std_logic_1164' tanımlanmış karar fonksiyonu 'std_logic' kullanılan sinyal 
atamalarında temel veri tipleri getirilir. 

2.4.9 Karar Fonksiyonu   
FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS 
   CONSTANT  resolution_table  : std_logic_table := ( 
   --      ------------------------------------------------------------------ 
   --       U        X       0       1       Z      W      L      H       -        
   --      ------------------------------------------------------------------ 
          ( 'U',    'U',    'U',   'U',   'U',   'U',     'U',   'U',    'U' ),     -- U  
          ( 'U',    'X',    'X',   'X',   ' X ',    'X',     'X',   'X',    'X' ),      -- X  
          ( 'U',    'X',    '0',    ' X ' ,    '0',    '0',     '0',    '0',    'X' ),      --  0   
          ( 'U',    'X',    'X',   '1',    '1',    '1',     '1',    '1',    'X' ),      -- 1  
          ( 'U',    'X',    '0',   '1',    'Z',    'W',    'L',    'H',   'X' ),      -- Z  
          ( 'U',    'X',    '0',   '1',   'W',    'W',   'W',   'W',   'X' ),      --W  
          ( 'U',    'X',    '0',   '1',    'L',    'W',    'L',    'W',   'X' ),      -- L  
          ( 'U',    'X',    '0',   '1',    'H',   'W',    'W',   'H',   'X' ),       -- H  
          ( 'U',    'X',    'X',   'X',   ' X ' ,     'X',     'X',    'X',   'X' )       --  -  );  
   V AR I AB L E result : std_ulogic := 'Z';  -- weakest state default 
B E GI N  
   IF    (s'LENGTH = 1) THEN 
      RETURN s(s'LOW); 
   ELSE 
      FOR i IN s 'R AN G E LOOP 
        result := resolution_table(result, s(i)); 
     END LOOP; 
   END IF; 
   RETURN result; 
END resolved;  
• Tüm yürütülen değerler bir vektör de 
tutulur 
• Sonuç, tabloya göre eleman eleman 
hesaplanır 
• Karar fonksiyonu, sinyal atamaları 
kararlı değerleri içerdiğinde çağırılır 
Karar sürecinin kendisinden kaynaklanan çelişme, birçok sürücüden gelen son sinyal değerleri 
hakkındaki karar ,  bir karar tablosu üzerine kurulmuştur. Tüm sürülen değerler bir dizide tutulur ve  
karar fonksiyonuna gönderilir, tek bir sürücü hazır olana kadar. Sonuç eleman eleman hesaplanarak 
elde edilir:Mevcut sonuç, karar tablosunun bir satırını seçer ve bir sonraki sinyal sürücüsü sonuçlanan 
sinyal değerini sütundan seçer. 

2.4.10 STD_LOGIC ile STD_ULOGIC 
Karşılaştırma 
STD_ULOGIC 
STD_ULOGIC_VECTOR 
Faydası 
• Aynı anda(koşutzamanlı) birçok sinyal atamalarından 
kaynaklanan hata mesajlarında  
STD_LOGIC 
STD_LOGIC_VECTOR 
Faydası 
• Genel sanayi standardıdır 
o Kapı seviyesi netlists 
o Matematiksel fonksiyonlar 
• Üç-durumlu veri yolları için gereklidir 
STD_LOGIC(_VECTOR) RT seviyesi tasarım için gereklidir 
'buffer' kapı modunu çoklu sinyal atamalarını önlemek için kullan 
'std_logic' in küçümsenmeyecek avantajlarından biri ise vektörler üzerindeki aritmetik işlemlerin 
tanımlanmasıdır. Bu karmaşık dönüşüm fonksiyonlarını önlerken, kodun okunabilirliğini 
arttırmaktadır.  
' numeric_std ' paketi IEEE kütüphanesinin içindedir ve bit vektörlerinin iki sayısal yorumlamasını 
desteklemektedir, bu işaretli(signed) ve işaretsiz(unsigned) tamsayı değerleridir. Operatörlerin aşırı 
yüklenmesi (operator overloading) karma vektörler ve tamsayı(integers)ifadele için kullanılabilir. 
Ancak unutmayın ki sinyal atama operatörlerinin aşırı yüklenmesi imkansızdır bu nedenli dönüşüm 
fonksiyonları ' to_integer ' ve ' to_(un)signed ' pakette tanımlanmıştır. 

2.4.11 NUMERIC_STD Paketi  
• 'std_logic' tabanlı vektörler için saysal yorumlama sağlar 
o İşaretli(signed): 2’ye tümleyeni (işaret+ kendi değeri) 
o İşaretsiz (unsigned): pozitif tamsayılar için ikili gösterim 
• Aşırı yüklenmiş(Overloaded) matematiksel operatörler 
o Vektör ve tamsayı değerlerinin karışımına izin verir (vector <= vector + 1) 
• Aşırı yüklenmiş(Overloaded) ilişkisel operatörler 
o Farklı vektör uzunluklarından kaynaklanan problemlerin önlenmesi 
o Vektörlerin tamsayı değerlerin göre karşılaştırılması  
• NUMERIC_BIT paketi 'bit' temel veri tipi olarak kullanılır 
 bit' ve 'bit_vector' ün kullanımı tavsiye edilmez 

2.4.12 Diziler(Arrays) 
type STD_ULOGIC_VECTOR is 
     array (natural range <>) of STD_ULOGIC; 
type MY_BYTE is  
     array(7 downto 0) of STD_ULOGIC; 
signal BYTE_BUS : STD_ULOGIC_VECTOR(7 d o w n t o  0); 
signal TYPE_BUS : MY_BYTE; 
• Bir dizi tipinin tanımlanması 
o Sınırlı veya sınırsız boyutta 
• Sinyal tipinin bildirimi 
o Alan belirtimi gerekmektedir 
architecture EXAMPLE of ARRAY is 
     type CLOCK_DIGITS is  
          (HOUR10,HOUR1,MINUTES10,MINUTES1); 
     type  T_TIME is  
           array(CLOCK_DIGITS) of integer  range 0 to 9; 
     signal ALARM_TIME : T_TIME := (0,7,3,0); 
begin 
     ALARM_TIME(HOUR1)                             <= 0; 
     ALARM_TIME(HOUR10 to MINUTES10) <= (0,7,0); 
end EXAMPLE; 
• Dizin(index)kümesi herhangi bir tipte 
olabilir  
Sadece tamsayı dizin kümeleri tüm sentez araçları için geçerlidir. 
Diziler tek bir veri tipindeki değerlerden oluşur ve VHDL de yeni bir tip olarak gösterilir. Dizinin 
boyutu tanımlama zamanında belirsiz bırakılabilir. Buna sınırsız diziler denir ancak sinyaller için 
kullanılamazlar, dizin alanı sinyal belirtiminde bildirilmelidir. Sınırsız dizilerin avantajı farklı 
uzunluktaki objeleri birleştirirken(concatenate) kullanılır. Eğer herbir dizi uzunluğu farklı bir veri 
tipindeyse bu mümkün değildir.  
VHDL dizin kümesi için herhangi bir kısıtlama getirmiyor, ancak sayı dışındaki belirtimler genelde 
sentezlenememektedir. 

2.4.13 Çokboyutlu Diziler 
architecture EXAMPLE of ARRAY is 
      type  INTEGER_VECTOR  is 
           array (1 to 8) of integer; 
    -- 1 -- 
      type  MATRIX_A  is  
           array(1 to 3)  of  INTEGER_VECTOR ; 
    -- 2 -- 
    t y p e   MATRIX_B  is 
           array(1 to 4, 1 to 8)  of  integer ; 
     signal MATRIX_3x8 : MATRIX_A; 
     signal MATRIX_4x8 : MATIRX_B; 
begin 
      MATRIX_3x8(3)(5)  <= 10;  --array of array 
      MATRIX_4x8(4, 5)   <= 17;  -- 2 dim array 
end EXAMPLE; 
• 2 olasılık vardır 
o Dizinin dizisi 
o Çokboyutlu dizi 
• Farklı referanslıdır 
• Sentez araçları tarafından desteklenmektedir 
Çok boyutlu diziler iki şekilde tanımlanabilir, birincisi, başka bir dizi veri tipinin dizisi, şeklindedir.  
' MATRIX_3x8(2)(4) ' de 2 ' MATRIX_A ' nın ikinci ' INTEGER_VECTOR ' ü seçilmesini sağlar, 
4 ise ' INTEGER_VECTOR ' deki dördüncü tamsayı değerini döndürür.  
Çokboyutlu diziler yeni bir veri tipi tanımlaması olarak da kullanılabilir(2). Farklı boyutların alanları 
',' sembolüyle birbirinden ayrılır, örnekteki gibi array(1 to 4, 1 to 8)  of  integer ; bu 4 e 8 lik bir iki 
boyutlu diziyi ifade eder. Çokboyutlu dizilerin genelde sadece 2 boyutluya kadar olanı sentezlenebilir.  
Çok boyutlu dizilere değer atamanın en uygun şekli kümeleme(aggregate) mekanizmasıdır.  
Kümeleme bu amaçla içiçe geçmiştir. 

2.4.14 Kümeleme ve Çok Boyutlu Diziler 
architecture EXAMPLE of AGGREGATE is 
     t y p e  INTEGER_VECTOR is 
          array (1 to 8) of integer; 
     t y p e  MATRIX_A is  
          array(1 to 3) of INTEGER_VECTOR; 
     t y p e  MATRIX_B is 
          array(1 to 4, 1 to 8) of integer; 
    signal MATRIX3x8 : MATRIX_A; 
    signal MATRIX4x8 : MATIRX_B; 
    signal VEC0, VEC1, 
              VEC2, VEC3  :  INTEGER_VECTOR; 
begin 
    MATRIX3x8 <= (VEC0, VEC1, VEC2); 
    MATRIX4x8 <= (VEC0, VEC1, VEC2, VEC3); 
    MATRIX3x8 <= (others => VEC3); 
    MATRIX4x8 <= (others => VEC3); 
    MATRIX3x8 <= (others => (others => 5)); 
    MATRIX4x8 <= (others => (others => 5)); 
end EXAMPLE; 
• Kümeleme içiçe geçmiş olabilir 
• Kümeleme, çok boyutlu bir dizinin tüm 
elemanlarına atama yapmak için kullanılabilir 
Bir kümeleme ile, silmedeki gibi tüm elemanlar için aynı değer atanabilir. 

2.4.15 Kayıtlar(Records) 
architecture EXAMPLE of AGGREGATE is 
    type MONTH_NAME is (JAN, FEB, MAR, APR, 
                                           MAY, JUN, JUL, AUG, 
                                           SEP, OCT, NOV, DEC); 
    t y p e  DATE is  
          record 
               DAY:        integer range 1 to 31; 
               MONTH: MONTH_NAME; 
               YEAR:     integer range 0 to 4000; 
         end record; 
    t y p e  PERSON is 
         record 
            NAME:         string (0 to 8); 
            BIRTHDAY: DATE; 
         end record; 
    signal TODAY:      DATE; 
    signal STUDENT_1: PERSON; 
    signal STUDENT_2: PERSON; 
begin 
   TODAY      <= (26, JUL, 1988); 
   STUDENT_1 <= ("Franziska", TODAY); 
   STUDENT_2 <= STUDENT_1; 
   STUDENT_2.BIRTHDAY.YEAR <= 1974; 
end EXAMPLE; 
• Farklı tipteki elemanlardır  
• Yapılabilecek atamalar 
o record<= record 
o record<= aggregate(kümeleme) 
o record.element <= value(değer) 
Dizi tiplerinin tersi olarak, kayıtlar farklı tipteki veri tiplerini yeni oluşturulmuş yapılarla içine alır. 
Değer atamak için üç seçenek vardır: en açık metod ise bir kaydı diğerine atamaktır (' STUDENT_2 
<= STUDENT_1 ').  Fakat bu bireysel olarak değer atamaya izin vermez. Kümeleme bu amaçla sıkça 
kullanılır,ör. farklı eleman değerleri bir araya toplanır' TODAY <= (26, JUL, 1988) '.  Tek 
elemanların adresleri RECORD.ELEMENT yapısıyla gösterilir, örnekteki 
'STUDENT_2.BIRTHDAY.YEAR <= 1974 ' gibi. Bu gösterim içiçe kayıtlarda da kullanılır. 

2.4.16 Tip Dönüşümü 
architecture EXAMPLE of CONVERSION is 
      type MY_BYTE is array (7 downto 0) of 
std_logic; 
     signal VECTOR:        std_logic_vector(7 downto 
0); 
     signal SOME_BITS:  bit_vector(7 downto 0); 
     signal BYTE:              MY_BYTE; 
begin 
     SOME_BITS <= VECTOR;                  -- wrong 
     SOME_BITS <= Convert_to_Bit( VECTOR ) ; 
     BYTE <= VECTOR;                             -- wrong 
     BYTE <= MY_BYTE( VECTOR ) ; 
end EXAMPLE; 
• Veri tipleri atama için uyuşmalıdır 
o Tip dönüşüm fonksiyonları 
o Tip kırpma(cast) 
• Birbiriyle yakın ilişki tipler  
o integer <-> real 
o aynı büyüklükteki, dizin 
kümesindeki ve eleman tipindeki 
dizilerde 
Birbiriyle uyuşan veri tipleri için birbirine atamalar için tip dönüşümü gereklidir. Bu dönüşümler 
birbiriyle yakın ilişkili veri tipleri için geçerlidir. Gösterilen kod VHDL de geçerlidir VHDL:  
' REAL_SIGNAL <= real(INTEGER_SIGNAL) '. Gösterim şekli fonksiyon çağırmaya 
benzemektedir, sadece beklenen veri tipi önisim gibi kullanılır. 
Diziler de ayrıca, eğer aynı tipte elemanları varsa ve büyüklüğü ve dizin kümesi aynıysa yakın ilişkili 
veri tipleridir.Tip kırpma genelde bit vektörlerle ilgili işlemlerin üstesinden gelmek için kullanılır  
(' bit_vector ', ' std_(u)logic_vector ') bu bit vektörlerin sayısal yorumlama yeteneği yoktur. 
Bit vektörleri için aritmetik ve ilişkisel operatörler ' signed '(işaretli) veya ' unsigned '(işaretsiz) tipler 
bit değerlerini 2’nin tümleyeniyle yorumlayarak sağlar. Tip ve operatör tanımlamaları (' use 
IEEE.numeric_bit/std.all ') kullanılabilir hale getirilerek sağlanır. 

2.4.17 Alttipler(Subtypes) 
architecture EXAMPLE of SUBTYPES is 
      type MY_WORD is array (15 downto 0) of std_logic; 
      subtype SUB_WORD is std_logic_vector (15 downto 0); 
     subtype MS_BYTE is integer range 15 downto 8; 
     subtype LS_BYTE is integer range 7 downto 0; 
     signal VECTOR:      std_logic_vector(15 downto 0); 
     signal SOME_BITS: bit_vector(15 downto 0); 
     signal WORD_1: MY_WORD; 
     signal WORD_2: SUB_WORD; 
begin 
     SOME_BITS <= VECTOR;                          -- wrong 
      S O M E _ B ITS <= Convert_to_Bit(VECTOR); 
     WORD_1 <= VECTOR;                                 -- wrong 
      WORD_1 <= MY_WORD(VECTOR); 
      WORD_2 <= VECTOR;                                 -- correct! 
      WORD_2(LS_BYTE) <= "11110000"; 
end EXAMPLE; 
• Varolan tiplerin alt kümeleridir 
• Orijinal tiple aynı tiptedir 
• Sinyal atamalarında daha okunabilirdir 
o Tip kırpmalarını(cast) ve tip 
dönüşümünü eler 
o Dizi büyüklüğü için sembolik isimler  
Tamamen yeni bir tip belirtmek yerine varolan tiplerin alttiplerini belirtmek mümkündür, eğer bir tip 
başka bir tipin kısıtlanmış haliyse kullanılır. Alttipler orijinal tiple aynı tiptedir ve bu nedenle temel 
tiple uyuşmaktadır böylece tip kırpmaya(casting) veya dönüşümüne gerek yoktur. Alttipler ayrıca, dizi 
boyutları için sembolik isimler yaratmak için kullanılır.  
Bu VHDL de ‘alias’(takma ad) ın sentezlenebilir alternatifidir.  Takma ad(alias) daha önce varolan 
objelere başka isimler vermek için kullanılır. Bu yolla karmaşık veri yapılarını doğrudan ulaşılabilir 
daha basit parçalara bölmek mümkündür. 

2.4.18 Takma Ad(Aliases) 
architecture EXAMPLE of ALIAS is 
     signal DATA is bit_vector(9 downto 0); 
      alias STARTBIT :   bit is DATA(9) ; 
     alias MESSAGE:  bit_vector(6 downto 0) is 
DATA (8 downto 2); 
     alias PARITY:       bit is DATA(1); 
     alias STOPBIT:    bit is DATA(0); 
     alias REVERSE:  bit_vector(1 to 10) is DATA; 
     function calc_parity(data: bit_vector) return bit is 
     . . . 
begin 
     STARTBIT        <= '0'; 
     MESSAGE       <= "1100011"; 
     PARITY            <= calc_parity(MESSAGE); 
     REVERSE(10) <= '1'; 
end EXAMPLE; 
• Daha önce varolan objelere yeni isimler 
verilmesidir 
• Karmaşık veri yapılarını daha kolay hale 
getirir 
Takma adlar her zaman sentez araçları tarafından desteklenmezler. 
2.5 Operatörler-İşletmenler  
logical 
not 
and 
or 
nand 
nor 
xor 
xnor 
relational 
= 
/= 
< 
<= 
>= 
> 
shift 
sll 
srl 
sla 
sra 
rol 
ror 
arithmetic 
+ 
- 
* 
/ 
mod 
rem 
** 
abs 
                           Artan önceliğe göre sıralanmıştır yüksek->düşük (top->down)  
Yeni operatörler: xnor, shift tanımlıdır 
 Tabloda VHDL de dahaönceden tanımlanmış operatörler bulunmaktadır. Çeşitlerine ve önceliğine 
göre sıralanmıştır. Lütfen VHDL’93 de yeni operatörler olduğunu unutmayın. 

2.5.1 Mantıksal Operatörler 
entity LOGIC_OP is 
   port (A, B, C, D : in   bit; 
            Z1:             out bit; 
            EQUAL :    out boolean); 
end LOGIC_OP; 
architecture EXAMPLE of LOGIC_OP is 
begin 
   Z1 <= A  and (B or (not C xor D))); 
   EQUAL <= A xor B;                  -- w r o n g  
end EXAMPLE; 
• Önceliği 
o Değil(not) (en üst öncelikli) 
o VE(and), or(VEYA), nand(VEDEĞİL), 
nor(VEYADEĞİL), xor(DIŞARAN VEYA), 
xnor(DIŞARAN VEYA DEĞİL) 
(eşit öncelikli) 
• Öntanımlıdır: 
o bit, bit_vector 
o boolean 
• Veri tipleri uyuşmalıdır 
Parantez, gerçekleme sırasını belirlemek için kullanılmak zorundadır. 
Dizilerle yapılan mantıksal işlemler aynı tipte ve aynı uzunlukta olmak zorundadır. İşlem eleman 
eleman yapılır. 
2.5.2 Dizilerle Mantıksal Operasyonlar-
İşlemlşer 
architecture EXAMPLE of LOGICAL_OP is 
   signal A_BUS, B_BUS : bit_vector (3 downto 0); 
   signal Z_BUS :               bit_vector (4 to 7); 
begin 
   Z_BUS <= A_BUS and B_BUS; 
end EXAMPLE; 
• İşlenenler aynı uzunluk ve tipte olmalıdır  
• Atama elemanın yerine göre yapılır  
(alan tanımlamasına göre yapılır) 

2.5.3 Kaydırma(Shift) Operatörleri: 
Örneklerle 
Sadece tek boyutlu boolean bit dizileri için tanımlanmıştır!  
Mantıksal kaydırma(Logical shift)  
Sola
Sağa  
Aritmetik kaydırma(Arithmetic shift) 
Döndürme(Rotation) 

2.5.4 İlişkisel Operatörler 
architecture EXAMPLE of 
                 RELATIONAL_OP is 
   signal NR_A, NR_B:  integer; 
   signal A_EQ_B1, A_EQ_B2:  bit; 
   signal A_LT_B:                       boolean; 
begin 
   -- A,B may be of any standard data type 
   process (A, B) 
   begin 
      if (A = B) then 
         A_EQ_B1 <= '1'; 
      else 
         A_EQ_B1 <= '0'; 
      end if; 
   end process; 
   A_EQUAL_B2 <= A = B;         -- w r o n g  
   A_LT_B <= B <= A; 
end EXAMPLE 
• Tüm standart veri tipleri için 
öntanımlıdır 
• Sonuç: 
bool(boolean)tipindedir 
doğru/yanlış(true, false) 

2.5.5 Dizilerle Karşılaştırma İşlemleri  
architecture EXAMPLE of 
COMPARISON is 
   signal NIBBLE: bit_vector(3 downto 0); 
   signal BYTE:     bit_vector(0 to 7); 
begin 
   NIBBLE <= "1001"; 
   BYTE     <= "00001111"; 
   COMPARE: process (NIBBLE, BYTE) 
   begin 
      if (NIBBLE < BYTE) then 
         -- evaluated as: 
         -- if (NIBBLE(3) < BYTE(0)) or 
         --    ((NIBBLE(3) = BYTE(0)) and 
         --     (NIBBLE(2) < BYTE(1))) or 
         --    ((NIBBLE(3) = BYTE(0)) and 
         --     (NIBBLE(2) = BYTE(1)) and 
         --     (NIBBLE(1) < BYTE(2))) or 
         ... 
      -- better: 
      if (( "0000"& NIBBLE) <= BYTE) 
then 
         ... 
end EXAMPLE; 
• İşlenenler aynı tiptedir 
• Diziler: 
o farklı uzunlukta olabiir  
o sol-taraftaki karşılaştırma için önceliklidir 
o eleman eleman karşılaştırılırlar 
• Sayısal yorumlama yapılmaz 
(unsigned, 2-complement, vb.) 
Karşılaştırma için dizilerin uzunluğuna göre öncelik ayarlar 
Dizi tipleri arasında karşılaştırma yaparken, karşılaştırma soldan sağa doğru yapılır. Bunun anlamı 
eğer farklı boyutlarda diziler "111"  “1001” den büyüktür. Eğer bu sizin için uygun değilse dizilerin 
boyutlarını elle eşitleyin,soluna sıfır koyarak. Böylece birleştirme '0'&"111"  "1001" den küçüktür. 

2.5.6 Aritmetik Operatörler  
+  : toplama(addition) 
- :çıkarma(substraction)  
*  :çarpma(multiplication) 
/  :bölme(division) 
m o d  :modu(modulo) 
** : üssü(exponentiation) 
abs: :mutlak değeri (absolute value) 
rem :kalan (remainder) 
• İşlenenler aynı tipte olmalı  
• Öntanımlıdır: 
o Tam sayı(integer) 
o Reel sayılar(real) (mod ve rem hariç) 
o Fiziksel tipler (ör. zaman(time)) 
• bit_vector için tanımlanmamıştır (sayı biçimi 
tanımlı değildir: unsigned, 2-complement, etc.) 
• Klasik matematiksel anlam ve önceliğe sahiptir 
• '+ ' ve '-' tekli operatörler olarak kullanılabilirler 
signal A, B, C:    integer; 
signal RESULT: integer; 
RESULT<= -A + B * C; 
VHDL operatörleri kendini açıklayan operatörlerdir. İlişkisel operatörler tüm öntanımlı veri 
tipleri için geçerliyken, mantıksal,kaydırma ve aritmetik operatörler sadece bit ve sayısal 
değerler için geçerlidir.  
Döndürme ve kaydırma operasyonları VHDL’93 standardıyla diziler üzerinde kullanılır. 
Normal kaydırma yapılırken sola kaydırılırken en sağdaki değer, sağa kaydırılırken en soldaki 
değer kaybolur. Aritmetik kaydırmada ise değer kaybolmaz normal kaydırmada kaybolan 
değerler korunur eski yerlerinde. Döndürmede ise kaybolan değer boş olan yere gider yani 
sola kaydırırken en soldaki değer kaydırıldıktan sonra en sağdaki değer olarak geçer. 
Bir tamsayının bölümünü hesaplamak için iki operatör mevcuttur. Örneğin; 
  5  rem   3  =  2,   5  mod   3  =  2   ( 5 =   1 *  3  +   2  ) 
(-5) rem   3  = -2, (-5) mod   3  =  1   (-5 = (-1)*  3  + (-2) 
                                                    = (-2)*  3  +   1) ) 
(-5) rem (-3) = -2, (-5) mod (-3) = -2   (-5 =   1 *(-3) + (-2) ) 
  5  rem (-3) =  2,   5  mod (-3) = -1   ( 5 = (-1)*(-3) +   2 
                                                    = (-2)*(-3) + (-1) ) 
2.5.7 Sorular 
Aşağıdaki soruları EVET ya da HAYIR şeklinde yanıtlayın. 
10. std_ulogic_vector tipinde hangi operatörler kullanılabilir?  
10.1. ... Mantık operatörleri (EVET/HAYIR)  
10.2. ... Aritmetik operatörler (EVET/HAYIR)  
10.3. ... Karşılaştırma operatörleri (EVET/HAYIR) 
11. Diziler aşağıdaki şekilde karşılaştırılabilir mi…  
11.1. ... pozisyonlarına göre. (EVET/HAYIR)  
11.2. ... soldan sağa doğru (EVET/HAYIR) 
12. Dizi elemanları aşağıdakilere göre atanır …  
12.1. ... otomatik olarak, pozisyonlarına göre(EVET/HAYIR)  
12.2. ... özel olarak, dizinine göre (ör.: Z_BUS(1) <= `3`;)(EVET/HAYIR) 
CEVAPLAR: 
10.1:EVET    10.2:HAYIR    10.3: EVET     
11.1: EVET    11.2: EVET 
12.1: EVET    12.2: EVET 
2.5.8 Sorular 
13. Hangi yapılar doğru VHDL i sunar? 
   signal BOOL :                                   boolean; 
   signal A_INT, B_INT, Z_INT:            integer range 0 to 15;  
   signal Z_BIT :                                    bit; 
   signal A_VEC, B_VEC, Z_VEC:       bit_vector (3 downto 0); 
   signal A_VEC2, B_VEC2, Z_VEC2: bit_vector (7 downto 0);  
13.1. Z_BIT   <= A_INT = B_INT; (EVET/HAYIR)  
13.2. BOOL  <= A_INT > B_VEC; (EVET/HAYIR)  
13.3. Z_INT   <= A_INT + B_INT; (EVET/HAYIR)  
13.4. Z_INT   <= A_INT = ``0001``;  (EVET/HAYIR)  
13.5. Z_BIT   <= A_VEC and B_INT; (EVET/HAYIR)  
13.6. Z_VEC <= A_VEC2 and B_VEC2; (EVET/HAYIR) 
CEVAPLAR: 
13.1:HAYIR    13.2:HAYIR    13.3:EVET 
13.4:HAYIR    13.5:HAYIR    13.6:HAYIR 

2.6 Sıralı-Ardışıl(Sequential) İfadeler 
• Kod içerisinde görüldüğü sıraya göre 
gerçekleştirilirler 
• Sadece içiçe işlemlere izin verilir 
• Algoritmaları anlatmak için kullanılır 
İşlemlerdeki tüm ifadeler veya altprogramlar sıralı olarak işlenir.  Gerçekleştirme akışının kontrolü 
için birçok yapı vardır. Bunlar arasında, if(koşul) deyimi, en sık kullanılanıdır.  
IF koşulu bir boolean(true yada false)(doğru yada yanlış)  değer biçmelidir. İlk IF deyimini, ondan 
sonra birçok ELSIF koşulu takipedebilir. ELSE genellikle son olarak yerleştirilir ve o ana kadarki tüm 
geçersiz durumları biraraya toplar. IF ifadesi END IF ile sonlandırılır.  
İlk IF deyimi en yüksek önceliğe sahiptir, eğer bu koşul sağlanıyorsa bir sonrali IF – END IF ifadesine 
atlar.  
Örnekteki kodda aynı davranıştaki iki farklı gerçekleme kodunu göstermektedir. Sinyal Z ye yapılan 
sinyal atamalarına (soldaki işlemin ilk satırında ) varsayılan atama denir, bunun etkileri, Z atamasının 
üstüne başka bir atama yoksa görülebilir.  

2.6.1 IF İfadesi  
if CONDITION then 
   -- sequential statements 
end if; 
if CONDITION then 
   -- sequential statements 
else 
   -- sequential statements 
end if; 
if CONDITION then 
   -- sequential statements 
elsif CONDITION then 
   -- sequential statements 
· · · 
else 
   -- sequential statements 
end if;  
CONDITION    : koşul 
suquencial statement : sıralı ifade 
• Koşul bir bool(boolean) ifadesidir yani ya doğrudur yada yanlış 
• Opsiyonel elseif sıralısı 
o Koşullar üstüste binebilir  
o öncelik 
• Opsiyonel else yolu 
o Eğer tüm koşullar yanlış sonuç verdiyse gerçeklenir 
Dikkat: elsif  ile end if arasındaki farka 
IF koşulu bir bool(boolean) değerle (doğru yada yanlış) gerçekleştirilmek zorundadır. İlk if 
koşulundan sonra herhangi bir sayıda elsif koşulu takip edebilir. Üstüstebinme(overlap) faklı 
koşulların içinde gerçekleşebilir. Bir else dallanması, eğer daha önceki tüm durumlar yanlış ise , son 
ifadeye opsiyonel olarak koyulabilir. Bir if ifadesi ‘end if’ ile sonlandırılır.  
İlk if koşulu en yüksek önceliğe sahiptir: eğer bunun içindeki tüm ifadeler kontrol edildiyse geri kalan 
‘if-end if’ bloğuna atlanır. 

2.6.2 IF İfadesi: Örnek 
   entity IF_STATEMENT is 
      port (A, B, C, X : in   bit_vector (3 downto 0); 
               Z              : out bit_vector (3 downto 0); 
   end IF_STATEMENT; 
architecture EXAMPLE1 of IF_STATEMENT  is 
begin 
   process (A, B, C, X) 
   begin 
      Z <= A; 
       if  (X = "1111")  then 
         Z <= B; 
       elsif  (X > "1000")  then 
         Z <= C; 
       end if; 
   end process; 
end EXAMPLE1; 
architecture EXAMPLE2 of IF_STATEMENT  is 
begin 
   process (A, B, C, X) 
   begin 
       if  (X = "1111")  then 
         Z <= B; 
       elsif  (X > "1000")  then 
         Z <= C; 
       else 
         Z <= a; 
       end if; 
   end process; 
end EXAMPLE2; 
 Örnek kodda aynı davranıştaki iki farklı gerçekleme gösterilmiştir.  İlk satırdaki Z sinyaline yapılan 
atamaya (architecture EXAMPLE1) varsayılan atama  denir, eğer herhangi bir atama yapılmazsa, Z  ye 
bu değer kullanılacaktır demektir. Şuna dikkat edin ki iki koşulda ‘if’ ve ‘elsif’ birbiriyle üstüste 
binmiştir(overlap), çünkü X="1111" aynı zamanda X>"1000" olduğunda da doğrudur. If yapısı için  
öncelik mekanızmasının sonucu olarak,   X="1111" olduğunda ‘Z’ ‘B’ nin değerini alacaktır. 

2.6.3 CASE İfadesi 
case  EXPRESSION  is 
    when  VALUE_1  => 
      -- sequential statements 
    when  VALUE_2 | VALUE_3   => 
      -- sequential statements 
    when  VALUE_4 to VALUE_N  => 
      -- sequential statements 
    when   others => 
      -- sequential statements 
end   case ; 
• Seçilecek seçenekler üstüstebinmemiş olmalı(overlap)  
• Tüm seçilecek seçenekler aşağıdaki özellikleri göstermeli 
o Tek değerli 
o Değer aralığı 
o Değerlerin seçilmesi  
("|" demektir "or") 
o Seçenekler dışında bir şey varsa onları da içermelidir 
else gibi. 
CASE ‘i içiçe geçmiş if ,elsif, end if gibi düşünebilir. Bir seçenek için durumların belirtildiği  s e ç i m  
durumlarını ve buna tepkileri belirtir. Tüm CASE dallanmaları eşit önceliklidir çünkü tüm durumlar 
birbiriyle üstüste binmemiş durumdadır. Diğer taraftan eğer belirttiğimiz durumların hiç birine 
uymuyorsa varsayılan bir değer vermek için  ' others ' anahtar sözcüğü kullanılabilir.  
CASE ifadesinin başında bulunan EXPRESSION ‘nın tipi , sorgu değerlerinin tipiyle uyuşmak 
zorundadır. Eğer farklı değerlerde aynı sonucu vermesi gerekiyorsa bu değerler '|' sembolüyle 
birleştirilir bu veya anlamına gelir. Eğer bir değer aralığı için aynı sonucu veriyorsa bu sorguya 
aktarılabilir.  
Değer aralığı sabit sıralı veri tipleri için tanımlanabilir, ör. kullanıcı tanımlı sayılı(enumerated) tipler 
veya tamsayı değerleri. Bu yolla bir değerin büyük,küçük ya da eşit olduğu anlaşılabilir.  
Diziler(ARRAY) için böyle bir sıra yoktur, "0000" ‘dan "0100" ’e değer aralığı tanımsızdır ve bundan  
dolayı kabul edilebilir değildir. 
Örnek: 
entity CASE_STATEMENT is 
   port ( A ,  B, C, X : in   integer range 0 to 15; 
            Z              : out integer range 0 to 15; 
end CASE_STATEMENT; 
architecture E X AM P LE  of CASE_STATEMENT is 
begin 
   process (A,  B, C, X) 
   begin 
       case  X  is 
          when  0  => 
            Z <= A;  
          when  7  |  9  => 
            Z <= B; 
          when  1 to 5  => 
            Z <= C; 
          when others => 
            Z <= 0; 
       end case;         
   end process; 
end EXAMPLE; 

2.6.5 Değer Kümesinin(Range) Tanımı 
entity RANGE_1 is 
port (A, B, C, X : in   integer range 0 to 15; 
         Z              : out integer range 0 to 15; 
end RANGE_1; 
architecture EXAMPLE of RANGE_1 is 
begin 
   process (A, B, C, X) 
   begin 
      case X is 
         w h e n  0 => 
            Z <= A; 
         w h e n  7 | 9 => 
            Z <= B; 
          when 1 to 5 => 
            Z <= C; 
         w h e n  others => 
            Z <= 0; 
      end case;         
   end process; 
end EXAMPLE; 
entity RANGE_2 is 
port (A, B, C, X : in    bit_vector(3 downto 0); 
         Z              : out  bit_vector(3 downto 0); 
end RANGE_2; 
architecture EXAMPLE of RANGE_2 is 
begin 
   process (A, B, C, X) 
   begin 
      case X is 
         w h e n  "0000" => 
            Z <= A; 
         w h e n  "0111" | "1001" => 
            Z <= B; 
          when "0001" to "0101" =>         -- wrong 
            Z <= C; 
         w h e n  others => 
            Z <= 0; 
      end case;         
   end process; 
end EXAMPLE; 
Dizişer için değerlerin sırası tanımsızdır 
Değer kümesi(range) sabit sıralı veri tipleri için tanımlanabilir, ör. kullanıcı tanımlı sayılı(enumerated) 
tipler veya tamsayı değerleri. Bu yolla bir değerin büyük,küçük ya da eşit olduğu anlaşılabilir.  
Diziler(ARRAY)( bit_vector) için böyle bir sıra yoktur, "0000" ‘dan "0100" ’e değer aralığı 
tanımsızdır ve bundan dolayı kabul edilebilir değildir. 

2.6.6 FOR Döngüleri 
entity FOR_LOOP is 
   port (A : in    integer range 0 to 3; 
           Z  : out bit_vector (3 downto 0)); 
end FOR_LOOP; 
architecture EXAMPLE of FOR_LOOP is 
begin    
   process (A) 
   begin 
      Z <= "0000"; 
       for  I  in  0 to 3  loop 
         if (A = I) then 
            Z(I) <= `1`; 
         end if; 
       end loop;       
   end process; 
end EXAMPLE; 
• Döngü parametreleri dolaylı olarak tanımlıdır 
o Haricen bildirilemezler 
o Sadece okunabilir erişim vardır 
• Döngü parametreleri değer kümesi tanımlamadaki tüm 
değerlere adapte olabilir 
o Tamsayı(integer) değer kümesi 
o Sayılı(enumerated) tipler 
Döngüler sık kullanılan yoldan yönetilirler, aynı VHDL kodunu istenildiği kadar  gerçekleştirmek için 
kullanılır. Döngü etiketleri okunabilirliği arttırmak için kullanılır, özellikle eğer iç içe döngüler varsa 
veya döngü içinde yapılanlar çok uzunsa . Döngü değişkenleri VHDL de dolaylı olarak(implicitly) 
tanımlı tek objedir. Dışarıda tanımlanamazlar ve sadece döngü içerisinde görülebilir.  Sadece değeri 
okunabilir, for döngüsü başladığında kodun kaç kez gerçekleştirileceği sabitlenmiştir, belirlidir.  
Eğer bir for döngüsü sentezlenmiş olsaydı, döngü değişkeninin değer kümesi sinyal veya değişken 
değerine bağlı olmazdı. Değer kümesi ataması ile , döngü değişkeninin yönü ve değer aralığı 
belirlenmiştir. Eğer bir dönüş sayısı değişkenine ihtiyaç varsa, while ifadesi kullanılmak zorundadır. 
While döngüleri CONDITION(koşul)  doğru sonucu dönderdiği sürece döngü devam eder.  Bu 
nedenle bu yapı genellikle sentezlenebilir değildir. 

2.6.7 Loop Sözdizimi(Syntax) 
[LOOP_LABEL :] 
for IDENTIFIER in DISCRETE_RANGE loop 
   -- sequential statements 
end loop [LOOP_LABEL] ; 
[LOOP_LABEL :] 
while CONDITION loop 
   -- sequential statements 
end loop [LOOP_LABEL] ;  
• Etiket opsiyoneldir-isteğe bağlıdır 
• FOR döngüsü belirteci 
o bildirilmez 
o sadece okunabilir 
o döngü dışında görülmez  
• Değer kümesi(range) elemanları 
o düşük(`low) 
o yüksek(`high) 
o değer kümesi(`range) 
Sentez gereklilikleri: 
- Döngüler sabit değer kümesine sahip olmalı  
  - 'while' yapıları genelikle sentezlenemezler  
Döngü etiketi( loop label) opsiyoneldir-isteğe bağlıdır.  Döngü değişkenlerinin değer kümesi ve yönü 
tanımlanarak  sabitlenirler. Döngü değişkenlerine sadece döngünün içinden ulaşılabilinir. Sentez için 
döngünün değer kümesi bilinmelidir ve sabit olmalıdır ,sinyal ve değişken değerlerine bağlı 
olmamalıdır. Bu nedenle  while döngüleri genellikle sentezlenemezler. 

2.6.8 Döngü Örnekleri 
   entity CONV_INT is 
      port (VECTOR: in   bit_vector(7 downto 0); 
              RESULT:  out integer); 
   end CONV_INT; 
architecture A of CONV_INT is 
begin 
   process(VECTOR) 
      variable TMP: integer; 
   begin 
      TMP := 0; 
      for I in 7 downto 0 loop 
         if (VECTOR(I)='1') then 
            TMP := TMP + 2**I; 
         en d i f; 
      end loop; 
      RESULT <= TMP; 
   end process; 
end A; 
architecture B of CONV_INT is 
begin 
   process(VECTOR) 
      variable TMP: integer; 
   begin 
      TMP := 0; 
      for I in VECTOR'range loop 
         if (VECTOR(I)='1') then 
            TMP := TMP + 2**I; 
         en d i f; 
      end loop; 
      RESULT <= TMP; 
   end process; 
end B; 
architecture C of CONV_INT is 
begin 
   process(VECTOR) 
      variable TMP: integer; 
      variable I       : integer; 
   begin 
      TMP := 0; 
      I := VECTOR'high; 
      while (I >= VECTOR'low) loop 
         if (VECTOR(I)='1') then 
            TMP := TMP + 2**I; 
         en d i f; 
         I := I - 1; 
      end loop; 
      RESULT <= TMP; 
   end process; 
end C; 
Üç döngü örneğinin mimarileri fonksiyonel olarak birbirinin aynıdır. Fark, döngü değer kümelerinin 
belirtiminde ortaya çıkmaktadır. İlk iki mimari A ve B for ifadesi için kullanılmıştır.  Kodlama ile 
yapılan değer kümesi belirtimine rağmen, sinyal tipine bağlı olan sinyal elemanları  nedeniyle B 
mimarisinde çalışma zamanı esnasında sabitlenmiştir. C mimarisi aynı gerçeklemeyi while yapısıyla 
sağlamaktadır.  Lütfen, ek döngü değişkeni l bu durumda tanımlanmak zorunda olduğunu unutmayın.  
Değer kümesi elemanları aynı VHDL kodlarının sinyallere  genişliğinden bağımsız olarak 
uygulanabilir olması için kullanılmaktadır. Bunlar özellikle bir tamsayı(integer) veya dizi tipiyle ilgili 
durumlarda kullanışlıdır. Aşağıdaki ifadeler eşit fonksiyonaliteye sahiptir,   
Z’nin değer kümesi 0 ‘dan 3 ‘e kadardır. 
for I in 0 to 3 loop 
for I in Z'low to Z'high loop 
for I in Z'range loop 

2.6.9 Bekleme(WAIT) İfadesi 
• 'wait' ifadeleri işlemin gerçekleştirmesini durdurur 
o İşlem komut yerine getirildiğinde devam eder  
• Farklı tipteki bekleme ifadeleri: 
o Özel bir zamana kadar bekleme 
o Bir sinyal olayı gerçekleşene kadar bekleme 
o Koşul değeri doğru olana kadar bekleme 
(bir olaya ihtiyacı vardır) 
o Belirsiz bekleme:işlem asla yeniden aktif 
olmaz 
Bekleme (Wait) ifadeleri hassasiyet listesi(sensitivity list) olan işlemlerde 
kullanılmamalıdır 
 Daha öncede belirttiğimiz gibi, işlemler iki şekilde kodlanırlar. Eğer hassasiyet listesi yoksa, başka bir 
metod uygulamak gerekir işlemin gerçekleşmesini durdurmak için. Wait(bekleme) ifadeleri işlemleri 
askıya alır belirli bir koşul gerçekleşene kadar. Eğer hiçbir koşul belirtilmemişse işlem asla yeniden 
yürürlüğe koyulmaz.  
Bekeme ifadeleri hassasiyet listesi ile birleştirilemezler, uygulama alanından bağımsızdır. 

2.6.10 WAIT İfadesi: Örnek 
• Flip Flop modeli 
• Testbenç: 
uyarı(stimuli) 
ü r e t m e  
entity FF is 
     port (D, CLK : in   bit; 
             Q          : out bit); 
end FF; 
STIMULUS: process 
begin 
      SEL      <= `0`; 
      BUS_B <= "0000"; 
      BUS_A <= "1111"; 
      w a i t  for 10 ns; 
      SEL <= `1`; 
      w a i t  for 10 ns; 
      SEL <= `0`; 
      w a i t  for 10 ns; 
      w a i t ;  
end process STIMULUS; 
architecture BEH_1 of FF is 
begin 
   process 
   begin 
      w a i t  on CLK; 
      if (CLK = '1') then 
         Q <= D; 
      end if; 
   end process; 
end BEH_1; 
architecture BEH_2 of FF is 
begin 
   process 
   begin 
      w a i t  until CLK=`1`; 
      Q <= D; 
   end process; 
end BEH_2; 
Hassasiyet listesi olmayan işlemler bekleme ifadesine ulaşana kadar gerçekleştirilir. Örnekte, bir Flip 
Flop ‘un  BEH_1 mimarisi, CLK('wait on CLK) sinyali gelene kadar gerçekleşmeye devam 
etmektedir.  Onu takip eden if ifadesi saat sinyalinin(clock signal) seviyesini kontrol eder ve yükselen 
kenarda(rising edge) yeni bir çıkış atanır. BEH_2 ‘de, kontroller tek bir 'wait until' ifadesinde 
gerçekleştirilir. Koşulun gerçekleştirilmesi sinyal olayının tetiklenmesine bağlıdır, davranışı aynıdır.   
'wait for' yapısı ile tasarımı doğrulamak amacıyla basit giriş değerleri üretmek çok kolaydır. 

2.6.11 WAIT İfadeleri ve Davranışsal 
Modelleme 
• Belirtimden (specification) gelen zamanlama davranışı 
• VHDL e dönüştürme 
• Zaman temelli 
READ_CPU : process 
begin 
      w a i t  until CPU_DATA_VALID = `1`; 
      CPU_DATA_READ <= `1`; 
      w a i t  for 20 ns; 
      LOCAL_BUFFER <= CPU_DATA; 
      w a i t  for 10 ns; 
      CPU_DATA_READ <= `0`; 
end process READ_CPU; 
Wait yapısı,genel olarak, zaman belirtimini tanımlamak için mükemmel bir araçtır. Örneğin, 
simülasyon için bus(veri yolu) protokolünü gerçeklemek çok kolaydır. Zamanlama belirtimi doğrudan 
VHDL kodu için simüle edilebilir hale dönüştürülebilir. Fakat şunu unutmayın ki bu davranışsal 
modelleme sadece simülasyon amaçlı kullanılabilir, sentezlenemezler. 

2.6.12 Değişkenler(Variables) 
architecture RTL of XYZ is 
      signal A, B, C : integer range 0 to 7; 
      signal Y, Z :      integer range 0 to 15; 
begin 
      process (A, B, C) 
        variable M, N : integer range 0 to 7; 
      begin 
         M := A; 
         N := B; 
         Z <= M + N; 
         M := C; 
         Y <= M + N; 
      end process; 
end RTL; 
• Değişkenler işlerin içinde kullanılabilir, 
o İş belirtiminde isimlendirilir 
o Sadece bu iş içinde kullanılabilir 
• VHDL 93: ‘de paylaşımlı değişkenler 
• Anında atama  
• Son değeri tutar 
• Mümkün atama şekilleri 
o Sinyalden değişkene 
o Değişkenden sinyale 
o Tipler uyuşmalıdır 
Değişkenler(variable) sadece işlem(process) içinde tanımlanır ve sadece tanımlandığı işlem içinden 
ulaşılabilir.  
Değişkenler ve sinyaller temelde farklı davranışlar gösterirler. Bir işlemde, işlem askıya alındığında 
bir sinyal için son sinyal ataması uygulanır. Değişken için değer ataması ise derhal yapılır. Bir sinyal 
ile değişken ataması arasındaki fark için farklı semboller kullanılır; ' <= ' bir siynal atamasını 
belirtirken, ':=' bir değişken atamasını belirtir.  

2.6.13 Değişkenler (Variables) / Sinyaller  
         (Signals) 
signal A, B, C, Y, Z : integer; 
begin 
     process (A, B, C) 
            variable M, N : integer; 
     begin 
           M  :=  A; 
           N  :=  B; 
           Z <= M + N; 
           M  :=  C; 
           Y <= M + N; 
     end process; 
signal A, B, C, Y, Z : integer; 
signal M, N             : integer; 
begin 
      process (A, B, C, M, N) 
      begin 
           M  <=  A; 
           N  <=  B; 
           Z <= M + N; 
           M  <=  C; 
           Y <= M + N; 
      end process; 
• Sinyal değerleri işlem 
gerçekleştikten sonra atanır 
• Sadece en son yapılan sinyal 
ataması gerçekleştirilir  
• M <= A; ‘nın üstüne M <= C; 
yazılabilir 
• C ye ikinci toplayıcı giriş 
bağlanmıştır 
İki işlemde de Y ve Z çıkışlarına B+C sonucunu göndermenin sinyal yerine değişken gönderilmesi 
arasındaki farkı gösteren farklı davranışların gerçeklemesini gösteren örnekler vardır.  Lütfen şuna 
dikkat edin ki ara sinyaller hassasiyet listesine eklenmek zorundadır, çünkü bunlar işlem 
gerçekleşirken okunurlar. 
2.6.14 Değişkenlerin Kullanımı 
• Algortima gerçeklemelerinin ara sonuçları 
o Sinyalden değişkene atama 
o Algoritmanın gerçekleştirilmesi 
o Değişkenden sinyale atama 
• Değişkenlerin değerlerine işlemlerinin dışından erişilemez 
• Değişkenler değerlerini bir sonraki işlem çağırılana kadar saklarlar 
Değişkenler özellikle algoritmaların gerçekleştirilmesi için uygundur. Genellikle, algoritma 
gerçekleştirilmeden önce sinyal değerleri değişkenlere kopyalanır. Daha sonra sonuç sinyale yeniden 
aktarılır. Değişkenler değerlerini bir sonraki işlem çağrısına kadar tutar, eğer bir değişken değer 
atanmadan önce okunuyorsa, değişken bir bellek davranışı göstermek zorundadır. Bunun anlamı bir 
latch(tutucu) ve flip flop ile sentezlenmek zorundadır. 

2.6.15 Değişkenler: Örnek 
Eşlik(Parity) hesaplama 
entity PARITY is 
      port (DATA: in   bit_vector (3 downto 0); 
              ODD : out bit); 
end PARITY; 
architecture RTL of PARITY is 
begin 
     process (DATA) 
        variable TMP : bit; 
     begin 
        TMP := `0`; 
        for I in  DATA`low to DATA`high  loop 
           TMP := TMP xor DATA(I); 
        end loop; 
        ODD <= TMP; 
     end process; 
end RTL; 
Sentez sonucu: 
 Örnekte sinyalle değişken arasındaki fark açıkça gösterilmektedir.  Sayısal(scalar) bir sinyal herzaman 
bir hat ile ilgili olabilir., bu değişkenler için geçerli değildir. Örnekte for döngüsü dört kez 
gerçekleştirilmektedir.  Her seferinde TMP değişkeni sonuçlanan donanımdaki farklı bir hattı  
tanımlamaktadır. Farklı hatlar,  uygun XOR kapılarının çıkışlarıdır. 

2.6.16 Global Değişkenler (VHDL'93) 
architecture BEHAVE of SHARED is 
         shared variable S  : integer; 
begin 
        process (A, B) 
        begin 
                S :=  A + B; 
        end process; 
        process (A, B) 
        begin 
                S :=  A - B; 
        end process; 
end BEHAVE; 
• Bir mimarideki tüm işlemler tarafından erişilebilmektedir. 
(paylaşımlı(shared) değişkenler) 
• Karar verilemeyen yapısı olduğu söylenebilir 
Sentezlenebilir kod için kullanılamaz 
VHDL 93’de, global değişkenlere izin verilmektedir. Bu değişkenler belirtilen mimari içindeki tüm 
işlemler tarafından görülebilir. İki işlemin aynı değişkene aynı anda farklı bir değer ataması bir 
problem oluşturabilir . Böyle bir durumda hangi değerin atanacağı belli değildir. Bu kararsız bir 
davranışa neden olmaktadır. 
Sentezlenebilir VHDL kodunda global değişkenler kullanılamaz. 

2.7 Koşutzamanlı(Concurrent) İfadeler 
• Koşutzamanlı ifadeler aynı zamanda yürütülür, 
sıradan bağımsızdır kod içerisinde nerede 
görüldüğünün önemi yoktur 
Mimari içindeki tüm ifadeler koşutzamanlı-aynı zamanda yürütülmektedir. VHDL işlemlerini tek 
koşutzamanlı ifade olarak kullanmak mümkündür, gerekli ek yük (process, begin,end,sensitivity list) 
için tasarımcı sıralı davranışlı işlemlere ihtiyaç duyulmadığında alternatifleri araştırır. Sinyal atama 
ifadeleri bilinen ilk VHDL ifadeleridir.  Atama operatörünün '<=' sol tarafı, sağ tarafındaki değer 
değiştiğinde yeni bir değer alır. Yeni değer,en basit durumda(farklı port modlar için ara sinyal 
gerektiğinde)başka bir sinyalden yada bir dizi sinyalle hesaplanarak atanır. 
2.7.1 Koşullu Sinyal Atama 
TARGET <= VALUE; 
TARGET <= VALUE_1 when 
CONDITION_1 else 
                    VALUE_2 when 
CONDITION_2 else 
                    . . . 
                    VALUE_n; 
• Koşul bool(bolean) bir ifadedir 
• Koşulsuz atama olana kadar else 
kullanılması zorunludur 
o Koşullar birbiriyle örtüşebilir  
o öncelik 
• if ..., elsif ..., else yapılarına eşdeğerdir 
Sinyal atamaları koşul belirtimi ile  de yapılabilir. Yeni bir ‘when’ anahtar sözcüğü ile belirtildikten 
sonra yeni koşullar eklenebilir. Anahtar sözcük ‘else’ kesinlikle gereklidir. Neticede, bellek 
elemanlarının üretilmesi koşullu atamayla mümkün değildir. Aksi halde bu işlemlerde kullanılan if ..., 
elsif ..., else ... yapılarına eşit olurdu. 

2.7.2 Koşullu Sinyal Atama: Örnek 
entity CONDITIONAL_ASSIGNMENT is 
   port (A, B, C, X : in   bit_vector (3 downto 0); 
            Z_CONC : out bit_vector (3 downto 0); 
            Z_SEQ    : out bit_vector (3 downto 0)); 
end CONDITIONAL_ASSIGNMENT; 
architecture EXAMPLE of CONDITIONAL_ASSIGNMENT is 
begin 
   -- Concurrent version of conditional signal assignment 
   Z_CONC <= B when X = "1111" else 
                        C when X > "1000" else 
                        A; 
   -- Equivalent sequential statements 
   process (A, B, C, X) 
   begin 
       if  (X = "1111")  then 
         Z_SEQ <= B; 
       elsif  (X > "1000")  then 
         Z_SEQ <= C; 
      else 
         Z_SEQ <= A; 
       end if; 
   end process; 
end EXAMPLE; 
Örnekte, basit bir multiplexer(çoklayıcı) için iki eşit tanımlama verilmektedir. Lütfen dikkat edin 
ki,tüm sinyaller sinyal atama operatörünün sağ tarafında görülmektedir ve işlem hassasiyet listesine 
girilmiştir. Koşulsuz else yolu, if ifadesinden önceki koşulsuz sinyal atama ile yer değiştirilebilir. Bu 
atama üstüne yazılabilirdir , sadece herhangi bir koşul doğru ise.   

2.7.3 Seçilmiş Sinyal Ataması 
with EXPRESSION select 
   TARGET <= VALUE_1 when 
CHOICE_1, 
                        VALUE_2 when 
CHOICE_2 | CHOICE_3, 
                        VALUE_3 when 
CHOICE_4 to CHOICE_5, 
                        · · · 
                        VALUE_n when others; 
• Seçenekler birbiriyle çatışmamalı  
• Tüm seçenekler göz önüne alınmalı 
o Tek değerler 
o Değer kümesi 
o Değerlerin seçimi  
("|" anlamı veyadır "or") 
o Geri kalan seçimler için "when 
others" kullanılır 
• Case… ve when ... yapısı ile aynı özelliğe 
sahiptir 
Seçilmiş sinyal atamalarının davranışı case ifadelerine benzemektedir.  
2.7.4 Seçilmiş Sinyal Ataması: Örnek 
entity SELECTED_ASSIGNMENT is 
   port ( A ,  B, C, X : in   integer range 0 to 15; 
            Z_CONC : out integer range 0 to 15; 
            Z_SEQ    : out integer range 0 to 15); 
end SELECTED_ASSIGNMENT; 
architecture E X AM P LE  of SELECTED_ASSIGNMENT is 
begin 
   -- Seçilmiş sinyal atamasının koşutzamanlı şekli  
   with X select 
      Z_CONC <= A when 0, 
                           B when 7 | 9, 
                           C when 1 to 5, 
                           0 when others; 
   -- Denk sıralı ifade  
   process (A, B, C, X) 
   begin 
      case X is 
         when 0         => Z_SEQ <= A; 
         when 7 | 9    => Z_SEQ <= B; 
         when 1 to 5  => Z_SEQ <= C; 
         when others => Z_SEQ <= 0; 
   end process; 
end EXAMPLE; 
 Seçilmiş sinyal ataması ',' sembolü ile birbirinden ayrılır. 'case EXPRESSION is' yerine 'with 
EXPRESSION select' kullanılır. 

 2.7.5 Koşutzamanlı İfadeler: Özet 
• Multiplexers(çoklayıcı)  modellemede 
o Koşullu sinyal ataması: birçok sinyal arasından karar vererek 
o Seçilmiş sinyal ataması: tek bir sinyalin değerlerine karar vererek 
• Sıralı ifadeler için kısayoldur"Shortcuts"  
o Koşullu sinyal ataması <=> if ..., elsif ..., else ..., end if 
o Seçilmiş sinyal ataması <=> case ..., when ..., end case 
  Koşulsuz else yolu koşullu sinyal ataması için zorunludur 
Tüm koşutzamanlı ifadeler multiplexer(çoklayıcı) yapısının fonksiyonalitesini tanımlar. Bellek 
elemanlarını modellemek imkansızdır, sadece Flip Flop gibi koşutzamanlı ifadeler modellenebilir. Bu 
nedenle, koşulsuz else yolu koşullu sinyal ataması için  gereklidir. Herbir koşutzamanlı sinyal ataması, 
koşullu veya seçilmişse, işlem yapısı olarak modellenebilir. Sıralı olarak gerçkleştirilen kod kolay 
anlaşılabilir olduğundan, basit fonksiyonalitedeki işler karmaşık hale geldiğinde koşutzamanlı 
versiyonu kısayol olarak kullanılabilir.  

2.8 RTL-Stili 
RTL (Yazmaç Transfer Seviyesi-Register Transfer Level) stil modellemede, tasarım depolama 
elemanlarına bölünür, Flip Floplar veya sıkılıkla söylenen yazmaçlar, ve  bir yazmaçtan diğerine 
transfer fonksiyonu oluşturur. Her bir kombinasyonel işlem için fonksiyonaliteyi tanımlayan bir işlem 
gerekir, ve tüm depolama elemanlarını kontrol eden bir saat işlemi gerekir. Bu iki işlemi bir araya 
getirmek tüm fonksiyonaliteyi modelleyecek tek bir saatle mümkündür. 

2.8.1 Kombinasyonel İşlemler: Hassasiyet 
Listesi  
process ( A, B, SEL ) 
begin 
   if (SEL = '1') then 
      OUT <= A; 
   else 
      OUT <= B; 
   end if; 
end process; 
• Hassasiyet listesi genellikle sentez sırasında gözardı edilir 
• Simülasyon modeliyle ve donanımla aynı davranışta: 
hassasiyet listesi işlem tarafından okunan tüm sinyalleri 
içermelidir 
Ne tür donanım modellendi? 
Eğer SEL hassasiyet listesinde yoksa simülasyonun sonucu ne olacaktır? 
Kombinasyonel işlemin hassasiyet listesi işlem esnasında okunan tüm sinyalleri içermelidir. Özellikle 
unutulmaması gereken şey, hiçbir sinyali unutmamaktır, çünkü sentez araçları, simülasyon araçlarının 
tersine genellikle hassasiyet listesini gözardı ederler. Simülasyon sırasında, sadece bir işlem 
gerçekleştirilebilir, eğer bir olay hassasiyet listesindeki en az bir sinyalden oluşuyorsa. Sentez 
sırasında, VHDL kodu basitçe lojik elemanlarla eşleştirilir. Sonuç olarak, hassasiyet listesinde 
unutulmuş bir sinyal, büyük bir olasılıkla simüle edilmiş VHDL modeli ile sentezlenmiş tasarım 
arasında davranışsal bir farklılığa neden olmaktadır. Hassasiyet listesindeki gereksiz sinyaller 
simülasyonda yavaşlamaya neden olmaktadır. 
Kod örneği bir çoklayıcıyı modellemektedir. Eğer SEL sinyali yoksa, sentez tamamen aynı sonucu 
verir, fakat simülasyon tamamen farklı şekilde davranacaktır. Çoklayıcı, SEL  A veya B olayı kesişene 
kadar düzgün şekilde çalışacaktır. Fakat A veya B olaylarından biri olmadan  işlem 
aktifleştirilmeyecektir ve simülasyonda SEL üzerinde bir olay gözardı edilecektir.  Sonuç olarak, 
simülasyon esnasında, sadece giriş sinyalleri A veya B değişirse çıkış değeri OUT değişir. 

2.8.2 Bekleme WAIT İfadesi <-> Hassasiyet 
Listesi  
process 
begin 
   if SEL = `1` then 
      Z <= A; 
   else 
      Z <= B; 
   end if; 
    wait on A, B, SEL; 
end process; 
• Eş işlemlerdir 
• Birbiryle ilişkili(mutually exclusive): < - > 
o Hassasiyet listesi 
o v e y a  bekleme ifadesi 
process  (A, B, SEL) 
begin 
   if SEL = `1` then 
      Z <= A; 
   else 
      Z <= B; 
   end if; 
end process; 
Bir hassasiyet listesi kullanmak yerine , aynı davranışı modelleyecek WAIT ON ifadesini kullanmak 
mümkündür. İşlemde son ifade olarak yerleştirilir ve  aynı sinyalleri alır.  
Hassasiyet listesi, listedeki sinyallerden biriyle ilgili olay gerçekleştiğinde işlem başlar. Tüm sıralı 
ifadeler gerçekleştirilir ve son sıralı ifadeden sonra işlem askıya alınır bir sonraki olay gerçekleşene 
kadar. Wait ifadesi gerçekleştirildiğinde, işlem sıralı ifade wait ifadesine gelene kadar çalıştırılır ve 
bekleme ifadesindeki koşul gerçekleşene kadar işlem askıya alınır. Eğer bir hassasiyet listesi yoksa bir 
wait ifadesiyle işlemin gerçekleştirilmesi kesilmelidir, yoksa simülatör sonsuz döngüye girer.  
Lütfen tekrar hatırlayın, hassasiyet listesi ile bekleme ifadesinin, aynı zamanda aynı işlem için 
kullanmanıza izin verilmez. 

2.8.3 Kombinasyonel İşlemler: Eksik 
Atamalar 
                                                   entity MUX is 
                                                   port (A, B, SEL : in    std_logic; 
                                                            Z                     : out  std_logic); 
                                                   end MUX; 
architecture WRONG of MUX is 
begin 
   process (A, B, SEL) 
   begin 
       if SEL = `1` then 
           Z <= A; 
       end if; 
   end process; 
end WRONG; 
architecture OK_1 of MUX is 
begin 
   process (A, B, SEL) 
   begin 
       Z <= B; 
       if SEL = `1` then 
           Z <= A; 
       end if; 
   end process; 
end OK_1; 
architecture OK_2 of MUX is 
begin 
   process (A, B, SEL) 
   begin 
       if SEL = `1` then 
          Z <= A; 
       else 
          Z <= B; 
       end if; 
   end process; 
end OK_2; 
Eğer SEL = `0` sa Z ‘nin değeri nedir? 
Hangi donanım sentez sırasında üretilir?  
 Kombinasyonel donanım modellenirken tutucuların üretilmesini engellemek için özel durumlar 
gereklidir. En soldaki kod örneğinde koşulsuz else dallanması eksiktir. Bu nedenle SEL='0' olduğu 
durumda giriş sinyali değişsede Z eski değerini korumuş olur.  Sentez uygun depolama elemanını 
üretmek zorundadır, bir tutucu, SEL ‘in değeri '1' ise transparandır. 
Bu tür depolama elemanları senkron tasarım için önerilmez. Kenar tetiklemeli Flip Floplar tercih edilir 
çünkü olası ara sinyal değerleri kombinasyonel mantık bir sonraki aktif saat kenarına kadar olan 
değerleri filtreler. Buna ek olarak tutucular bir tarama testi tarafından test edilemezler. Tarama testi 
modunda, tüm Flip Floplar tek bir kaydırma yazmacı(tarama yolu) için biraraya getirilir. Tümü aynı 
saat sinyali ile beslenirler. Bu tüm yazmaçlara, chip üzerinde ek bir giriş pini(scan_in) kullanıp 
kaydırarak, belirli bir değer atanmasını  sağlar. Bir sistem saat periyodundan sonra, yazmaçlar ek bir 
çıkış pini kullanıp(scan_out)  kaydırarak yeni değerlerini alırlar. Bu yönden, tarama testi diğer görünür 
iç durumlara erişilmesini sağlar. Tarama testi, üretim testinin test edilebilirliğini geliştirir.  
İki alternatif kodlama vardır, fonksiyonel olarak birbiriyle özdeş ve kombinasyonel mantığı 
(multiplexer-çoklayıcı) sentez araçlarıyla eşleşmiş. Fark, varsayılan değerin verilmesinde görülür. 
Lütfen unutmayın ki sinyal değerleri sadece işlem gerçekleştikten sonra güncellenir.  

2.8.4 Kombinasyonel İşlem: Kuralları 
• Eksiksiz hassasiyet listesi 
o R T L   davranış donanım gerçekleştirmeyle benzer davranıştadır 
o Eksik hassasiyet listesi uyarı veya hatalara neden olur 
• Eksik if ifadesi olmamalı 
o Transparan tutucuların çıkarımı 
2.8.5 Saat İşlemleri: Saat Kenar 
Bulma(Clock Edge Detection) 
• Sentez için yeni bir standart: IEEE 1076.6 
if  
clock_signal_ name'EVENT and 
clock_signal_ name='1' 
clock_signal_ name='1' and 
clock_signal_ name'EVENT 
not clock_signal_ name'STABLE and 
clock_signal_ name='1' 
clock_signal_ name='1' and 
not clock_signal_ name'STABLE 
RISING_EDGE ( clock_signal_ n a m e )  
wait until  
clock_signal_ name'EVENT and 
clock_signal_ name='1' 
clock_signal_ name='1' and 
clock_signal_ name'EVENT 
not clock_signal_ name'STABLE and 
clock_signal_ name='1' 
clock_signal_ name='1' and 
not clock_signal_ name'STABLE 
RISING_EDGE ( clock_signal_ n a m e )  
clock_signal_ name='1' 
IEEE 1076.6  henüz tüm araçlar tarafından tamamen desteklenmemektedir 
Hassasiyet listesi sentez araçları tarafından genellikle reddedildiği için ve bekleme ifadeleri 
sentezlenemediği için, bu bellek elemanlarını modelleme sorunu için bir çözüm bulunmuştur. Sentez 
araçları VHDL kodunda kesin kalıplar arayarak bu konuyu çözerler, iki işlem stilinin ilk seçeneği 
olarak isimlendirilir('if/wait until X'event and X='1' then'). Simülasyon sırasında tüm alternatifler aynı 
davranışı göstermektedir.  Lütfen dikkat edin, 'wait until'  ifadesinde olay bulmak gereksizdir çünkü 
bir olay 'wait until' yapısı için kesinlikle gereklidir. 
Bu arada IEEE 1076.6 standardı yazmaç üreten VHDL yapılarının listesini içerir. Ancak bu standart 
tüm sentez araçları tarafından tamamen desteklenmemektedir. Bu nedenle ilk seçenek sentez için 
yükselen/alçalan saat  kenarı en sık kullanılan tanımlama yoludur.  Asenkron aktifleştirme veya 
yenidan başlatma sinyalleri sadece IF ifadeleri uygulanabilir olduğunda mevcuttur. 

2.8.6 Artan Kenarın Fonksiyon Kullanarak 
T e s b i t i   
• std_logic_1164 paketinde tanımlanmıştır 
process 
begin 
   w a i t  until  RISING_EDGE (CLK); 
   Q <= D; 
end process; 
function RISING_EDGE (signal CLK : std_ulogic) 
             return boolean is 
begin 
     if (CLK`event and CLK = `1` and CLK`last_value = `0`) then 
         return true; 
     else 
         return false; 
     end if; 
end RISING_EDGE; 
 RISING_EDGE fonksiyonu sentez araçlarını desteklemeyebilir. Yine de simülasyon için faydalı 
olabilir.   

2.8.7 Yazmaç Çıkarımı(Register Inference) 
library IEEE; 
use IEEE.std_logic_1164.all; 
entity COUNTER is 
port ( C L K :   in std_logic; 
         Q    :  o u t  integer  range 0 t o  15 ); 
end COUNTER; 
architecture RTL of COUNTER is 
    signal  COUNT  : integer  range 0 to 15 
; 
begin 
   process ( C L K )  
   begin 
      if CLK`event and CLK = `1` then 
          if (COUNT >= 9) then 
             COUNT <= 0; 
         else 
             COUNT <= COUNT +1; 
         end if; 
      end if; 
   end process; 
   Q <=  COUNT ; 
end R T L ;  
• Bellek elemanlar, bir saat işlemi içerisinde, tüm sürülen sinyaller 
için sentezlenmiştir  
o COUNT: 4 flip flop 
o Q: saat işlemlerinde kullanılmamaktadır 
 Örnekte 1 basamaklı onluk sayıcının VHDL modeli gösterilmektedir. Birçok şey 
kullanılmıştır,bunlar;  
İlk olarak, tasarım sıfırlanamaz. eğer sinyallere başlangıç değerleri atarsak bu simülasyon için bir 
sorun oluşturmaz. Gerçek dünyada donanım bu kadar hoş karşılamaz, fakat bellek elemanlarının iç 
durumları güç verildikten sonra bilinmemektedir. Tuhaf ve nedeni anlaşılmaz davranışları engellemek 
için, tasarımı iyi tanımlanmış duruma getirecek bir sıfırlama(reset) özelliği ile desteklenmesini 
önermektedir.   
İkinci olarak, tamsayı(integer) sinyallerin değer aralığı sınırlandırılmıştır.  Sentez araçları, tel 
üzerinden iletilmiş bit örneğindeki(pattern) tüm veri tipleriyle eşleştirilmelidir. Herhangi bir değer 
kümesi sınırlandırma tanımlaması yapmadan, tamsayı(integer) değer kümesi -2,147,483,647 ile 
+2,147,483,647 arasındadır, bu 32 bit’e eşittir. Maksimum sayıcı değeri 9 olduğundan değer aralığı 0 
dan 9’a sınırlandırılmıştır. Sentez sırasında 4bit 9 u göstermek için yeterlidir, teorik olarak 4 bitle 
maksimum sinyal değeri 15 olabilmektedir. Sentez araçlarında oluşabilecek olası hataları önlemek ve 
sayıcının 0’la yeniden başlatılacağını garanti etmek için değer kümesi sentez donanımıyla eşleşcek 
şekilde atanmalıdır. 
Üçüncü olarak, çıkış portu Q ya ek olarak iç sinyal COUNT tanımlanmalıdır. Bu nedenle Q ‘nun port 
modu ' out ' olarak bildirilmiştir, onun değeri mimari içinde okunabilir değildir. Bir sonraki değeri bir 
önceki değerine bağlı olduğundan, sayma işlemi için kullanılacak ara sinyal COUNT belirtilmelidir. 
İşlemin kendisi asenkron kontrol sinyalleri olmayan saat işlemidir ve bu sebepten CLK sinyali 
hassasiyet listesindeki tek sinyaldir.  
Flip Floplar sadece saat işlemleriyle çalışırlar. Bir saat işleminde güncellenen herbir sinyal, bir yazmaç 
kullanır.Bu nedenle dört bellek elemanı oluşturulmuştur COUNT sinyali için. Çıkış değerlerinin 
araması aynı zamanda gerçekleşir, Flip Flopların çıkışları doğrudan COUNTER modülünün 
çıkışlarına bağlanmıştır. 

2.8.8 Asenkron Atama/Yeniden Başlatma  
           (Set/Reset) 
library IEEE; 
use IEEE.std_logic_1164.all; 
entity ASYNC_FF is 
port (D, CLK, SET, RST : in   std_logic; 
        Q                            : out std_logic); 
end ASYNC_FF; 
architecture RTL of ASYNC_FF is 
begin 
    process  (CLK, RST, SET) 
    begin 
        if (RST = `1`) then 
          Q <= `0`; 
       elsif SET ='1' then 
          Q <= '1'; 
        elsif (CLK`event and CLK = `1`) then 
          Q <= D; 
        end if; 
    end process; 
end RTL; 
• Sadece hassasiyet listesi olan işlemlerde mümkündür 
• If / elsif - yapısı 
o Saat kenar tesbiti son koşul olarak 
o Koşulsuz else dallanması yoktur 
Daha önce belirtildiği gibi, herbir saatli tasarımın yeniden başlatma(reset) yeteneğinin olması önerilir. 
Eğer senkron yeniden başlatma stratejisi yürütülüyorsa, yeniden başlatma sinyali başka kontrol 
sinyalleri ile tetiklenir, saat sinyali işlem hassasiyet listesindeki tek sinyal olabilir.  
Tamamen senkron saat işlemleri 'wait until' yapısıyla tanımlanabilirken, asenkron kontrol sinyalleri 
hassasiyet listesi olan  işlemlerle modellenebilir.  İşlemin gerçekleştirilmesini tetikleyebilecek tüm 
sinyaller yeniden listelenmek zorundadır, asenkron sinyaller(genellikle sadece yeniden 
başlatma(reset)) eklenmiştir. İşlemin kendisi, önce asenkron sinyalleri kontrol eden, daha sonra da 
aktif saat kenarı tesbit edilen bir if-yapısı içerir.  
Senkron olaylar için koşul if yapısının son koşulu olmak zorundadır  çünkü asenkron kontrol sinyalleri 
genellikle kullanılan donanım birimleri için en yüksek öncelikle tetiklenir.  Koşulsuz else yolu 
kesinlikle yasaktır çünkü aktif saat kenarında olmadığında işlenmesi gereken ifadelerin fiziksel bir 
gösterim şekli yoktur. 
Bu asenkron sinyallerden herhangi birini unutmamak çok önemlidir. Yoksa simülasyon sentez 
sonuçlarıyla farklılık gösterir, simülasyon araçları hassasyiet listesi temellidir ve sentez araçları 
hassasiyet listesini tamamen gözardı eder. 

2.8.9 Saatli İşlemler: Kuralları 
process 
begin 
    w a i t  until CLK'event and CLK='1'; 
    if RESET = '1' then 
       -- synchronous register reset 
    else 
       -- combinatorics 
    end if; 
end process; 
• Wait-yapısı: hassasiyet listesi yoktur 
• Senkron yeniden başlatma(reset) 
process(CLK, RST) 
begin 
    if (RST = `1`) then 
       -- asynchronous register reset 
    elsif (CLK`event and CLK=`1`) then 
       -- combinatorics 
    end if; 
end process; 
• If-yapısı: sadece saat ve asenkron sinyaller(reset) hassasiyet 
listesindedir 
• Senkron ve asenkron yeniden başlatma(reset) 
Sürülen tüm sinyaller için yazmaçlar kullanılır 
Tüm yazmaçlar yeniden başatılabilir(resetable) 
2.8.10 Sorular 
Aşağıdaki sorulara yalnızca EVET ya da HAYIR şeklinde cevap verin. 
14. Saatli işlemlerde hangi sinyaller yazmaçlardan sonuç çıkarak kullanılır? 
  14.1. Geçici sinyaller. (EVET/HAYIR)  
  14.2. Atama içeren sinyaller. (EVET/HAYIR)  
  14.3. Okunmuş sinyaller. (EVET/HAYIR) 
15. Hangi iki işlem tipi RTL-stilinde izin verilir?  
15.1. Karma ve analog işlemler. (EVET/HAYIR)  
15.2. Kombinasyonel ve sıralı işlemler. (EVET/HAYIR) 
16. Sentezlenmiş tasarımda tutucuların oluşturulmasının nedeni nedir?  
16.1. Koşutzamanlı IF-ifadesi. (EVET/HAYIR)  
16.2. Unutulmuş else-yolu. (EVET/HAYIR) 
16.3. IF veya CASE –ifadelerinin tüm yollarında sinyal ataması gerçekleştirilmemiş. 
                        (EVET/HAYIR)
  16.4. Eksik hassasiyet listesi. (EVET/HAYIR) 
17. İstenmeyen tutucular en etkili yoldan nasıl önlenebilir?  
  17.1. IF-ifadeleri yerine CASE-ifadeleri koyarak. (EVET/HAYIR)  
  17.2. IF veya CASE ifadelerinden önceki tüm sinyallere varsayılan değer  atayarak 
          (EVET/HAYIR) 
CEVAPLAR: 
14.1:HAYIR    14.2:EVET    14.3:HAYIR 
15.1:HAYIR    15.2:EVET 
16.1: HAYIR    16.2:EVET    16.3:EVET    16.4:HAYIR 
17.1:HAYIR    17.2:EVET 

2.9 Altprogramlar(Subprogram) 
• Fonksiyonlar 
o Fonksiyon ismi bir operatör olabilir 
o İstediğiniz sayıda giriş parametresi  
o Sadece bir dönüş değeri  
o W A I T   ifadesine kullanılamaz 
o Fonksiyon çağrısı <=> VHDL ifadesi 
• Prosedür 
o Herhangi bir yönde istenilen sayıda parametre (input/output/inout) 
o Geridönüş ifadesi ‘RETURN’ opsiyoneldir (geri dönüş değeri olmayabilir) 
o prosedür call <=> VHDL ifadesi 
• Altprogramlar aşırıyüklenebilirler (overloaded) 
• Parametreler sabit(constant), sinyal, değişken veya dosya olabilir.  
 VHDL'93 de karışık('impure') fonksiyonlara izin verilir. 
Altprogram terimi fonksiyonlar,prosedürler ve operatörlerin biraradaki ismidir.  Operatör tanım l a m a  
fonksiyon tanımlamanın özel bir durumudur,tanımlama fonksiyon isminin yerine operatör sembolünün  
çift tırnak(") içerisinde yazılmasıyla yapılır. Lütfen dikkat edin, yeni bir operatör tanımlamaya izin 
verilmez, sadece bir fonksiyonu farklı bir giriş parametresi kümesi için sağlar.  Buna 
aşırıyükleme(overloading) denir ve tüm alt programlara yüklenebilir.  
Altprogram tanımı altprogram bildirimini(declaration) içerir, belirtici ve paramtere listesi tanımlanır, 
altprogram gövdesi ise davranışı tanımlar. Altprogram gövdesindeki ifadeler sırayla gerçekleştirlir.  
Bir fonksiyon çağırma ifadesi ('a + b' gibi) bir ifade içerisindeki  bir ifadedir. Diğer bir taraftan bir 
prosedür çağırma, ('c := a + b;' gibi) bir ifadedir ve bunedenle sıralı olarak gerçekleştirilen veya bir 
mimaride bulunan koşutzamanlı  ifadeler gibi davranan bir işlemin içine koyulabilir. Geridönüş 
(return) değeri ' return 'anahtar sözcüğü ile atanır,bir alt programın içerisinden birçok kez koyulabilir. 
Unutmayın ki bir prosedürün geri dönüş değeri olmaz!   
Karışık(IMPURE) fonksiyonlar kapsamı dışındaki objelere ulaşma yetkisi vardır. Bu aynı 
parametrelerle çağırıldığında  farklı geridönüş değerlerine izin verir . Örneğin, eğer bir fonksiyon 
çağrısı kullanıldığında giriş değerlerini bir dosyadan okuyorsa, VHDL’87 de dosya fonksiyonun içinde 
bildirilmek zorundaydı. Dolayısıyla, fonksiyon her çağırıldığında dosya açılırde ve kapatılırdı.  Bu 
nedenle, herzaman ilk karakter okunmuş olurdu.VHDL’87 de bir karakterden sonra başka bir karakter 
okuma fonksiyon çağırmayal mümkün değildi, eğer dosyanın kendisi herbir fonksiyon çağrısını 
sağlamıyorsa.  
VHDL’93 de karışım (IMPURE) mekanizması ve global objelerin varlığı ile VHDL kodun hehangi bir 
yerinde dosya açma ve karakterden sonra karakter okuma fonksiyon çağırmayla mümkün olmaktadır. 
Diğer güzel bir örenk, her seferinde farklı sayı üreten rastgele sayı üreticinin gerçeklemesidir. Elbette 
rastgele sayılar bir dosyadan okunabilir. 

2.9.1 Parametreler ve Modlar 
• Resmi parametreler (parametre bildirimi) 
o varsayılan mod: IN(giriş) 
o IN giriş modu için varsayılan parametre sınıfı :sabit(constant),  
çıkış ve giriş-çıkış modu OUT/INOUT için: değişken(variable) 
o Dosya parametrelerin modu yoktur 
• Gerçek parametreler (altprogram çağırma) 
o Resmi parametrelerdeki sınıflarla uyuşmalıdır 
o Sınıf sabitleri gereçk sabitler,sinyaller veya değişkenlerle uyuşmalıdır 
Fonksiyon parametreleri herzaman IN(giriş) modundadır ve değişken olarak 
tanıtılamazlar. 
 Analogdan varlık portlarına, altprogram parametrelerin onlarla ilgili kesin bir modu vardır. Varsayılan 
mod IN giriş modudur, bunlar sadece okunabilirler. Sinyal elemanları(' event ', ' last_value ',vb.) 
sadece eğer yasal parametreler sinyal olarak bildirildilerse kullanılabilir.  Lütfen dikkat edin ki, sinyal 
elemanlarının ' stable ', ' quiet ', ' transaction ' ve ' delayed ' kullanımı yasaktır.  
Gerçek parametreler alt program çağrısında kullanılır ve varsayılan olarak sabit olarak ele alınır.  
Yasal ve gerçek parametrelerin sınıfları birbiriyle uyumlu olmalıdır. Eğer bir parametre sinyal olarak 
bildirilmesi ve çağırmada bir değişkenin  gerçek parametre olarak kullanılması  bir hatadır. ‘constant’ 
tipinin parametreleri tüm olası tiplerle uyuşmaktadır. 

2.9.2 Fonksiyonlar 
architecture EXAMPLE of FUNCTIONS is 
   [(im)pure] function COUNT_ZEROS (A : bit_vector) 
                                                           return integer is 
      variable ZEROS : integer; 
   begin 
      ZEROS := 0; 
      for I in A'range loop 
         if A(I) = '0' then 
            ZEROS := ZEROS +1; 
         end if; 
      end loop; 
      return ZEROS; 
   end COUNT_ZEROS; 
   signal WORD:     bit_vector(15  downto 0); 
   signal WORD_0: integer; 
   signal IS_0:         boolean; 
begin 
   WORD_0 <= COUNT_ZEROS(WORD); 
   process 
   begin 
      IS_0 <= true; 
      if COUNT_ZEROS("01101001") > 0 then 
         IS_0 <= false; 
      end if; 
      w a i t ;  
   end process; 
end EXAMPLE; 
• Karma/tek ((Im)pure) bildirim 
opsiyoneldir  
(varsayılan: tek'pure' = VHDL'87) 
• Gövde bildirimsel ve tanımlama bölümü 
olarak bölünür 
• Sınırsız parametreler mümkündür  
(dizi boyutu belirtilmemiş) 
• Diğer VHDL ifadeleri gibi kullanılabilir 
(koşutzamanlı veya sıralı) 
Anahtar sözcük ' pure '  eskitipteki fonksiyonlar için, ' impure ' anahtar sözcüğü ise yeni VHDL’93 
fonksiyon tipini bildirir. Eğer herhangi bir anahtar sözcük belirtilmediyse varsayılan bildirim PURE 
‘dür.  Bir PURE fonksiyonun paylaşılmış bir değişkene erişim yetkisi yoktur, çünkü paylaşımlı 
değişkenler(shared variables) bir mimarinin bildirimsel bölümünde bildirilirler ve PURE 
fonksiyonların kendi alanları dışındaki bir objeye erişim hakkı yoktur.  
Kod örneği bir bit_vector deki 0’ların sayısını veren bir fonksiyonu göstermektedir.  fonksiyon 
çağrılarında sadece giriş modundaki(‘in’) parametrelere izin verilmektedir ve varsayılan olarak sabit ' 
constant ' gibi davranılır. Bit vektörün boyutu belirtilmemiştir, bu nedenle sınırlandırılmamış yasal 
parametreler kullanılmıştır. Neticede altprogram kodu gerçek vektör genişliğinden bağımsız olarak 
yazılmıştır. Bu öntanımlı elemanların yardımıyla yapılmıştır,  örnekteki değer kümesi' range ' elemanı 
gibi. Bu yönden, for döngüsü girilen herhangi bir vektör uzunluğuna göre çalışmaktadır. Eğer 
sınırlandırılmış bir dizi (bit_vector(15 downto 0)),  kullanılsaydı, gerçek parametre aynı tipte 
olmalıydı, dizi elemanlarının tipi ve dizinin boyutu uyuşmalıydı. Dizinin değer kümesinin yönü farklı 
olabilirdi.  
Fonksiyonlar VHDL ifadesinde gerek duyulan herhangi bir yerde kullanılabilir. Fakat altprogramların 
kendisi ,işlemler gibi sıralı olarak gerçeklenmektedir. İşlemlere benzer şekilde, lokal değişkenler 
bildirmek mümkündür. Bu değişkenler herbir fonksiyon çağırıldığında tip belirtimindeki elemanın en 
sol değerine göre başlangıç durumuna getirilmektedir((boolean: false, bit: '0')). Tamsayılar için en sol 
değer en az  -(2^31)-1 olabilir, ZEROS fonksiyon gövdesinin başlangıcında başlangıç değerine 0 
getirilir.  Kodun daha açık olması için tüm değişkenler için başlangıç değeri girilmesi önerilir. 

2.9.3 Prosedürler 
architecture EXAMPLE of PROCEDURES is 
   procedure COUNT_ZEROS 
                                    (A: in bit_vector; 
                                     signal Q: out integer) is 
      variable ZEROS : integer; 
   begin 
      ZE R OS   :=  0 ; 
      for I in A'range loop 
         if A(I) = '0' then 
            ZEROS := ZEROS +1; 
         end  if; 
      end loop; 
      Q <= ZEROS; 
   end COUNT_ZEROS; 
   signal COUNT: integer; 
   signal IS_0:      boolean; 
begin 
   process 
   begin 
      IS_0 <= true; 
      COUNT_ZEROS("01101001", COUNT); 
      wait for 0 ns; 
      if COUNT > 0 then 
         IS_0 <= false; 
      end if; 
      w a i t ;  
   end process; 
end EXAMPLE; 
• Geri dönüş(return) değeri yoktur 
• Parametre değerleri güncellenebilir  
(m o d  out/inout) 
• Gövde bildirim ve tanımlama parçalarına ayrılır 
• Sınırlandırılmamış parametreler mümkündür  
(dizi boyuru belirtilmeden bırakılabilir) 
• VHDL ifadeler olarak kullanılır (koşutzamanlı veya sıralı) 
Prosedürler, fonksiyonlardan farklı olarak, VHDL deki herhangi bir ifade olarak kullanılabilir. Sonuç 
olarak, bir geri dönüş değeri yoktur, ancak ‘return’ bir alt programın bittiğini belirtmek için 
kullanılabilir. VHDL kodundaki yerine bağlı olarak, bir mimari veya bir işlemin içinde, prosedür 
koşutzamanlı veya sıralı olarak gerçekleştirilebilir.  Tüm altprogramlardaki kodlar sıralı olarak 
gerçekleştirilir.  
Prosedür bir dizi çıkış parametrelerini inceleyerek, çevresinden gelen sonuçlara karşılık verebilir.  Bir 
parametrenin varsayılan modu ' in ' ‘dir, ' out ' veya ' inout ' anahtar sözcükleri sinyal/değişkenlerin 
çıkışlarını bildirmek için gereklidir. Varsayılan olarak, çıkış parametreleri sınıf  değişkenlerdir. VHDL 
derleyicisi, eğer bir fonksiyon bildiriminde bir sinyal parametre olarak alırsa, hata mesajı alınır.  
Parametrelerin sınıfları uyuşmak zorundadır, aşırı yüklenmiş bir prosedürü aklınıza gelebilir, 
parametrelerin sınıf bildiriminde farklılık ile yazılan prosedürler ve uygun atama operatörleri. Hala bu 
mümkün değil  çünkü parametre sınıfı uygun altprogram seçildiğinde yoksayılır.  
Örnek prosedür bir önceki 0 sayma ile aynıdır. Tekrardan, tüm iç değişkenler belirtilmek zorundadır 
çünkü altprogramlar değişken değerlerini kaydedememektedir ve herbir çağrıda ilk değerlerine 
atanırlar. 

2.10 Altprogramın Bildirimi ve Aşırı 
Yüklenmesi(Overloading) 
• Altprogramlar herhangi bir bildirim bölümünde bildirilir/tanımlanır(declared/defined) 
o Paket(package) 
o Varlık(entity) 
o Mimari(architecture) 
o İşlem(process) 
o Altprogram(subprogram) 
• Altprogramların aşırı yüklenmesi(overloading) mümkündür 
o Aynı isim 
o Farklı parametreler 
o Herhangi tipteki altprogramla çalışır 
• Derleme veya çalışma zamanında altprogram çağırıldığında yasal parametreleriyle 
varolan parametreler uyuşmak zorundadır 
Bir altprogram başka bir altprogramın içerisinde bildirildiyse sadece bu ebeveyn "parent" 
altprogram tarafından kullanılabilir. 
2.10.1 Aşırı Yükleme(Overloading) Örneği  
procedure READ ( L          : inout line; 
                              VALUE : out    character; 
                              GOOD : out     boolean ); 
procedure READ (L           : inout line; 
                             VALUE : out    character ); 
procedure READ ( L          : inout line;  
                              VALUE : out    integer; 
                              GOOD : out    boolean ); 
procedure READ ( L           : inout line;  
                               VALUE : out integer ); 
· · · 
• TEXTIO  paketinden giriş rutinleri  
o Bir hattan farklı veri tiplerini çıkarmak 
o a y n ı -özdeş isimler 
o farklı sayıda parametreler 
o farklı parametre tipleri 
 Standart TEXTIO paketinde dosya I/O prosedürleri, okuma(read),yazma (write),hat okuma (readline), 
hat yazma(writeline) ve hat tipleri(line type) öntanımlı olarak bulunmaktadır. Standart veri tipleri için 
birçok aşırı yüklenmiş  okuma/yazma(read/write) prosedürü bildirilmiştir.  Dosyanın  hatından  
belirtilen tipteki değeri alarak çıkarır. Daha önceden mod bildirimiyle ' inout ' belirtildiği şekilde hatın 
kendisi değiştirilmiştir, birçok değer bir hatdan okunmuş olabilir.  Derleme sırasında, yasal 
parametreleriyle gerçek parametreleri prosedür çağrısında uyuşan prosedür seçilir. 

2.10.2 Aşırı Yükleme(Overloading) – 
Geçersiz Yeniden Bildirim   
package P_EXAMPLE is 
   -- 1 -- 
   procedure TEST (A: bit;  
                                 variable X_VAR: out 
integer); 
   -- 2 -- 
   procedure TEST (B: bit;  
                                 variable X_VAR: out 
integer); 
   -- 3 -- 
   procedure TEST (variable X_VAR: out 
integer; 
                                 A: bit); 
   -- 4 -- 
   procedure TEST (A: bit;  
                                 variable X_VAR: in 
integer); 
   -- 5-- 
   procedure TEST (A: bit;  
                                 signal X_SIG: out 
integer); 
   -- 6-- 
   procedure TEST (A: bit;  
                                 signal X_SIG: out 
integer;  
                                 FOO: boolean := false); 
end P_EXAMPLE; 
• VHDL derleyicisi belritilen parametre bildirimlerini 
reddeder: 
o Yasal parametrelerin yasal isimleri (2) 
o Parametre bildirimlerinin sırası (3) 
o Yasal parametrelerin mod/sınıfı (4/5) 
• Varsayılan değerler giriş parametrelerine atanabilir 
Varsayılan parametreler sentezlenebilir kodda kullanılamaz 
Aynı sayıda parametresi olan ve aynı tipte fakat farklı isimde, modda veya sınıfta iki altprogram 
bildirimi mümkün değildir. Derleyici şuna benzer, geçersiz yeniden bildirim( "illegal redeclaration"), 
bir hata mesajı verir. Örnek paket P_EXAMPLE ,2-5 bildirimleri silinmediği sürece başarılı bir 
şekilde derlenemez, bunları açıklama yaparak deneyebilirsiniz. Bu dört prosedür ilki ile aynı isimdedir 
ve hepsinin bir bit’e ve bir tamsayı parametresine ihtiyacı vardır. 
Eğer sinyal ve parametrelerin üstesinden gelebilecek bir altprogram gerekliyse, ek sahte bir giriş 
parametresi eklenerek ve buna varsayılan bir değer atayarak altprogramı bildirmek mümkündür. Bu 
yolla, bildirilmiş altprogram  parametre sayısı olarak ve yeniden  bildirim hatası görülenden farklı 
olmuş olur. 

2.10.3 Aşırı Yüklemede(Overloading) – 
Muğlaklık(Ambiguity) 
-- Declarations 2-4 need to be removed from 
the 
-- package P_EXAMPLE in order to compile! 
use work.P_EXAMPLE.all; 
entity AMBIGUITY is end AMBIGUITY; 
architecture EXAMPLE of AMBIGUITY is 
   signal A:          bit; 
   signal X_SIG: integer; 
begin 
   process 
      variable X_VAR: integer; 
   begin 
      -- 1 -- 
      TEST(A, X_VAR); 
      -- 2-- 
      TEST(A, X_SIG); 
      -- 3-- 
      TEST(A => A, X_SIG => X_SIG); 
      -- 4 -- 
      TEST(A => A, X_VAR => X_VAR); 
      w a i t ;  
   end process; 
end EXAMPLE; 
• Muğlaklık(Ambiguous)eğer 
aşağıdakileri sağlayan tek bir 
altprogram bulunamazsa söylenir: 
o isim 
o yasal parametre sayısı 
o kullanılan parametrelerin 
tipi ve sırası (1/2) 
o yasal parametrelerin ismi  
(isim çağrışımı) 
Aşırı yüklemede muğlaklık için kullanılan parametrelerle bildirilmiş yasal parametrelerin 
eşleştirilmesi için isim çağrışımı kullanılması gerekmektedir. Yoksa derleyici, altprogram çağrılırken 
verilen isimle aynı sayıda ve tipte parametreleri olan tek bir altprogram bulmaya çalışır. Eğer 
bulamazsa, bir hata mesajı verir bunda, muğlak ifade üretilmiş (ambiguos statement) ifadesi yer alır. 
(TEST 1, 2 ifadelerini deneyin) 
Varsayılan değer atanmış giriş parametrelerinin altprogram çağrımında hazır olmasına gerek yoktur. 
Onların kullanımı gerekli değildir, ancak bazı sentez araçları boş parametrelere kendi tiplerinin 
varsayılan değerlerini atarlar(type’left) bu da eğer parametre gövdede gerçekten kullanılıyorsa farklı 
bir davranışa neden olabilir. 

2.10.4 Operatör Aşırı Yükleme 
(Overloading) 
• fonksiyon bildirimi ile benzer şekildedir  
o isim= varolan operatör sembolü çift 
tırnak arasında verilerek 
o operatörün sol/sağ işleneni 
ilk/ikinci parametrelerle eşleştirilir 
• Yeni veri tipi için ek operatör 
fonksiyonalitesi sağlar  
• Operatör içeriğine göre çağırılır 
• Yeni bir operatörün tanımlanmasına izin 
verilmez  
  ’bit_vector’ ile yapılan aritmetik işlemler tanımlanmamıştır 
Tüm standart VHDL operatörleri aşırı yüklenebilir ancak yeni operatörlerin tanımlanmasına izin 
verilmemektedir.  Operatör bildirimi fonksiyon bildirimi ile aynıdır tek fark fonksiyon ismi yerine çift 
tırnak(“) arasında operatörün yazılmasıdır. Parametrelerin sayısı sabittir ve değiştirilemez. Binary 
işlemler için, iki operandı olan işlemlerde,sol/sağ operand ile sol/sağ parametre eşleştirilir. 

2.10.5 Operatör Aşırı Yükleme - Örneği 
package P_BIT_ARITH is 
   function "+" (L: bit_vector; R: bit_vector) return bit_vector; -- 1 
   function "+" (L: integer; R: bit_vector) return bit_vector;      -- 2 
   function "+" (L: bit_vector; R: integer) return bit_vector;      -- 3 
   function "+" (L: bit_vector; R: bit_vector) return integer;      -- 4 
end P_BIT_ARITH; 
use work.P_BIT_ARITH.all; 
entity OVERLOADED is 
   port(A_VEC, B_VEC: in bit_vector(3 downto 0); 
           A_INT, B_INT: in integer range 0 to 15; 
           Q_VEC: out bit_vector(3 downto 0); 
           Q_INT: out integer range 0 to 15); 
end OVERLOADED; 
architecture EXAMPLE of OVERLOADED is 
begin 
   Q_VEC <= A_VEC + B_VEC; -- a 
   Q_VEC <= A_INT + B_VEC; -- b 
   Q_VEC <= A_VEC + B_INT; -- c 
   Q_VEC <= A_INT + B_INT; -- d 
   Q_INT <= A_VEC + B_VEC; -- e 
   Q_INT <= A_INT + B_INT; -- f 
end EXAMPLE; 
 Kod örneği operatör bildirimini ve kullanımını göstermektedir. Eğer tasarım simüle edilecekse 
davranış paket gövdesinde tanımlanmalıdır.  Derleme sırasında, VHDL derleyicisi operatör bildirim 
listesini uyan veri tipleri ile parametre listesini tarar.  Bu yolla, operatör bildiriminin fonksiyon 
gövdesi  ( 1 - 3 ), (a - c) sinyal atamaları için kullanılacaktır. Sinyal ataması (d) bir hataya neden 
olacaktır çünkü iki tamsayının sonucu bir bit_vector e atama henüz tanımlanmamıştır. Atama (e) 
bildirim(4)ün parametre listesini eşleştirir ve son atama standart VHDL operatör olarak kullanılır.  
‘bit’ veri tipindeki aritmetik işlemler standart pakette 'numeric_bit' tanımlanmıştır. Pratikte bu veri 
tipinden çekinilmelidir, ancak, eğer standart paketler varsa bunlar bit vektör tiplerini ve uygun 
işlemleri daha iyi şekilde tanımladıklarından kullanılabilir. 
2.10.6 Sorular 
Aşağıdaki sorulara EVET ya da HAYIR olarak cevap veriniz. 
18. Alt program aşırı yüklemesi nedir?  
  18.1.Aynı parametreli fakat farklı fonksiyon isimli (EVET/HAYIR)  
  18.2. Doğru fonksiyon içeriğe göre seçilir. (EVET/HAYIR)  
  18.3. Aynı isimli fakat farklı parametreli. (EVET/HAYIR) 
19. Aşırı yükleme kullanımında önemli şey nedir?  
  19.1. Aynı isimdeki alt programlar aynı işi yapabilir. (EVET/HAYIR)  
  19.2. Paket başlığında güzel bir altprogram dokümantasyonu vardır. (EVET/HAYIR) 
CEVAPLAR: 
18.1:HAYIR    18.2:EVET    18.3:EVET 
19.1:EVET    19.2:EVET 

3. Simülasyon(Simulation)  
• Derleme Sırası 
• Simülasyonun Akışı 
• İşin Yürütülmesi 
• Gecikme(Delay) Modelleri  
• Testbenç 
• Dosya GirişÇıkışı(File IO) 
3.1 Derleme Sırası (Sequence of 
Compilation) 
• Temel bileşenler yan- veya alt- bileşenlerden önce analiz edilir 
o Mimariden önce varlık  
o Paket gövdesinden önce paket  
• Okun gösterdiğinden öne okun kaynağı analiz edilmeli 
o Varlık/mimariden önce paket  
o Varlık/mimariden sonra konfigürasyon  
Derleme sırası, sinyal bölümlerinin içbağımlılığı tarafından karar verilir. İlk birimler ikincilerden önce 
derlenmelidir, çünkü ikinci birimler ilk birimle ilgili gerekli bilgilere ihtiyaç duyarlar( varlık portları 
kullanılabildikten sonra mimari sinyalleri kullanılabilir). Bu nedenle varlık mimarisinden önce 
derlenir, bir paket başlığı paket gövdesinden önce derlenir ve en son konfigürasyon derlenir.  
Genel kural: Bir modül referans edilmeden önce derlenmiş olmalıdır. 

Örnek 
Bir tasarımın yapısı 
Belirtilen dosyalarda herhangi bir değişiklik olursa 
hangi dosyalar yeninde derlenmek zorundadır? 
o Modül C’nin varlığı 
o Modül D’nin mimarisi 
o Paket PKG1 
o Paket PKG2 
o Paket gövdesi PKG2 
o TB ‘nin mimarisi 
o TB ‘nin konfigürasyonu  
DUT tasarımı, birçok modül(A,B,C,D) içerecek şekilde derlenmiştir.  PKG1 ve PKG2 paketleri modül 
A ve B den referans edilmiştir. PKG1 paketi, bir paket başlığı; altprogramların bildirimi, veri tipleri ve 
sabitleri içeren, ve bir paket gövdesine; uygun tanımlamaları içeren, ayrılmıştır.  
Başlangıç derlemesi için şu sıra uygundur: PKG1, PKG2, PKG2 ‘nin gövdesi(body of PKG2), modül 
D, C, B, A, DUT, TB (önce varlık) ve son olarak testbenç konfigürasyonu. Konfigürasyon simüle 
edilebilir objeyi oluşturduğunda , eğer birşeyler değiştiyse yeniden derlenmelidir.  
Eğer C varlığı değiştiyse, uygun mimari ve konfigürasyon yeniden derlenmek zorundadır.  D’nin 
mimarisindeki herhangi bir değişiklik herhangi konfigürasyonun parçası olan ek bir yenidenderlemeye  
gerek yoktur. PKG1 ‘in yenidenderlenmesi  tüm A modülünün ve konfigürasyonun 
yenidenderlenmesine  neden olmaktadır.  
PKG2  deki değişiklik beraberinde paket gövdesinde ve modül B ‘de yenidenderlenmeyi 
getirmektedir. Eğer değişiklikler paket gövdesiyle sınırlıysa,sadece konfigürasyon, her zaman güncel 
tutulması gerektiğinden.  Aynı şey testbençe(TB) mimarisinde ve konfigürasyonun kendisinde 
değişiktede değiştirmek için uygulanır.  
Lütfen dikkat edin, sadece minör(küçük önemsiz )değişiklikler, VHDL yorumları burada dikkate 
alınmıştır. Eğer varlık portları değişirse,örneğin,  basit bir yeniden derleme yeterli olmayacaktır ve 
tüm hiyerarşi seviyeleri üzerindeki VHDL modül kodları buna uygun şekilde ayarlanmalıdır. Arayüz 
uyumsuzluğu konfigürasyonu derlerken meydana çıkacaktır. 
CEVAP: 
Değiştirilen Dosya  / Yeniden Derlenen Dosya: 
Entity of module C / Package PKG2,  Architecture of module D / Package body PKG2,  
Package PKG1 / Architecture of TB,   Configuration of TB / Boş(Değişiklik yok) 

3.2  Simülasyonun Akışı 
• Tasarım ayrıntılandırma(elaboration) 
o Belirlenmiş elemanlar 
yaratılmıştır 
• Sinyallerin İlklendirmesi (initialisation) 
o Başlangıç değerleri atanır 
• Simülasyon komut üzerinde çalıştırılır 
 Bir VHDL modelinin simülasyonu üç adımda yürütülür. Önce, ayrıntılandırma fazında(elaboration) 
simülasyon modeli yaratılır. İlklendirme (initialisation) fazında tüm sinyallere bir başlangıç değeri 
atanır.  Gerçekleştirme fazında modelin kendisi gerçekleştirilir. 
3.2.1 Ayrıntılandırma (Elaboration) 
• Ayrıntılandırma sırasında tasarım 
elemanları yaratılır 
• Tüm tasarım objeleri simülasyondan 
önce ayrıntılandırılır 
• "for döngüsü" haricindeki değişkenler 
ve objeler altprogramda 
tanımlanmıştır  

3.2.2 İlklendirme (Initialization) 
    type std_ulogic is ( `u` ,`x`,`0`.....) --
 First value is `u` !!! 
    signal clock: std_ulogic :=  `0 `;  
    signal reset: std_ulogic; 
• Başlangıç değerleri: 
o Bildirimden gelen 
başlangıç değerleri 
VEYA 
o Tip tanımındaki ilk değer 
(type`left) 
• Herbir işlem askıya alınana kadar 
gerçekleştirilir 
o ...sinyal değerleri 
güncelleştirilmediği 
sürece 
 Tüm sinyallere başlangıç değerlerinin verilmesi ilklendirme fazında gerçekleşir. İlklendirme fazından 
sonra her işlem askıya alınana kadar gerçekleştirilmiştir. 
3.2.3  Yürütme(Execution)   
• Simülasyon gerçekten 
yürütülmüştür 
• Sinyal değerleri ölçülmüştür 
Tasarım davranışının gerçek simülasyonu  yürütme fazında meydana gelmektedir.  Bunun anlamı 
testbenç işlemleridir, VHDL modeli uyarıcı ile desteklenmektedir. Modelin bireysel sinyalleri 
görüntülenebilir ve dalgaformu penceresiyle kontrol edilebilir. Alınan yanıtla beklenen yanıt 
arasındaki fark    uygun VHDL ifadesiyle karşılaştırılır. 
Örneğin  OCCURRING_TIME zamanındaki alınan değerle beklenen değer arasındaki fark bir if 
ifadesiyle teyit edilir(assertion):  
if now=OCCURRING_TIME then 
   assert EXPECTED_RESPONSE=RECEIVED_RESPONSE 
   report "unexpected behaviour" 
   severity error; 
end if; 

3.3 İşlem Yürütme(Process Execution)  
architecture A of E is 
begin 
   P1 : process 
   begin 
      -- sequential statements 
   end process P1; 
   -- C2: concurrent statements 
   P2 : process 
   begin 
      -- sequential statements 
   end process P2; 
   -- C1: concurrent statements 
end A;  
 Bir mimari işlemleri ve paralel olarak aktif olan koşutzamanlı ifadeleri içermektedir. İşlemlerin 
içerisindeki ifdeler sıralıdırlar ve birbiri ardına yürütülürler. 
Paralel bölümlerin bağlantıları sinyaller ve hassasiyet listesi ile sağlanır. Koşutzamanlı ifadeler 
fonksiyonel olarak denk işlemler olarak  yorumlanırlar, bir hassasiyet listesinin bu işlemde okunacak 
tüm bu değerleri içermesiyle sağlanır. Koşutzamanlı ifadeler  elbette sıralılara aktarılabilmeli (koşullu 
sinyal atamasından -> if ifadesine, seçilmiş sinyal atamasından -> case ifadesine).  
Örneğin, eğer P1 işlemi bir tetikleniyorsa(saat kenarı ile),onun ifadeleri sırayla yürütülür. Bu yolla 
aktif kenardan sonra kodun bölümlerini yürütmek mümkün olmaktadır. Bir dizi sinyalin değiştiğini 
varsayalım. Onların değerleri işlem yürütülmesi bittikten sonra değişmiştir. Bu şematiğe göre, bu 
güncellenmiş değerle C1 ve P1 i tetikler bunlar da P1 ve C2 yi tetikler ve devam eder. Bu ifadelerin 
yürütülmesi stabil bir duruma ulaşana kadar devam eder, yeni bir olay üretilmeyene kadar. 

3.3.1 Koşutzamanlı ve Sıralı Yürütmenin 
Karşılaştırılması  
architecture CONCURRENT of MULTIPLE is 
        signal A, B, C, D : std_ulogic; 
        signal Z : std_logic 
begin 
        Z <= A and B; 
        Z <= C and D; 
end CONCURENT; 
architecture SEQUENTIAL of MULTIPLE is 
         signal Z, A, B, C, D : std_ulogic; 
begin 
        process (A, B, C, D) 
        begin 
              Z <= A and B; 
              Z <= C and D; 
          end process; 
end SEQUENTIAL; 
Eğer aynı iki sinyal ataması VHDL kodunda görünüyorsa,bunlardan biri mimarideki 
koşutzamanlı ifade ve diğeri de işlemdekidir, sonuçlar büyük ölçüde farklılık gösterir: İlk durumda, iki 
paralel sinyal ataması gerçekten bir sinyale yaplımıştır. Bu sadece kararlı tipler için izin verilmektedir, 
bir çözünürlük fonksiyonu hangi değerin sürüleceğine karar vermek için hazırdır.  İkinci durumda, ilk 
atama yürütülmüştür ve sonuçları kaydedilmiştir. Daha sonra bu sonuca başka bir atamayla 
üstüneyazılmıştır, bu nedenle sadece son sinyal ataması taşınmaktadır sinyal güncelleştirildiğinde. 
3.3.2 Sinyal Güncelleme  
• Sinyalleri bir geçmiş değeri, bir mevcut değeri, bir de gelecek değeri vardır 
o Gelecek değer simülatör katmanında kullanılır sadece 
o Geçmiş değer ≠ mevcut değer: olay(event) 
• Sinyal değerleri bir işlem gerçekleştirildikten sonra güncellenirler:  
bir sinyalin eski mevcut değeri üzerine gelecek değer yazılır 
• Simülasyonun tek bir anında birçok işlem çağrısı olması mümkündür 
 Sinyal güncelleme mekanizması VHDL simülatörün olmazsa olmazıdır.  Simülatör sinyal yönetimi 
fonksiyonu içerisinde sinyaller bir geçmiş,bir mevcut  ve bir de gelecek değeri vardır.  Bir işlemdeki 
sinyal atamaları  herzaman sinyalin gelecek değeriyle gerçekleştirilir. Gelecek değer işlem yürütülmesi 
bittikten sonra sinyal güncelleştirme fazında mevcut değere kopyalanır. 

3.3.3 Delta Dönüşü-Çevrimi (1) 
• Simülasyonun bir anında 
• Bir döngü çevrimi = ``delta çevrimi" 
• Delta zamanı simülasyon zamanıyla 
dikeydir-ortogonaldir 
• Sinyaller güncellenmiştir  
• Tüm işlemler başlatılmıştır 
o Sinyal atamaları kaydedilir 
• Yeni sinyal atamaları 
o Daha sonraki işlemler için 
yürütülür 
 Bir sümülasyon çevirimi herzaman bir sinyal güncellemesi ve bir faz işlem yürütülmesini içerir. 
Bunların birçoğuna delta çevirimi denir, sistemi stable hale getirmek için uygulanan bir simülasyona 
zamanı noktasıdır. Delta çevirimi sayısı simülsyon için gereken zamanı etkilemez. Sadece 
simülasyonu gerçekleştirmek için gerekli süreyi etkiler.  
Başlangıçta, tüm sinyaller güncellenir ve sinyal değişimlerinin yaratılmasıyla listedeki bir dizi işlem 
tetiklenir.  Bu listedeki tüm işlemler birbiri ardına delta çevrimi 1 de yürütülmüştür. Yürütülme 
bittiğinde, bir sinyal ataması gerçekleştirilmiştir. Yeniden bir işlem listesi,bu işlemlerin hassasiyet 
listesi sinyal değerleri değişmiş, bir liste oluşturulur .  
Bu süreç işlem listesi boş kalana kadar devam eder, bunun anlamı sinyal olaylarıyla tetiklenmiş 
herhangi bir işlem kalmamasıdır.  Şimdi, gerçek zamandaki adımları('wait for ...', '... after ...') içeren 
ifadeler gerçekleştirilir ve simülasyon zamanı belirtilen zamanda ilerler. Delça çevrimi simülasyon 
zamanına dikey olarak araya girer, birçok delta çevrimi bir simülasyon zamanında gerçekleşebilir. 

3.3.4 Delta Çevrimi(2)  
• Simülasyonun herhangi bir anındaki birçok delta çevrimi gösterilmektedir. 
Delta çevrimi simülasyon zamanını dikey olarak keser. Bu yüzden sabit bir simülasyon zamanında 
birden fazla delta çevrimi yürütülebilir. 

3.3.5 Delta Çevrim - Örneği  
library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity DELTA is 
   port (A, B :  in std_ulogic; 
           Y, Z :   out std_ulogic); 
end DELTA; 
architecture EXAMPLE of DELTA is 
   signal X : std_ulogic; 
begin 
   process (A, B, X) 
   begin 
      Y <= A; 
       X <= B; 
     Z <= X; 
   end process; 
end EXAMPLE; 
   B deki olay (ilk delta çevrimi) 
Y’nin gelecek değeri alır A’nın mevcut değerini(değişim yok)  
X’in gelecek değeri alır B’nin mevcut değerini(yeni değer) 
Z’in gelecek değeri alır X’in mevcut değerini(d e ği ş i m   y o k ) 
 sinyal güncelleme 
   X deki olay (ikinci delta çevrimi) 
Y’nin gelecek değeri alır A’nın mevcut değerini(değişim yok)  
X’in gelecek değeri alır B’nin mevcut değerini(değişim yok) 
Z’in gelecek değeri alır X’in mevcut değerini(yeni değer) 
             sinyal güncelleme 
` 
 A, B, X de başka olay yok 
 B sinyalinin değiştiğini varsayalım. A mimarisinin işlemi, B olayıyla tetiklenmiştir ve ilk olarak 
aktifleştirilmektedir. X in gelecek değeri B’nin mevcut değerine verilmektedir.  İşlemin sonunda, X in 
gelecek değeri mevcut değere transfer edilir.  X in  değerindeki bu değişim ikinci zaman için olan 
işlemi çağıran olayla sonuçlanır.   Şimdi, X ‘in mevcut değeri, Z’nin gelecek değerine(B ve sonuç 
olarak X aynı kalmaktadır) yazılmıştır. İşlemin sonunda, sinyal  güncellenmesi birkez daha 
gerçekleşmektedir, bu nedenle Z nin gelecek değeri Z’nin mevcut değerine aktarılmaktadır.  
Hassasiyet listesinde verilmiş sinyaller A,B veya X in mevcut değerlerinden bir değişiklik görülmediği 
sürece , işlem yeniden çağırılmaz. Her iki X ve Z sinyali değerini B den elde eder.  
Bu örnek sadece gösterme amaçlıdır. X ara sinyali  işlemin fonksiyonalitesi gizlemektedir ve pratikte 
kullanılmaz. Bunun yerine ,genellikle güncelleme mekanizmasına bağlı olan değişkenlerin 
kullanılması tavsiye edilir. 

3.3.6 İşlem Davranışı   
process  (A, B) 
begin 
        if (A=B) then 
            Z <= `1 `;  
        else 
              Z <= `0 `;  
        end if; 
end process; 
process 
begin 
        if (A=B) then 
              Z <= `1 `;  
        else 
              Z <= `0 `;  
        end if; 
         wait on A, B; 
end process; 
• İşlem sonsuz bir döngüdür 
• Wait-ifadesiyle(bekleme) durdurulabilir 
• Hassasiyet listesi wait-ifadesine denktir. 
• Hassasiyet listesi olan bir işlem 
wait(bekleme) ifadesi içeremez 
 Temel olarak, bir işlem sonsuz bir döngü gibi gözönüne alınmalı. Sürekli devam edem yürütme 
wait(bekleme) ifadesiyle kesilebilir.  Hassasiyet listesinin kullanımı WAIT ON-ifadesiyle aynıdır. 
Eğer bir hassasiyet listesi varsa, WAIT ifadesi işlemde olmamalıdır. 

3.3.7 Ertelenmiş İşlemler (Postponed 
Processes)  
postponed  process 
begin 
        Z <=  `0` ;          --
  wrong 
        w a i t  for 0 ns; 
        Z <=  `1` ;          --
  wrong 
        w a i t  on A, B;     --
  wrong 
end process; 
• İşlemler belirli bir anda en son delta çevriminde yürütülürler 
• Aşağıdakilerine izin verilmez: 
o Time 0 bekleme(wait)- ifadesine 
o Gecikme(delay) olmaksızın sinyal atamasına (0 ns için) 
postponed  process (A, B) 
begin 
    if (A=B) then 
        Z <=   `1`  after 5 ns; 
    else 
        Z <=  `0`  after 4 ns; 
    end if; 
end process; 
Ertelenmiş işlemler VHDL'93 deki yeni bir özelliktir 
Ertelenmiş ilemler her zaman en son delta çevrimine taşınır. Bunun anlamı bu işlemler simülasyonun 
o anında daha önceden stabil olan sinyallere ulaşabilmektedir. Ertelenmiş işlemleri için , 
wait(bekleme) ifadesi 0 ns ve sinyal ataması gecikme olmadan yapılmasına izin verilmez. 
Lütfen dikkat edin ertelenmiş işlemler sadece simülasyonda kullanılabilir, sentezde kullanılamaz. 

3.4 Gecikme Modelleri  
Taşıma gecikmesi(Transport delay): 
Modellerin mevcut akışı bir tel üzerinden olur  
(herşey buradan taşınır)  
Eylemsiz gecikme(Inertial delay): (varsayılan 
gecikme mekanizması) 
Modellerin ani voltaj yüklenmesi-davranışın kanıtı 
=> bir değer eğer en az 2ns boyunca aktifse 
aktarılır  
Darbe reddinin limiti ile eylemsiz gecikme 
(Inertial delay with pulse rejection limit) 
Modellerin ani voltaj yüklenmesi-davranışın kanıtı 
=> bir değer eğer en az 5ns boyunca aktifse 
aktarılır  
İki farklı tipte gecikme modeli vardır VHDL de:  taşıma ve eylemsizlik (varsayılan olarak kullanılır). 
Taşıma gecikme modelinde, herşey sinyallerle taşınır, üstteki örnekte de görüldüğü gibi sinyal A 
sinyal  S nin birebir kopyasıdır ancak, 2ns gecikmiştir. Taşıma gecikme modelinde sinyaller bir tel 
üzerinden (propogasyon gecikte ile)taşınırlar , bu yüzden ani durum hemen yansıtılmaz.  
Eylemsizlik gecikmesi kullanıldığındai sinyal geçişleri, sedece yeni değer belirtilen en az sürece 
varolduğu sürece taşınır, bu nedenle ani değişimler bastırılmıştır. 
"S <= A after 2 ns"  2ns den az olan değişimleri filtreler ve gecikme sinyal değerleri 2ns den uzun 
sürelidirt. 
"S <= reject 5 ns inertial A after 10 ns"  minimum 5ns kadar darbe genişliğine ihtiyacı vardır ve A dan 
S ye kadar olan yüm diğer sinyalleri 10 ns lik bir gecikme ile kopyalar.  
Eylemsizlik gecikmesi anahtarlama devrelerinin karakteristiğidir. Belirtilen süreden kısa ani 
değişimler göz ardı edilir ve iletilmez. 
3.4.1 Projelendirilmiş Çıkış 
DalgaFormları(Projected Output 
Waveforms (LRM)) 
• Taşıma ve eylemsizlik gecikmesi(transport and inertial delay): 
o (1) Tüm eski projelendirilmiş işler ondan sonraki ilk iş projelendirilmiş dalga 
formundan silindikten sonra gerçekleşir. 
o (2) Yeni işler projelendirilmiş çıkış dalga formuna projelendirme sırasına göre 
eklenir. 
• Eylemsiz gecikme projelendirilmiş çıkış dalga formu ayrıca değiştirilir: 
o (3) Tüm yeni işler işaretlenir. 
o (4) Bir eski işi, projelendirilme süresi ilk yeni işin projelendirme süresinden 
azsa işaretlenir. 
o (5) Geriye kalan herbir işaretsiz eski işler, eski işler eğer işaretli bir işten önce 
geliyorsa ve onun bileşen değeri işaretlenmişle aynıysa bu da işaretlenir. 
o (6) Sürücünün mevcut değerine karar veren iş işaretlenir. 
o (7) Tüm işaretsiz işler(hepsi eski işlerdir) projelendirilmiş çıkış dalga 
formundan silinir. 
Gecikme mekanizmasının tanımı VHDL dili başvuru kitabında yer almaktadır. Sonuç olarak, tüm 
sinyal atamaları şu formatı göstermek zorundadır:  
T <= reject TIME_1 inertial VALUE after TIME_2; 
Belirtilen bu atamalar birbirinin anyıdır:  
T <=                                        VALUE after TIME_1; -- (default inertial delay) 
T <=                           inertial VALUE after TIME_1; 
T <= reject TIME_1 inertial VALUE after TIME_1; 
Bunlarda birbirinin aynıdır: 
T <= transport                 VALUE after TIME_1; 
T <= reject 0 ns inertial VALUE after TIME_1; 
Bu nedenden dolayı ki gecikme reddetme limitinin 0ns olması tüm işlerin işaretlenmiş yapar(adım 3) 
ve hiçbir işlem silinememiş olur(adım 7). Sonuç olarak 3 den 7 ye kadar olan adımların herhangi bir 
etkisi yoktur ve gecikme modeli tamamen taşıma modeline denk hale gelmektedir.  
Bununla birlikte "T <= VALUE"  sadece "T <= VALUE after 0 ns" için sadece bir kısayoldur. 

3.4.2 Taşıma Gecikmesi (Transport Delay) 
            (1)  
signal S : integer := 0; 
process 
begin 
      S <= transport 1 after 1 ns; 
      S <= transport 2 after 2 ns; 
      wait; 
end process; 
signal S : integer := 0; 
process 
begin 
      S <= transport 2 after 2 ns; 
      S <= transport 1 after 1 ns; 
      wait; 
end process; 
Bir sinyal sürücüsü değer/zaman çiftini yönetir.Yeni bir değer atamak mümkün 
değildir eğer Zamani < Zaman i-1 
Bir sinyal sürücüsünde, gerçek değerler herzaman aktivasyon zamanıyla ilişkilidir.  Örnekteki 
tamsayı(integer)sinyal için başlangıç değeri/zamanı(0,0ns) çiftinin figürde herhagi bir zamanda 
etkilenmeden kaldığı gösterilmiştir.  
Bir sinyal ataması yapılınca yeni bir çifte neden olur,  değer/zaman çiftindeki zaman  kronolojik olarak 
son liste girişinden sonra olmalıdır. İlk sinyal ataması en kolay olanıdır sadece listeye eklenir. Aynı 
şekilde eğer zamandan sonra geliyorsa uygulanır soldaki örnekte olduğu gibi. Yoksa yeni değer/zaman 
çifti bir öncekinden sonra değilse önceki tüm çiftler silinir.(sağdaki örnek, adım 1).  
Daha öncekileri silmeden daha önceki zaman ait bir işlem eklenemez. 

3.4.3 Taşıma Gecikmesi (Transport Delay) 
            (2) 
signal S : integer := 0; 
process 
begin 
  S <= transport 1 after 1 ns, 3 after 3 ns, 5 after 5 ns; 
  S <= transport 4 after 4 ns; 
wait; 
end process; 
signal S : integer := 0; 
process 
begin 
  S <= transport 1 after 1 ns, 3 after 3 ns, 5 after 5 ns; 
  S <= transport 4 after 6 ns; 
wait; 
end process; 
Yeni çiftler listeye eklenir yada olan elemanların üzerine yazılır 

3.4.4 Eylemsiz Gecikme(Inertial Delay) (1)   
signal S : integer := 0; 
process 
begin 
     S <= 1 after 1 ns; 
     S <= 2 after 2 ns; 
     wait; 
end process; 
signal S : integer := 0; 
process 
begin 
     S <= 1; 
     S <= 2; 
     wait; 
end process; 
signal S : integer := 0; 
process 
begin 
     S <= 2 after 2 ns; 
     S <= 1 after 1 ns; 
     wait; 
end process; 
signal S : integer := 0; 
process 
begin 
     S <= 1 after 2 ns; 
     S <= 1 after 1 ns; 
     wait; 
end process; 
S <= 1; -- equivalent to 
S <= 1 after 0 ns; 
Bir sinyale son atama işlemde etkili olmaktadır  
Örnekte, sinyal atamasında belirtilen darbe reddetme limiti "S <= 2 after 2 ns" 2ns dir. Bunedenle 
tekrarlama zamanı 0ns den küçük (2 ns artı darbe reddetem süresi; adım 4) olan tüm işlemler 
işaretlidir.Bu yüzden  (1, 1 ns) çifti işaretlenmemiş ve son adımda silinmiştir(adım 7).  
Sağdan üç örnekte gösterilen yeni değer/zaman çiftindeki zamanda  listedeki listedeki en büyük zaman 
çiftidir, bu nedenle eski girişlerin üzerine yeni olanı yazılmaktadır(adım 1 silme, adım 2 yeni değer 
ekleme), reddetme limit değerlerinden bağımsız olarak. 

3.4.5 Eylemsiz Gecikme(Inertial Delay) (2)  
İlk sinyal atamasından"S <= 1 after 1 ns, 3 after 3 ns, 5 after 5 ns;"  sonra, liste üç değer/zaman çifti 
içermektedir. 
İkinci sinyal ataması  "S <= 3 after 4 ns, 4 after 5 ns;", listedeki son girişi siler çünkü 4 ns <= 5 ns 
(adım 1) ve iki girişi ekler(adım 2). Daha sonra, tüm yeni işlemler (adım 3) ve elbette (3,3ns) 
işaretlenmiştir, çünkü bu işlem işaretlenmiş işlerin atasıdır ve bu işaretlenmiş işlemlerle aynı değere 
sahiptir(adım 5). İşaretlenmemiş girişler silinmiştir,bunlar (1, 1 ns) ve (2, 2 ns) söylenen sırayla 
gerçekleştirilir(adım 7). 

3.4.6 Eylemsiz Gecikme(Inertial Delay) (3) 
signal S : integer := 0; 
process 
begin 
      S <= 2 after 3 ns, 2 after 12 ns, 12 after 13 ns, 5 after 20 ns, 8 after 42 ns; 
      S <= reject 15 ns inertial 12 after 20 ns, 18 after 41 ns; 
      wait; 
end process; 
Sinyal ataması "S <= 2 after 3 ns, 2 after 12 ns, 12 after 13 ns, 5 after 20 ns, 8 after 42 ns;" ilk listeyi 
oluşturmaktadır.  
İkinci sinyal ataması "S <= reject 15 ns inertial 12 after 20 ns, 18 after 41 ns;" listeyi aşağıdaki şekilde 
değiştirir:  
adım 1 : zaman değeri 20ns den büyük veya eşit tüm çiftler silinecektir  
adım 2 : yeni çiftler sona eklenecektir  
adım 3 : tüm yeni işlemler işaretlenecektri (sarı); 
adım 4 : eski işlemler(20ns den küçük olanlar) dan reddetme limiti (15 ns) farkı yani 5ns olanlar 
işaretlenmiştir (yeşil) 
adım 5 : hala işaretlenmemiş olarak bulunan işlemler(kırmızı) ile işaretlenmiştir eğer doğrudan 
işaretlenmiş bir işlemin atası ve daha önce işaretlenmiş işlemle aynı değerdeyse.  
adım 6 : mevcut değer/zaman çifti işaretlenmiştir;  sadece işaretli olanlar listede kalmıştır  
adım 7 : tüm işaretsiz işlemler silinmiştir. 

3.5 Testbenç(Testbenches) 
• DUT için tepki vericidir(test vektörleri) 
• Sentezlenebilir olmasına ihitiyaç yoktur 
• Çıkış tarafında port yoktur 
•  DUT için çevre 
• Tasarım için doğrulama(verification) ve 
sağlama(validation)  
• Birçok çıkış metodu 
• Birçok giriş metodu 
Bir testbenç, bir tasarımın fonksiyonalitesini doğrulamak için kullanılır.Testteki Araçlar Device Under 
Test (DUT) için tepkiyi sağlar ve DUT’in yanıtlarını analiz eder veya bir dosyada saklar.  Tepki 
yaratmak için gerekli olan bilgi tenstbençe doğrudan entegre edilmiştir veya  dışardan bir dosyadan 
yüklenebilir. Simülasyon araçları sinyalleri görüntüler, bu dalga formu(waveform) ile gerçekleştirilir 
böylece tasarımcı beklediği değerlerle elde ettiği değerleri karşılaştırır. Eğer dalgaformu doğru değilse 
uyuşmuyorsa tasarımcı kaynak kodu değiştirmelidir. Büyük projeler için bu yöntem pek de kullanışlı 
değildir bunun için tek yol düzeltmenin otomatik olarak yapılmasıdır bu da şimdilik bir hayalden 
ibarettir.           

3.5.1 VHDL Testbenç’in Yapısı   
entity TB_TEST is 
end TB_TEST; 
• Boş varlık 
architecture BEH of TB_TEST is 
   -- component declaration of the 
DUT 
   -- internal signal definition 
begin 
   -- component instantiation of the 
DUT 
   -- clock generation 
   -- stimuli generation 
end BEH; 
• DUT ‘ın bildirilmesi (Declaration) 
• Testbenç sinyalleriyle DUT arasındaki bağlantının kurulması 
(Connection) 
• Tepki ve saat üretme (Stimuli and clock) (davranışsal 
modelleme) 
• Yanıt analizi (Response analysis) 
configuration CFG_TB_TEST of 
TB_TEST is 
   for BEH; 
       -- customized configuration 
   end for; 
end CFG_TB_TEST; 
• Testbençi simüle etmek için varsayılan yada kişiselleşitirilmiş 
konfigürasyon  
Bir testbençin varlığı tamamen boş olmalıdır, çün gerekli tepkiler bağımsız oluşturulmuştur. 
Diğertürlü, bir testbenç bir testbençe ihtiyaç duyabilir. Dut ‘ın girişleri doğrudan  uyarılamadığından, 
iç geçici sinyaller tanımlanmalıdır. Port isimleri ile iç sinyalleri birbirinden ayırabilmek için önekler 
koyulabilir, örneğin "W_" bir teli(wire) belirtmek için kullanılır.  
Testbenç mimarisinin bildirim bölümü, iç sinyallerin tanımlanmasını, DUT veya DUT’ların bir 
eleman bildirimini ve sabit tanımlamalarını(saat periyodunun atanması) içerir. Bir tepki işlemi DUT’ın 
giriş portları için değer sağlar, davranışsal modelleme  sentezlenmesine gerek duyulmadan çalıştırılır. 
Bazen dış eleamnların modelleri kullanılabilir(belkide sadece davranışsal bildirim)  ve tüm sistem için 
benzer şekilde kullanılabilir .  
Bir konfigürasyon  istenilen elemanı simülasyon için seçer. 

3.5.2 Örnek 
entity TB_TEST is 
end TB_TEST; 
architecture BEH of TB_TEST is 
   component TEST 
      port(CLK       : in std_logic; 
             RESET  : in std_logic; 
             A            : in integer range 0 to 15; 
             B            : in std_logic; 
             C            : out integer range 0 to 15); 
end component; 
   constant PERIOD  : time := 10 ns; 
   signal W_CLK      : std_logic := '0'; 
   signal W_A, W_C   : integer range 0 to 15; 
   signal W_B             : std_logic; 
   signal W_RESET   : std_logic; 
begin 
   DUT : TEST 
      port map(CLK       => W_CLK, 
                     RESET  => W_RESET, 
                     A            => W_A, 
                     B            => W_B, 
                     C            => W_C); 
   · · · 
• Mimartinin bildirim bölümü 
o Bileşen(component) 
o İç sinyaller(internal signals) 
o Altprogramlar(subprograms) 
o Sabitler(constants) 
• DUT örneklemesi  
• Modül portları ile iç sinyallere bağlanma 
Başlangıö saat sinyalini ‘0’atayın 
 Örnekte TEST tasarımı için VHDL testbençi gösterilmektedir.  Tasarım BEH mimarisinin bildirim 
bölümündeki bileşenşler olarak bildirilmiştir. PERIOD sabiti saat periyodunu kurmak için kullanılır. 
DUT a bağlantı kurmak için kullanılan iç sinyaller bildirilmiştir. Saat sinyalinin başlangıç değerinin 
varsayılan değere göre’u’ 0 yada 1 verilmesi önemlidir  çünkü saat üretim yapısı daha sonra 
kullanılacaktır. 

Saat(Clock) ve YenidenBaşlatma(Reset) 
Üretimi 
   W_CLK <= not W_CLK after 
PERIOD/2; 
-- complex version 
   W_CLK <= '0' after PERIOD/4 when 
W_CLK='1' else 
                       '1' after 3*PERIOD/4 when 
W_CLK='0' else 
                       '0'; 
• Basit sinyal atamaları 
o Sonsuz döngü 
o W_CLK için başlangıç değeri olarak '0' veya '1'atanmalı 
(not 'u' = 'u') 
o Simetrik-düzenli  saat  
• Koşullu sinyal ataması 
o Kompleks saat şeması  
• İşlemlerin büyük ek yüklerinin farkına varılması 
   W_RESET <= '0',  
                            '1' after 20 ns,  
                            '0' after 40 ns; 
• Yeniden başlatma üretimi (Reset generation) 
   assert now>100*PERIOD 
               report "End of simulation" 
               severity failure; 
• Simülasyonun zorla sonlandırılması 
Senkron tasarım için en önemli şeylerden biri saat tepkisidir. Bunu, koşutzamanlı sinyal atamasıyla ya 
da saat üretme işlemiyle  oluşturulur. Bir işlem, gerçekleştirilmiş bir fonksiyonaliteyle karşılaştırırsak 
birçok ek yük getirir, koşutzamanlı versiyonu gereklidir.  
En basit şekli en üstte gösterilmektedir, saat sonsuza kadar çalışır ve simetriktir. Sinyal değeri her 
yarım saat periyodunda tersine dönüştürülür, başlangıç sinyal değeri ‘u’ olmak zorunda değildir, 
başlangıç değeri dışarıdan da bildirilebilir. Daha ayrıntılı örnek hemen altında gösterilmiştir, koşullu 
sinyal ataması ile %25 iş çevrimi ile asimetrik saat üretilmiştir. Şuna dikkat edin ki varsayılan sinyal 
değeri belirtilmemiştir çünkü koşulsuz else yolu vardır, buna koşullu sinyal atamalarında ihtiyaç 
vardır. 
Tüm simülasyon 100 saat çevriminden sonra ASSERT ifadesiyle durdurulmuştur. Elbette zaman 
kontrolü  koşullu sinyal ataması ile eklenebilir.  
Sabitlenmiş bir saat genişliği ilişkisi en iyi ‘delayed’ bekletilmiş özellikle, "CLK_DELAYED <= 
W_CLK'delayed(5 ns);" ,ifadesine benzer şekilde modellenir.  
Yeniden başlatma-sıfırlama doğrudan gerçekleşir: simülasyon başlangıcından başlangıç değeri 0 ile 
başlatılır,daha sonra aktifleştirilmiştir, 20ns boyunca 1 e kur, daha sonra 20ns boyunca 0 a geridönsün, 
simülasyonun geri kalanında böyledir. 

Yanıt-Tepki Analizi(Response Analysis) 
· · · 
process(W_C) 
begin 
    assert W_C > 5 --message, if false 
   report "WRONG RESULT!!" 
   severity ERROR; 
end process; 
· · · 
• Önem derecesi nin belirtilmesi 
o Not(Note) 
o U y a r ı ( Warning) 
o Hata(Error (default)) 
o Başarısızlık(Failure) 
· · · 
process(W_C) 
begin 
  assert W_C > 5 
  report "WRONG RESULT in " & 
                   W_C'path_name & 
              "Value: " & 
                  integer'image(W_C) 
   severity error; 
· · · 
• VHDL'93 Ek elemanlar 
o 'path_name 
o 'inst_name 
o 'image 
WRONG RESULT in TB_TEST:W_C Value: 2 
• Simülatöre rapor vermek 
Hata ayıklama(debugging) için ek elemanlar 
Bildirilmeyen(assert) ifadeler için rapor vermek 
 ' assert ' ifadesi otomatik yanıt analizini en iyi şekilde yürütmek için uygundur. Bir koşulun iddia 
kontrolü ve eğer koşul yanlışsa bir mesaj rapor etmesi.  Seçilen önem seviyesine göre ve simülasyon 
araçlarındaki ayarlara göre, simülasyon devam eder(warning için) veya durur(error, failure) hata 
raporu vererek. Varsayılan önem seviyesi ' error ' dur. 
Rapor edilecek mesaj tasarımcı tarafından tanımlanır.  

3.6 Dosya Giriş/Çıkışı(File I/O) 
• Standart kütüphanesindeki TEXTIO 
paketi 
• Önemli fonksiyonlar ve prosedürler: 
o readline(...), read(...), 
o writeline(...), write(...), 
o endfile(...) 
• Ek veri tipleri (text, line) 
• READ / WRITE aşırı yüklenebilir tüm öntanımlı 
veri tipleri için: 
o bit, bit_vector 
o boolean 
o character, string 
o integer, real 
o t i m e  
VHDL de, tasarımcıya dosyadan veri yükleme yada dosyaya veri yazmaya izin verilmiştir. Bunu 
yapmak için STD  kütüphnesinden TEXTIO paketinin eklemek gerekir. Dosya I/O(giriş/çıkış- 
input/output)nun temel uygulaması simülasyon esnekliğidir.  
Bir dosyadan bilgi almak için, kullanıcının bunu satır satır okuması gerekir ve bunları ' line ' veri 
tipinin değişkenlerinde tutmalıdır. Bundan sonra bu satırdaki bilgiler READ komutuyla erişilebilinir. 
Genellikle bir satırda birdan fazla veri tipindeki bilgi vardır. Veriyi doğru şekilde yorumlayabilmek 
için , aynı veri tipinin gerçek parametreleriyle çalışmak gerekir. Bu etkenler aşağıdaki örneği daha da 
açık hale getirmektedir. Bunun yaninda, bilgiler arasındaki boşluk karakterinin ayrı bir ifadeyle 
okunması gerekmektedir.  
Dosya çıkış işi aynı yolla yapılır, önce WRITE ile satır düzenlenir ve WRITELINE ile de dosyaya 
yazılır. 

3.6.1 Dosya (File)I/O Örnek(1/4) 
• toplayıcı modülü ADDER 
o İki 8 bit vektörü toplayıp, bir tane 8 bit 
vektöre sonucu verir 
o Taşma(overflow)  sinyali üretir 
library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 
entity ADDER is 
  port(VALUE_1      : i n   std_logic_vector(7 downto 0); 
         VALUE_2      : i n   std_logic_vector(7 downto 0); 
         OVERFLOW : out std_logic; 
         R E SU LT        : out std_logic_vector(7 downto 0)); 
end ADDER; 
architecture RTL of ADDER is 
  signal INT_RES    : std_logic_vector(8 downto 0); 
  s i g n al INT_VAL_1 : std_logic_vector(8 downto 0); 
  signal INT_VAL_2 : std_logic_vector(8 downto 0); 
begin 
  INT_VAL_1   <= '0' & VALUE_1; 
  INT_VAL_2   <= '0' & VALUE_2; 
  I N T _ R E S       <= INT_VAL_1 + INT_VAL_2; 
  R E S U L T        <= INT_RES(7 downto 0); 
  OVERFLOW <= INT_RES(8); 
end RTL; 
• ADDER  modülünün varlık ve mimarisi 
• std_logic_unsigned paketi 
o yayın hakları Synopsys aittir 
(EDA yazılım firması) 
o IEEE standardında değildir  
o std_logic_vector  deki aşırı yüklenmiş 
matematiksel operatörlere işaretsiz sayılar 
gibi davranılır(unsigned number) 
 Örnekte ilk bölüm bir toplayıcı tasarımını göstermektedir. STD_LOGIC_UNSIGNED paketinin 
kullanımına dikkat edin.   
Mimaride, operandlar 9 bit ile gösterilmiştir gerçek toplamadaki taşmayı önlemek için. En önemli bit 
yani en soldaki bit OVERFLOW(taşma) sinyalini geri kalan 8 bit ise toplamanın sonucunu gösterir. 

Örnek(2/4) 
library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 
use IEEE.std_logic_textio.all; 
use STD.textio.all; 
• std.textio ve IEEE.std_logic_textio paketlerini 
dosya I/O fonksiyon ve prosedürleri için ekleyin 
entity TB_ADDER is 
end TB_ADDER; 
architecture BEH of TB_ADDER is 
  component ADDER 
    port(VALUE_1      : in   std_logic_vector(7 downto 0); 
           VALUE_2      : in   std_logic_vector(7 downto 0); 
           OVERFLOW : out std_logic; 
           R E S U L T        : out std_logic_vector(7 downto 0)); 
  end component; 
  signal W_VALUE_1      : std_logic_vector(7 downto 0); 
  signal W_VALUE_2      : std_logic_vector(7 downto 0); 
  signal W_OVERFLOW : std_logic; 
  signal W_RESULT       : std_logic_vector(7 downto 0); 
begin 
  DUT : ADDER 
    port map(VALUE_1      => W_VALUE_1, 
                   VALUE_2      => W_VALUE_2, 
                   OVERFLOW = >   W _ O V E R F L O W ,  
                   RESULT       = >  W_ R E SU LT );  
• Yaygın testbenç yapısı 
o Boş varlık: dış arayüz yoktur 
o Bilişim bildirimi ve örnekleme 
o Giriş/çıkış portlarının etki/tepki analiz 
işlemi için bağlanması için iç sinyallerin 
tanımı  
 ADDER tasarımı testbençin yaygın yapısını takip eder.  
İki ek paketin kullanıldığını unutmayın. Standart TEXTIO paketi temel fonksiyonaliteyi sağlar.  
STD_LOGIC_TEXTIO Synopsys paketidir aşırı yüklenmiş altprogramların üstesinden gelmek için 
STD_ULOGIC temelli veri tiplerini destekler. 

Örnek(3/4) 
STIMULI : process 
   variable L_IN : line; 
  variable CHAR : character; 
  variable DATA_1 : std_logic_vector(7 
downto 0); 
  variable DATA_2 : std_logic_vector(7 
downto 0); 
   file STIM_IN : text is in "stim_in.txt"; 
begin 
  W_VALUE_1 <= (others => '0'); 
  W_VALUE_2 <= (others => '0'); 
  wait for PERIOD; 
  while not endfile (STIM_IN) loop 
     readline (STIM_IN, L_IN); 
     hread (L_IN, DATA_1); 
    W_VALUE_1 <= DATA_1; 
     read (L_IN, CHAR); 
     hread (L_IN, DATA_2); 
    W_VALUE_2 <= DATA_2; 
    wait for PERIOD; 
  end loop; 
  wait; 
end process STIMULI; 
• Uyarı(STIMULI) işler  
o Dosyaya erişim belirtilen zamanda sadece bir 
satırla sınırlıdır 
o Okuma fonksiyonlarının parametreleri için 
sadece değişkenler kullanılabilir 
o hread(...) fonksiyonu IEEE.std_logic_textio  
paketinde tanımlıdır: 16 basamağındaki 
hexadecimal(hex) sayıları okuyarak bit 
vektöre çevirir 
00 A1 
FF 01 
FF 00 
11 55 
0F 01 
1F 05 
AA F3 
• Uyarı dosyası(Stimuli file) "stim_in.txt" 
o Herbir satırda iki hex değeri vardır bunlar 
ADDER modülü için giriş değerleridir 
Her satır bir PERIOD da giriş vektörleri olarak kullanılır.  
W_VALUE_1 ve W_VALUE_2  sinyalleri  başlangıçta tüm değerleri sıfır olan vektörlerdir.Bir saat 
çevriminden sonra uyarı dosyası STIM_IN ‘in veri içerip içermediği kontrol edilir. Eğer değer 
içeriyorsa devam eder yoksa ' wait ' ifadesine atlar.  
READLINE komutuyla STIM_IN ‘den okunan satır L_IN satır değişkenine atanır. READ prosedürü 
ile veri tipindeki değiken ile seçilir.  
Dosyadan alınan değerler  değişkenlere kaydedildikten sonra DUT ‘ın giriş portuna bağlı olan 
sinyallere atanmalılar. Bir satırı bitirdikten sonra, işlem bir periyot(PERIOD) kadar bekler; 
uyarı(stimuli) dosyasının hala veri içerip içermediğini tekrar kontrol etmek için. 

Örnek (4/4)  
RESPONSE : 
process(W_RESULT) 
  variable L_OUT : line; 
  variable CHAR_SPACE : 
character := ' '; 
  file STIM_OUT : text is out 
"stim_out.txt"; 
begin 
   write (L_OUT, now); 
   write (L_OUT, 
CHAR_SPACE); 
  w r i t e  (L_OUT, 
W_ R E SU LT );  
  w r i t e  (L_OUT, 
CHAR_SPACE); 
  h w r i t e  (L_OUT, 
W_ R E SU LT );  
  w r i t e  (L_OUT, 
CHAR_SPACE); 
   write (L_OUT, 
W _ O V E R F L O W ) ;  
   writeline (STIM_OUT, 
L _ O U T ) ;  
end process RESPONSE; 
• Testbençin yanıt işlemi 
o 'NOW' şuanki simülasyon zamanını veren bir 
fonksiyondur 
o Birçok yazma fonksiyonuyla bir satır oluşturulur 
o Writeline oluşturulan bu satırı dosyaya kaydeder 
o hwrite(...) fonksiyonu IEEE.std_logic_textio  paketinde 
tanımlıdır: bir vektörü 16 basamağındaki 
hexadecimal(hex) sayılara çevirerek satıra kaydeder 
0 NS UUUUUUUU 00 U 
0 NS XXXXXXXX 00 X 
0 NS 00000000 00 0 
20 NS 10100001 A 1  0 
40 NS 00000000 00 1 
60 NS 11111111 F F  0 
80 NS 01100110 66 0 
100 NS 00010000 10 0 
120 NS 00100100 24 0 
140 NS 10011101 9D 1 
• Tepki dosyası "stim_out.txt" 
o 4 sütun vardır: 
- Simülasyon zamanı  
- 8 bit sonuç değeri (binary and hex) 
- Taşma(Overflow) biti 
İkinci satırdaki 'X' aşırı yüklenmiş operatör, tanımlanmayan bir değer eklendiğinde  'X'(bilinmeyen) 
değerini döndürdüğü için vardır. 'X' ve  'U' aynı şekilde davranır, sonuçta 0 dır. 

4. Sentez (Synthesis)  
• Sentez nedir? 
• RTL-stili 
• Kombinasyonel Mantık (Combinational Logic) 
• Sıralı Mantık (Sequential Logic) 
• Sonlu Durum Makineleri ve VHDL (Finite State Machines and VHDL) 
• İleri Seviyede Sentez (Advanced Synthesis) 
4.1 • Sentez nedir? 
• Bir soyut betimlemeyi daha detaylı 
betimlemeye(description)  dönüştürme  
o "+" operatörü bir kapı netlistine 
dönüştürülür 
o "if (VEC_A = VEC_B) then" 
bir çoklayıcıyı(multiplexer) kontrol 
eden karşılaştırıcı ile gerçeklenir 
• Dönüşüm birçok faktöre bağlıdır 
 Genel olarak, sentez terimi, RT seviyesi tanımlamayı otomatik olarak kapı seviyesi sunumuna 
gönüştürülmesi olarak kullanılır. Bu dönüşüm esasen hedef teknolojideki kullanılabilir temel hücre 
kümesini etkiler. Basit operasyonlar,karşılaştırma ve herikisi/veya kararları yapılırken kolayca bool 
fonksiyonlarla gösterilebilmektedir, matematiksel işlemler gibi daha kompleks yapılar araç spesifik 
makro hücre kütüphanesiyle gösterilmektedir. Bunun anlamı bir dizi toplayıcı,çarpıcı,vb. mimariler 
sentez araçları tarafından biliniyordur ve bu tasarımlar kullanıcı tarafından tasarlanmışsa işleme maruz 
kalır.  

4.1.1 Sentezlenebilirlik(Synthesizability) 
• Sadece VHDL bir altkümesi sentezlenebilir 
• Farklı araçlar farklı altkümeleri destekler 
o Kayıtlar(records)? 
o Tamsayı dizileri(arrays of integers)? 
o Saat kenarı bulunması(clock edge detection)? 
o Hassasiyet listesi(sensitivity list)? 
o ... 
Makro hücre kütüphanesi (macro cell library) sadece sentez yazılımının özelliğini ayırt eder. VHDL 
kendisi tamamen sentezlenebilir değildir ve kullanılabilir araçlar desteklenen dil altkümesine göre 
farklılık gösterir.  Kayıtlar ve çok boyutlu diziler gibi karmaşık-kompleks kullanıcı tanımlı veri 
yapıları daha problemli durumlar ortaya çıkarmaktadır.  
4.1.2 Sentez İçin Farklı Dil Destekleri 
 Zamanlı bir işlem örneği için sonuç donanımında farklı dil desteklerinin önemi gösterilmiştir. Sentez 
aracı hassasiyet listesini destekliyorsa sonuç flip flop dur çünkü işlem herbir CLK’daki olayda 
tetiklenmektedir.  Bu nedenle, yükselen kenar tetiklemeli flip flop davranışı modellenmiştir burada.  
Eğer sentez araçları hassasiyet listesini desteklemiyorsa , genellikle yazmaçların davranışlarını 
tanımlayan şablonlar ararlar. Genellikle CLK olayının kontrolü if koşulunun bir parçası olarak yapılır. 
Eğer hassasiyet listesi yoksa ve kod yazmaç şablonuyla uyuşmuyorsa, bir seviye tetiklemeli tutucu 
üretilir. 

4.1.3 Nasıl Yapılır ? 
• Kısıtlar 
o Hız(speed) 
o Alan(area) 
o Güç(power) 
• Makrohücreler(Macrocells) 
o Toplayıcı(adder) 
o Karşılaştırıcı(comparator) 
o İletim yolu arayüzü 
(businterface) 
• Optimizasyon(Optimizations) 
o Bool(boolean): matematik 
o Kapı(gate): teknolojik 
 Sabit sentez kısıtları hedef teknoloji ve araç yetenekleriyle, ‘soft’ yazılım kısıtlarıyla belirlenir. 
Maksimum işlem hızı ve gerekli donanım kaynakları genellikle netlist optimizasyonu için ana hedeftir. 
Bu sadece soyut matematiksel model veya kullanılabilir teknoloji hücreleri üzerinde farklı boole 
fonksiyonları  eşleştirerek mümkündür.  Optimizasyon fazının, yazılım son sonuçlarını vermeden önce 
birçok yenileme gerektirmesinden dolayı karmaşıktır. 
4.1.4 Sentez İçin Gerekli Bilgiler 
• Yükleme değerleri(Load values) 
• Yol gecikmesi(Path delays) 
• Sürücü gücü(Driver strengths) 
• Zamanlama(Timing) 
• İşletim koşulları(Operating conditions) 

4.1.5 Pratikte Sentez Süreci 
• Birçok durumda sentezi optimal 
bir sentez sonucuna ulaşmak için 
birçok kez gerçekleştirmek gerekir  
Optimizasyon sentez araçalarıyla yapılsa bile, sonuç sistem ihtiyaçlarıyla örtüşmemektedir. Bu 
durumda yazılım için giriş değiştirilmelidir. Birçok parametre tasarımcı tarafından değiştirilebilir: 
Blok işleme koşulu çevresel koşulları, işletim sıcaklığı gibi, içermektedir. Bunların kullanılan tel 
gecikmesine doğrudan etkisi vardır.  
Hiyerarşi değişimi, daha büyük blok seçerek ve VHDL kaynak kodundan gelen hiyerarşi 
tanımlamalarını bozacak araçlara izin verirse, gerçekleştirilebilir. Eğer tekrarlayan değişim hala 
beklenen sonucu vermiyorsa, orijinal VHDL koddaki değişim son çıkış yolu olur. 
4.1.6 Sentez Araçlarıyla İlgili Problemler 
• Zamanlama sorunları 
o Yerleşim bilgisi sentez işlemi sırasında kaybolabilir 
o Saat ağacı sonradan üretilmelidir 
• Kompleks saat şeması 
(ters çevrilmiş saat(inverted clocks), çoklu saatler(multiple clocks), kapı saati(gated 
clocks) 
• Bellek(Memory) 
o Sentez araçları yazmaç dizilerini bellek makro hücreleriyle 
yerdeğiştirememektedirler 
• Makro hücreler(Macro cells) 
o Varolan makro hücreleri örneklemek için  standartlaşmış bir yol yoktur 
• IO(giriş-çıkış) yolları 
o A S I C -kütüphanesi birçok farklı IO-yoluna sahiptir 
o Elle seçim ,sentez araçlarıyla veya en üst seviye varlıkla  
Algoritmalar oldukça gelişmiş olmalarına rağmen kullanıcılar için sentez araçlarının hala bir dizi 
problem ve  gizli tehlikeleri vardır. Birçok sorun netlistin bölünmesinden ve kritik netlerin elle 
değiştirilmek zorunda olmasından kaynaklanmaktadır. Saat ağacının,örneğin, çip üzerindeki saat 
sinyallerini dağıtmak için kapsamlı şekilde önbelleğe alınması gerekmektedir ve elle üretilmek 
zorundadır.  
Senkron  tasarımın sentezi tek bir saat kaynağıyla oldukça kolaydır, pratikte sistemler, kesinlikle ek 
saat sinyallerine ihtiyaç duyarlar. Bu bize asenkron davranışa ihtiyaç olduğunu gösterir bu da çok 
karmaşıktır ve gerçek gecikme süreleri bilinmemektedir. Makro hücreleri, hedef teknolojide 
kullanılabilir ancak kullanımı zordur. Bu özellikle bellek hücreleri için geçerlidir ki bunlar sentez 
araçlarıyla otomatik olarak kullanılamamaktadır. Aynı şey ASIC kütüphanesinin I/O hücreleri içinde 
geçerlidir ki bunlar elle seçilmek zorundadır. 
4.1.7 Sentez Stratejisi  
• Farklı kodlama stillerinin etkisini donanım yapısı üzerinde gösterdiğini göz önünde 
bulundurun 
• Uygun tasarım bölme 
o Kritik yolların birçok sentez bloğuna dağıtılmaması önerilir  
o Otomatik sentez en iyi performansı modül büyüklüğü 1000 kapıysa 
gerçekleştirir 
o Farklı optimizasyon kısıtları blokları bölmek için kullanılabilir 

4.2 RTL-stili 
• Tam hassasiyet listesi  
• Tam IF-ifadeleri veya varsayılan-atamalar 
• if-elsif-elsif-end if yapısı 
• ilk I F   ‘de reset vardır 
• son elsif de CLK kontrolü 
• else dallanması yoktur 
Yazmaç transfer seviyesi(RTL - register transfer level). Davranış seviyesindeki modelleme 
çeşitleriyle, VHDL diğer programlama dilleri gibi kullanılabilir, RT seviyesi donanıma bir seviye daha 
yakındır. Bununla algoritma sadece kombinasyonel gruplara ve  kaydetme yeteneğine sahip saatli 
gruplara,flip floplara bölünür.  saf konbinasyonel grupta hiç bellek elemanı içermeyebilir. Diğer 
taraftan, IF atamaları tamamen yazılmış olmalı, bunun anlamı ELSE dallanması unutulmamalıdır, 
çünkü  diğer türlü  sentez araçları tarafından istenmeyen tutucular üretilebilir. Diğer bir olasılık, IF 
koşulundan önce varsayılan değerler atanmasıdır, gerekiyorsa IF dallanmasında değiştirilebilir.  
Asenkron  reset ‘li bir saat işlemi aşağıdaki gibidir:  
process(clock, reset) 
begin 
if reset = '1' then ...(Reset-assignmnet)  
elsif clock'event and clock = '1' then ...(assignment to FFs) ; 
end if ;  
end process; 

4.2.1 Objelerin Kombinasyonları 
(Combinatorics) 
Library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity IF_EXAMPLE is 
port (A, B, C, X : in std_ulogic_vector(3 downto 0); 
          Z                : out std_ulogic_vector(3 downto 0)); 
end IF_EXAMPLE; 
architecture A of IF_EXAMPLE is 
begin 
     process (A, B, C, X) 
     begin 
        if ( X = "1110" ) then 
           Z <= A; 
        elsif (X = "0101") then 
           Z <= B; 
        else 
           Z <= C; 
        end if; 
     end process; 
end A; 
Sentez sırasında, bir IF ataması herzaman bir veya birden çok çoklayıcı(multiplexer) ile 
gerçekleştirilir.  
Tek dallanmaların önceliğine dikkat edin lütfen. IF atamasının simülasyonunda, bir koşul girildiğinde, 
diğerlerinin işlemez duruma düşmemesine dikkat edin. 
Bu dallanma sırası sentez sırasında da  korunmalıdır. Henğz, bu sadece bir dizi birbirine bağlı 
çoklayıcı ile mümkün olmaktadır,  ilk koşul son çoklayıcının seçim girişine eklenir. 

4.2.2 Tam hassasiyet listesi 
o Eğer SEL hassasiyet listesinde 
olmasaydı , davranış nasıl olurdu? 
• Okunan tüm sinyaller daha önce 
hassasiyet listesine girilmiş 
olmalı 
• Tam if-ifadesi kombinasyonel 
mantığın sentezi içindir 
process (A, B, SEL) 
begin 
  if SEL = `1` then 
    Z <= A; 
  else 
    Z <= B; 
  end if; 
end process; 
Simülasyonda bir işin aktifleştirilmesi için, hassasiyet listesindeki sinyallerden birinin gerçekleşmesi 
gerekmektedir. 
Soruda olduğu gibi eğer SEL hassasiyet listesinde olmasaydı, işlem A veya B olaylarından 
birinde aktifleştirilecekti sadece. Bu bir tarafta tanımlanmış olan çoklayıcının davranışına 
uymamaktadır. 
Diğer taraftan, birçok sentez araçları hassasiyet listesini önemsememektedir, ancak işlemi 
içeren VHDL  kodunun üstesinden gelmektedir.Bizim durumumuzda bu bir IF atamasıdır. 
IF ataması herzaman çoklayıcı olarak ortaya çıkar. 
Sonuç: Eğer SEL hassasiyet listesinde olmasaydı, bileşen bölümü simüle edilmeyecekti, genellikle 
sentezlenebilir.  
Netice: okunan tüm giriş sinyalleri, tam kombinasyon tanımlaması için  hassasiyet listesinde olmalıdır. 

4.2.3 WAIT ifadesi < - > Hassasiyet Listesi  
process 
begin 
  if SEL = `1` then 
    Z <= A; 
  else 
    Z <= B; 
  end if; 
WAIT ON A,B,SEL; 
end process; 
• Eş işlemlerdir 
process (A, B, SEL) 
begin 
  if SEL = `1` then 
    Z <= A; 
  else 
    Z <= B; 
  end if; 
end process; 
İşlemin sonunda hassasiyet listesi bir WAIT ON ifadesiyle yerdeğiştirilebilir. İşlemin davranışı 
yerdeğiştirmeyele değişmeyecektir. 

4.2.4 Eksik atamalar 
• Eğer SEL = `0` ise Z 
nin değeri nedir ? 
• Hangi donanım sentez 
sırasında üretilir ?  
Library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity INCOMP_IF is 
port (A, B, SEL :in std_ulogic; 
         Z              : out std_ulogic); 
end INCOMP_IF; 
architecture RTL of INCOMP_ IF is 
begin 
process (A, B, SEL) 
begin 
       if SEL = `1` then 
           Z <= A; 
       end if; 
end process; 
end R T L ;  
Bu örnekte 'else' dallanması çıkarılmıştır.  
Eğer SEL='0' ise , simülasyonda Z eski değerini korur, bunun anlamı Z  üzerinde herhangi bir 
değişiklik olmamıştır. 
 Bu nedenle, uygun donanımda bir bellek elemanı ile gerçekleştirilmelidir. Sentez aracı bir tutucu 
oluşturur, SEL sinyali de bu tutucunun saat girişine bağlanır. Senkron tasarımda çok zor test edilen bir 
elemandır, ve bu nedenle kullanılmamıştır. Normalde sadece kenar tetiklemeli FF kullanılır, tümü tek 
bir ve aynı saat sinyaline bağlanmıştır. Artık, bir tarama yolu için FF tarama ile tüm  FF leri bir arada 
tutma olasılığı vardır; ek bir giriş pini ile, çip tarama test modülüne koyulabilir ve iç değerler 
okunabilir. 
4.2.5Kombinasyonel Lojiği Sentezlemek 
İçin Kurallar  
• Tam hassasiyet listesi 
o R T L   davranışı IC ile özdeş olmalıdır 
o Eksik hassasiyet listesi hatalara veya uyarılara neden olabilir 
• Eksi if-ifadelerine izin verilmez 
o transparan tutucular 

4.2.6 Flip Flopların Modellenmesi 
Library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity FLOP is 
port (D, CLK        : in std_ulogic; 
         Q                  : out std_ulogic); 
end FLOP; 
architecture A of FLOP is 
begin 
      process 
      begin 
          wait until CLK`event and CLK=`1`; 
          Q <= D; 
      end process; 
end A; 
Burada bir D-FF’unun bir saat darbesi kenarı ile kontrol edilmesi tanımlanmıştır. Eğer saat sinyalinde 
bir olay gerçekleşirse be bu olay bir(ONE) değerine sahipse, D pin’inin değeri Q pin’ine transfer 
edilir. 
(Siz ayrıca negatif saat darbe kenarını da bekleyebilirsiniz, bu durumda CLK='0' olmalı) 

4.2.7 Sentez İçin Artan Saat Kenarının 
Tanımı  
• Sentez için yeni standart: IEEE 1076.6 
... if koşulu  
RISING_EDGE ( clock_signal_ name) 
clock_signal_ name'EVENT and clock_signal 
_name='1' 
clock_signal _name='1' and clock_signal_ 
name'EVENT 
not clock_signal_ name'STABLE and 
clock_signal_ name='1' 
clock_signal _name='1' and not clock_signal_ 
name'STABLE 
... wait until koşulu  
RISING_EDGE ( clock_signal_ name) 
clock_signal_ name'EVENT and clock_signal 
_name='1' 
clock_signal _name='1' and clock_signal_ 
name'EVENT 
not clock_signal_ name'STABLE and 
clock_signal_ name='1' 
clock_signal _name='1' and not clock_signal_ 
name'STABLE 
clock_signal _name='1' 
Genelde hassasiyet listesi sentez araçları tarafından reddedilir ve bekleme ifadeleri 
sentezlenemezdiğinden, bellek elemanlarının modelleme sorunu için bir çözüm bulunmalıydı. Sentez 
araçları bu sorunu VHDL kodunda kesin şablonlar bularak çözmüştür, yani iki işlem stilinin ilk 
seçeneğidir ('if/wait until X'event and X='1' then') . Fakat, tüm alternatifler simülasyonda aynı 
davranışı göstermektedir. Lütfen şunu unutmayın ki 'wait until' ifadesindeki olay tesbiti, eğer olay  
'wait until' yapısı tarafından tamamiyle gerekliyse, gereksizdir.  
Bu arada, IEEE 1076.6 standardı, yazmaç üretiminin geçerli olduğu çıkarımları yapacak VHDL 
yapılarını listeler. Bu standart sentez araçları tarafından henüz tamamen desteklenmediğinden, ilk 
seçenek hala en sık kullanılan yoldur sentez için artan/azalan saat kenarının tanımlanmasında. 
Asenkron kurma(set) ya da yeniden başlatma(reset) sinyalleri hazır olduğunda sadece IF ve 
varyasyonları uygulanabilir. 

4.2.8 Artan Saat Kenarının Fonksiyon 
Çağrımı ile Tanımlanması  
• Std_Logic_1164 paketindeki 
process 
begin 
   wait until RISING_EDGE(CLK); 
   Q <= D; 
end process; 
function RISING_EDGE (signal CLK : std_ulogic) 
             return boolean is 
begin 
     if (  CLK`event and CLK =`1` 
                             and CLK`last_value=`0`) then 
         return true; 
     else 
         return false; 
     end if; 
end RISING_EDGE; 
Birçok sentez aracı tarafından kabul edilmemektedir('last_value son değer nedeniyle), fakat 
simülasyonda kullanılabilmektedir. 

4.2.9 Sayıcı Sentezi 
Library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity COUNTER is 
port ( C L K     : in std_ulogic; 
           Q    : out integer  range 0 to 15 ); 
end COUNTER; 
architecture A of COUNTER is 
  signal COUNT  : integer  range 0 to 15 
; 
begin 
   process (CLK) 
   begin 
      if CLK`event and CLK = `1` then 
         if (COUNT >= 9) then 
            COUNT <= 0; 
         else 
            COUNT <= COUNT +1; 
         end if; 
      end if; 
   end process; 
    Q <= COUNT; 
end A; 
• Saat işlemindedeki bellekte bir atama 
yapılan tüm sinyaller sentezlenebilir 
 Bu yeniden başlatma (resetting) hattı olmayan bir sayıcının tanımıdır.Bazı hususları özellikle 
belirtmeliyiz:İlk önce çıkışın port bildiriminde değer kümesi ataması yapılmalı. Burada, sadece 0 dan 
15 e kadar olan rakamlara izin verilmektedir bunun anlamı ikili gösterim için 4 bit yeterlidir. Q port 
sinyali 4 bitlik sinyalin sentez aracı vasıtasıyla  yerdeğiştirmesi yapılmıştır. Sonuçta 4 bitlik bir sayıcı 
oluşmuştur. 
Diğer husu ise, ‘out’(çıkış) port  modüllerinin Q sinyali sadece yazılabilir, okunamaz. Bu nedenle, 
COUNT >= 9 sorgusunu yağpabilmek için,mimari içerisinde (geçici) bir sinyal COUNT bildirilmek 
zorundadır. 
Ek bir işlem olarak saymanın sonucu Q ya koşutzamanlı (Q <= COUNT) sinyal ataması ile transfer 
edilmektedir. Bunun anlamı COUNT daki herbir sonuç   Q <= COUNT atamasını tetiklemektedir. İç 
IF ataması, FF den önce kombinasyonları tanımlamaktadır. FF in sayısı sinyalin genişliğine göre 
belirlenir, dışdaki IF atamasının içinden bir atama alarak. Bizim  durumumuzda COUNT sinyali 4 
bitle gösterilmektedir(çünkü değer kümesi 0 dan 15 e kadardır). 
Önemli:Hassassiyet listesinde sadece CLK sinyali olmalıdır!!! 

4.2.10 FF İle Asenkron Reset(Yeniden 
Başlatma) 
Library IEEE; 
use IEEE.Std_Logic_1164.all; 
entity ASYNC_FF is 
port (    D, CLK, SET, RST : in std_ulogic; 
            Q                            : out std_ulogic); 
end ASYNC_FF; 
architecture A of ASYNC_FF is 
begin 
    process  (CLK, RST, SET) 
    begin 
       if (RST = `1`) then 
          Q <= `0`; 
       elsif SET ='1' then 
          Q <= '1'; 
       elsif (CLK`event and C L K  = `1 `) then 
          Q <= D; 
       end if; 
    end process; 
end A; 
• if/elsif - yapısı 
o son elsif ‘in bir kenarı vardır 
o else yoktur 
• Hassasiyet listesine sahiptir!! 
RESET(yeniden başlatma) yı tanımlamak için aşağıdaki şekilde ilerlemelisiniz:  
RESET sinyalide hassasiyet listesinde olmalı. RESET sorgusu ilk önce gelmeli(asenkron RESET). 
CLK sorgusu bunu takip eden 'elsif' atamasında bulunmaktadır. 'else' dallanması yoktur. Bu sentezde 
hata mesajına neden olabilir. 
Bir sonraki koşul hesaplaması için CLK dallanmasından önce  bulunmaktadır. 
Genel olarak bu uygulanabilir: son elsif koşulu CLK sorgusunu içerir (aslında NAME'event ve 
NAME='value', 'value'  değer 0 yada 1 olacak şekilde eklenmiş olmalı). Daha önceki tüm 'if' ve 'elsif' 
koşul sinyalleri hassasiyet listesinde olmak zorundadır, çünkü sorgular çevrimde asenkron olarak 
gerçekleşmektedir. 
Önemli:  Eğer bu sinyaller hassasiyet listesinde bulunmuyorsa,  sentezlenmiş bazı şeyler simüle 
edilebilir, çünkü hassasiyet listesi prensipte sentez araçlarıyla birebir aynı olmalıdır. Onlar sadece 
işlem içerisindeki VHDL kodun yapısına uymak zorundadır. 

4.2.11 Zamanlı İşlemler İçin Kurallar 
process 
begin 
    w a i t  until CLK'event and CLK='1'; 
    if RESET = '1' then   --
 synchron RESET 
    -- Register reset 
  else 
     -- combinatorics 
  end if; 
end process; 
Wait-şekli: 
• Hassasiyet listesi 
yoktur 
Wait ve If-şekli: 
• Yazmaç ataması alan tüm 
sinyaller  
-> Register 
process(CLK, RST) 
begin 
  if (RST = `1`) then    --
 asynchron RESET 
    -- Register reset 
  elsif (CLK`event and CLK=`1`) then 
    -- combinatorics 
  end if; 
end process; 
If-şekli: 
• Sadece saat ve 
yeniden 
başlatma(reset)sadec
e hassasiyet 
listesinde olmalı( ve 
tüm diğer asenkron 
sinyaller) 
process(CLK)   -- no RESET 
begin 
  if (CLK`e vent and CLK=`1`) then 
    -- combinatorics 
  end if; 
end process; 
4.2.12 Sorular 
20. Hangi sinyaller saat işleminde yazmaçları çıkarmak için kullanılır  
  20.1. Geçici sinyaller. (EVET/HAYIR)  
  20.2. Atama içeren sinyaller. (EVET/HAYIR)  
  20.3. Daha önce okunmuş sinyaller. (EVET/HAYIR) 
21. Hangi iki işlem tipi RTL-stilinde izin verilmektedir  
  21.1. Karışık ve analog işlemler. (EVET/HAYIR)  
  21.2. Kombinasyonel ve sıralı işlemler. (EVET/HAYIR) 
22. Tutucuların sentezlenmiş tasarımda oluşmasına neler neden olmaktadır ?  
22.1. Koşutzamanlı IF-ifadesi. (EVET/HAYIR) 
22.2. Unutulmuş else-yolları. (EVET/HAYIR)  
22.3. IF- veya CASE- ifadelerin tüm yollarında gerçekleştirilmemiş sinyal 
atamalarında . (EVET/HAYIR)  
  22.4. Eksik hassasiyet listesi. (EVET/HAYIR) 
23. İstenmeyen tutucular nasıl en etkili şekilde önlenir?  
23.1. IF-ifadesi ile CASE-ifadesini yer değiştirerek. (EVET/HAYIR) 
  23.2. IF veya CASE ifadesinden önce, bir yol üzerinde atama içeren sinyallere  
  varsayılan atamalar vererek. (EVET/HAYIR)  
CEVAPLAR: 
20.1:HAYIR    20.2:EVET    20.3:HAYIR 
21.1:HAYIR    21.2:EVET 
22.1: HAYIR    22.2: EVET    22.3: EVET    22.4: HAYIR 
23.1: HAYIR    23.2: EVET 

4.3 Kombinasyonel Lojik(Combinational 
Logic) 
architecture EXAMPLE of FEEDBACK is 
   signal B,X : integer range 0 to 99; 
begin 
   process (X, B) 
   begin 
      X <= X + B; 
   end process; 
  . . . 
end EXAMPLE; 
Kombinasyonel geribildirim döngüleri oluşturmayın 
 Tam bir kombinasyonel mantık modellenirken, kombinasyonel geribildirim döngülerini önlemek 
gerekir. Bir geribildirim döngüsü herzaman kendi kendini tetikler, uygun işlem herzaman aktiftir. 
Örnekte,bu aralıksız toplama ile sonuçlanmaktadır, X maksimum değerine ulaşana kadar artmıştır. Bu 
nedenle simülasyon 0ns de bir hata mesajıyla sonlanır çünkü X değer aralığını aşmaktadır. Genel 
olarak, sentez mümkündür ancak donanım henüz kullanılabilir değildir. 

4.3.1 Akıcı Kodlama Stili  
Doğrudan Gerçekleştirim(Direct 
implementation)  
EXAMPLE1: 
process (SEL,A,B) 
begin 
   if SEL = `1` then 
      Z <= A + B; 
   else 
      Z <= A + C; 
   end if; 
end process 
EXAMPLE1; 
Elle kaynak paylaştırma(Manual 
resource sharing)  
EXAMPLE2: 
process (SEL,A,B) 
    variable  TMP : bit; 
begin 
   if SEL = `1` then 
       TMP  := B; 
   else 
       TMP  := C; 
   end if; 
   Z <= A + TMP; 
end process 
EXAMPLE2; 
 Bir IF-ifadesi en sonunda toplama mantığı olan bir çoklayıcı(multiplexer)ile sentezlenebilir. Bu örnek 
1 deki doğrudan gerçekleştiriminin iki toplayıcıyla  sonuçlanmasının nedenidir ki VHDL kodunda 
tanımladığı da budur. Fakat, görüşmüştür ki aynı fonksiyonaliteyi sağlayacak  bir toplayıcının yeterli 
olduğu bir gerçekleştirim yapılabilmektedir ve iyi sentez araçları  bunu optimizasyon çevriminde tesbit 
etmektedirler . Örnek 2 de, denk fonksiyonaliteye sahip bir geçici değişken kullanılarak, sadece bir 
toplayıcıya ihtiyaç duyan tanımlama yapılmıştır. Elle kaynak paylaştırma gereklidir çünkü sentez 
işlemi için daha iyi bir başlangıç noktası sağlamaktadır. 

4.3.2 Kaynak Kod Optimizasyonu 
• Bir işlem sentez için çok verimli şekilde tanımlanabilir, ör.: 
• Tanımlamanın birinde en uzun yol beş ikden diğer tanımlama da sonuca giden en uzun 
yol üç toplama elemanı ile sağlanmaktadır.Bazı optimizasyon araçları tanımlamayı 
istenilen kısıtlara göre otomatik olarak   değiştirmektedir. 
Üretilen donanımın yapısı, en az ilk sentez yinelemesindeki gibi olmalı, bu VHDL kodunun kendisi 
tarafından karar verilir.  Sonuç olarak, kodlama şeklinin optimizasyon algoritmaları üzerinde büyük 
etkisi vardır. Tüm sentez araçları tasarım yapısının kendisini optimize edemedikleri için, onların 
işlerini kolaylaştırmak gerekmektedir, örnekteki gibi kodun yapısını minimum kritik yol için 
değiştirerek. 

4.3.3 IF yapısı < - > CASE yapısı 
• Farklı betimlemeler farklı şekillerde sentezlenmektedir 
· · · 
if (IN > 17) then  
   OUT <= A ; 
elsif (IN < 17) then 
   OUT <= B ; 
else 
   OUT <=  C ; 
end if ; 
· · · 
· · · 
case IN is 
   when 0 to 16 =>  
         OUT <= B ; 
   when 17 =>  
         OUT <= C ; 
   when others =>  
         OUT <= A ; 
end case ; 
· · · 
Algoritme VHDL yapısındaki bazı hantal yapılarla ilgilenriken, diğer modellerin durumlarını 
değiştirmemeli sentez sırasında. Örneğin, IF yapısının kullanımı farklı öncelik seviyelerinden 
görülmektedir, hiyerarşik çoklayıcı yapısını tercih etmiş olabilir. Ancak CASE ifadesinde,farklı 
seçenekler üstüste gelmediği için ve bir anahtarlama bölümü ile paralel bir yapı oluşturulabilir 
sonuçta. 

4.3.4 Veri Yolunun Gerçekleştirilmesi  
entity TRISTATE is 
   port(DAT A1, DATA2 : in   std_ulogic; 
          EN1, EN2         : in   std_ulogic; 
          DATA_BUS       : out std_logic ); 
end TRISTATE; 
architecture RTL1 of TRISTATE is 
begin 
   process (DATA1, EN1) 
   begin 
         if EN1 = '1' then 
            DATA_BUS <= DATA1; 
         else 
            DATA_BUS <= 'Z'; 
         end if; 
   end process; 
   process (DATA2, EN2) 
   begin 
         if EN2 = '1' then 
            DATA_BUS <= DATA2; 
         else 
            DATA_BUS <= 'Z'; 
         end if; 
   end process; 
end RTL1; 
architecture RTL2 of TRISTATE is 
begin 
   DATA_BUS <= DATA1 when EN1 = '1' else 'Z'; 
   DATA_BUS <= DATA2 when EN2 = '1' else 'Z'; 
end RTL2; 
 Uygun iç veriyolu sisteminin gerçekleştirilmesi için,diğerleri yüksek empedansda iken sadece bir 
sürücünün aktif olduğunun garanti edilmesi gerekir, ‘Z’ nin sürülmesi. Yoksa, eğer bir veriyolu 
elemanının biri ‘1’ diğeri ‘0’ sürüyorsa, kullanılan teknolojiye göre,kabul edebileceği seviyenin üstüne 
çıkar ve belkide aygıtın tamamen zarar görmesine neden olur. Aktifsürücülerin bu üstüste binmesi 
farklı gecikme sürelerine(propogation delay) neden olabilir,  bir sürücünün etkisiz hale getirme süresi 
diğerinin etkinleştirme süresinden daha uzun sürebilir. Eğer gecikmeler dengedeyse herşey düzgün 
çalışıyor demektir, başka bir  teknolojiyle değişim olası gecikme süresi problemlerine neden olabilir. 

İç Veri Yolu Yapısı Sorunları 
Üçdurum sürücü ile veriyolu 
Waveform 
• Farklı gecikme süreleri 
(propagation delays) 
• Bir veri yolu üzerinde en fazla bir 
sürücünün aktif olduğunu garanti 
etmek zorundadır 
• Teknoloji bağımlılığı 
Bu problemi önlemek için çoklayıcılar(multiplexer)  kullanabilirsiniz. 

Taşınabilir ve Güvenli Yol Yapısı 
• Uç durum yerine çoklayıcı 
kullanılması iç yolu ortadan kaldırı 
• Üç iç sinyal  
(DIN, DOUT, DOUT_EN) 
• Herikiyönlü I / O   pad’i 
• Uygundur 
o Güvneli devreler 
o Taşınabilir ve testedilebilir 
Diğer bir alternatif tasarım yapısı üçdurumlu sinyalden kaynaklanan sorunları önlemektedir: 
Çoklayıcılar, etkin(enable) sinyalleriyle sürülürler, sinyal başına sadece bir sürücünün olacağını 
garanti ederler. İkiyönlü sinyaller  içerden orijinal yolun iki parçaya ayrılmasını önlemektedir.  Dış 
dünyayla iki yönlü haberleşme özel I/O padleri ile yapılmaktadır, örneğin çekirdek yapısı güvenli bir 
devreyi gösterir, bu tamamen test edilebilir ve kolayca diğer teknolojilere taşınabilir. 

4.3.5 Bir Çarpan(Multiplier) Örneği 
• 2 x 2 bit çarpan(multiplier) 
o Girişler(inputs): 
A1, A0, B1, B0 : 2 bit 
o Çıkışlar(outputs): 
C3, C2, C1, C0 : 4 bit 
• 3 farklı VHDL gerçeklemesi 
o Fonksiyon tablosu 
o Elle sentezleme 
(çıkışlar için bool 
fonksiyonlar) 
o VHDL tamsayı tiplerinin ve 
operatörlerinin kullanımı 
entity MULTIP LIER is 
   port ( 
         A0 : in  bit; 
         A1 : in  bit; 
         B0 : in  bit; 
         B1 : in  bit; 
         C0 : out bit; 
         C1 : out bit; 
         C2 : out bit; 
         C3 : out bit); 
end MULTIPLIER; 
 Herbir giriş için maksimum değer 3 ‘tür, sonuç olarak çıkış değeri en fazla 9 olabilir ve bunun da 4 
bite ihtiyacı vardır. Bunedenle 4 giriş portu ve 4 çıkış portuna ve veritipi olarak ‘bit’  gereklidir.  

Çarpan(Multiplier) Fonksiyon Tablosu 
    a1      
    a0      
    b1      
    b0      
    c3      
    c2      
    c1      
    c0      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    1      
    0      
    0      
    0      
    0      
    0      
    1      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    0      
    1      
    0      
    0      
    0      
    1      
    0      
    1      
    1      
    0      
    0      
    0      
    1      
    0      
    0      
    1      
    1      
    1      
    0      
    0      
    1      
    1      
    1      
    0      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    0      
    0      
    1      
    0      
    0      
    1      
    0      
    1      
    0      
    1      
    0      
    0      
    1      
    0      
    0      
    1      
    0      
    1      
    1      
    0      
    1      
    1      
    0      
    1      
    1      
    0      
    0      
    0      
    0      
    0      
    0      
    1      
    1      
    0      
    1      
    0      
    0      
    1      
    1      
    1      
    1      
    1      
    0      
    0      
    1      
    1      
    0      
    1      
    1      
    1      
    1      
    1      
    0      
    0      
    1      
En doğrudan uygulamadır çarpım fonksiyon tablosu . Kombinasyonel mantık bloğunun davranışını 
olası tüm girişlere göre listelenmiş sonuçlarla tanımlanır. Elbette fonksiyon tablosu genellikle en 
sıkışık gösterim değildir. 

Çarpanların  Minterm’leri -- Karnaugh 
Diyagramı 
2x2 bitlik çarpan fonksiyon tablosunu doğrudan çıkış sinyallerini dört Karnaugh diyagramına 
çevirmek mümkündür. Karnaugh diyagramıyla çıkışlar sadeleştirilerek minimal çıkış fonksiyonu 
türetilecektir. 

Çarpan(Multiplier): Fonksiyon Tablosuyla 
Oluşturulmuş VHDL Kodu 
architecture RTL_TABLE of MULTIPLIER is 
   signal A_B : bit_vector (3 downto 0); 
begin 
   A_B <=  A1 & A0 & B1 & B0;  
   MULTIPLY : process (A_B) 
   begin 
      case A_B is 
            when "0000" => (C3,C2,C1,C0) <=  "0000"; 
            when "0001" => (C3,C2,C1,C0) <=  "0000"; 
            when "0010" => (C3,C2,C1,C0) <=  "0000"; 
            when "0011" => (C3,C2,C1,C0) <=  "0000"; 
            when "0100" => (C3,C2,C1,C0) <=  "0000"; 
            when "0101" => (C3,C2,C1,C0) <=  "0001"; 
            when "0110" => (C3,C2,C1,C0) <=  "0010"; 
            when "0111" => (C3,C2,C1,C0) <=  "0011"; 
            . . . 
            when "1100" => (C3,C2,C1,C0) <=  "0000"; 
            when "1101" => (C3,C2,C1,C0) <=  "0011"; 
            when "1110" => (C3,C2,C1,C0) <=  "0110"; 
            when "1111" => (C3,C2,C1,C0) <=  "1001"; 
      end case; 
   end process MULTIPLY; 
end RTL_TABLE; 
o Tüm giriş sinyallerini birarada 
toplamak için bir içsinyal 
kullanılmıştır 
o İç sinyal aynı zamanda 
üretilmektedir, giriş değiştiği 
anda güncellenmektedir 
o Fonksiyon tablosu case ifadesi 
olarak ortaya çıkmıştır ve bir 
işlemin içerisine yerleştirilmek 
zorundadır. İç sinyal davranışı 
kontrol eden tek sinyaldir.( 
A_B sinyali) 
Çarpan(Multiplier): Minterm Dönüşümü 
architecture RTL_MINTERM 
of MULTIPLIER is 
begin 
     C0 <= A0 and B0; 
     C1 <= (A0 and not A1 and B1) or 
                  (A0 and not B0 and B1) or 
                  (not A0 and A1 and B0) or 
                  (A1 and B0 and not B1); 
     C2 <= (A1 and B1 and not B0) or 
                   (A1 and not A0 and B1); 
     C3 <= A1 and A0 and B1 and B0; 
end RTL_MINTERM; 
o Minterm fonksiyonları doğrudan koşutzamanlı 
ifadeler olarak ortaya çıkmaktadır 

Çarpan : Tamsayı(Integer) Gerçekleştirme 
library IEEE; 
use IEEE.NUMERIC_BIT.all; 
architecture RTL_INTEGER of MULTIPLIER is 
     signal A_VEC, B_VEC: unsigned(1 downto 0); 
     signal A_INT, B_INT:     integer range 0 to 3; 
     signal C_VEC: unsigned (3 downto 0); 
     signal C_INT:   integer range 0 to 9; 
begin 
     A_VEC <= A1 & A0; 
     A_INT <= TO_INTEGER(A_VEC); 
     B_VEC <= B1 & B0; 
     B_INT <= TO_INTEGER(B_VEC); 
     C_INT <= A_INT * B_INT; 
     C_VEC <= TO_UNSIGNED(C_INT, 4); 
     (C3, C2, C1, C0) <= C_VEC; 
end RTL_INTEGER; 
• NUMERIC_BIT paketi tüm gerekli 
fonksiyonları,  
bit vektörleri<-> tamsayıya(integer) 
çeviren fonksiyonları içermektedir 
• İç sinyaller bit vektörler üretmek ve 
port sinyallerinin tamsayı gösterimi 
için kullanılmaktadır.Bit vektörlere 
işaretsiz ikili değerler olarak işlem 
görmektedir. 
• Giriş sinyallerindeki tek bit vektörleri 
ve dönüştürülmüş tamsayı veri 
tiplerini birbirine bağlamak için 
kullanılır 
• Çarpma standart VHDL operatörü ile 
gerçekleştirilir 
• Tamsayıdan bit vektörlere 
dönüştürülürken hedef vektörün 
büyüklüğü muhakkak belirtilmelidir  
• Son olarak bit vektör elemanları çıkış 
portlarına atanmalıdır 

4.3.6 Operatörlerin Sentezi 
• Operatör yapısı 
o Ayrık kapılar 
o Kütüpanedeki Makro hücre 
• Operatör mimarisi(ör. ripple-carry, carry-look-ahead vb.) 
o VHDL kodunu içeren sentez araçları için özel açıklamalar 
o Zaman- / alan- varsayılanları temelli optimizasyon (time- / surface-defaults) 
Operatör sembollerine dayanarak, sentez gerekli fonksiyonaliteyi bilmektedir. Hedef teknolojiye ve 
kullanılan kütüphane elemanlarına göre bir dizi altmodül standart hücrelerde veya makro hücrelerde 
yaratılmaktadır. Eğer alternatif gerçeklemeler varsa örneğin ripple-carry or carry-look-ahead, karar 
verilen hız ve alan kısıtlarına  göre yapılmalıdır. Bazen kullanıcı sentez işlemini araç seçenekleri veya 
özel VHDL açıklamalarıyla etkiler bu da yazılım tarafından değerlendirilir. 
Sentez  Sonuçları 
• Adım 1: Soysal bir netliste dönüştürme 
o VHDL -> bool eşitlikler veya aracın karmaşık fonksiyonları teşhisi ile 
• Adım 2: Optimizasyon 
• Araca(tool) göre değişir: Tüm üç önek de aynı sonucu vermektedir 

4.3.7 Toplama Örneği 
entity ADD is 
   port (A, B  : in integer range 0 to 7; 
           Z       : out integer range 0 to 15); 
end ADD; 
architecture ARITHMETIC of ADD is 
begin 
    Z <= A + B; 
end ARITHMETIC; 
library VENDOR_XY; 
use VENDOR_XY.p_arithmetic.all;  
entity MVL_ADD is 
   port (A, B : in mvl_vector (3 downto 0); 
            Z : out mvl_vector (4 downto 0) ); 
end MVL_ADD; 
architecture ARITHMETIC of MVL_ADD is 
begin 
    Z <= A + B; 
end ARITHMETIC; 
Notice: 
Tamsayı için değer kümesi bildirimi avantaj sağlar:  
   a) Simülasyon esnasında: değer aralığı dışında 
olup olamdığının kontorlünde 
   b) Sentez esnasında: sadece 4 bit yol genişliği  
Bu örnektede çarpan da uygulanan adımlar uygulanabilir. O örnekten bildiğimiz üzere en iyi yöntem 
tamsayı tiplerini ve ‘+’ operatörünü kullanmaktır. 
VHDL standart olarak ‘+’ operatörü için REAL ve INTEGER veri tipleri öntanımlı bulunmaktadır. 
Kendi tanımladığımız veri tipleri kullanmak daha karmaşıktır. Bu nedenle yeni bir “+” operatörü 
tanımlanmalıdır VHDL de. Bu yeni fonksiyon (“+” ile aynı  isimde,fakat farklı parametrelerle ) 
tanımlanmalıdır: 
          function "+"(L: mvl_vector; R: mvl_vector) return mvl_vector is 
          constant length: INTEGER := R'length + 1; 
          begin 
               -- calculate result = L + R 
              return result; 
          end;. 

4.4 Sıralı Mantık(Sequential Logic) 
• Tüm yazmaçlara başlangıç değeri atamak için bir yeniden başlatma(reset) 
mekanizmasına ihtiyaç vardır 
• Asenkron reset davranışı sadece hassasiyet listesi ile işlemlerle modellenmektedir. 
process 
begin 
   w a i t  until CLK`event and CLK=`1`;   -- not recommended 
      DATA <= INPUT ; 
end process ;  
process(CLK,RESET) 
begin 
   if (RESET = `1`) then 
      DATA <= `0` ; 
   elsif (CLK`event and CLK=`1`) then     -- correct 
        DATA <= INPUT ; 
   end if ; 
end process ; 
Sıralı mantık,bellek elemanlarını içeren,özellikle Flip Floplar, tasarımın genel adıdır. Tüm sinyaller, 
simülasyondan önce varsayılan değerler atanarak başlatılır, dışardan bir yeniden başlatma(reset) 
mekanizması gereklidir, güç verildiğinde tasarımın aynı şekilde davrandığını garanti etmek için. 
Bunun için sadece yeniden başlatma için adanmış  bir reset sinyali kullanılır. Lütfen dikkat edin ki 
asenkron davranış hassasiyet listesi olan işlemler için modellenebilir, işlem saat ve reset sinyaline göre 
tepki verir. 

4.4.1 RTL – Kombinasyonel Mantık ve 
Yazmaçlar  
LOGIC_A: process 
begin 
wait until CLK`event and C L K = ` 1 ` ;  
--   Logic A  
end process LOGIC_A;     
LOGIC_B: process (ST) 
begin 
--  Logic B 
end process LOGIC_B; 
• Saat işlemlerde sinyal ataması Flip Flop olarak 
kullanılır 
o LOGIC_A: lojik+ Flip Flops 
o LOGIC_B: tamamen kombinasyonel 
mantık 
o LOGIC_AB: "Logic A" ve "Logic B" 
‘nin çıkışlarındaki Flip Floplar 
=> yanlış gerçekleme 
LOGIC_AB: process 
begin 
wait until CLK`event and C L K = ` 1 `  ;   
-- Logic A and Logic B 
end process LOGIC_AB; 
Ek olarak, saat işleminin sonunda tüm sinyaller yeni değerlerini alırlar. Bu nedenle, teorik bir noktanın 
belirtilmesi gerekmektedir ki yazmaçlar ve kombinasyonel mantık  bölünmüş işlemlerle modellenirler,  
Flip Flop’un bir sonraki değerinin hesabını aynı işlemde yapmak mümkündür.  Fakat,yazmaç 
değerlerinin sonradan işlenmesi,  başka bir işlemde yada koşutzamanlı ifadeyle gerçekleştirilmek 
zorundadır. 

4.4.2 Zamanlı İşlemlerde Değişkenler 
VAR_1: process(CLK) 
   variable TEMP : integer; 
begin 
   if (CLK'event and CLK = '1') 
then 
      TEMP := INPUT * 2; 
      OUTPUT_A <= TEMP + 1; 
      OUTPUT_B <= TEMP + 2; 
   end if; 
end process VAR_1; 
• Yazmaçlar güncellenmeden önce alacakları değerleri 
okunabilen değişkenler üretirler. 
• Kaç tane yazmaç üretilmiştir? 
VAR_2: process(CLK) 
   variable TEMP : integer; 
begin 
   if (CLK'event and CLK = '1') 
then 
      OUTPUT <= TEMP + 1; 
      TEMP := INPUT * 2; 
   end if; 
end process VAR_2; 
Değişkenlerin donanım gerçeklemesi işlemlerde kullanışlarına bağlıdır. VHDL dili, bir işlem tekrar 
yürütülene kadar değişkenlerin eski değerlerini korumasını garanti etmektedir. Eğer değer 
kullanılmadıysa, çünkü her zaman kullanılmadan önce güncellenmiştir,  bellek elemanı  gereksiz 
olacaktır. Sonuç olarak, Flip Floplar saatli işlemlerde kullanılan değişkenlerin eğer güncellenmeden 
önce okunması gerekiyorsa bu değişkenler için ortaya çıkmıştır.  
VAR_1 işleminde, aktif saat kenarı tesbit edildiğinde değişkenler her zaman INPUT*2 olarak 
atanır.Bu nedenle, TEMP ifade için kestirme olarak ele alınmıştır ve  son netlist de görülmemektedir. 
Fakat,  VAR_2 de TEMP in değeri çıkış OUTPUT sinyalinin yeni dğeerini hesaplamak için 
kullanılmıştır, yazmaç bakası(register bank)(integer: en az 32 bit) üretilmiş olunacaktır. 

Örnek  
process 
   variable LFSR : bit_vector(3 downto 0); 
begin 
   wait until CLK`event and C L K = ` 1 ` ;  
      LFSR(0) := INPUT; 
      LFSR(3) := LFSR(2); 
      LFSR(2) := LFSR(1); 
      LFSR(1) := LFSR(0); 
      OUTPUT <= LFSR(3); 
end process; 
Kaç tane register üretilmiştir? 
Üç Flip Flop gerçeklenmiştir. Bir tanesi saat işlemleriyle sürülen  OUTPUT çıkış sinyali için. İki Flip 
Flop ise sürülmeden önce okunan LFSR(2) ve LFSR(1) değişkenleri için  gerçeklenmiştir. 
4.5 Sonlu Durum Makineleri ve VHDL 
    ( FSM-Finite State Machines) 
• Durum İşlemleri(State Processes) 
• Durum Kodlama (State Coding) 
• FSM Tipleri  
o Medvedev 
o Moore 
o Mealy 
o Kayıtlı Çıkış(Registered Output) 
Bu bölümde, farklı tipteki sonlu durum makinlerini, onların grafiksel gösterimini ve VHDL le 
modelleme yollanırını göstermiş olacağız. Ayrıca sadece senkron otomasyon varsayılmıştır.  
Genel olarak her FSM tek bir tane yada ikiye bölünmüş işlemlerden biriyle  tanımlanabilir. 
Gerçekleme(implementation) kılavuzu ve avantajları veya dezavantajları farklı tipler için verilmiştir. 
Durum makinesinin mevcut durumu genellikle betimleyici isimlerle tanımlanmıştır.  Bu 
numaralama(enumeration) tipleri ile  betimleyici isimler kullanılarak elde edilir. Daha sonra, sentez 
işleminde, bu isimler  ikili(binary) bir sunumla eşleştirilmelidir. Bu adımda durum şifreleme-kodlama 
denir.  
Sonlu durum makinelerinin birçok versiyonu vardır. Teoride bilinen standart versiyonları ise 
Medvedev, Moore and Mealy makineleridir. Fakat bunun dışında daha çok versiyonu vardır. Birçok  
nedenle ihtiyaç duyulmaktadır, örneğin bellek elemanlarının(yazmaçlar(registers), Flip Floplar)  
modül çıkışına koyulması. Bunu yaparak, sonlu durum makinelerinin ek versiyonları oluşturulabilir, 
bunu ilerde göstereceğiz. 

4.5.1 Bir "State"Durum İşlemi 
FSM_FF: process (CLK, RESET) 
begin 
    if RESET='1' then 
         STATE <= START  ; 
    elsif CLK'event and CLK='1' then 
        case  STATE  is 
                when  START   => if  X=GO_MID  then 
                                 STATE <= MIDDLE  ; 
                             end if ; 
                when  MIDDLE  => if  X=GO_STOP  then 
                                 STATE <= STOP  ; 
                             end if ; 
                when  STOP    => if  X=GO_START  then 
                                 STATE <= START  ; 
                             end if ; 
                when  others  =>  STATE <= START  ; 
            end case ; 
    end if ; 
end process FSM_FF ; 
Basit durum makinesinin üç farklı gösterimi resimde gösterilmektedir. 
En üstteki grafikte ise sadece ilgilki blok ve sinalleri içeren soyut blok diyagramının  otomatını 
göstermektedir.İlk blok(oval) otomatın mantığını ve ikinci blok(kare) ise  bellek elemanlarını 
göstermektedir.  
Sağdaki alttaki grafikde ise, otomat balon diyagram(bubble diagram) şeklinde tanımlanmıştır. 
Çemberler, otomatın farklı durumlarını işaret etmektedir. Aktif saat kenarı zamanında uygun 
geçişse(ok) bağlanmı koşul ‘true’ doğru ise , otomat durumunu değiştirir. Bu senkron bir davrnaıştır. 
Burada asenkron yeniden başlatma  tek istisna davranış durumudur. Reset sinyali aktif olarka 
alındığında , otomat durumunu sıfırlayarak START durumuna gelir hemen.  
Altta solda ise, VHDL kaynak kodunun gerekli kısmı gösterilmiştir. Otomat bir saat işlemin içinde 
tanımlanmıştır. İlk IF dallanması reset(yeniden başlatma)  düzenini içermektedir. İkinci dallanma, 
ELSIF dallanması, geri kalan otomat bildirilmiştir. Durum geçişini modelleyen CASE ifadesinde, 
otomatın mevcut durumu tesbit edilir ve giriş değerlerinin hazır olup olmadığına yani durumu 
değiştirmeye neden olup olmayacağına karar verilir. 

4.5.2 İki "State"Durumlu İşlemler 
FSM_FF: process (CLK, RESET)    begin 
    if RESET='1' then 
         STATE <= START  ; 
    elsif CLK'event and CLK='1' then 
         STATE  <=  NEXT_STATE  ; 
    end if; 
end process FSM_FF ; 
FSM_LOGIC: process ( STATE , X) 
begin 
     NEXT_STATE <= STATE ; 
    case  STATE  is 
           when  START   => if  X=GO_MID  then 
                            NEXT_STATE <= MIDDLE  ; 
                       end if ; 
           when  MIDDLE  => ... 
           when  others  =>  NEXT_STATE <= START  ; 
        end case ; 
end process FSM_LOGIC ; 
 Şimdi, aynı otomat iki VHDL işlemi temelli gerçeklemeyi göstermek için kullanılacaktır.  
NEXT_STATE sinyali bu kez apaçık incelenmektedirç Blok diyagramın içine mantık ile bellek 
elemanlarının arasına eklenmiştir. Davranış aynı kaldığı için balon diyagramında herhangi bir değişik 
yoktur.  
VHDL kaynak kodu iki işlem içermektedir. NEXT_STATE mantığı için hesaplama ayrılmış bir 
işlemin içinde  bildirilmiştir.  Sonuç bir bellek elemanları tanımlayan saatli işlemdir  ve diğeri ise 
mantığı tanımlayan tamamen kombinasyonel işlemlerdir.  CASE ifadesinde,yine mevcut durum 
kontrol edilmektedir ve giriş değerleri sınanmaktadır. Eğer durum değişmek zorundaysa ,  
NEXT_STATE ve STATE farklılık gösterecektir.Aktif saat kenarının bir sonraki gerçekleşmesinde, 
bu yeni durum mevcut durum olarak atanacaktır. 
4.5.3 Kaç tane İşlem? 
• Yapı ve Okunabilirlik(Structure and Readability) 
o Asenkron kombinasyonları≠ Senkron bellek elemanları  
=> 2 işlem 
o Özel giriş değişimleriyle FSM durumunun değişimi  
=> 1 işlem daha anlaşılır 
o Grafiksel FSM (çıkış eşitlikleri olmadan)  
=> 1 işlem 
• Simülasyon(Simulation) 
o Hata tesbiti  iki işlemde daha kolay olmaktadır  
=> 2 işlem 
• Sentez(Synthesis) 
o 2 durum işlemi daha küçük netlist ve daha iyi sentez sonucu sağlamaktadır  
=> 2 işlem 
Otomat tanımlama bir veya iki bölümlü işlemlerle daha önce gösterilmişti.  Tasarımcının kendi 
isteğine ve deneyimlerine göre, bir veya iki bölümlü versiyonlardan birini tercih edebilir.  
Genellikle bunların farklı avantajları ve dezavantajları vardır:  
Yapı ve okunabilirlik(Structure and readability) 
VHDL modeli, VHDL kaynak kodundan donanımı  yaratarak gösterecek bir yok sunmaktadır. Bu 
yüzden yapı VHDL kodundan yansıtılıyor olmalıdır. Tamamen kombinasyonel mantık  ve bellek 
elemanları farklı yapısal elemanlardı, bu açıdan bölümlere ayrılmalıdır, bu yüzden VHDL kaynak 
kodu iki işleme bölünmelidir.  
Fakat biri normal olarak durumların mevcut değişimleriyle ilgilenirken sadece. Bu değişimler sadece 
modülün dışından gözlemlenebilir olmalı.  Bir işlem tanımı bu açıdan daha uygundur. Ek olarak, 
gafiksel tanımlama, VHDL model için belirtim olarak kullanılır genelde, bir işlemden çok iki işlem 
tanımlanmasına benzer.  
Simülasyon(Simulation) 
VHDL modeldeki olası hataları dalgaformundan(waveform)  tesbit etmek, eğer bir ara sinyal 
NEXT_STATE e erişilebilirse, çok kolay olacaktır. Bu yüzden hatanın ilk olarak görüşdüğü zaman ve 
alan iyi şekilde saptanmalıdır ve hatanın kaynağı bulunmalıdır. İki işlem versiyonu bu açıdan daha 
iyidir.  
Sentez(Synthesis) 
Sentez allgoritmaları buluşsal temellidir. Bu nedenle herkes tarafından geçerli ifadeler vermek 
imkansızdır. Fakat birçok sentez aracı daha iyi sonuçlar üretme eğilimi göstermektedir, daha az kapı 
kullanarak , otomat tanımlama için iki işlem kullanılmıştır çünkü donanım yapısıyla çok yakın ilişki 
içerisindedir. 

4.5.4 Durum Şifreleme-Kodlama  
   (State Encoding) 
type STATE_TYPE is ( START, MIDDLE, 
STOP ) ; 
signal STATE : STATE_TYPE ; 
• Durum şifreleme FSM ‘nin güvenliğinden 
sorumludur 
START      -> " 00 " 
MIDDLE   -> " 01 " 
STOP       -> " 10 " 
• Varsayılan şifreleme: binary(ikili)  
START     -> " 001 " 
MIDDLE   -> " 010 " 
STOP       -> " 100 " 
• Optimal hızda varsayılan şifreleme: one hot 
if {ld(# of states-durumun)≠ENTIER[ld(# of states-durumun)] } => güvenli olmayan (unsafe) FSM! 
Bir sonlu durum makinesi sayısal donanımın soyut tanımlamasıdır. Otomatın durumları binary 
değerlerde tanımlıysa veya sentez araçaları durum isimlerini binary tanımlara kendiliğinden 
dönüştürebiliyorsa ,sentez gerekmektedir.  Bu dönüşüme durum şifreleme denir.  
Birçok sentez araçları bir binary(ikili) kodu varsayılan olarak seçer, eğer tasarımcı dışarıdan özellikle 
başka bir kod belirlemediyse. Otomarın durumları sentez araçlarıyla "00", "01" ve "10" değerleriyle 
şifrelenir. Durum kodlamanın diğer olasılıkları olmasına rağmen.  Sık kullanılan bir kod,hız optimize 
devreler için gereklidir ve "one-out-of-n" (n taneden biri) kısaca “one hot” kod denir. Buradai 
otomatın her durumu için bir bit kullanılmıştır. Örneğin, eğer otomat’ın 11 durumu varsa durum 
vektörünün 11 bit içermesi gerekmektedir. Bit vektördeki kurulmuş olan bit yani ‘1’ olan otomatın 
mevcut durumunu gösterir.  
Durumların şifrelenmesinde oluşabilecek bir problem  asla gözardı edilemez: Eğer otomatın ‘n’ 
durumu varsa, bir(one) ‘in ENTER[ld(n)] Flip Flop’ a ihityacı vardır binary kod için. Bu en küçük 
tamsayı değeri n ‘in binary algoritmasının sonucundan büyükeşit olabilir.  Sadece 3 durum içerdiği ve 
iki FF içeren otomat 4  durumla ("00", "01", "10", "11") gösterilebilir, burada bir tane geçersiz durum 
vardır ki bu durum güvenli olmayan (unsafe) durum makinesine neden olabilir, yanlışlıkla 
tanımlanmamış bir duruma girildiğinden tasarımın davranışı kararsızdır.  
Genellikle, bir mekanizma geçersiz bir durumun hatalı girişini düzeltecek şekilde olmalı. 

4.5.5 Case İfadesinin Eki 
type STATE_TYPE is (START, MIDDLE, STOP) ; 
signal STATE : STATE_TYPE ; 
· · · 
    case STATE is 
           when START     => · · · 
           when MIDDLE  => · · · 
           when STOP      => · · · 
            when others      => · · · 
    end case ; 
• "when others" seçeneği 
eklenmiştir 
Simüle edilemez: RTL de STATE için başka değer bulunmamaktadır 
Yeterince güvenli değil: bazı sentez araçları "when others" seçeneğini reddeder 
 Geçersiz durumların üstesinden gelmek için en sık kullanılan metod CASE ifadesine bir 'when others' 
dallanması eklemektir.  
VHDL katı bir dil olduğundan, simülasyon sırasında,  sadece tip tanımlaması yapılmış bir sinyale 
ulaşılabilir. Bu nedenle geçersiz durumlar simülasyonda bulunmaz ve bu nedenle simüle edilemez. 
Bununla birlikte sentezlenmiş devre ister istemez güvenli değildir.  Bazı sentez araçları 'when others' 
dallanmasını reddetmektedir, doğası gereği, bu dallanmayı kapsayacak bir değer yoktur.  
Güvenli bir durum makinesi yaratmak için case ifadesine 'when others' eklemek iyi bir çözüm değildir. 

4.5.6 Tip Bildirimini Eki  
t y p e  STATE_TYPE is (START, MIDDLE, STOP, DUMMY) ; 
signal STATE : STATE_TYPE ; 
··· 
    case STATE is 
           when START     => ··· 
           when MIDDLE  => ··· 
           when STOP      => ··· 
            when DUMMY      => ···     -- or when others 
    end case ; 
• Sahte(dummy) değerler eklenmektedir 
• Avantajları: 
o Şimdi simüle edilebilir 
o Sentezden sonra güvenli 
FSM elde edilir 
{2**(ENTIER [ld(n)]) -n} sahte durumlar (dummy states) 
(n=20 => 12 dummy states) 
one hot kodu değiştirerek => gereksiz donanım (unnecessary hardware) 
(n=20 => 12 unnecessary FlipFlops) 
 İkinci bir yol ise enumeration tip içn ek değerler tanımlamaktır.  Bu nedenle birçok değer eklenmek 
zorundadır ki durum şifrelemeden sonra geçersiz değerler hala görülmesin. Eğer bir otomat örneğin 20 
durum içeriyorsa, 5 FF gereklidir. 5 FF ile 32 değer belirtilebilir. Bu nedenle 12 ek değer durum 
makinesinin enumeration tipine eklenmelidir. 
Ek değerler ekleyerek, eğer hataya neden olacak bir değer alındıysa artık simüle edilebilir. Ayrıca 
sentez de güvenli devre orijinal durum makinesiyle gösterilebilir.Ancak, bu metodun kullanılması 
zordur birilerinin sahte durumları eklemesi gerekmektedir. Ayrıca bu metod için sadece otomatın 
durumları için binary kod kullanılmalıdır. Eğer biri 12 ek değeri eklese bile, 12 gereksiz FF 
kullanması gerekmektedir.  
Eğer bir one hot kodu kullanıldıysa, sistemi ek sahte durumlar ekleyerek güvenli hale getirmek 
imkansızdır.  Herbir yeni değer ek FF e neden olacaktır ve bu nedenle sentezden sonra geçersiz 
durumların miktarı artacaktır.  
Bu nedenle, enumeration tipe ek değerler ekleme metodu iyi bir çözüm değildir, çünkü sadece 
binary(ikili) durum şifrelemede uygulanabilir.  

4.5.7 Elle Kodlama 
subtype STATE_TYPE is std_ulogic_vector (1 downto 0) ; 
signal STATE : STATE_TYPE ; 
constant START   : STATE_TYPE := "01"; 
constant MIDDLE : STATE_TYPE := "11"; 
constant STOP     : STATE_TYPE := "00"; 
··· 
    case STATE is 
           when START     => ··· 
           when MIDDLE  => ··· 
           when STOP      => ··· 
           when others      => ··· 
    end case ; 
• Sabitleri tanımla 
• Şifrelemenin kontrolü 
• Güvenli FSM 
• Simüle edilebilir 
• Taşınabilir tasarım 
• Daha çok çaba gösterilmeli 
 Durum şifrelemenin en iyi yolu elle kodlamadır, tasarımcının kendisinin hangi kodu kullancağına 
karar vermesi.  
Bu enumeration tipi yerine vektör tipinin kullanılmasıyla yapılı. Bu vektör tipi örneğin 
'std_(u)logic_vector' temelli olabilir. Bu vektörün genişliği seçilen koda göre değişir.  Durum sinyali 
artık tanımlanan bu vektör tipindedir, bu nedenle buna durum vektörü("state vector") denir.  
Bir sonraki adımda, sabitler otomatın uygun durumlarını belirtecek şekilde tanımlanırlar. Bu sabitler 
seçilen koda göre durum vektörünü kurar. Bu sabitler ile, kod tasarımcı tarafından düzeltilir ve sentez 
araçları tarafından değiştirilemez. Bu VHDL modeli %100 taşınabilirdir. Hata olması durumunda 
davrnaış simülasyonda doğrulanır, durum vektöründeki tüm değerlerin gerçek donanımdada 
görüleceği varsayılmaktadır. 
Belirtilmesi gereken tek dezavantaj VHDL kodunu yazmak için biraz daha fazla çaba sarfetmek 
gerekmektedir.Bu özellikle koo değiştirildiği zaman geçerlidir. Elle kodlama alternatifi güvenli bir 
sonlu durum makinesi tasarlamak için en iyi metoddur  ve farklı sentez araçlarına taşınabilirliği daha 
fazladır. 

4.5.8 FSM: Medvedev 
• Çıkış vektörü (output vector) durum vektörüne(state vector) benzemektedir: Y = S  
        Two Processes-Çift İşlemli  
architecture RTL of MEDVEDEV is 
    ... 
begin 
     REG: process (CLK, RESET) 
    begin 
        -- State Registers Inference 
    end process REG ; 
     CMB: process (X, STATE) 
    begin 
       -- Next State L o g i c  
    end process CMB ; 
    Y <= S ; 
end RTL ; 
         One Process-Tek İşlemli 
architecture RTL of MEDVEDEV is 
    ... 
begin 
     REG: process (CLK, RESET) 
    begin 
        -- State Registers Inference with Logic Block 
    end process REG ; 
    Y <= S ; 
end RTL ; 
 Teoride bilinen üç tip durum makinesi(Medevedev, Moore ve Mealy makineleri) arasındaki fark 
ürettikleri çıkışlardan kaynaklanmaktadır.  
Medvedev makinesinde çıkış değeri sonlu durum makinesindeki durum vektörüne benzemektedir. 
Çıkış için mantık sadece tellerden oluşmaktadır; durum vektörleri yazmaçlarından çıkış portlarına 
bağlantı vardır. Bu VHDL de basit bir sinyal atamasıyla örnekte gösterildiği gibi yapılmaktadır. 
Burada koşutzamanlı atama kullanılmaktadır. 

4.5.9 Medvedev Örneği 
architecture RTL of MEDVEDEV_TEST is 
    signal STATE,NEXTSTATE : STATE_TYPE ; 
begin 
     REG: process (CLK, RESET) 
    begin 
        if RESET=`1` then 
            STATE <= ST ART  ; 
        elsif CLK`event and CLK=`1` then 
            STATE <= NEXTSTATE ; 
        end if ; 
    end process REG; 
     CMB: process (A,B,STATE)  begin 
        NEXT_STATE <= STATE; 
        case STATE is 
            when START  => if (A or B)=`0` then 
                            NEXTSTATE <= MIDDLE ; 
                        end if ; 
            when MIDDLE => if (A and B)=`1` then 
                            NEXTSTATE <= STOP ; 
                         end if ; 
            when STOP    => if (A xor B)=`1` then 
                            NEXTSTATE <= START ; 
                         end if ; 
            when others => NEXTSTATE <= ST ART  ; 
        end case ; 
    end process CMB ; 
    -- concurrent signal assignments for output 
     (Y,Z) <= STATE ; 
end RTL ; 
 Burada bir Medvedev makine örneği gösterilmektedir. 
Balon diyagram makinedeki durumları(START, MIDDLE, STOP), durum şifrelemesi ("00", "11", 
"01"; ayrıca sabit bildirimine bakınız) ve durum geçişini içermektedir. Geçişlerin(oklar) 
ağırlıkları(etiketler) uygun geçişleri gerçekleştirildiğinde giriş vektörünün(burada A ve B sinyalleri)  
değerine karar verir. '10 | 01' için durum geçişi, giriş vektörü “10” yada “01” değerlerinin birine sahip 
olduğunda gerçekleştirilir.  
Durum makinesinin fonksiyonalitesi  sol taraftaki VHDL kaynak kodunda belirtilmiştir.  İki işlemli 
versiyon seçilmiştir. Çıkış vektörü koşutzamanlı sinyal atamasıyla durum vektörüne bağlanmıştır. 

4.5.10 Medvedev Örneğinin Dalgaformu  
        (Waveform) 
• (Y,Z) = STATE => Medvedev makinesi 
Dalgaformunda sinyal değerlerinin simülasyon süresince ilerlemesi gözlemlenmektedir. Bu bir 
Medvedev otomat olmalı çünkü çıkış vektöründeki değerler (Y ve Z sinyalleriyle) gösterilirler ve 
durum vektörüyle senkron olarak değişirler. 

4.5.11 FSM: Moore 
• Çıkış vektörü(output vector) durum vektörünün(state vector) bir fonksiyonudur: 
         Y = f(S)  
       Three Processes  
architecture RTL of MOORE is 
    ... 
begin 
     REG: -- Clocked Process 
     CMB: -- Combinational Process 
    OUTPUT: process (STATE) 
    begin 
        -- Output Logic 
    end process OUTPUT ; 
end RTL ; 
       Two Processes  
architecture RTL of MOORE is 
    ... 
begin 
     REG: process (CLK, RESET) 
    begin 
        -- State Registers Inference with Next State Logic 
    end process REG ; 
    OUTPUT: process (STATE) 
    begin 
        -- Output Logic 
    end process OUTPUT ; 
end RTL ; 
 Burada Moore makinesinin bir örneği gösterilmiştir.  
Çıkış vektörü(output vector) durum vektörünün(state vector) bir fonksiyonudur.  Bunun nedeni blok 
diyagramdaki ikinci mantık bloğunun, bellek elemanından sonra yer almasıdır. Bu mantık bloğu 
donanımı tutar bu da otomatın mevcut durumunun çıkış değerinin hesaplanması için gerklidir.  
VHDL kaynak kodunda, mantık kombinasyonel işlem olarak gerçekleştirilmektedir. Çıkış vektörünün 
değeri sadece durum vektörünün mevcut değerine bağlıdır, işlemin hassasiyet listesinde başka 
sinyaller  görülmemektedir. 

4.5.12 Moore Örneği 
architecture RTL of MOORE_TEST is 
    signal STATE,NEXTSTATE : STATE_TYPE ; 
begin 
    REG: process (CLK, RESET) begin 
        if  RES ET =`1 `  th en     STATE <= START ; 
        elsif CLK`event and CLK=`1` then 
            STATE <= NEXTSTATE ; 
        end if ;    end process REG ; 
    CMB: process (A,B,STATE) begin 
        NEXT_STATE <= STATE; 
        case STATE is 
          w h e n   S T A R T   = >  if (A or B)=`0` then 
                            NEXTSTATE <= MIDDLE ; 
                         end if ; 
          when MIDDLE => if (A and B)=`1` then 
                            NEXTSTATE <= STOP ; 
                         end if ; 
          when STOP    => if (A xor B)=`1` then 
                            NEXTSTATE <= START ; 
                         end if ; 
          when others => NEXTSTATE <= START ; 
        end case ;     end process CMB ; 
    -- concurrent signal assignments for output 
    Y <= ,1` when STATE=MIDDLE else ,0` ; 
    Z <= ,1` when STATE=MIDDLE 
                or STATE=STOP else ,0` ; 
end RTL ; 
Bu kez Moore otomat için balon diyagramında VHDL kodu gösterilmektedir. Medvedev otomattan 
farkı durum şifreleme ve çıkış vektörü için uygun değerlerde görülmektedir. Her iki değerde 
baloncuklarda gösterilmektedir. Çıkış vektörü(Y,Z) için değerler Medvedev otomat ile aynıdır.Fakat 
durum şifreleme bu kez binary koda dayanmaktadır. 
VHDL kaynak kodda, çıkış mantığı  alan kısıtından dolayı kombinasyonel işlemde  içermemektedir. 
Bunun yerine, ayrı koşutzamanlı sinyal atamaları gerçeklenmektedir.  Çıkış değerleri durum 
vektörünün değerlerinden  hesaplandığı  görülebilmektedir. 

4.5.13 Moore Örneğinin Dalgaformu   
       (Waveform) 
• (Y,Z) STATE ile eşzamanlı olarak değişir => Moore makinesi 
Çıkış vektörünün değerleri durum vektörünün değeriyle eşzamanlı olarak değişir. Fakat bu kez çıkış 
vektörünün değeri durum vektöründen farklılık gösterir. 

4.5.14 FSM: Mealy 
• Çıkış vektörü, durum vektörü ve giriş vektörünün fonksiyonudur:  Y = f(X,S)  
       Three Processes  
architecture RTL of MEALY is 
    ... 
begin 
    REG: -- Clocked Process 
    CMB: -- Combinational Process 
    OUTPUT: process (STATE, X) 
    begin 
        -- Output Logic 
    end process OUTPUT ; 
end RTL ; 
       Two Processes  
architecture RTL of MEALY is 
    ... 
begin 
    MED: process (CLK, RESET) 
    begin 
        -- State Registers Inference with Next State Logic 
    end process MED ; 
    OUTPUT: process (STATE, X) 
    begin 
        -- Output Logic 
    end process OUTPUT ; 
end RTL ; 
 Burada bir Mealy otomat gösterilmektedir. 
 Çıkış vektörünün değeri, durum vektörünün değeri ve giriş vektörünün değerinin bir fonksiyonudur. 
Bu nedenle blok diyagramda bulunan hat giriş vektöründen mantık bloğuna gider burada çıkış 
vektörünü hesaplar. VHDL kaynak kodunda, giriş vektörü şimdi uygun işlemlerin hassasiyet listesinde 
listelenmektedir. 

4.5.15 Mealy Örneği  
architecture RTL of MEALY_TEST is 
    signal STATE,NEXTSTATE : STATE_TYPE ; 
begin 
    REG: · · ·   -- clocked STATE process 
    CMB: · · ·   -- Like Medvedev and Moore 
Examples 
    OUTPUT: process (STATE, A, B) 
    begin 
        case STATE is 
           when START   => 
                                          Y <= `0` ; 
                                          Z <= A and B ; 
           when MIDLLE  => 
                                          Y <= A nor B ; 
                                          Z <= '1' ; 
           when STOP     => 
                                          Y <= A nand B ; 
                                          Z <= A or B ; 
           when others  => 
                                          Y <= `0` ; 
                                          Z <= '0' ; 
        end case; 
    end process OUTPUT; 
end RTL ; 
 Daha önce tanımlanan iki otomat tipinin tersine , çıkış değerleri mevcut durum balonunda 
basitçe yazılamamaktadır. Tüm fonksiyon, bir durumdan diğer duruma değişiklik göstererk 
geçerken yazılmış olmalıdır. Bu fonksiyonlar genellikle durum balonun arkasında gizlidir 
ancak grafikte özellikle gösterilmektedir.  
VHDL kaynak kodunda, çıkış değerinin hesaplanması koşutzamanlı sinyal atamaıs ile 
tanımlanmaktadır. Giriş sinyalleri atamanın sağ tarafında görülmektedir ve çıkış fonksiyonun bir 
parçasıdır.  

4.5.16 Mealy Örneği Dalgaformu      
      (Waveform) 
• (Y,Z) giriş ile değişir => Mealy makinesi 
• Y ve Z dalgaformunun ani yükselmelerine dikkat edin 
o FSM normal işlemlerdeki aşırı voltaj yükselmesini önlemek için dikkatli bir 
şekilde modellenmeli. 
 Bu dalgaformunda en çok dikkat edilmesi gereken şey, bazen çıkış değerlerinin değişimi giriş 
vektörünün değerlerinin değişimiyle birlikte olmaktadır. Bunula birlikte bunlar elbette durum 
vektörünün değerlerinin değişimiyle birlikte değişmelidir. Görüldüğü üzere, bu “spike”(ani 
yükselmeye)  adı verilen, sinyal darbesinin saat periyodu boyunca daha küçük genişlikte olması.  
Bunun ardından blokda kötüdavranışa neden olabilir. Elbette, bu durum önlenmelidir ve tasarımcı 
Mealy otomat modellerken bu durum için özel önlem almalıdır. 

4.5.17 Modellemeye Bakış 
• Medvedev hiç esnek değildir 
• Moore güvenli operasyonlar için tercih edilir 
• Mealy daha esnektir, fakat tehlikeleri: 
o Ani vurum(Spikes) 
o Gereksiz uzun yollar(Unnecessary long paths (maximum clock period)) 
o Kombinasyonel geribesleme döngüleri(Combinational feed back loops) 
Medvedev otomatın avantajı otomatı gerçeklemek için gereken donanım miktarı ve çıkış mantığı 
azaltılmıştır. Çıkış değerleriyle durum vektörü aynı olduğu için ek kombinasyonel mantığa gerek 
yoktur ve çıkış vektörünün değerleri aktif saat kenarıyla birlikte değişmektedir.  Fakat tasarımcı durum 
vektörü için kodu kendi seçmelidir. Bunun anlamı tasarımcı tasarım için daha çok çaba sarfetmeli ve 
tasarım esnekliğe izin vermez, bu eğer durum makinesi için kod değiştirilmek zorundaysa kötü bir 
durumdur.  
Moore otomat sık olarak kullanılan bir otomat tipidir ve Medvedev otomattan daha esnektir ve çıkış 
sadece durum vektörüne bağlı olarak  hesaplanır. Durum vektöründeki bu tek bağımlılıkla,  çıkış 
değerleri diğerlerine nisbeten daha güvenli biçimde hesaplanır, bunun anlamı, yeni değerler birsonraki 
aktif saat kenarı gerçekleşene kadar stabildir ve spike(aşırı yükselme) önlenmiştir. Bazen giriş 
vektöründeki bir değişimin çıkış vektörünü etkilemek için tam bir saat çevrimine ihtiyacı vardır buda 
dezavantajlı bir durumdur çünkü durum vektörü çıkış vektörü değişmeden önce değişmek zorundadır. 
Bazen zamandaki bu gecikme kabuledilemez ve sonuç olarak Moore otomat kullanılamayabilir.  
Mealy otomat hazırda bulunan en esnek otomasyondur. Çıkış vektörü, durum ve giriş vektörlerine 
bağlı olduğu için, değerin herbir değişiminde tepki verir. Fakat elbetteki bazı dezavantajlar vardır. 
Spike(ani yükselme) gerçekleşebilir.Eğer iki Mealy otomat bir sırada bağlıysa, burada bir 
kombinasyonel geribesleme döngüsü tehlikesi vardır, bu yukarıdaki resimde gösterilmiştir. Ek olarak, 
uzun yollar yaratılmıştır. İki mantık bloğu bir sırada bağlanmıştır, bu yüzden bir değerin değişmesi 
için nispeten daha uzun gecikme süresi(propogation delay) gerekmektedir. Bu nedenle daha büyük 
saat periyodu seçilmelidir. 

4.5.18 Yazmaçlı Çıkış(Registered Output) 
• Uzun yolları ve kararsız zamanlamayı önlemek 
• Ek bir saat periyodu ile 
• Ek bir saat periyodu olmadan (Mealy) 
Daha önce gösterildiği üzere eğer iki  Mealy otomat bir sırada başlanmışsa kombinasyonel 
geribesleme döngüsü gerçekleşebilir. Bu döngüler çıkışlar zamanlandırılırsa önlenebilir, eğer çıkışlar 
FF lere bağlanırsa. Bu şekilde geribesleme döngüsü kırılmış olur.  
Genel olarak , zamanlandırılmış çıkışlar Flip Floplar arasındaki uzun yolları önlemek için kullanılır ve 
bu güvenli zaman davranışını sağlar. Tüm çıkışlar saatlenerekii çıkış mantığı, hemen sonra gelen 
modülün birsonraki mantık bloğundan bölünür ve bu yol boyunca, mantık elemanları kısaltılmış ve 
daha yüksek saat frekansı mümkün olmaktadır. Ayrıca, sentez araçları, sıkça mantık yolunun optimize 
edilmesi sırasında modül sınırlarının hızla geçilmesinden dolayı sorun yaşamaktadır. Çıkışı 
saatlendirerek, bu problem çözülebilir. Diğer bir avantajı ise ard arda modüller güvenli giriş verileriyle 
çalışabilir. Güvenlinin anlamı, veri değişimi sadece aktif saat kenarında olmaktadır, ve ani 
yükselmeler bertaraf edilmiştir.  Böylece ardarda modül tasarımcısı modülü tasarlarken birçok 
seçeneğe sahiptir.  
Çıkışları saatlemek için iki versiyon vardır. İlk versiyonda, bir saat periyotluk ek bir bekleme yaratılır. 
Burada, Flip Floplar, basitçe çıkış mantığıyla durum makinesinin çıkışı arasına başka hiçbir değişiklik 
yapmadan eklenir.  Böylece, çıkışların yeni değerleri bir sonraki aktif saat kenarında ulaşır. Fakat, bu 
gecikme bazen  kabul edilmeyebilir.  
İkinci versiyonda, Flip Floplar  durum makinesinin çıkışında bulunur ve çıkış mantığı durum 
vektörüne ek olarak NEXT_STATE sinyalini kullanır. Daha büyük durum makineleri için, anlaşılmaz 
bir bağımlılığa neden olmaktadır ve diğerlerine nazaran uzun yollar iki mantık bloğu olarak bir sırada 
bağlanırlar.  Fakat durum makinesinin bu versiyonu en esnek ve en hızlı şekilde güvenli(saatli) çıkış 
sinyallerini sağlar. 

4.5.19 Yazmaçlı Çıkış Örneği (1) 
architecture RTL of REG_TEST is 
    signal Y_I , Z_I : std_ulogic ; 
    signal STATE,NEXTSTATE : STATE_TYPE ; 
begin 
    REG: · · ·   -- clocked STATE process 
    CMB: · · ·   -- Like other Examples 
    OUTPUT: process (STATE, A, B) 
    begin 
        case STATE is 
           when START   => 
                                          Y_I<= `0` ; 
                                          Z_I<= A and B ; 
           · · · 
    end process OUTPUT 
    -- clocked output process 
    OUTPUT_REG: process(CLK)    begin 
        if CLK'event and CLK='1' then 
         Y <= Y_I ; 
         Z <= Z_I ; 
        end if ; 
    end process OUTPUT_REG ; 
end RTL ; 
 Resimde Mealy otomat örneği yeniden gösterilmektedir. 
VHDL kaynak kodunda, ara sinyallere(Y_I, Z_I) değer verilmektedir. Bu sinyallerin değerleri giriş 
değerlerine ve mecvut duruma bağlıdır.  Zamanlı işlemlerde, ara sinyaller Flip Floplara bağlanırlar. 

4.5.20 Yazmaçlı Çıkış Örneği Dalgaformu 
(1) 
• STATE  ve çıkış değişimleri arasında bir saat periyotluk . 
• Saat kenarıyla giriş değişimleri çıkış değişimiyle sonuçlanır. 
(İstemdığı değerlerin tehlikesi   ile gösterilmiştir) 
Dalgaformu zamanlı Mealy otomatın simülasyon sonuçlarını göstermektedir. 
Hala modelleme  dikkatlice yapılmalıdır. Durum vektörü ile çıkış sinyalleri arasındaki bir saat 
periyotluk gecikme gereklidir. Eğer bu gözardı edilirse, dalgaformunda işaretlenmiş değerler 
sonradan gelen modüllerde beklenmeyen davranışa yol açmaktadır. 

4.5.21 Yazmaçlı Çıkış Örneği (2) 
architecture RTL of REG_TEST2 is 
    signal Y_I , Z_I : std_ulogic ; 
    signal STATE,NEXTSTATE : STATE_TYPE ; 
begin 
    REG: · · ·   -- clocked STATE process 
    CMB: · · ·   -- Like other Examples 
    OUTPUT: process ( NEXTSTATE , A, B) 
    begin 
        case NEXTSTATE is 
           when START   => 
                                          Y_I<= `0` ; 
                                          Z_I<= A and B ; 
           · · · 
    end process OUTPUT 
    OUTPUT_REG: process(CLK) 
    begin 
        if CLK'event and CLK='1' then 
         Y <= Y_I ; 
         Z <= Z_I ; 
        end if ; 
    end process OUTPUT_REG ; 
end RTL ; 
Yine bir önceki örnekteki Mealy otomat kullanılmıştır. Üstelik self-döngüler daha önce bildirildiği 
gibi, durum makineleri çıkışı için sinyal atamaları, durum geçisine bağlanmıştır. Bu yolla, çıkış 
sinyallerine atamalar sadece zamanlanmış geçişlerde görülmektedir ve FF’ler çıkışları sağlamalıdır.  

4.5.22 Yazmaçlı Çıkış Örneği Dalgaformu 
            (2) 
  STATE ve output değişimi arasında gecikme yoktur.  
  Orijinal Mealy  makinesindeki "Spikes"(aşırı vurma) ortadan kalkmıştır 
Şimdi çıkış değerleri durum değişimleriyle senkron olarak değişmektedir ve istenmeyen geçici 
değerler giderilmiştir. 

4.6 İleri Düzey Sentezleme 
• C sabiti(Constant) tüm referans 
birimlerinde özdeştir 
• Soy(Generic) G farklıdır fakat her bir 
varlık için sabittir 
• Giriş sinyali(signal) S işlemlerde 
set/changed(kurar/değiştirir)  
(farklı işlem modlarında) 
 Tasarımı bitirdiğiniz zaman, VHDL kodun en az bir kısmını diğer tasarımlarda da kullanabilmeyi 
umacaksınız. Bu kesinlikle mümkündür eğer siz VHDL kodunuzu kopyala/yapıştıra uygun şekilde 
adapte ettiyseniz. Fakat eğer fonksiyon çok az bile değiştiyse, tasarımcı VHDL kodunu adapte etmek 
zorundadır.  Bu adaptasyonu kolaylaştırmak için ve az hata-eğilimli olması için, VHDL bir tasarım 
veya modülü parametreleştirmenin birçok yolunu destekler, bunun anlamı davranış bildirimi bazı 
parametrelere bağlıdır. Bu parametrelerin değeri farklı gerçeklemelerle veya operasyon 
gerçekleştrilirken farklı şekillerde atanabilir. Amaç, parametreleri değiştirerek davranışı buna göre 
değiştirmektir. 

4.6.1 Sabitlerle Parametreleştirme  
package T_PACK is 
   constant MAX_VALUE :integer := 15; 
end T_PACK; 
• Sabitler tam bir tasarımda sabitlenmiştir 
• COUNTER_C  örneklemesi tamamen aynı 
sayıcıyı üretir 
• Port haritasında parametrik sinyaller vardır 
use WORK.T_PACK.all; 
entity COUNTER_C is 
  port(..., 
         COUNT : buffer integer range 0 to 
M AX _ V A LU E ) ;  
end COUNTER_C; 
architecture RTL of COUNTER_C is 
begin 
  process(CLK) 
  begin 
      if CLK'event and CLK='1' then 
        if RESET='1' then 
          COUNT <= 0; 
        elsif ENABLE='1' then 
          if COUNT < M A X _ VA L U E then 
             COUNT <= COUNT + 1; 
          else 
             COUNT <= 0 ; 
          end if; 
        en d i f; 
      end if; 
  end process; 
end RTL; 
 Bir tasarımı parametreleştirmenin bir yolu sabitleri(constant) kullanmaktır. Örnekte, reset(yeniden 
başlatma) ve enable(aktif) olan bir sayıcı gösterilmektedir. Sayıcı aktifleştirildiğinde sürekli döner(free 
wheeling) şekildedir. Maksimum değer (MAX_VALUE), T_PACK paketinde verilen ve tanımlanmış 
bir sabit tarafından kurulur-aktifleştirilir(set).  COUNTER_C  sabitlenmiş değer aralığında inşa 
edilmiştir. 

4.6.2 Jeneriklerle Parametreleştirme (1) 
              (Generics) 
entity COUNTER_G is 
   generic ( MAX_VALUE : integer := 15); 
   port(...                                -- default value 
          COUNT : buffer integer 
                                     range 0 to 
MAX_VALUE ); 
end COUNTER_G; 
architecture RTL of COUNTER_G is 
begin 
  process(CLK) 
  begin 
      if CLK'event and CLK='1' then 
        if RESET='1' then 
           COUNT <= 0; 
        elsif ENABLE='1' then 
          if COUNT < MAX_VALUE then 
             COUNT <= COUNT + 1; 
          else 
             COUNT <= 0 ; 
          end if; 
        end if; 
      end if; 
  end process; 
end RTL; 
• Jenerikler(Generics) varlık bildiriminde 
tanımlanmıştır 
• Mimaride sabitler olarak ele alınır 
• Varsayılan değerler 
• Parametrik sinyaller port haritasının içindedir 
Bir tasarımda eğer sayıcıları farklı sayıcı değer aralıklarıyla örneklemek istiyorsanız, jeneriklere 
yönelmek zorundasınız. Jenerikler(generics) varlık bildirimindeki portlar gibi tanımlanmaktadır ve  
bileşen örnekleme adımı sırasında değerlerini almaktadırlar. Bu nedenle, port haritalarına ek olarak,  
bu değerleri destekleyecek bir jenerik haritası gerekmektedir. Eğer jeneriğe dışardan bir değer 
atanmamışsa jenerik cümlesinde  jeneriğe varsayılan bir değer verilir. 

4.6.3 Jenerikle Parametreleştirme(2)  
entity TWO_COUNTERS IS 
port(...); 
end entity; 
architecture RTL of TWO_COUNTERS is 
component COUNTER_G 
   generic (MAX_VALUE:integer := 15); 
  port(...); 
end component; 
begin 
  COUNTER1 : COUNTER_G 
    port map (...); -- MAX_VALUE with default 
value 
  COUNTER2 : COUNTER_G 
     generic map (MAX_VALUE => 31) 
    port map (...); 
... 
end RTL; 
• Farklı örneklemeler için farklı değerler 
o Varsayılan değerle örnekleme 
o Jenerik haritasıyla örnekleme 
Herbir örneklemin bir etikete ihtiyacı vardır 
Sadece tamsayı tipindeki jenerik, sentez araçları tarafından desteklenmektedir 
Bileşen bildirimi, jenerik cümleyi unutmamanız haricinde, herzamanki gibidir.  
Fakat COUNTER_G örneklemi nasıl çalışmaktadır? Eğer varsayılan değerler jenerik için 
tanımlandıysa, bileşen örnekleme jenerik haritasına ihtiyaç duymaz (COUNTER1). Elbette ki, 
varsayılan değerin üzerine yazılabilir,bu bileşen örneklem jenerik haritasındaki değer dışarıdan 
atanarak gerçekleştirilir(COUNTER2).  
En kullanışlı özellik; varlıklar jenerikleri kullanarak aynı modüldeki jenerikler için farklı değerlerle 
örneklenebilmektedir. Fakat, sadece tamsayı tipi jenerikler sentezlenebilir! 

4.6.4 Üretme(GENERATE) 
entity GENERATE_COUNTER IS 
   port(...); 
end entity; 
architecture RTL of GENERATE_COUNTER is 
   component COUNTER_G 
      generic (MAX_VALUE:integer := 15); 
      port(...); 
   end component; 
begin 
   GEN: for K in 2 to 5 generate 
      COUNTER : COUNTER_G 
         generic map (MAX_VALUE => 2**K-1) 
         port map (...); 
   end generate; 
   . . . 
end RTL; 
• 'for generate' bir etikete ihtiyacı vardır 
• Koşutzamanlı ifadeler için "loop"  
(bileşen örnekleme, sinyal atamaları) 
o Aynı bileşenin birçok örneklemi 
o Jenerikler için farklı değerler 
o Döngü değişkeni dolaylı olarak 
bildirilmiştir 
Bir bileşen birçok kez örneklenmiş olmak zorunda olduğunda, tanımlama geniş kapsamlı olmalıdır. 
Üretme(generate) ifadesi problem için bir kısayol sağlar. Bir 'for ... generate ...' döngüsü yineleyebilen 
koşutzamanlı bir ifadedir. Bu sadece tekrarlayan bileşen örneklemleri için deği aynı zamanda 
koşutzamanlı sinyal atamalarında da uygulanabilir.  Döngü değişkeni dolaylı olarak bildirilniştir, ve 
sadece okunabilir, jenerik değerler gibi. Değer ataması bir hataya yol açabilir. 

4.6.5 Koşullu Üretme İfadesi 
 (Conditional GENERATE)  
entity GENERATE_COUNTER IS 
   port(...); 
end entity; 
architecture RTL of GENERATE_COUNTER is 
   component COUNTER_G 
     generic (MAX_VALUE:integer := 15); 
     port(...); 
   end component; 
begin 
   GEN: for K in 1to 8 generate 
       COND1 : if K<=5 generate 
         COUNTER : COUNTER_G 
            generic map (MAX_VALUE => 2**K-1) 
            port map (...); 
      end generate; 
       COND2: if K>5 and FLAG generate 
         MAX : COUNTER_G 
            generic map (MAX_VALUE => 31) 
            port map (...); 
       end generate; 
   end generate; 
   . . . 
end RTL; 
• Eğer koşul doğru ise üret(generate)… 
• elsif / else yolu yoktur 
• Herbir üretmenin bir etikete ihtiyacı vardır 
 Generate(üretme) ifadesini daha güçlü kılmak için, koşutzamanlı bool ifadelerinin değerin yürütecek  
bir if-generate ifadesi kullanılabilirsiniz. Buna karşın, koşullu sinyal ataması  veya sıralı if ifadesi,elsif 
ve else yolu izin verilmemektedir.  
Örnekte, 8 sayıcı örneklenmektedir. K=1…5 için maksimum sayıcı değeri formüle göre hesaplanır:  
2K-1 . Daha büyük dizin değerleri için maksimum sayıcı değeri 31 dir. If koşul ifadesinin kendi 
varlıklarınon jeneriği veya sabitleri ölçmek(evaluate) mümkündür. 

4.6.6 Parametreleştirme ve Sinyaller 
entity COUNTER_S is 
   port( MAX_VALUE : in integer range 0 to 1023 
           . . .); 
end COUNTER_S; 
architecture RTL of COUNTER_S is 
begin 
  process(CLK) 
  begin 
      if CLK'event and CLK='1' then 
        if RESET ='1' the n 
           COUNT <= 0; 
        elsif ENABLE='1' then 
           if COUNT < MAX_VALUE then 
             COUNT <= COUNT+1; 
           else 
             COUNT <= 0 ; 
          end if; 
        end if; 
      end if; 
  end process; 
end RTL; 
• İşlemde (operation) faklı modlar 
kurulur(set) (cf. MAX_VALUE) 
• Port haritasında parametrik sinyal 
yoktur 
 Sabitler ve jenerikler,sentezlemeden önce bir modülü konfigüre ederken çok karlıdır. Eğer 
parametreleri işlem esnasında değişmek gerekiyorsa tek çözüm modüldeki bu sinyalleri bu 
parametrelerle beslemektir.  
Örnekte sayıcının değer aralığına 1 ile 1023 arasında bir değer atanabilir. Bu nedenle, fonksiyonalitede 
esnekliği sağlayacak donanımın ek yükü üretilmiştir.  MAX_VALUE sinyal değeri aktif saat kenarı 
gerçekleştiğinde stabil olmalıdır. Eğer bu garanti edilemezse, bu bellek elemanları yaratılmak zorunda 
kalarak, MAX_VALUE ‘nun mevcut değerini tutar ve  berlili bir zamanda günvcellenir, sadece. 

5. Proje Yönetimi(Project Management) 
  Tasarım Bileşenleri (Design Components ) 
  Kütüphaneler (Libraries)  
  Dosya Yapısı (File Organisation) 
5.1 Tasarım Bileşenleri 
Beş temel tasarım birimi, iki gruba bölünmüştür: 
     Birin birimler(primary units)                 İkincil birimler(secondary units) 
• Herbir tasarım birimi analiz edilmeli ve kütüphaneye kaydedilmelidir 
• Paketler başlık(bildirim) ve ana bölüm olarak bölünmelidir 
 VHDL tasarımının tüm bölümleri simülasyon yada sentezden önce muhakkak analiz 
edilmeli/derlenmelidir. Toplamda, şimdiye kadar söylenen beş farklı tasarım birimi mevcutter: 
varlık/mimari(entity/architecture), paket/paket gövdesi( package/package body) ve 
konfigürasyon(configuration). Bir dosya, derleyici tarafından kabul edilmiş en az bir tasarım 
birimini içermek zorundadır. Paket gödesinin bildirimsel bölümde parçalara ayrılamsı katı bir 
şekilde gerekli değildir. 

5.1.1 Kütüphaneler(Libraries) 
• Derlenmiş tasarım birimlerinin kapsayıcısıdır 
o Varlıklar(entities), mimariler(architectures),  
o Paketler(packages), paket gövdesi(package 
bodies),  
o Konfigürasyonlar(configurations) 
• Dosya sistemindeki bir klasörle eşleştirilmiştir 
o Platform bağımsızdır 
o Kurulum dosyası gereklidir 
• Bir tasarım projesinde farklı kütüphaneler olabilir 
Kurulum dosyası(Setup file): 
PROJECT1:/home/user_bill/VHDL_Stuff/project1_lib 
Komut Satırı(Commandline): 
c o m p i l e -library PROJECT1 p_frame_types.vhd  
Derlemeden sonra, tasarım birimleri  kütüphane("library") adı verilen yere kaydedilir. Kütüphane 
mekanizmasının amacı platform bağımsız olmasıdır, herbir VHDL aracı, mantıksal kütüphane ismi ile 
bir fiziksel klasör eşleşmeli. Eğer hedef kütüphane bir VHDL dosyası derlenirken belirtilmediyse, 
tasarım birimi varsayılan kütüphane ' work ' ‘e derlenmiştir. Bu genellikle yazılımın başlangıç 
klasörüyle eşleştirişmiştir. Varsayılan ayarların üzerine yazılabilir-değiştirilebilir,ör. kurulum dosyası. 
Özel kurulum dosyaları(setup file) yada seçenek ayarları(option settings) alternatifleri belirtmek için 
gereklidir.  
Örnekte, mantıksal kütüphanenin ismi PROJECT1, simülatör ve sentez araçları için kurulum 
dosyalarının olduğu fiziksel klasörle "/home/user_bill/VHDL_Stuff/project1_lib" eşleştirilmiştir.  Bu 
kütüphane VHDL dosyaları derlenirken hedef (target) olarak isimlendirilmelidir, bu nedenle komut 
satırındaki komut şöyle görünmektedir "compile -library project1 p_frame_types.vhd". 
P_FRAME_TYPES  paketindeki bilgileri kullanabilmek için, PROJECT1 kütüphanesi “LIBRARY” 
ifadesiyle görülebilir hale getirilmelidir. Bundan sonra, kütüphanenin bireysel elemanları USE 
ifadesiyle kullanılabilir haldedir. 

5.1.2 LIBRARY (Kütüphane) İfadesi 
library EXAMPLE; 
use 
EXAMPLE.PKG.all; 
entity A is 
. . . 
end A; 
library EXAMPLE;  
use 
EXAMPLE.PKG.all; 
entity X is 
. . . 
end X; 
architecture BEH of A 
is 
. . . 
end BEH; 
• İ ş e y i ş i (Occurrence) 
o Herhangi tasarım biriminin önünde bulunur  
(entity, architecture, package, ...) 
o Bir sonraki birim için geçerlidir sadece 
• İkincilk birimler(Secondary units) kütüphane bildirimlerini 
kalıt alırlar ("inherit") 
• Herhangi bir VHDL tasarım birimi/objesi bildirilmez 
• Varolan kütüphaneleri referans gösterebilir 
• Daha kolay tasarım yönetimi ve hazırlığı  
• Görülebilirlik problemlerine neden olabilir 
architecture BEH of X 
is  
. . . 
end BEH; 
WORK ve  STD kütüphaneleri varsayılan olarak görülebilirdir ve bildirilmelerine gerek yoktur. STD 
kütüphanesi STANDARD paketi içerir, bu varsayılan olarak görülebilir, ve TEXTIO paketi de dosya 
I/O işlemleri için gereklidir.  
Kütüphaneler obje kodunun farklı tasarım projelerinde avantajlı şekilde bölünmesi için kullanılabilir. 
Fakat, görülebilirlik problemi gerçekleşebilir.  Eğer derleyici tarafından ayırt edilemiyen objelerse, 
hiçbiri seçilebiir objeler olarak olarak kullılamaz ve bir hata mesajı üretilir.  Belkide en sık karşılaşılan 
örnek özdeş isimlerde ve parametre listelerine sahip prosedürlerin bölünmüş paketlerde tanımlanmış 
olmasıdır.  Lütfen dikkat edin ki eğer aynı kütüphanede bulunan her iki pakette de tanımlanmı geçersiz 
yeniden bildirim varsa bu rapor edilecektir. 

5.1.3 USE(Kullanma) İfadesi 
library EXAMPLE; 
library OTHER_1; 
library OTHER_2; 
use EXAMPLE.PKG_1.CONST_A, 
       EXAMPLE.PKG_1.CONST_B; 
use EXAMPLE.PKG_2.all; 
use EXAMPLE.ENTITY_1; 
architecture BEH of ENTITY_1 is 
   use OTHER_1.all; 
   signal A : integer; 
begin 
   A <= 
OTHER_2.PKG.CONST_A; 
end BEH; 
• İşeyişi(occurrence) 
o Herhangi bir tasarım biriminin önünde 
bulunur 
o Bir sonraki birim için geçerlidir sadece 
o Eğer bir objenin tüm elemanları 
görülebilir yapılabiliryorsa, bildirimsel 
bölümde görülebilir 
• İkincil birimler, use ifadelerini 
kalıtırlar"inherit"  
• Kütüphane bilinmek zorundadır 
• Bireysel elemanlara yardım kabul edilir 
o Tasarım birimleri (ör. entities) 
o Paketlerden gelen objeler (ör. constants) 
o 'all' ile tüm objelere erişim 
• Eğer ‘use’ çıkarılmışsa, tam mantıksal yol adı 
("logical pathname") gereklidir  
Bir kütüphane ifadesi tek başına tasarım birimlerine ve objelere erişme iznini vermez. Ek olarak, use 
ifadesi gereklidir. Use ifadesinin birçok kuralı kütüphaneninkiyle aynıdır ve genelde aynı tip ifadeler 
görülür.  
Kütüphane (‘library’) fadesi herzaman gereklidir, objelere seçilmiş isimleriyle "selected name" ile 
ulaşılabilir bir use cümlesi yerine. Daha sonra, kütüphanenin isminin olduğu mantıksal yolun tamamı, 
tasarım birimi ve objeler belirtilmiş olmalıdır. 
5.2 Ad Uzayları(Name Spaces) 
• Aynı isimdeki çoklu objelere izin verilir: 
o Seçilmiş isimler olmadan: lokal(yerel) ismi geçersiz kılar 
o Tam seçilmiş isimlerle atama: ENT.RTL.C <= 12; 
• Bir paketteki bildirimler, bu paketi kullanan tüm tasarım birimlerinde görülebilir 
• Varlık bildirim bölümündeki bildirimler, bu varlığın tüm mimarilerinde görülebilir 
• Bir mimarideki bildirimler, bu mimarideki tüm işlemler için görülebilir 
• Bir işlemdeki bildirimler, sadece bu işlemde görülebilirler 
• Bir döngü ifadesinde veya altprogramdaki bildirimler sadece bu objelerin içinde 
görülebilir. 
package PKG is 
   constant C : integer := 1; 
end PKG; 
entity ENT is 
   constant C : integer := 4; 
end ENT; 
architecture RTL of ENT is 
   signal C : integer := 8; 
begin 
    -- only signal C is visible 
   C <= 24; 
   process 
      variable C : integer := 9; 
   begin 
      -- only variable C is visible 
     C := 42; 
     for C in 0 to 5 loop 
         -- only loop parameter C is visible 
         ENT.RTL.C <= C; -- selected name 
     end loop; 
      ENT.RTL.C <= work.PKG.C;  
   end process; 
end RTL; 

5.3 Dosya Yapısı (File Organisation) 
• Birincil ve ikincil tasarım birimleri birçok dosyaya bölünebilir 
• Avantajları 
o Birçok Paket 
o Modülarizasyon ve yeniden kullanma 
bakış açısı  
(IEEE, şifket,proje paketleri) 
o Sadece VHDL simülasyonundan 
sentezlenebilir bölme 
o Paket / Paket Gövdesi 
ayrımı 
o Eğer gövde(gerçekleme) değişmediyse, 
tasarım hiyerarşisinin yeniden 
derlenmesine gerek yoktur 
o Varlık / Mimari 
ayrımı  
o Sistem tasarımı (en üst seviye,yapısal)  
gerçeklemeden bağımsızdır 
o Birçok modelleme alternatifi 
(ör.davranışsal,RTL) mümkündür 
o Birçok en üst seviye 
konfigürasyon  
o Simülasyonun başarıya ulaşması için 
tasarımı ayarlamak 
o Alternatif mimarilerle karşılaştırma 
VHDL birçok olası  hiyerarşini gerçeklemesi önerir.  Dil, temel hiyerarşiyi, tasarıma varlık/mimari 
çifti ve onların örneklemi olan bileşenlerle bildirir. Bu arayüz ve gerçeklemenin katı ayrımına neden 
olur.  Paketlerin yardımıyla büyük tasarımlar birçok dosyalar yardımıyla  mümkün olmaktadır. 
Simülasyon esnasındaki farklı gerçeklemere atlama konfigürasyon mekanizmasıyla yapılmaktadır. 

5.3.1 Paketler(Packages) 
• Paketler, birçok tasarım birimi tarafından paylaşılabilir VHDL objelerini içerir 
o (alt-)tip bildirimleri 
o sabitler 
o altprogramlar 
o bileşenler 
• Paket içeriği use sözcüğü ile kullanılabilir hale getirilmelidir 
• Gerçekleme ayrıntıları paket gövdesinde gizlenir 
• Paket gövdesi 
o Sadece paket tarafından görülebilir 
o Herzaman bir pakete bağlanmıştır 
o Bir paket için olan tüm bildirim/tanımlamaları içerir 
o Daha önce bildirilmiş sabitleri ve altprogramların tanımını bulundururlar 
5.3.2 Paket Sözdizimi(Package Syntax)  
Paket bildirimi: 
Paket gövdesi bildirimi: 
 package IDENTIFIER is 
     -- Declaration of (aşağıdakileri bildirir) 
        -- tip ve alttipleri (types and subtypes) 
        -- altprogramları (subprograms) 
        -- sabitleri (constants),sinyalleri (signals) ve paylaşımlı 
değişkenleri (shared variables) 
        -- dosyaları (files) 
        -- takma adları(aliases) 
        -- bileşenleri (components) 
 end [ package ] [ IDENTIFIER ] ; 
package body IDENTIFIER is 
     -- Definition of previously declared( daha 
önce bildirilmişleri tanımlar) 
        -- sabitler (constants) 
        -- altprogramlar (subprograms) 
     -- Aşağıdaki eklerin  bildirimi /     
 tanımlanması  
        -- tipler ve alttipler  
        -- altprogramlar 
        -- sabitleri (constants),sinyalleri 
 (signals) ve paylaşımlı 
 değişkenleri (shared variables) 
        -- dosyalar 
        -- takma adlar (aliases) 
        --  bileşenler (components) 
end [ package body ] [ IDENTIFIER ] ; 
Sadece paketin içeriği görülebilirdir, paket gövdesi değil 
Altprogram tanımlamaları paketin içine yerleştirilmez 
'package' / 'package body' anahtar sözcükleri 'end' anahtar sözcüğünden sonra tekrar edilebilir 

5.3.3 Paket Örneği 
package PKG is  
       type T1 is ... 
       type T2 is ... 
       constant C : integer; 
       procedure P1 (...); 
end PKG; 
library STD;                    -- VHDL default 
library WORK;                -- VHDL default 
use STD.standard.all; -- VHDL default 
use work.PKG.all; 
entity EXAMPLE is 
end EXAMPLE; 
architecture BEH of E X A M P L E  is  
      signal S1 : T1; 
      signal S2 : T2; 
      signal S3 : T3; -- error: T3 not declared 
begin 
      P1 (...); 
      P2 (...);            -- error: P2 not declared   
end BEH; 
package body PKG is 
      type T3 is ... 
      C := 17; 
      procedure P1 (...) is 
      . . . 
      end P1; 
      procedure P2 (...) is 
      . . . 
      end P2; 
end PKG; 
• Paket gövdesinde bildirilmiş sinyal ve prosedürlere ulaşılamaz 
• Özel veri tipleri sadece referans gösterilmiş paketlerde tanımlanabilir 
• Ertelenmiş(Deferred) sabitler: gerçek veri ataması paket gövdesindedir 
Bu örnekte T3 tipi ve P2 prosedürü paket gövdesinde bildirilmiştir. Bu derleme sırasında hataya yol 
açmaktadır çünkü bu iki eleman mimari tarafından görülemez. 

5.3.4 Paketlerin Kullanımı 
• Tanımlamar: tipler,alttipler,sabitler, bileşenler ve altprogramların tanımlamaları yapılır 
• Ertelenmiş sabitler(Deferred constants): paket başlığında bildirilmişve paket 
gövdesinde atama yapılmı sabitlerdir 
package P is  
       constant C: integer; 
end P; 
package net is  
      subtype p_bit is std_ulogic; 
      subtype p_bit_vector is std_ulogic_vector; 
      subtype p_net_data is p_bit_vector (7 downto 0); 
      type p_net_frame is array (1 downto 0) of p_net_data; 
       constant low: integer := 0; 
       constant high: integer :=1; 
       constant period: time := 10 ns;  
package body P is  
       constant C : integer:=200; 
end P; 
• Düşük maliyetli kendiliğinden tanımlanmış paketleri desteklemeyen araçlar vardır. 
Tüm tasarımı yeniden derlemeden C sabitinin değerini birçok kez değiştirmek mümkündür. Sadece 
paket gövdesi yeniden derlenmiş olmalıdır.  
Bir paket gövdesi sadece altprogram veya ertelenmiş sabitler bildirildiyse gereklidir.  
Örnek: 
package SimulationTimes is 
        constant tCLK        :        time := 30 ns; 
        constant tSetup     :        time := 10 ns; 
        constant tHold       :        time := 14 ns; 
        constant tCLK77  :        time := 77 ns; 
        constant tWrite      :        time := 8 ns; 
        constant tRead      :        time := 8 ns; 
        constant tData       :        time := 21 ns; 
end SimulationTimes ; 

5.3.5 Paket İçeriğinin Görülebilirliği 
USE cümlesinin son eki içerisindeki "all" anahtar sözcüğü ile  paket başlığında bildirilmiş tüm objeleri 
görülebilir yapmak mümkündür. Eğer sadece paket başlığındaki özel objeleri görülebilir yapmak 
istiyorsanız,  basit adlarını son ek olarak kullanmak zorundasınız:  
Library ps; 
use ps.p.C;