Quartus 11 – Qsys aracı ile donanım üzerinde NIOS II işlemcisi oluşturma

Hasan Yavuz ÖZDERYA - 16 Nisan 2012

Bu yazımda Altera Quartus programını kullanarak FPGA üzerinde bir NIOS II işlemcisinin nasıl gerçekleştirilebileceğini anlatacağım. Bu çalışma Qsys aracı ile minimal bir tasarım yapılarak FPGA'e bağlı LED'lerin yakılmasını içermektedir. Ben bu çalışmayı yaparken Terasic'in DE-0 Nano kitini kullandım.

Not: Quartus programı ile basit bir FPGA tasarımı oluşturup donanım üzerinde çalıştırabildiğiniz varsayarak yazıyorum.

Bütün işlemleri şu 3 aşamada sıralamak mümkündür.

1- Qsys ile işlemciyi içeren sistemin tasarlanması

2- Oluşturulan sistemin bir FPGA tasarımına eklenip sentezinin yapılması ve cihaza yüklenmesi

3- NIOS II yazılım geliştirme aracı ile programın yazılarak donanım üzerindeki işlemciye yüklenmesi

Qsys ile sistemin tasarımından başlayalım. Tabi öncelikle Terasic'in DE-0 Nano ile sunduğu "System Builder" programcığını kullanarak kendimize yeni bir proje oluşturup bu projeyi açıyoruz.

"System Builder" gerekli pin bağlantılarını vs. hazırlamış oluyor. Nios II işlemcisini ve çevre bileşenlerini seçerek bir sistem oluşturacağımız Qsys aracını "Tools" menüsünden açıyoruz.




Karşımıza şöyle bir pencere çıkıyor:





Gördüğünüz gibi bir halihazırda bir saat modülü eklenmiş. Saat modülünün adı "clk_0". İsterseniz sağ tıklayıp "Rename" diyerek bu modülün adını değiştirebilirsiniz.


Sol taraftaki menüden "Embedded Processors"a tıklayıp "Nios II Processor"u seçiyoruz ve "Add"e tıklayarak sistemimize işlemcimizi ekliyoruz.





Karşınıza şu ekran çıkacak.



Şimdilik burada hiç birşeyi değiştirmeyeceğiz. Hata mesajlarını da göz ardı ediyoruz. "Finish"e tıklıyoruz.


Ekranda göründüğü gibi küçük beyaz noktalara tıklayarak modüller arasındaki bağlantıları yapacağız. Aşağıdaki görüntüde işaretlenen noktaya tıklayarak saat modülünün (clk_0) saat çıkışını eklediğimiz işlemcinin saat girişine bağlayın. Fare imlecini bağlantıların üzerine getirdiğinizde yapılabilecek bütün bağlantılar gözükecektir, yapmanız gereken tek şey istediğiniz bağlantı için gerekli noktaya tıklamak.



Aynı şekilde "jtag_debug_module_reset" çıkışını "clk_in_reset" girişine bağlayın. "clk_reset" çıkışını da "reset_n" girişine bağlayın. Bu bağlantılar daha farklı da yapılabilirdi. Böyle yaparsanız aşağıdaki gibi bir görüntü elde edeceksinizdir.




Kütüphaneden "On-Chip Memory (RAM or ROM)"u seçerek sistemimize bir bellek ekliyoruz.



Başlangıç için bellek boyutunu büyük tutalım. "Total Memory Size" için 24000 değerini girip "Finish"e tıklıyoruz.



Eklediğimiz belleğin saat bağlantısını yapıyoruz. Belleğin "s1" girişini işlemcinin "data_master" ve "instruction master" portlarına bağlıyoruz. "reset1" portunu da hallettikten sonra bağlantılar şöyle olmalı.




Şimdi sistemimize LEDlerin bağlı olduğu pinleri kontrol edebileceğimiz bir giriş/çıkış kontrol donanımı ekleyelim. "Peripherals->Microcontroller Peripherals->PIO"ı seçerek sistemizie bir paralel giriş çıkış modülü ekliyoruz.



Varsayılan port genişliği 8bit olduğu için hiç bir değişiklik yapmadan "Finish"e tıklıyoruz.

Modül adına ("pio_0") sağ tıklayıp "Rename"i seçerek, modül adını "led"'e değiştiriyoruz. Saat ve reset bağlantısını yapıyoruz. "s1" bağlantısını bellek modülünü bağladığımız gibi işlemcinin "data_master" ve "instruction_master" portlarına bağlıyoruz.

Farkedeciğiniz gibi bu modülün portlarından biri ("external_connection") sistemdeki diğer hiç bir porta bağlanmıyor. Adından da anlaşılabileceği gibi bu port sistemin dışına çıkacak. "external_connection" portunu sistem dışına vermek için hemen sağında bulunan "Click to export" yazan hücreye tıklıyoruz ve bu porta bir isim ("led") veriyoruz. Bu işlemlerden sonra sistemin görüntüsü şöyle olmalı.




Sistemimize modülleri eklemeyi tamamladık. Şimdi bellek adreslerini otomatik olarak düzenleyip şu hata mesajlarından kurtulalım.

"System" menüsünden "Assign Base Address"i seçiyoruz. Bu aşamada hata mesajlarının bir kısmından kurtulmuş olmamız gerekiyor.

İşlemci üzerine (adını değiştirmediyseniz muhtemelen "nios2_qsys_0" modülü) sağ tıklayarak "Edit"i seçiyoruz. İşlemciyi ilk eklediğimizde karşılaştığımız ekran geliyor. "Reset vector memory" ve "Exception vector memory" için ekledimiz belleğe karşılık gelen "onchip_memory2_0.s1"i seçiyoruz. Bu aşamada mesaj bölümünde görüntülenen hata mesajlarının kaybolmuş olması gerekiyor. Ve "Finish"e tıkladığımızda sistemimiz hazır. Sıra gerekli dosyaları oluşturmada.

Sistemimiz kaydetmeden önce "nios2_qsys_0"ı "nioscpu" olarak yeniden adlandırıyorum. Böylesi daha iyi. Daha sonra menüden "File->Save" diyerek sistemi "niossys" adıyla kaydediyorum.

Kaydetme işleminden sonra "Generation" sekmesine geçiyoruz.



Hiç birşeyi değiştirmeden "Generate" düğmesine tıklıyoruz. Bu oluşturduğumuz sistemi FPGA tasarımımıza eklememizi sağlayacak bütün dosyaları oluşturacak.


Qsys ile işimiz bitti onu kapatabiliriz. Sadece işlemcimizden oluşacak olan tasarımımızı ekleyeceğimiz bir block diyagram dosyası oluşturuyoruz. Oluşturduğunuz sistemi pekala bir HDL dosyasına da (VHDL veya Verilog) gömebilirsiniz. Diğer modüllerden bir farklı yok. Oluşturduğumuz dosyayı kaydedik "Top Level" yapıyoruz.

Qsys ile oluşturulan dosyaları da projemize eklememiz gerekiyor. Bunun için aslında tek bir dosyayı eklememiz yeterli. "Project" menüsünden "Add/Remove Files.." a tıklayarak "niossys/synthesis" klasörü içindeki "niossys.qip" dosyasını projemize ekliyoruz. Dosya seçme penceresinde bu dosyayı görebilmek için dosya türü olarak "IP Variation Files (*.qip)"i seçmeyi unutmayın.

Şematik editördeki sembol ekleme aracına tıkladığımızda "Project" kısmında "niossys" adındaki sistemimizi görebilirsiniz. "OK"e tıklayarak modülü tasarıma ekliyoruz.




Saat girişi için bir giriş pini ve led çıkışları için de bir çıkış pini ekliyoruz. Saat girişinin adını "CLOCK_50", led çıkışının adını da "LED[7..0]" olarak değiştiriyoruz. Bu isimler "System Builder" tarafından oluşturulan projede gerekli pinlere bağlandıkları için böyle bir seçim yapıyoruz. CLOCK_50'yi "niossys"nin saat girişine, LED[7..0]'ı da led portuna bağlıyoruz.



Tasarımımızı sentezliyoruz ve oluşan "SOF" dosyasını FPGA donanımına (DE-0 Nano gibi) yüklüyoruz. Burada dikkat etmeniz gereken şey lisans durumunuza göre Quartus sizi bir zaman kısıtlamasıyla ilgili uyarabilir. FPGA kartınız PC'ye bağlı olduğu müddetçe sorun çıkmayacaktır. Yalnız tasarımı yükledikten sonra gelen "OpenCore Plus Status" penceresini de kapatmayın.


Bu aşamada işlemcimiz hazır artık programı yazabiliriz. Quartus programının "Tools" menüsünden "Nios II Software Build Tools for Eclipse"i seçiyoruz. Nios II yazılım geliştirme aracı olarak düzenlenmiş bir Eclipse sürümü açılacak. Dosya menüsünden "New->Nios II Application and BSP from Template"i seçiyoruz.



Açılan pencereden "SOPC Information File Name" olarak proje klasöründe bulunan "niossys.sopcinfo" dosyasını seçiyoruz. Proje adını yazıyoruz. "Template" kısmından "Hello World" programını seçiyoruz ve "Finish"e tıklıyoruz.



Eğer "Console" penceresinde herhangi bir hata mesajı yoksa herşey yolunda gitti demektir.


hello_world.c dosyasını bularak aşağıdaki şekilde değiştiriyoruz.




"Project" menüsünden "Build All"u seçerek programı derliyoruz.



Derleme işlemininin ardından sıra son hamle olarak programı işlemciye yükleyip çalıştırmada. "Run" menüsünden "Run As->Nios II Hardware"i seçiyoruz.


Ve bu kadar. Program çalışıp, LED'leri "10101010" olacak şekilde yakıyor...