2010-03-03 14 views
5

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)

cevap

3

Orijinal yazar, bellekten okunan 32 bit verilere bir bayt çoklayıcı ekliyor gibi görünüyor. Bu bellek tam 32 bit doğal olarak hizalanmış bir yüke (lw komutu) izin verir ve ek bayt çoklayıcı ve sıfır uzantısı da yük bayt komutlarına izin verir (lbu komutu).

ALU sonucunun sola kayması, bir bayt adresi olan bir kelime adresini verir ve sinyal yönlendirmesinde örtük sağa kaydırmayı hesaplar. Sonuç, basit bir şekilde, ALU sonucunun alt iki bitinin belleğe gönderilmeden önce maskelenmiş (sıfırlanmış) olmasıdır. ALU değerinin iki LSB'si, belleğin aşağı akışından bayt çoklayıcıya beslenir ve kelime belleğinin keyfi baytları okumasına izin verir.

Yarım sözcükleri (16 bit), yalnızca baytları ve tam 32 bit sözcükleri yüklemek için gösterilen mantıkta doğrudan destek yoktur. Bununla birlikte, benzer bir yaklaşım kullanarak bayt yerine (veya hatta her ikisine de) destek vermek için bayt adresleme mantığını kolayca değiştirebilirsiniz.

+0

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

+0

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). –

İlgili konular