FPGA Display: Double Dabble ile 4 Basamaklı 7-Segment Sürücü
Basys2 FPGA kartında 8 switch'ten okunan binary değeri Double Dabble algoritmasıyla BCD'ye dönüştürüp 4 haneli 7-segment ekranda gösteren; 4 buton ile 0–3825 aralığında çarpım yapabilen VHDL tasarımı.
Görseller
Proje Detayları
Proje Hakkında
TUSAŞ Uzay Sistemleri Mühendislik Merkezi Donanım Birimi'ndeki staj sürecinde geliştirilen bu proje, bir FPGA kartında binary sayıları insan okunabilir decimal formatta göstermenin doğru yolunu bulmak üzerine kurulu.
Basys2 kartındaki 8 switch, 0–255 arasında bir binary değer girer. Hedef: bu değeri 4 haneli 7-segment ekranda hatasız göstermek. Ve bunu hardcoded lookup tablosu olmadan, saf mantıksal bir algoritmayla yapmak.
Sorun: Neden 2 Basamak Yetmez?
Çok basamaklı 7-segment ekranlarda rakamlar aslında aynı anda yanmaz. Tek bir segment sürücüsü tüm haneleri paylaşır; haneler çok hızlı sırayla aktive edilip göz yanıltılır (multiplexing). Bu yöntemle 2 hane rahatlıkla yönetilir: birincisi açık, ikincisi kapalı, sonra tersine — 99'a kadar sorun yok.
Ama 3 haneye geçildiğinde ortaya çıkan problem farklı: binary sayıyı doğrudan segmentlere gönderemezsin. 8-bit bir değer olan `10110011` (179) ekranda `1`, `7`, `9` olarak ayrı hanelere dağıtılmak zorunda. Her hane kendi BCD (Binary Coded Decimal) değerini bağımsız olarak bilmeli.
Bunu yapmak için **Double Dabble** algoritması kullanıldı.
Çözüm: Double Dabble Algoritması
Double Dabble, binary bir sayıyı BCD'ye dönüştüren donanım dostu bir yöntem. FPGA'da çalıştırmak için ideal: kombinasyonel lojik, iteratif ve saat bağımsız.
**Algoritma adımları:**
1. Binary sayıyı sola hizalanmış boş bir shift register'a yerleştir.
2. Her BCD hanesi için 4 bitlik alan ayır (birler, onlar, yüzler, binler).
3. Her shift öncesi: herhangi bir BCD alanı 4'ten büyükse, o alana 3 ekle.
4. 1 bit sola kaydır.
5. Toplam bit sayısı kadar tekrarla.
Sonunda her 4 bitlik blok, ondalık basamağı binary olarak tutmuş olur. Örnek:
```
Giriş: 11111111 (255)
→ Double Dabble (13 iterasyon)
→ 0010 0101 0101
→ 2 5 5 ✓
```
Bu dönüşüm VHDL'de `display1` entity'si olarak implemente edildi. 16-bit giriş alır (çarpım modu için genişletildi), 20-bit BCD çıkışı üretir — dört hane, her biri 4 bit.
Çarpma Modu
Projenin ikinci aşamasında 4 buton, binary katsayı girişi olarak kullanıma alındı. Buton kombinasyonu 1–15 arası bir çarpan belirler; switch değeriyle çarpılarak sonuç hesaplanır.
**Örnek:** Switch = `11111111` (255), buton = `0100` (4) → `sw1 = 255 × 4 = 1020`
Bu genişleme ile gösterilebilir aralık **0–3825**'e çıktı — 4 hane tam olarak kullanılıyor.
Mimari (3 Bileşen)
**`display1`** — Double Dabble çeviricisi. 16-bit binary → 20-bit BCD. Kombinasyonel, saat bağımsız, 13 iterasyon.
**`seven_segment`** — 4 haneli multipleks sürücü. 50 MHz sistem saatini bölerek ~200 kHz tarama frekansı üretir. Her hane için segment kodlama tablosu.
**`top`** — Üst katman. Switch ve buton girişlerini alır, çarpım hesabını yapar, iki bileşeni bağlar.
Geliştirme Ortamı
**Xilinx ISE Design Suite** kullanıldı (Basys2, Vivado tarafından desteklenmez). Sentez, implementation ve JTAG programlama adımları ISE içinde yapıldı. Projeyi üretmek yaklaşık bir ay sürdü — VHDL ile ilk ciddi donanım projesi.