Verilog kullanarak FPGA üzerindeki D Flip-Flop Uygulaması



FPGA yapılarında en kritik komponentlerden biri de D Flip-Flop'lardır. Ne işe yarar bu D Flip-Flop'lar? Burayı iyi anlamak ve detaylı tasarımlara girmeden mantığını kavramak ilerlemek açısından sağlıklı olacaktır diye düşünüyorum. Aslında Flip Flop yapıları JK , T ve D olmak üzere farklı yapılarda olabilirler. Ancak FPGA yapılarında bizim sıklıkla muhattap olacağımız türü D Flip Flop'lardır. O zaman yapılarını incelemeye başlayalım. 




Aşağıdaki grafikte görüldüğü üzere sol tarafta sembolü verilen D Flip-Flop elemanının 2 adet girişi ve 2 adet çıkışı mevcuttur. Giriş sinyali "D" ; giriş verisi ve "Clk" yani Clock sinyalinden oluşmaktadır. Çıkışta ise diyalektik bir çıkışa ihtiyaç duyulmuş sorusunu akıllara getiren bir adet Q durumu ve bir adet de bunun tersi Q' durumu mevcut. Her ikisinin de ne işe yarayacağından bahsedeceğiz. Burada kritik sinyallere tekrar değinirsek aslında bize lazım olan:

D - Flip Flop giriş verisi

CLK - Flip Flop saat girişi

Q - Flip Flop çıkışı


Bu yazıyı okuduğunuza göre birçoğunuzun clock hakkında bilgi sahibi olduğunu varsayıyorum ancak yine de konunun bütünlüğünü sağlamak açısından biraz Clock'tan bahsedebiliriz. Çünkü Clock denen arkadaş dijital devrelerin olmazsa olmazıdır. Clock yani saat hareketi aslında çoğumuzun bildiği metronoma benzer bir davranış sergiler. Tek farkı bunu elektronik devrelerde, özellikle senkron dijital devrelerde yapıyor olmasıdır. Bu arada Clock sinyaline bağlı olarak durumu değişmeyen devrelere de Asenktron devreler denmektedir. Bunu da hatırlatmakta fayda var. Clock üretilirken birçok kompleks yapı var gibi görünse de sonuç olarak ortayan çıkan sinyal %50 dolulukta bir kare dalga sinyalidir. Ancak frekansı değişebilmektedir tahmin edeceğiniz üzere. Zaten clock deme sebebimiz aslında bu frekans değerinin ve dolayısıyla temponun (frekansın) değişebiliyor olması.

Örnek bir dijital clock sinyali (genlik 5V) - %50 doluluk (duty cycle)
Buraya kadar genel olarak clock sinyalinden basitçe bahsetmiş olduk. Clock sinyalinin dijital devrelerde kullanımında en dikkat çekici özelliği aslında sistemin Clock işaretine bağlı olarak (senkron olarak) çalışan sinyallerinin, Level veya Edge Triggering denen iki farklı metotla senkronizasyon sağlamasıdır. 

Level Triggering  

Positive Level Triggering
Negative Level Triggering

Pozitif seviyede tetikleme, Clock sinyalinin Lojik olarak "1" seviyesinde devrenin durumunun değişmesi, Negatif seviyede tetikleme ise tahmin edeceğiniz üzere Clock sinyalinin Lojik olarak "0" seviyesinde durum değişimidir.

Edge Triggering

Positive Edge Triggerin (Rising Edge)
Negative Edge Triggering (Falling Edge)

Sistemin saate senkron çalışabilmesi için ya "Falling Edge" ya da "Rising Edge" durumlarında ya da hem Rising hem Falling edge durumlarında sinyalerin aktif olması gerekir. 

Rising (Positive)  Edge 

Falling (Negative) Edge

D Flip Flop elemanlarının kullanımında Clock sinyali, Flip-Flop'un veri depolama elemanı olarak kullanılmasını sağlar. Bu noktada bu kavram önemli. Çünkü verilog dilinde de yazdığımız kodlarda bir flip-flop tanımlamadan bir durumu tutamayız ve bunu yaparken de "reg" komutunu kullanırız. Reg komutu aslında register ifadesinin kısaltmasıdır yani yazmaç elemanını simgeler Verilog dilinde. 

Örnek vermek gerekirse;

reg D_FlipFlop_Out; // Burada bir bit değer kaydedebilen veya üreten bir register (yazmaç) tanımladık. reg [7:0] Bus_FF; // Burada ise 8 bitlik bir register(yazmaç) tasarlamış olduk.

reg D_FlipFlop_Out; // Burada bir bit değer kaydedebilen veya üreten bir register (yazmaç) tanımladık.

reg [7:0] Bus_FF; // Burada ise 8 bitlik bir register(yazmaç) tasarlamış olduk.

Dijital devrelerde veri depolama elemanları "Sequential (ardışıl) Logic" veya "Registered (Yazmaçlı) Logic" olarak bilinirler. Ardışıl lojik yapılar saat sinyalinin geçişlerinde aktif olurlar. Bir Sequential logic devre olan D Flip Flop da girişteki (D) veriyi Clock sinyalinin Positive (Rising) Edge kısmında çıkışa (Q) aktarır.  Bu basit yapılar, FPGA 'de verinin aktarımı ve kaydı konusunda büyük kolaylıklar sağlamaktadır bu özellikleri sayesinde. Dolayısıyla FPGA ile uğraşmaya devam ettiğiniz sürece bol bol D Flip Flop kullanacağınızdan emin olabilirsiniz.


Yukarıdaki grafikten D flip flop'un çalışma mantığını inceleyip artık örnek kodumuzu yazmaya geçebiliriz. Sistemin D girişindeki sinyalin mavi okla gösterildiği üzere High seviyesinden Low seviyesine indiğini görüyoruz. Ancak farkındaysanız Q çıkışındaki durumun değişmesi bir miktar zaman alıyor. Q sinyalindeki mavi ok ile gösterilen High-Low geçişi ancak Clock sinyalinin Low seviyesinden High seviyesine "geçişi" yani Positive Edge ile aktif olmuştur. Bunun aynısını kırmızı ok ile gösterilen durumlar için de söyleyebiliriz. Q' durumu ise Q durumunun tam tersi olduğu görülüyor. Aşağıdaki görselde Q' durumundan faydalanarak frekans bölme uygulamasının D Flip Flop'la nasıl gerçekleştirildiğini görebiliriz.

Frekansın 2'ye bölünme işlemi

D Flip Flop durum tablosu

Verilog ile FPGA üzerinde D Flip-Flop
Kodu satır satır incelemekte fayda gördüm. D Flip Flop gibi kritik elamanın temel çalışma mantığını anlamaya çalışırken sistemi adım adım inceleyeceğiz. Öncelikle RTL kodumuzun başında 

`timescale 1ns / 1ps    // time-unit = 1 ns, precision = 10 ps

satırını ekledik. Bu satır RTL kodunun en tepesinde olmak zorundadır. Çünkü burada zaman birimi ve zaman hassasiyetini belirliyoruz. Bu diğer zamanlama ile ilgili işlemlerde özellikle de test bench gibi manuel olarak süreci ayarlama şansımız olan ortamda işimize yarayacaktır. 

Kodun kalan kısımını bir bütün olarak ele alıp sonrasında parçalamak istiyorum. 
module D_flip_flop_rtl(D,clk,Q); input D; // Data input input clk; // clock input output reg Q; // output Q always @(posedge clk) begin Q <= D; end endmodule

Daha önce bahsettiğimiz gibi Verilog'da modülleri birer fonksiyon yapısı olarak düşünebiliriz. Bu fonksiyonun parametreleri D, clk, Q olarak tanımlanmıştır. D parametresi D Flip Flop elemanının giriş verisini tutacak. "clk" girişi ise Flip Flop'ta işlemlerin gerçekleşmesi için gerekli tetiklemeleri yapacak. Q parametresi ise bildiğimiz gibi durum çıkışımız olacak ve bir yazmaç olarak tanımlanmıştır burada. Çünkü veriyi Q'da depolayabilmemiz gerekiyor. 

always @(posedge clk) satırı ile fonksiyonun gerçekleştireceği işleme girmiş oluyor.  Yani Clock tetiklemesinde D giriş verisini Q çıkış ya da yazmaç değerine atayacağız. Bu RTL kodunun belirlenen süre kadar simülasyon sonucu aşağıdaki gibidir. 





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)