FPGA ile (Sahada Programlanabilir Mantık Dizeleri) gerçekleştirilen bu örnek uygulamamızda deneme kartımız üzerinde bulunan 1 adet LED’i kullanarak 3 adet PWM sinyali üretim örneği uygulaması yapacağız. Bu uygulamalar sırası ile;
1. Kart Üzerindeki Sürgülü Anahtarların(Switch) Kullanımı İle Darbe Genişlik Modülasyonu(PWM) Sinyali Üretilmesi Uygulaması
2. Sürgülü Anahtarların(Switch) Yerine Program Tarafından Darbe Genişlik Modülasyonu(PWM) Sinyal Değerlerinin Üretilmesi Uygulaması
3. Darbe Genişlik Modülasyonu(PWM) Sinyallerinin Kayan Nokta Şeklinde Üretilmesi Uygulaması

FPGA’lar PWM sinyallerini üretmek ve işlemek konusunda mikro denetleticilere göre oldukça avantajlılardır. Mikro denetleyicilerde PWM pinleri sabit olduğu halde FPGA’nın tüm giriş çıkış(I/O) pinleri PWM sinyal çıkışı olarak kullanılabilir. Ayrıca mikro denetleyicilere göre daha fazla istenilen çözünürlük ve frekansta PWM sinyali elde etmek de mümkündür.
PWM sinyali nedir?
Darbe-Genişlik Modülasyonu diğer adı ile PWM, dijital araçlarla analog sonuçlar elde etmek için kullanılan bir tekniktir. Dijital olarak yapılan kontrol ile, açık-kapalı oranları ayarlanabilen kare dalga oluşturmak için kullanılır. Bu açık-kapalı oran ile açık gerilimler (~ 2,5 Volt) ve kapalı(0 Volt) arasındaki küsuratlı gerilimler oluşturulabilir. Kare dalganın “açık” olduğu orana darbe genişliği denir. LED örneğinde de olduğu gibi, bu açık-kapalı oranı hızla tekrarlandığında LED’in paraklığı, 0-2,5V arasındaki gerilim ayarlanarak, kontrol edilebilmektedir.
Darbe genişlik modülasyonu ile istenen gerilimler şu formül ile elde edilirler;

Adsız

Tüm örnek uygulamalarımızda, ürettiğimiz Darbe genişlik modülasyonu(PWM) sinyalinin gösterimi için, PİN_83’e bağlı olan D7 ile etiketlenmiş LED’i kullanacağız. PWM sinyalinin, LED’in yanık kalma ve süresini ise, kart üzerinde tümleşik olarak bulunan 50 MHz’lik kristalin osilasyon frekansının bölünmesi ile elde edilen frekans ile buluyoruz.
İlk örnekte sürgülü anahtarlardan; gelen 8 bitlik değer ile aşağıda gösterilen oranlarda PWM sinyalleri oluşmaktadır;

1. Anahtar açık konumda ise; 2^0/128 = 1/128 oranında bir PWM sinyali, LED EN SÖNÜK DURUMDA
2. Anahtar açık konumda ise; 2^1/128 = 1/64 oranında bir PWM sinyali,
3. Anahtar açık konumda ise; 2^2/128 = 1/32 oranında bir PWM sinyali,
4. Anahtar açık konumda ise; 2^3/128 = 1/16 oranında bir PWM sinyali,
5. Anahtar açık konumda ise; 2^4/128 = 1/8 oranında bir PWM sinyali,
6. Anahtar açık konumda ise; 2^5/128 = 1/4 oranında bir PWM sinyali,
7. Anahtar açık konumda ise; 2^6/128 = 1/2 oranında bir PWM sinyali,
8. Anahtar açık konumda ise; 2^7/128 = 1/1 oranında bir PWM sinyali, LED EN PARLAK DURUMDA

Sigma-Delta modülasyonunun(SDM), klasik Darbe Genişlik modülasyonundan farklı(PWM) elde edilmek istenen gerilim değeri için anahtarlama frekansınındı değişebilmesi, kayabilmesidir. İlk 2 örneğimizde Sigma Delta modülasyonunu ile oluşturulan PWM sinyalleri gösterilecektir.

sdmSDM16

İkinci örnekte ise LED animasyon makalesinde de bahsedilen, durum(case) ifadesinden gelen değerler bir desen halinde zaman aralıkları ile bir döngü haline getirilerek anahtar girişi yerine program koduna yaptırılmıştır.
Üçüncü örneğimizde ise Verilog operatörlerinden; Koşullu operatörü kullanılarak PWM sinyali elde edilecektir.
Koşullu operatörün kullanımı şu şekildedir;

A ? B : C işleminin sonucu, eğer A işleneni B’ye eşit ise 1 olarak değerlendirilir, aksi takdirde, sonuç C’dir. x değerlendirildiğinde, koşullu operatör bit düzeyinde çıktı üretir; Sonuçta her 1 olan bit B ve C nin her ikisinde de 1 olan bittir, bitler 0 ise sonuç, 0 ve aksi taktirde sonuç x olur.

Uygulamalar ile diğer açıklamalar program kodlarının arasındaki yorum satırlarında yapılmıştır. Örnek uygulamalarımızda; FPGA çipi olarak ALTERA Firmasının Cyclone IV ailesinden EP4CE6E22C8 model bir FPGA ve geliştirme kartına tümleşik olan LED’leri kulandık. Bu FPGA çipinin gelişmiş özellikleri için modelin datasheet’i(bilgiSayfası) incelenmelidir. Ama kabaca olarak kullandığımız FPGA çipi; 6272 Lojik Elementli, 270Kbit Gömülü Hafızası, 91 adet I/O (Giriş/Çıkış) Pini bulunan, 144 ayaklı bir çiptir .ALTERA firmasının üretmiş olduğu FPGA’ları programlayabilmek için, “Quartus” Derleyicisini kullanıyoruz. Quartus Derleyicisinin kurumsal internet sitesinden indirdiğimiz “Demo” versiyonu ile bu örnek uygulamayı gerçekleştirdik. FPGA’ları programlayabilmek için yaygın olarak kullanılan iki dil; VDHL ve Verilog içerisinden, “C” söz dizimine daha yakın geldiği için “Verilog” ile programlamayı tercih ettik.

FPGA ve LED’ler ve Sürgülü Anahtarların(SWITCH) arasındaki Pin Bağlantıları :

anahtar

led

FPGA ile PWM Sinyal Üretim Uygulaması Pin Tanımlama & Bağlantıları

Çıkış Pinleri
LED_D7 PIN_83 1,2,3. Uygulama
Giriş Pinleri
saatDarbesi PIN_23 1,2,3. Uygulama

f_degergir_1 PIN_58 1. Uygulama
f_degergir_2 PIN_59 1. Uygulama
f_degergir_3 PIN_60 1. Uygulama
f_degergir_4 PIN_64 1. Uygulama
f_degergir_5 PIN_65 1. Uygulama
f_degergir_6 PIN_66 1. Uygulama
f_degergir_7 PIN_67 1. Uygulama
f_degergir_8 PIN_68 1. Uygulama

1.Uygulama: Kart Üzerindeki Sürgülü Anahtarların(Switch) Kullanımı İle Darbe Genişlik Modülasyonu(PWM) Sinyali Üretilmesi Uygulaması Verilog Program Kodu :

/*******************************************************************************
* @dosya PWM Sinyal Üretim Uygulaması
* @yazar Erkan ÇİL
* @sürüm V0.0.1
* @tarih 18-Ağustos-2016
* @özet Cyclone IV EP4CE6 FPGA PWM Sinyal Üretim Uygulaması
*
* Bu örnek uygulamada, Cyclone IV EP4CE6 FPGA kartını ile PWM Sinyalleri
* üretilecek, bu sinyaller ile LED'in parlaklığı kontrol edilecektir.
******************************************************************************
*
* Bu program özgür yazılımdır: Özgür Yazılım Vakfı tarafından yayımlanan GNU
* Genel Kamu Lisansı’nın sürüm 3 ya da (isteğinize bağlı olarak) daha sonraki
* sürümlerinin hükümleri altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.
*
******************************************************************************/
module LED_PWMV02(saatDarbesi, f_DegerGir, PWM_Cikis);
// LED PWM versyon0.2 MODÜLÜ TANIMI
//-------------Giriş Portları-----------------------------
input saatDarbesi; //saatDarbesi giriş olarak tanımlanmıştır
input [enBuyukBit-1:0] f_DegerGir; //sürgülü anahtar(switch) girişleri
//-------------Çıkış Portları-----------------------------
output reg PWM_Cikis = 1; //PWM LED çıkış olarak tanımlanmıştır
//-------------Parametre Tanımlamaları--------------------
parameter enBuyukBit = 8; //giriş değişkeni ve sayac içerisindeki en büyük bit sayısı
//-------------Çıkış Portları Veri Tipleri------------------
// Çıkış portları bellek elemanı(reg-yazmaç) veya bir tel olabilir
reg [enBuyukBit-1:0] sayac = 0; //reg tipindeki sayac değişkenin oluşturulması
//------------Kod Burada Başlamaktadır-------------------------
// Ana döngü bloğu
// Bu sayaç yükselen kenar tetiklemeli olduğundan,
// Bu bloğu saatin yükselen kenarına göre tetikleyeceğiz.
always@ (posedge saatDarbesi )begin
if ( sayac < f_DegerGir ) // anahtardan girilen değer sayac değişkeninden büyükse
PWM_Cikis <= 1; // PWM çıkışa 1 değerini ata
else // değilse
PWM_Cikis <= 0; // PWM çıkışa 0 değerini ata
sayac <= sayac+1; // sayac değerini 1 arttır
end
endmodule // LED PWM versyon0.2 MODÜLÜ SONU
//Sigma Delta PWM MODÜLÜ TANIMI
module SigmaDeltaPWM(saatDarbesi, f_DegerGir, PWM_Cikis);
//-------------Giriş Portları-----------------------------
input saatDarbesi; //saatDarbesi giriş olarak tanımlanmıştır
input [enBuyukBit-1:0] f_DegerGir; //darbe genişliğini ayarlayan anahtar giriş değeri
//-------------Çıkış Portları-----------------------------
output reg PWM_Cikis = 1; //PWM sinyal çıkışı
//-------------Parametre Tanımlamaları--------------------
parameter enBuyukBit = 8; //anahtar girişi içerisindeki en büyük bit sayısı
//-------------Çıkış Portları Veri Tipleri------------------
// Çıkış portları bellek elemanı(reg-yazmaç) veya bir tel olabilir
reg [enBuyukBit:0] Sigma = 0; //reg tipindeki sigma değişkenin oluşturulması
//------------Kod Burada Başlamaktadır-------------------------
// Ana döngü bloğu
// Bu bloğu saatin yükselen kenarına göre tetikleyeceğiz.
always @(posedge saatDarbesi)
begin //8 bitlik bloklanan PWM değerin ataması
Sigma = Sigma + f_DegerGir; //PWM değerinin elde edilmesi;
PWM_Cikis = Sigma[enBuyukBit]; //sigma değişkenin en büyük değerinin çıkışa atanması
Sigma[enBuyukBit] = 0; //Delta: eğer 256 değerine eşit ya da büyük ise değeri azalt
end
endmodule // Sigma Delta PWM MODÜLÜ SONU

Uygulamanın Görseli :

20160819_135030-01

2.Uygulama: Sürgülü Anahtarların(Switch) Yerine Program Tarafından Darbe Genişlik Modülasyonu(PWM) Sinyal Değerlerinin Üretilmesi Uygulaması Verilog Program Kodu :

/*******************************************************************************
* @dosya PWM Sinyal Üretim Uygulaması
* @yazar Erkan ÇİL
* @sürüm V0.0.2
* @tarih 18-Ağustos-2016
* @özet Cyclone IV EP4CE6 FPGA PWM Sinyal Üretim Uygulaması
*
* Bu örnek uygulamada, Cyclone IV EP4CE6 FPGA kartını ile PWM Sinyalleri
* üretilecek, bu sinyaller ile LED'in parlaklığı kontrol edilecektir.
******************************************************************************
*
* Bu program özgür yazılımdır: Özgür Yazılım Vakfı tarafından yayımlanan GNU
* Genel Kamu Lisansı’nın sürüm 3 ya da (isteğinize bağlı olarak) daha sonraki
* sürümlerinin hükümleri altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.
*
******************************************************************************/
module LED_PWMV02(saatDarbesi, PWM_Cikis);
// LED PWM versyon0.2 MODÜLÜ TANIMI
//-------------Giriş Portları-----------------------------
input saatDarbesi; //saatDarbesi giriş olarak tanımlanmıştır
//-------------Çıkış Portları-----------------------------
output reg PWM_Cikis = 1; //PWM LED çıkış olarak tanımlanmıştır
//-------------Parametre Tanımlamaları--------------------
parameter enBuyukBit = 8; //giriş değişkeni ve sayac içerisindeki en büyük bit sayısı
//-------------Çıkış Portları Veri Tipleri------------------
// Çıkış portları bellek elemanı(reg-yazmaç) veya bir tel olabilir
reg [enBuyukBit-1:0] sayac = 0; //reg tipindeki sayac değişkenin oluşturulması
reg [enBuyukBit-1:0] f_DegerGir; // kontrol değişkeninin üretilmesi
reg [25:0] sayac2; //sayac2 register(kayıtcısının oluşturulması)
//------------Kod Burada Başlamaktadır-------------------------
// Ana döngü bloğu
// Bu sayaç yükselen kenar tetiklemeli olduğundan,
// Bu bloğu saatin yükselen kenarına göre tetikleyeceğiz.
always @ ( posedge saatDarbesi )
begin
sayac2<=sayac2+1;
end
//f_DegerGir değerinin zamanla aşağıdaki desen ile döndürülmesi
always@ (posedge saatDarbesi)
begin
case ( sayac2[25:22] )
0 : f_DegerGir <= 8'b11111111;
1 : f_DegerGir <= 8'b11111110;
2 : f_DegerGir <= 8'b11111100;
3 : f_DegerGir <= 8'b11111000;
4 : f_DegerGir <= 8'b11110000;
5 : f_DegerGir <= 8'b11100000;
6 : f_DegerGir <= 8'b11000000;
7 : f_DegerGir <= 8'b10000000;
8 : f_DegerGir <= 8'b00000000;
9 : f_DegerGir <= 8'b10000000;
10: f_DegerGir <= 8'b11000000;
11: f_DegerGir <= 8'b11100000;
12: f_DegerGir <= 8'b11110000;
13: f_DegerGir <= 8'b11111000;
14: f_DegerGir <= 8'b11111100;
15: f_DegerGir <= 8'b11111110;
endcase
end
always@ (posedge saatDarbesi )begin
if ( sayac < f_DegerGir ) // anahtardan girilen değer sayac değişkeninden büyükse
PWM_Cikis <= 1; // PWM çıkışa 1 değerini ata
else // değilse
PWM_Cikis <= 0; // PWM çıkışa 0 değerini ata
sayac <= sayac+1; // sayac değerini 1 arttır
end
endmodule // LED PWM versyon0.2 MODÜLÜ SONU
//Sigma Delta PWM MODÜLÜ TANIMI
module SigmaDeltaPWM(saatDarbesi , PWM_Cikis);
//-------------Giriş Portları-----------------------------
input saatDarbesi; //saatDarbesi giriş olarak tanımlanmıştır
//-------------Çıkış Portları-----------------------------
output reg PWM_Cikis = 1; //PWM sinyal çıkışı
//-------------Parametre Tanımlamaları--------------------
parameter enBuyukBit = 8; //anahtar girişi içerisindeki en büyük bit sayısı
//-------------Çıkış Portları Veri Tipleri------------------
// Çıkış portları bellek elemanı(reg-yazmaç) veya bir tel olabilir
reg [enBuyukBit:0] Sigma = 0; //reg tipindeki sigma değişkenin oluşturulması
reg [enBuyukBit-1:0] f_DegerGir; // kontrol değişkeninin üretilmesi
//------------Kod Burada Başlamaktadır-------------------------
// Ana döngü bloğu
// Bu bloğu saatin yükselen kenarına göre tetikleyeceğiz.
always @(posedge saatDarbesi)
begin //8 bitlik bloklanan PWM değerin ataması
Sigma = Sigma + f_DegerGir; //PWM değerinin elde edilmesi;
PWM_Cikis = Sigma[enBuyukBit]; //sigma değişkenin en büyük değerinin çıkışa atanması
Sigma[enBuyukBit] = 0; //Delta: eğer 256 değerine eşit ya da büyük ise değeri azalt
end
endmodule // Sigma Delta PWM MODÜLÜ SONU

3.Uygulama: Darbe Genişlik Modülasyonu(PWM) Sinyallerinin Kayan Nokta Şeklinde Üretilmesi Uygulaması Verilog Program Kodu :

/*******************************************************************************
* @dosya PWM Sinyal Üretim Uygulaması
* @yazar Erkan ÇİL
* @sürüm V0.0.1
* @tarih 18-Ağustos-2016
* @özet Cyclone IV EP4CE6 FPGA PWM Sinyal Üretim Uygulaması
*
* Bu örnek uygulamada, Cyclone IV EP4CE6 FPGA kartını ile PWM Sinyalleri
* üretilecek, bu sinyaller ile LED'in parlaklığı kontrol edilecektir.
* fpga4fun sitesindeki örneklerden yararlanılmıştır.
******************************************************************************
*
* Bu program özgür yazılımdır: Özgür Yazılım Vakfı tarafından yayımlanan GNU
* Genel Kamu Lisansı’nın sürüm 3 ya da (isteğinize bağlı olarak) daha sonraki
* sürümlerinin hükümleri altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.
*
******************************************************************************/
module ledPWM(saatDarbesi, LED);
// LED PWM MODÜLÜ TANIMI
//-------------Giriş Portları-----------------------------
input saatDarbesi; //saatDarbesi giriş olarak tanımlanmıştır
//-------------Çıkış Portları-----------------------------
output LED; //LED çıkış olarak tanımlanmıştır
//-------------Parametre Tanımlamaları--------------------
parameter N=28;
//-------------Çıkış Portları Veri Tipleri------------------
// Çıkış portları bellek elemanı(reg-yazmaç) veya bir tel olabilir
reg [N-1:0] sayac;
//------------Kod Burada Başlamaktadır-------------------------
// Ana döngü bloğu
// Bu sayaç yükselen kenar tetiklemeli olduğundan,
// Bu bloğu saatin yükselen kenarına göre tetikleyeceğiz.
always @(posedge saatDarbesi)
begin
sayac<=sayac+1;
end
// PWM sinyalinin aşağı ve yukarı eğiminin koşullu operatörün kullanılması ile üretilmesi
wire [6:0] PWM_Giris = sayac[N-1] ? sayac[N-1:N-7] : ~sayac[N-1:N-7];
reg [6:0] PWM; //reg tipinde PWM 7 bitlik değişken vektörünün tanımlanması
always @(posedge saatDarbesi) PWM <= PWM[5:0]+PWM_Giris;
assign LED = PWM[6]; //PWM sinyalinin en değerli bitinin LED çıkışına tanımlanması
endmodule // LED PWM MODÜLÜ SONU

Uygulamanın Görseli :

Jpeg

Uygulamanın PDF Dosyasını indirmek için :

İndir (PDF, 1.4MB)

Uygulamanın Videosu: