FPGA PWM: Vivado VIO ile Gerçek Zamanlı Duty Cycle Kontrolü
Artix-7 FPGA kartında VHDL ile tasarlanan, Xilinx VIO (Virtual I/O) IP core üzerinden fiziksel pin kullanmadan gerçek zamanlı duty cycle ve periyot kontrolü sağlayan PWM üreteci. Testbench ile doğrulanmış, simulation'dan hardware'e eksiksiz akış.
Görseller
Proje Detayları
Proje Hakkında
TUSAŞ Uzay Sistemleri Mühendislik Merkezi Donanım Birimi'ndeki staj sürecinde geliştirilen bu proje, dijital donanım tasarımında temel bir bloğu — **PWM (Pulse Width Modulation)** üretecini — sıfırdan VHDL ile implemente eder ve Xilinx'in **VIO (Virtual I/O)** IP core'uyla entegre ederek gerçek zamanlı kontrol sağlar.
PWM Çalışma Prensibi
PWM, bir sinyalin ON süresi ile periyodunun oranını kontrol ederek analog bir etki yaratır. Motor hız kontrolünden LED parlaklık ayarına kadar gömülü sistemlerde kritik bir temel taşıdır.
Bu implementasyonda PWM üreteci iki parametre alır:
**`high_time`** — sinyalin HIGH kalacağı saat çevrimi sayısı
**`period`** — toplam periyot (2 × high_time)
Sayaç `high_time`'a ulaşana kadar çıkış HIGH kalır, sonra LOW'a geçer, periyot sonunda sayaç sıfırlanır. 50 MHz sistem saatiyle milisaniye düzeyinde hassas zamanlama elde edilir.
VIO — Fiziksel Pin Olmadan Gerçek Zamanlı Kontrol
Projenin teknik özgünlüğü VIO entegrasyonundadır. Geleneksel yaklaşımda PWM parametreleri fiziksel switch veya butonlarla ayarlanır — her değişiklik için yeniden sentez şarttır. VIO bunu tamamen ortadan kaldırır.
**VIO (Virtual I/O)**, Vivado'nun Hardware Manager arayüzü üzerinden FPGA içindeki sinyallere gerçek zamanlı read/write erişimi sağlayan bir Xilinx IP core'udur. Bir JTAG kanalı üzerinden çalışır; bitstream değişmeden, kart üzerinde hiçbir fiziksel bileşene dokunmadan parametreler anında güncellenebilir.
Bağlantı şeması:
```
VIO probe_out0 (32-bit) → high_time (integer) → PWM duty cycle
VIO probe_out1 (32-bit) → period (integer) → PWM frekansı
```
Vivado Hardware Manager'ı açıp bir slider hareket ettirmek, FPGA üzerindeki PWM çıkışını anında değiştirir.
Testbench ile Doğrulama
Proje, davranışsal simülasyon aşamasından geçirildi. Testbench'te:
**50% duty cycle** — `high_time = 5_000_000`, `period = 10_000_000`
Reset sinyal testi — RST aktif/pasif geçişlerinin doğru tepkiyi tetiklediği doğrulandı
Rising-edge tetiklemeli sayaç davranışı simülasyonda gözlemlendi
Davranış simülasyonda doğrulandıktan sonra sentez ve implementation aşamalarına geçildi, bitstream kartа yüklendi ve oscilloscop ile doğrulandı.
Mimari (3 Bileşen)
**`pwm`** — Çekirdek üreteci. `clk`, `rst`, `high_time`, `period` girdileriyle saf sayaç mantığı. Saat bağımsız reset, rising-edge tetiklemeli çalışma.
**`vio_0`** — Xilinx VIO IP core. `probe_out0` ve `probe_out1` ile iki bağımsız 32-bit çıkış sinyali.
**`top`** — Üst katman. VIO çıkışlarını `to_integer(unsigned(...))` ile integer'a çevirir, PWM bileşenine iletir. Sentez ve yönlendirme constraint'leri burada uygulanır.