Veri belleğini değiştirmek zorunda kalmadan, bir yük baytını tek bir döngü veri yoluna uygulamakla ilgili sorulan bir sorun vardı ve çözüm aşağıdaki bir şeydi.Tek bir döngü veriyolunda yarım sözcük ve yükleme baytını yükle
alt text http://img214.imageshack.us/img214/7107/99897101.jpg
Bu aslında oldukça gerçekçi sorudur; Çoğu bellek sistemi, tamamen kelime tabanlı ve bireysel baytlar, yalnızca işlemcinin içinde yalnızca ile ilgilenilir. Birçok bilgisayarda “veriyolu hatası” gördüğünüzde, bu , genellikle işlemcinin numaralı telefonun adresindeki bir bellek adresine düzgün bir şekilde hizalı olmayan bir bellek adresine erişmesi gerektiği ve bellek sisteminin bir istisna oluşturduğu anlamına gelir. Her neyse, bayt adresleri olabilir, çünkü birden fazla 4 olamaz, bunları doğrudan belleğe geçiremeyiz. Ancak, her bayt bazı kelime içinde bulunabilir çünkü biz hala herhangi byte de alabilirsiniz ve tüm kelime adresleri 4'ün katları Yani yaptığımız ilk şey şu kelime olsun emin olmak için toplamak vardır . Yüksek 30 bitlik adresini (yani, ALUresult [31-2]) alır ve 'da iki 0 biti ile birleştirirsek (bu, “sol vardiya 2” birimi gerçekten yapıyor) , 'un istenen baytı içerdiği sözcüğün bayt adresine sahiptir. Bu sadece byte'ın kendi adres olduğunu bu değişiklik Tamam olacak şimdi de yuvarlak adresleri aşağı 4'e katları, ancak lw bağlantısız adreslere beri işe yaramaz demektir 4 bir katına yuvarlanmış Bu bellek ünitesi ile zaten lw için. Tamam, şimdi kelimesini bellekten geri alıyoruz. 'u ondan kurtulmak için nasıl byte alırız? Eh, , bayt içinde baytının ofset ofsetinin yalnızca bayt'ın düşük sipariş 2 bitleri tarafından verildiğini unutmayın. Bu nedenle, biz bir 0xbitlerini kullanarak, uygun bir bayt 'u bir mux kullanarak sözcükten çıkarıyoruz. büyük-endian bayt numaralandırmanın kullanılmasına dikkat edin, MIPS için uygundur. Ardından, biz sorununun yapması için belirttiğinden, baytını 32 bitlerine (yani, 24 sıfır ile birleştirerek) sıfır-genişletmek zorundayız. Aslında, bu, sorusunda ufak bir hataydı: gerçekte, lbu yönergesi, bayt sıfırlar, ancak lb işareti genişletir. Oh iyi. Son olarak, bir yeni girişi kabul etmek için MemtoReg denetimli bir mux genişletmeliyiz: lb kasası için sıfır genişletilmiş bayt. MemtoReg kontrolü sinyali 2 bite genişletilmelidir. orijinal 0 ve 1 durumları sırasıyla 00 ve 01, değiştirmek ve sadece lb
Oldukça aslında nasıl anlamıyorum durumda kullanılan yeni vaka 10 eklemek Bu açıklama, özellikle de solda kayma anlatıldıktan sonra bile çalışır, ALU sonucunu 2 byte verirdi ... bu nasıl mümkün olabilir?bu yüzden eğer yarım sözcük yüklemek istersem o zaman bir sol vardiya yapardım ve yarım kelimenin adresini alırdım? yük baytını yapmak için daha iyi bir yol ne olurdu, veri hafızasını değiştirerek yarım kelimeyi yükle? (yukarıdaki soru, veri belleğini değiştiremeyeceğimiz kısıtlamaları koyar)
böylece nokta budur. 1. Bu, 2'ye sola kaymadan çalışmak zorunda kalacak mı? 2. Yarım kelime yapmak istiyorsam 2x1 mux olmalı ve kontrol sinyali olarak en az anlamlı biti kullanmalı mıyım? – aherlambang
1) Gerçekten iki tarafından sola kayma yok. İki tarafından bir sağa kayma vardır (iki LSB'nin düşürülmesinden kaynaklanır: ALUResult [31-2]) ve iki tarafından sola kaydırma, bitleri aynı yere geri döndürür (iki LSB'de sıfır). Alt iki bitin maskelenmesi daha açık olacaktır. 2) Hizalanmış bir yarım sözcük okuması yapmak için, bir 16-bit 2-1 çoklayıcıyı kontrol etmek için ALUresult [1] kullanırsınız. Bu bellekle rasgele tek döngülü yarım sözcük okumalarını destekleyemezsiniz, çünkü hizalanmamış durumlardan biri (adres LSB = 11), iki farklı 32 bit sözcükten byte gerektirir (ör: iki bellek erişimi). –