Vivado Kullanarak Frekans Üreteci Tasarımı - (DDS IP Blok ile)

Daha önce haberleşme etiketli yazılarda Modülasyon'dan ve bazı modülasyon tekniklerinden bahsetmiştik. Haberleşmenin eti kemiği, işlevi, gayreti olan modülasyonu pratikte nasıl kullanıldığını anlamak için özellikle hızlı işlem birimlerinden olan FPGA sistemlerinde göstermeye çalışacağız. FPGA sistemleri sinyal işleme, analog dijital sinyal üretme işlerinde en çok tercih edilen yapılardandır. Donanım tanımlama dilleri sayesinde bu sistemlerin sayısal devrelerini (lojik kapılar, flip floplar, hızlı clock yapıları) yöneterek kare dalga, sinüs-cosinüs, testere dişi vs. haberleşme için kritik matematiksel araçları kullanabiliyoruz. Bu yazıda daha önce Modülasyon yazılarında bahsettiğimiz taşıyıcı sinyalin nasıl üretildiği konusuna gireceğiz ve FPGA 'de üretmeye çalışacağız.

Burada sinüs dalgası üretmek için Vivado programının IP Integrator aracını kullanacağız. Böylece VHDL veya verilog ile yazmak yerine Vivado kütüphanesinde bulunan, amacımıza yönelik daha önce HDL ile tanımlanmış blok şemalarını kullanacağız. FPGA'de DDS - Direct Digital Syntesis metodunu kullanacağız. DDS, bir referans kaynak kullanarak çeşitli frekanslarda analog dalga (örneğin sinüs dalga) üretmek için sayısal teknikler kullanan bir  yöntemdir. Bu yöntemde analog sinyaller, hafızada depolanan dalga fazlarından (faz açıları) sentezlenir. O zaman DDS metodunu kullanarak modülasyonda bilgi sinyalini taşıyacak olan bir taşıyıcı sinyal üretelim ve bu sinyalin formu sinüs formu olsun.

DDS sisteminin iç yapısı-mimarisi aşağıdaki gibidir. Bura üç adet temel komponent bulunmaktadır:

1- Faz akümülatörü

2- Faz - Genlik dönüştürücü

3- Dijital - Analog dönüştürücü (DAC)


Şekil -1 


Bu sistemin çıktısı olan sinyalin frekansı iki parametre ile kontrol edilebilir.

1- Referans clock frekansı yani DDS sistemini beslediğimiz giriş clock sinyali

2- Faz registerına giren programlanabilen "M" parametresi

Sistemin en önemli elemanı   burada faz akümülatörüdür. Her bir clock darbesi faz akümülatör register'ına eklenen ayar kelimesi (tuning word) olarak bilinen bir değerdir. Burada Tuning Word parametresi yukarıda bahsettiğimiz M değeridir. Faz akümülatörünün kesilmiş-kısaltılmış çıkış sinyali sinüs look up tablosunu adresleyecek şekilde davranır ve look up tablosunda oluşan her bir adres sinüs dalgasının 0 dan 360 a kadar her bir faz noktasını temsil eder. Bu yüzden Lookup tabloları tabloları sinüs dalgasının bir tam periyodu için dijital genlik bilgisini içerir ve faz bilgisini (0-360 derece arası) dijital genlik değerlerine eşler (mapping).

Aslında özetle DDS sistemi bir ROM bellek kullanarak Sinüs örneklemelerini bu belleğe yazıyor. Faz akümülatörü ile de değerlerin kaydedildiği bu bellekte adresleme yapıyor. Böylelikle DDS sistemin çıkışında istenen frekansta bir sinüs dalgası görebiliyoruz. Tabiki de burada önemli noktalardan biri de çıkışta görebileceğimiz dalganın çözünürlüğünün FPGA rom bellek boyutu ve FPGA clock kapasitesi ile sınırlı olması.

Faz akümülatörüne sağlanan Tuning Word değeri büyük veya küçük olmak üzere iki şekilde tercih edilebilir:

Büyük faz artışı: Faz akümülatörü hızlı bir şekilde sinüs LUT tablolarını tarar ve böylece yüksek frekans bir sinüs dalgası üretilir.

Küçük faz artışı: Faz akümülatörü daha çok adım atarak yüksek çözünürlükte tarama yapar ve böylece düşük frekans bir dalga görülür çıkışta.


Şekil-2

"Faz kesimi/kısaltması (Phase truncation)" tabirini biraz inceleyelim. Kesilmiş/Kısaltılmış faz , Faz akümülatörü ve Faz-Genlik dönüştürücüsü arasında oluşur. Şekilde 1'de bu blokların arasında oluştuğunu görebiliyoruz.  Faz akümülatörününün çıkışındaki yalnızca bir kısım bitler,  Faz-Genlik dönüştürücünün girişinde görülür. Mesela eğer ki 32 bit akümülatör kullanan bir DDS sistemine sahipsek yalnızca 16 ağırlıklı bit Faz-Genlik dönüştürücüsüne geçebilir. 32 bit dijital verinin yarısı Faz akümülatöründen geçememiştir ve veri kırpılmıştır. Bu davranış güç tüketimini indirgemek ve Faz-Genlik dönüştürücü bloğunun karmaşıklığını azaltmak içindir ancak DDS sisteminin frekans çözünürlüğüne bir etkisi yoktur.  

DDS sisteminin örneklenmiş bir veri sistemi olduğunu bilmekte fayda var. Yani kuantalama gürültüsü, veri örtüşmesi, filtreleme önlemleri ve hataları gibi örnekleme işleminde karşımıza çıkan kavramlar burada da yer almaktadır.

Xilinx FPGA'de DDS Yapısı

Sinüs dalga üretirken uygulamamızda Xilinx firmasının Basys 3 FPGA geliştirme kartını kullanacağımız için Xilinx'in DDS derleyici için kullandığı sistemi yakından inceleyip adım adım neler yaptıklarına bakalım. Aşağıdaki görselde bu bloğun yapısına dair genel bir şema bulunmaktadır. Bu şemada "Faz Kesici/Kısaltıcı (phase truncation)" 'nin yapısını gçrüyoruz. D1 ve A1 komponentleri birer integral alıcı olarak çalışırlar.

Bu integral alıcı komponentlerin görevi nedir peki bunu inceleyelim. Burada yapılan işlem, şemanın devamında hatta son evresindeki Lookup Tablosu olan T1 aracılığıyla sinüzoidal dalgaya eşlenen faz eğrisini hesaplamak. Look tablosu öncesindeki Q1 kuantalayıcısı bloğunda faz açısı kısaltılır ve faz açısının düşük hassasiyetli bir gösterimi üretilir. Bu değer de faz uzayından zamana eşleme yapan Lookup tablosunun adres portuna girer. Sistemin çıkış frekansı ise aşağıdaki gbii hesaplanır:

Şekil-3


Bu formüldeki elemanların ne anlama geldiğine bakalım:

Hesaplanan değerimiz fout: çıkıştaki dalganın istenen frekansı

fclk : sistem clock değeri

delta-teta :  faz artışı

B.teta(n) : Faz genişliği, Faz akümülatöründeki bit sayısı.

Faz akümülatörü fclk frekansının her bir cycle'ında faz açısını bir artırır. Faz akümülatörünün çalışma mantığı aslında basitçe budur. Faz açııs dediğimiz şey de zaten basitçe sinüs dalganın hareketini temsil eden değerdir. Toplam hareket 2*pi yani 360 derece faz açısı kadardır. Dolasıyla burdan bir cycle'da bir derece ya da çözünürlüğe bağlı olarak sistemin minimum açı değeri kadar artması ve sinüs hareketini ilerletmek demektir. 

Faz artışını hesaplama gereği duyduğumuzda  da yukarıdaki formülün aslında aynısını kullanarak faz artışı değerini formülde yalnız bırakarak hesaplamamız gerekiyor: 


Şekil-4

Faz akümülatörü, Sinüs look tabloları, referans clocklar ve çıkış frekansı hesaplarını anladıktan ya da anlamaya çalıştıktan sonra bu anlamı pekiştirmek için DDS blok ile istediğimiz frekansta bir sinüs  dalgasını FPGA yardımıyla üretmeye başlayabiliriz.

UYGULAMA

Buradaki örnek uygulamada verilen değerlerimiz yani DDS sistem parametrelerimiz aşağıdaki gibi olacaktır:

fclk : 10MHz

fout : 1MHz

B.teta(n) - faz genişliği: 16 bit  olacaktır. 

Burada hesaplamamaız gereken değer olarak geriye faz artışı değeri kalıyor. 


delta-teta = ( fout * 2^Bteta(n) ) / fclk = 6553,6    olarak elde ederiz faz artışı değerini.


Bu değer tabiki decimal türde olduğu için DDS bloğuna binary olarak tanımlamamız gerekecek ve bunun için decimalden binary veri tipine dönmemiz gerekcek.

6553.6 decimal değerinin binary karşılığı 0001 1001 1001 1001 'dir. Bundan sonrası için Vivado'da proje açıp IP Integrator kısmından "Create Block Design"a tıklıyoruz ve IP bloklarla tasarım aşamasına geçiyoruz. Aşağıda görüldüğü gibi sistemin IP şemasını çiziyoruz. Şemaya eklediğimiz üç adet blok var Xilinx'te kullanabileceğimiz. Bunlardan ilki Clocking Wizard dediğimiz bloktur ve bu blokla istediğmiz frekansta clock üretebiliriz. Bunu aslında PLL bloğu olarak düşünebiliriz. Girişindeki referans sistem clcok sinyalinden istediğimiz frekansta bir clock sinyali elde edebiliriz. Ayrıca bu bloğun diğer bir özelliği de birçok güçlü işlemci yapısında bulunan Spread Spectrum özelliğine sahip olmasıdır. Bu özellik sayesinde elektromanyetik girişim problemlerinde girişimleri bastırmak için kullanılabilir frekanslarda sinyaller üretebilmesidir.

İkinci blok ise kullanıldığı sistemin reset koşullarının düzenlenmesini sağlar. Resetin tutulması ve yönetilmesi başlıca görevidir. Bu blok girşindeki reset sinyalini tutar ve uygun bir şekilde çıkışta yeniden sisteme sağlar.

Üçüncü blokta ise yazımızın amacı olan DDS - Direct Digital Synthesis bloğu bulunur. Yukarıda detaylıca anlatmaya çalıştığımız gibi Faz üretimi ve Faz-Sinüs dönüşümü işlerinin geçekleştirildiği ve sistemin tamamnlandığı yerdir. Bu blokların bir araya gelmesi ile dijital referans clock sinyalinden  analog bir sinüs dalgası elde etme işi gerçekleştirilecektir. Sistemin IP blok şeması aşağıdaki gibidir:


Şekil-5

Sistemimn konfigürasyonu için aşağıdaki adımlar izlenir. 


Şekil-6


Şekil-7

Şekil-8

Bunları yaptıktan sonra sırada Faz artış değerini girmek var. Yukarıda hesapladığımız binary değeri burada set ediyoruz.


Şekil-9

Sistemi konfigüre ettikten ve gerekli sinyal bağlantılarını yaptıktan sonra blokları birleştirip "wrapper" işlemini de tamamlayalım.  Bunu yaparken de aşağıdaki adımı uyguluyoruz.

Şekil-10

Bu adımı tamamladıktan sonra blokların verilog veya vhdl (hangi kodla tanımlandılarsa) tanımlamalarını birleştirip tek bir blok şema oluşturmuş oluyoruz. Daha sonrasında Project Manager kısmından kaynak kodlarını görüntüleyebilir ve istediğimiz müdahalelerde bulunabiliriz. Şimdi test bench kodumuzu projeye ekleyelim ve simülasyonumuzu başlatıp sonuçları görelim. Test bench kodu ve proje kaynak dosyalarını ekte paylaştım.  Buradan indirebilirsiniz.

stimuli : process
  begin

    reset              <= '1';
    aclken             <= '0';
    m_axis_data_tready <= '0';
    -- Reset generation
    reset <= '0';
    wait for 100 ns;
    reset <= '1';
    -- EDIT Add stimuli here
    wait for 6500 ns;                   //Clock stabilitesi için bekleniyor.
    aclken             <= '1';
    m_axis_data_tready <= '1';
    wait;

  end process stimuli;

Test bench kodunda neler yapıldığını inceleyelim. Öncelikle sistem resetleniyor ve 6500ns kadar bir süre bekleniyor. Bu beklemede sistemde 10MHz referans clock sinyali üretiliyor ve stabil hale gelmesi bekleniyor. Bunun için 6500ns'lik süre yeterli olacak. Clock stabilitesi sağlandıktan sonra aclken ve m_axis_data_ready sinyallerini aktif ediyoruz. Bu kadar adımdan sonra çıkış sinyalini gözleeyebiliyoruz. DDS çalıştıktan sonra  sistem m_axis_data_tvalid kontrol sinyalini aktif edecektir. Bu bir nevi sistemin çıkışında istediğimiz sinüs sinyalini görmek için eşik noktasıdır. Bundan sonra çıkışta DDS sistemi çıkışa sinüs sinyalini üretecektir.

Şekil-11
Simülasyon çıktısında görülen sinüs dalgasının formu düşük çözünürlüktedir. Burada FPGA modeli olan Artix-7 çekirdekli BASYS-3 FPGA kartını kullanmamızdan ötürü bu sonuçla karşılaşıyoruz. Daha önce bahsettiğimiz gibi ROM bellek ve Clock kapasitesinin yüksek olmamasından ötürü çözünürlük de yeterince iyi çıkmıyor anca kendini tekrar eden periyodik bir sinyali çıkışta görebiliyoruz. 

Kaynaklar:

https://levimarien.com/2018/08/25/frequency-generator-with-the-xilinx-dds-compiler-core/


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)