FPGA ve Vivado Kullanarak Simulasyon

FPGA ve Vivado Kullanarak Simulasyon

Bu yazıda anlatılan uygulamada kullanılan FPGA  kartı Xilinx firmasının BASYS-3 modelidir. Özellikleri;

  • Artix-7 FPGA XC7A35T-1CPG236C FPGA işlemcisi
  • 5200 adet dilimde 33,280 lojik hücre (her dilim 4 adet 6 girişli LUT ve 8 adet flip-flop içerir)
  • 1,800 Kbits hızlı blok RAM
  • Her biri phase-locked loop’a sahip 5 adet saat yönetim başlığı
  • 90 DSP dilimi
  • 450 MHz yi aşan dahili saat hızı
  • Dahili örneksel- sayısal çevirici(XADC)
Digikey web sitesinde 150$ fiyata sahip olmakla birlikte dünya üzerindeki distribütörlerden de temin edilebilmektedir. 

Vivado

Burada Vivavo uygulamasının hangi versiyonunun kullanılacağı önem arz etmektedir. Tecrübeme dayanarak Windows 10 platformunda daha önce denediğim Vivado 2018.3 uygulamasının Windows 10 platformuyla olan bir uyumsuzluğundan ötürü FPGA test bench kodunu çalıştırmakta problem yaşanmaktadır. Dolayısıyla biz internette simulasyon uygulamalarının sıklıkla kullanıldığı Vivado 2016.2 platformunu kullanacağız.






Yukarıdaki görsellerde Xilinx sitesinden bu programın nasıl indirileceği konusunda yol gösterilmiştir. Vivado 2016.2 programını kurduktan sonra ilk projemizi başlatıyoruz.

Öncelikle uygulamayı açtığımızda karşımızda çıkan ekrandan Create New Project ibaresine tıklıyoruz ve karşımızda çıkan pencerede Next butonuna tıklıyoruz. Daha sonra sırasıyla Proje ismi girip Proje Directory seçtikten sonra Project Type ekranında RTL Project sekmesine ve hemen altındaki Do not specify sources at this time kutucuğuna tıklıyoruz.

Next butonuna basıyoruz.
Projemize bir isim verip, kaydet etmek istediğimiz lokasyonu seçiyoruz.

İlgili kutucuklara tıklıyoruz ve Next butonuna basıyoruz.

Daha sonra karşımıza Default Part penceresi gelecektir. Buradan FPGA kartımız üzerindeki FPGA işlemcisinin modelini seçip Next butonuna basıyoruz. 

Önemli Not: BASYS-3 FPGA kartımızın ürün kutusu üzerinde arka kısımda yazan işlemci koduyla birebir olmasa da burada seçtiğimiz XC7A35TICPG236-1L parça numarası bizim uygulamalarımızda kullanım için uygundur.




Evet bu adımdan sonra da tahmin edeceğiniz üzere Yeni Proje'mizi oluşturmuş bulunmaktayız. Tabiki başın sonundayız henüz. Ancak başlamak bitirmenin yarısı kuralını da dikkate alırsak aslında epey yol almış bulunmaktayız. FPGA ile uğraşırken daha önce aşina olunmayan bir program arayüzüyle karşı karşıya kaldığımızı düşünebiliriz. Bu bizi korkutmasın. Çünkü araya zaman girerse ve nasıl proje açtığımızı hatırlamak isterseniz bu blog'u boşuna yazmadık tabiki. Şimdi projemize kaynak dosyaları ekleyip simulasyon veya FPGA kartına implemente etme yolumuza devam edelim.
Yukarıdaki hareketleri başarıyla gerçekleştirdiğimizi düşünüyorsa karşımıza sonuç olarak artık FPGA geliştirme ortamı aşağıdaki gibi gelmiş olmalıdır.



Bu ekrandan kısaca bahsetmek gerekirse; Ekranın sol tarafında sabitlenmiş olan Flow Navigator penceresi bulunmaktadır. Bir FPGA projesinin kodunun yazılıp adım adım gerçekleştirilme işleminin buradan yürütüleceğini söyleyebiliriz. Bu yüzden Navigator kelimesi gayet uygun olmuş. 👌

Hemen bu pencerenin sağında bulunan Project Manager kısmında ise kaynak dosyalarını görebiliriz. Kaynak dosyaları hakkında birazdan bilgi sahibi olacağız. 

Yukarıdaki görselde görülen Project Summary penceresi ise kodlarımızı görüntülemek, simulasyon çıktılarını ekrana yansıtmak vs gibi işlemler için kullanacağımız kısımdır.

Ekranın alt kısmında yer alan (şuanda Design Runs penceresi görünüyor) pencerede ise TCL konsol sekmesi sıklıkla kullanılan bir penceredir. Bu pencerede projeyle ilgili derleme çıktıları, uyarılar (warning) ve hata (error) mesajlarını göreceğiz. Hata ve uyarı mesajlarını görmek FPGA kodlarının düzgün bir şekilde yazılıp derlenmesi ve karta aktarılması konusunda geliştirici için kolaylık teşkil eder. Konuyla ilgili detaylı bilgiye 

Şimdilik bu kadar tanımlama yeterli diye düşünüyorum. Artık harekete geçebiliriz. Burada örnek bir uygulama olarak PWM modülatörü uygulamasını gerçekleyeceğiz. Ayrıca uygulamalarımızı Verilog HDL programlama diliyle yapacağımızı da belirtmek istiyorum. Neden VHDL kullanmadığım konusuna gelirsek de bu işe Verilog ile başladığım ve VHDL'e göre daha önce kullandığım C programlama diline daha yakın olmasından ötürü olduğunu söyleyebilirim. Verilog'un tasarımcıları da zaten bu dili ortaya çıkarırken C programlama diline yakın olması amacıyla bu dili yazmışlardır ki mühendislerin aşina olduğu C diline yakın olmasının avantajının kullanılmasını istemişlerdir. Ancak bir donanım tanımlama dili (HDL - Hardware Description Language) olan Verilog'un elbette C'den ayrılan birçok yönü vardır. İf-While gibi deyimlerin benzer olmasının yanı sıra Verilog'da bir blok kodu tanımlanırken kıvrık süslü parantezler koymak yerine "begin" ve "end" komutları kullanılır. Ayrıca verilog diğer geleneksel programlama dilleri gibi kodu sırayla ardışık bir biçimde işletmez. Verilog kodlarında sıklıkla kullanılan "module" yapıları vardır. Bunları bir nevi C'deki fonksiyon yapılarına benzetebiliriz. Verilog bu modüller arasında bir hiyerarşi kurar. Bir veya birden fazla "wire", "register" gibi modül ifadeleri arasındaki ilişki modülün eş zamanlı ve/veya ardışık çalışan ifadeler modülün fonksiyonunu belirler. 
Özetle bir donanım tanımlama dili olarak Verilog şuan bizim için uygun görünmektedir ancak biz yine de VHDL' e öcü gözüyle bakmayıp bazı uygulamalarda kullanabiliriz. 

Burada Verilog dili kullanacağımız PWM modülatör uygulamamızda 3 girişli 1 çıkışlı sistemimiz olacağını belirtelim. Bu sistemin giriş sinyalleri:

  • Clock
  • Duty Cycle Azalt
  • Duty Cycle Artır
şeklinde olacaktır. Burada Clock sinyalimiz bildiğimiz (ya da bilmemiz gerektiği üzere) üzere modülasyon işleminde taşıyıcı sinyal görevini üstlenecektir. Üretmek istediğimiz PWM sinyalinin frekansını 10MHz olarak belirliyoruz bu uygulamada. Clock sinyalimiz ise 100MHz frekansında olacaktır. Kodun genel algoritmasından bahsetmek gerekirse de, 

  • Flip Flop'larımız için ortak clock kullanarak Multi Clock problemlerinden kurtulmamız gerekiyor. Neden bunu yapmamız gerektiğini ......... başlıklı yazıda anlattım. Bunu yaparken bir slow_clock_enable sinyali üreteceğiz. Bu sinyali Flip Flop'ları senkron bir şekilde süren Clock hattının geçtiği Clock Divider elemanını sürmek için kullacağız. 
  • Debouncing sağlayan Flip Flop'ları yaratacağız. Bu aşamada Flip Flop için kullanılan geçici sinyalleri "wire" komutu ile tanımlamış olacağız.
  • 10MHz PWM sinyalini üretip 2 adet buton ile Duty Cycle değerini kontrol edeceğiz.
Kaynak kodu ve Test Bench kodu bu post'un ekinde verilmiştir. Design Sources sekmesinden kaynak kodunu ve Test Bench kodunu projeye ekleyip simulasyon için gerekli aşamalara geçebiliriz. Test bench kodu olmadan simulasyon işlemi yürütülemez. Çünkü verilog veya VHDL (RTL kodlama) yazılım dilleriyle yazılan kaynak kodları simulasyon ortamı için uygun değildir. Bu kodlar ancak Test Bench kodumuzun kullanacağı sistemi yaratmak/tanımlamak için kullanılmaktadır.

Test Bench Kodunun Projeye Eklenmesi

Flow Navigator penceresinden Add Sources diyerek aşağıdaki görsellerde anlatıldığı gibi ilerliyoruz ve en son Finish diyerek simulasyon kaynağı ekleme işlemini tamamlıyoruz.





Yukarıdaki işlemleri yaptıktan sonra imulasyon için yeni bir test bench kodu ortamı açmış oluyoruz. Bu uygulamada kullanacağımız test bench kodunu ekteki linkten indirdikten sonra burada yaratmış olduğumuz yeni dosyaya kopyalayıp yapıştırabiliriz. Dilersek de yukarıdaki Create File yerine Add File deyip direkt olarak hazır test bench kodu dosyasını projeye ekleyebiliriz. 

Hazırsak Test Bench kodumuzu da projeye ekledikten sonra Flow Navigator penceresinden Run Simulation sekmesine tıklayabiliriz.

Önemli Not: Run Simulation dedikten sonra aşağıdaki hatayı almamak için, proje lokasyonunuz fazla uzun olmamalı. 

[USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information.

Proje dizinini ne kadar kısa tutarsanız bu hatayı almama olasılığınız artacaktır. Bu önemli bilgilendirmeyi de yaptıktan sonra test bench kodumuzun gerçeklenmiş halini simulasyon ekranında görebiliyor olmamız lazım.



Simulasyon ekranında sol tarafta giriş sinyali değişkenlerimizin değerlerinin test bench kodundaki senaryoya göre değişimleri sonucunda PWM_OUT çıktısının duty cycle değerinin artıp, azaldığını görebiliyoruz. Simulasyon haricinde verilog kodumuzu FPGA kartımızda da deneyebiliriz. 

Kaynak kodu:

https://drive.google.com/open?id=1oxfP1gvxGOEC0gz3mHhGCrxf7Mj5mdBt

Test Bench kodu:











Yorumlar

Bu blogdaki popüler yayınlar

KV260 Kria Starter Kit Series: 3 - Petalinux Install and Boot

KV260 Kria Starter Kit Series: 1 - Power and Boot Up

KV260 Kria Starter Kit Series: 2 - Smartcam Application (Ubuntu)