Erdem
Paylaşımcı üye
- Katılım
- 14 Ocak 2013
- Mesajlar
- 713
- Puanları
- 106
Aslında arkadaşlar bu konu, benim de yeni öğrenmekte olduğum bir konu.
Verilog öğrenmek isteyen arkadaşlar en baştan bu konuyu araştırma zahmetine girmesin diye kısaca giriş seviyesinde bir yazı hazırlamayı düşündüm.
Diyelim ki donanım düzeyinde yukarıdaki işlevi Verilog kullanarak gerçekleştirmek istiyoruz.
Gördüğünüz gibi Verilog kodu oldukça basit. a, b ve c'yi giriş olarak tanımladık. y ise çıkış olacak.
Yazdığımız işlevin doğru çalışıp çalışmadığını sınamamız gerekiyor.
Sınama için farklı şekilde sınama tezgahları yazmak mümkün olsa da şimdilik en basitini yazıyoruz.
Dikkat ederseniz sina1 işlevinin herhangi bir girişi ya da çıkışı yok. İlk önce sınanacak cihazı ilklendiriyoruz.
$dumpfile ile bu değişkenleri yazmak istediğimiz kütüğü belirtiyoruz. $dumpvars ile de hangi değişkenlerin kütüğe yazılacağını belirtiyoruz. Bir sonraki kısımda ise basitçe değişkenlere vermek istediğimiz değerleri belirtiyoruz. Daha sonra bir süre bekliyoruz. Örneğin '#10' 10 nano saniye kadar bekle demek.
Kodu derleyelim.
Çalıştıralım.
Oluşturulan dalga şekline bakmak için :
komutunu verebiliriz.
Girişlerin istediğimiz gibi olduğunu görebiliriz.
Dikkat ederseniz çıkış işlevini yani y'nin değerinı sınamadık. Aslında bunun da yöntemleri var. Ama şimdilik yazıyı giriş seviyesinde tutmak için bu noktada sonlandırıyorum.
Daha önceki Verilog'a giriş niteliğindeki yazı için buraya bakabilirsiniz.
Verilog öğrenmek isteyen arkadaşlar en baştan bu konuyu araştırma zahmetine girmesin diye kısaca giriş seviyesinde bir yazı hazırlamayı düşündüm.
Diyelim ki donanım düzeyinde yukarıdaki işlevi Verilog kullanarak gerçekleştirmek istiyoruz.
Kod:
module birseyler(input a, b, c,
output y);
assign y = ~b & ~c | a & ~b;
endmodule // birseyler
Gördüğünüz gibi Verilog kodu oldukça basit. a, b ve c'yi giriş olarak tanımladık. y ise çıkış olacak.
Yazdığımız işlevin doğru çalışıp çalışmadığını sınamamız gerekiyor.
Kod:
module sina1;
reg a, b, c;
wire y;
// sınanacak cihazı ilklendir
birseyler dut (.a(a), .b(b), .c(c) , .y(y));
// girişleri birer birer uygula
initial begin
$dumpfile("birseyler.vcd");
$dumpvars(1, sina1.a, sina1.b, sina1.c, sina1.y);
a = 0;
b = 0;
c = 0; // girişleri uygula 10 ns bekle
#10;
c = 1;
#10;
b = 1;
c = 0;
#10;
c = 1;
#10;
a = 1;
b = 0;
c = 0;
#10;
end // initial begin
endmodule // sina1
Sınama için farklı şekilde sınama tezgahları yazmak mümkün olsa da şimdilik en basitini yazıyoruz.
Dikkat ederseniz sina1 işlevinin herhangi bir girişi ya da çıkışı yok. İlk önce sınanacak cihazı ilklendiriyoruz.
$dumpfile ile bu değişkenleri yazmak istediğimiz kütüğü belirtiyoruz. $dumpvars ile de hangi değişkenlerin kütüğe yazılacağını belirtiyoruz. Bir sonraki kısımda ise basitçe değişkenlere vermek istediğimiz değerleri belirtiyoruz. Daha sonra bir süre bekliyoruz. Örneğin '#10' 10 nano saniye kadar bekle demek.
Kodu derleyelim.
$ iverilog -o birseyler birseyler.v sina1.v
Çalıştıralım.
$ vvp birseyler
Oluşturulan dalga şekline bakmak için :
$ gtkwave birseyler.vcd &
komutunu verebiliriz.
Girişlerin istediğimiz gibi olduğunu görebiliriz.
Dikkat ederseniz çıkış işlevini yani y'nin değerinı sınamadık. Aslında bunun da yöntemleri var. Ama şimdilik yazıyı giriş seviyesinde tutmak için bu noktada sonlandırıyorum.
Daha önceki Verilog'a giriş niteliğindeki yazı için buraya bakabilirsiniz.