FPGA Sine Wave DAC: 500 Girişli LUT + SPI Master + Digilent WaveForms
Artix-7 FPGA üzerinde 500 girişli sinüs LUT'undan SPI protokolüyle harici bir DAC'a sürekli veri gönderen ve Vivado VIO ile frekansı gerçek zamanlı ayarlayabilen sinüs dalga üreteci. Çıkış Digilent Analog Discovery 2 ile doğrulandı.
Görseller
Proje Detayları
Proje Hakkında
TUSAŞ Uzay Sistemleri Mühendislik Merkezi Donanım Birimi'ndeki stajın final projesi. Yaklaşık üç aylık bir süreçte geliştirildi. FPGA üzerinde matematiksel olarak doğru bir sinüs dalgası üretmek, bunu analog çıkışa dönüştürmek ve Digilent Analog Discovery 2 ile ölçüm alarak doğrulamak temel hedefti. SPI haberleşme protokolü, DAC entegrasyonu ve VIO ile canlı frekans kontrolü tek bir tasarımda bir araya getirildi.
Sinüs LUT — Örnekleme Yaklaşımı
FPGA tamamen dijital bir devre olduğundan sinüs gibi sürekli bir fonksiyonu doğrudan hesaplayamaz. Çözüm: sinüs dalgasının bir yarım periyodunu 500 ayrık değer olarak önceden hesaplayıp **LUT (Lookup Table)** içinde sabitlemek.
LUT'taki değerler 16-bit işaretsiz tam sayılardır (0–65535 aralığı). Yarım periyot için hesaplanan 500 değer, `state` sinyaliyle çevrilir:
**State '0'** → LUT(0..499) doğrudan gönderilir (sinüsün pozitif yarısı)
**State '1'** → `65535 − LUT(i)` gönderilir (negatif yarı, ayna görüntüsü)
500 adım tamamlanınca `state` çevrilir; böylece tam bir periyot 1000 adımda oluşur. Her adım arasındaki bekleme süresi `period` parametresiyle belirlenir — **frekans bu şekilde ayarlanır.**
VIO ile Canlı Frekans Kontrolü
`period` parametresi Vivado Hardware Manager üzerinden VIO IP core aracılığıyla gerçek zamanlı değiştirilebilir. Sentez ya da yeniden programlama gerekmez: bir değer girilir, dalga frekansı anında değişir. Frekans formülü:
```
f = clk_freq / (period + 1) / 1000
```
100 MHz sistemde `period = 100` girildiğinde yaklaşık **1 kHz** sinüs üretilir.
SPI Master ve DAC Entegrasyonu
Her LUT adımında güncel 16-bit sinüs değeri SPI üzerinden DAC'a iletilir. SPI paketi 24 bittir:
```
[ "01" — 2 bit komut ] [ sine_data(15:0) — 16 bit veri ] [ "000000" — 6 bit dolgu ]
```
SPI master konfigürasyonu: `CPOL=1`, `CPHA=0`, `clk_div=5` → 20 MHz SPI saati. Durum makinesi dört aşamayı yönetir:
**start** — 100 µs güç açılış gecikmesi (DAC'ın hazır olması için)
**pause** — işlemler arası 100 ns bekleme
**ready** — yeni LUT değerini latching
**send_data** — SPI transferi; `spi_busy` takibi ile tam tamamlanma beklenir
Doğrulama — Digilent Analog Discovery 2
Çıkış, Digilent'in Analog Discovery 2 cihazıyla Waveforms yazılımı üzerinden ölçüldü. Osiloskopta temiz, sürekli bir sinüs dalgası gözlemlendi. Ölçüm: frekans ~20 Hz (seçilen `period` değerine göre), genlik DAC referans voltajı sınırında.
Mimari (3 Bileşen)
**`sine_lut`** — 500 girişli sabit LUT, state-flip ile tam periyot üretimi, `period` ile frekans kontrolü
**`spi_master`** — Generic `d_width=24`, CPOL/CPHA konfigürasyonlu tam SPI master; `busy` sinyaliyle işlem takibi
**`top`** — Üç bileşeni koordine eder; LUT çıkışını SPI paket formatına sarar, VIO'dan `period` alır, DAC güç açılış zamanlamasını yönetir