VHDL de unsigned işlemlerin C dili ile kıyaslanması.

Başlatan yamak, 22 Kasım 2011, 13:17:43

yamak

Merhaba arkadaşlar;
VHDL de şöyle bir olay var. Mesela 4 bitlik unsigned 2 sayı tanımladım 1.sı "1111" ikincisi "0110" bu iki sayıyı toplayınca sonuc "0101" çıkıyo yani bir sayıyı sınır değeriyle toplarsam sayıyı 1 eksiltiyo ya da sınır değerinin 1 eksiğiyle toplarsam 2 eksiltiyo. Merak ettiğim bu olay sadece vhdl e mi özgü yoksa c dilinde de böyle bişey oluyo ben olmuyo diye biliyom hatta sınır değerini aştığın için derleyici uyarı veriyo diyo biliyom.

muuzoo

Olay tamamen sizin tasarımınızla alakalı. Bakın vhdl'de yazdığınız kodlar karşılığında fiziksel bir devre oluşturulur. Siz taşma durumunu dikkate almaz iseniz derleyicinin bu konuda yapabileceği birşey yoktur. C dilinde de buna benzer hatalar yapabilirsiniz. Tanımladığınız değişken diyelim ki unsigned char olsun. Bu değişken tipinin taşmasına neden olacak bir işlem yaparsanız siz de yanlış sonuçlar görebilirsiniz. Hatta bu sıkça yapılan bir hatadır. Belirttiğiniz toplama işleminde taşmayı engellemek için önlem almanız gerekir. Önlemden ziyade bu işin kuralıdır. İkilik tabanda işlem yaparken işlem yapılan değerin uzunluğuna göre tasarım yapılır. iki adet 4 bitlik sayının toplamının alabileceği azami değer sonucu 5 bitlik bir sayı oluşturabilir sizde sonuç dekişkeninizi buna göre tasarlarsınız. Kısaca toplama işlemi için, eğer sayılar N bit uzunluğunda ise sonuc değişkeni N+1 bit olmalı. Yaptığınız işlem çarpma ise, 2N uzunluğunda olmalı.

Sizin işleminizi ele alalım. Yaptığın işlem "1111" + "0110". 1111 ifadesi 15 sayısına tekabül eder. "0110" ise 6 sayısına tekabül eder. ikisinin toplamının sonucu 21, ikilik tabandaki karşılığı "10101" dir. Siz burada taşma durumunu dikkate almadığınız için sonucu "0101" olan kısmını görüyorsunuz sadece. Olay 1 eksiltme ya da 2 eksiltme durumu değil.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

yamak

Tamam hocam teşekkür ederim. Zaten yapmak istediğim şey böyle bir kullanımla azaltma yapmaktı. Ama işin söylediğiniz gibi olduğu aklıma gelmemişti. Sanki sınır değeri aşıldığında tekrar sıfıra dönüyo gibi bişey anladım ben.