Anakartlarımızdaki bellek soketlerine yerleştirdiğimiz baskı devreleri, anakarta bağlandıkları veri yolunun genişliğine göre DIMM (Dual Inline Memory Module) ve SIMM (Single Inline Memory Module) gibi kısaltmalarla adlandırıyoruz; sanırız bunun da haklı bir sebebi var (!). Bugünlerde en popüler olanı, üzerinde genellikle bant genişliği yüksek ve dolayısıyla daha geniş veriyoluna ihtiyaç duyan DDR bellek yongalarını barındıran DIMM'ler. Dizüstü bilgisayarlarda kullanılan DIMM'ler fazla yer kaplamamaları için küçük olduklarından SO-DIMM (Small Outline Dual Inline Memory Module) yani küçük izdüşümlü RAM adını alıyorlar. DIMM'lere baktığımızda, genellikle 4,8 ya da 16 gibi belli sayılarda bellek yongaları, dirençler ve kondansatörlerin yanısıra SPD (Serial Presence Detect) denilen bir ROM yongası bulunduğunu görebiliriz.


DIMM üzerindeki bellek yongaları (büyük olanlar) ve SPD yongası (sol alt köşe)

SPD yongası üzerinde, yazımızın ilerleyen bölümlerinde daha detaylı değineceğimiz, baskı devre üzerindeki bellek yongalarıyla ilgili çeşitli parametreler saklanır. Bu parametrelerin zamanlamayla ilgili olanları (örn. CAS gecikmesi), üretimden sonra yapılan perfromans testleri sonucunda modülün kararlı olarak çalışabileceği en üst performansı gerçekleyecek şekilde belirlenir ve SPD üzerine işlenir. Bellek modülü anakarta yerleştirildikten sonra, SPD üzerindeki bu parametreler boot esnasında BIOS tarafından okunur ve sistemin bellek kontrolüyle ilgili kısımları (yonga seti) gerektiği şekilde haberdar edilir, böylece bellekle olan iletişim sağlanmış olur. Bellek modülünün üreticisi olan firmanın kodu, modülün üretim tarihi, seri numaralrı, bellek yongalarının kapasiteleri ve erişimleriyle ilgili bilgiler SPD yongasında saklanan diğer bilgiler arasında yer alır.

Bizi ilgilendiren asıl kısım ise bellek yongaları. Bunlar, tıpkı mikroişlemciler gibi, kılıflanmış tümleşik devreler. Üretim teknolojisi yani transistörlerin minyatürleştirilmesi bakımından bazı durumlarda işlemcilerden bir nesil önde gidenlerine rastlamak bile mümkün. Yonga üzerinde yer alan ve milyonlarcasının bir araya gelerek bellek dizisini oluşturduğu temel yapı, verinin en temel hali olan bir bitlik veriyi yani ikilik düzendeki 0 veya 1 bilgisini saklamakla sorumlu RAM hücresidir. Bir yongada bu hücreden milyonlarcası kullanıldığından, tasarım ve üretimde çalışan mühendisleri meşgul tutan ve para kazanmalarını sağlayan konuların başında bu bellek hücresini en az yer kaplayacak, en az fireyle en verimli şekilde üretilebilecek şekilde tasarlamak yer alır.

Bellek yongasının nasıl çalıştığını anlamak için önce bu tümdevrenin yapısını inceleyelim. Elimizde bir bellek dizini var. Bu dizini belli sayıda satır ve sütünlardan oluşan iki boyutlu bir tablo olarak düşünebiliriz. Tablomuzun yapıtaşları ise bahsettiğimiz RAM hücreleri. Bu tablo üzerindeki herhangi bir hücreye erişmek (yazmak ya da okumak) için o hücrenin tablodaki konumunu, yani, hangi satır ve sütünun kesişim noktasında bulunduğunu vermemiz gerekir. Bu konum bilgisine adres diyoruz. Erişimi kolaylaştırmak için genelde bellek tablomuz yonga üzerinde daha küçük alt tablolara bölünmüştür. Bu alt tablolara banka (bank) deniyor. Günümüzde bellek yongaları genelde 4 bankalı olarak tasarlanıyor. Kısaca, adresimiz satır ve sütün numaralarının yanısıra bir banka numarasını da içeriyor. Bu sayede bellek yongası hangi bankanın kaçıncı satırındaki kaçıncı sütunundaki hücreye erişim yapılmak istendiğini biliyor. İşlemcilerin belleğe erişirken kullandığı en küçük veri birimi tek bir bit yerine 8 bitten oluşan bayt (byte)'tır. Bu yüzden bellek yongalarında erişilebilen en küçük veri birimi de byte olarak düzenlenmiştir. Böylece bellek tablomuz satır, sütun ve banka adres bilgileriyle erişilen byte'lardan oluşuyor. Diğer bir deyişle bir byte'ı oluşturan ve tablomuzda yanyana konumlanmış olan 8 RAM hücresi aynı anda okunuyor ya da yazılıyor. Bu aslında gerçekte olanın basitleştirilmiş hali. Kullandığımız bellek modüllerinde anakarta bağlantıyı sağlayan veri yolunun genişliği göze önüne alındığında - ki bu DIMMlerde 128 bittir - aynı anda çok sayıda byte okumak mümkün (128bit/8bit=16 byte).

Sanıyorum ki bu noktada bir bankanın yapısını ve nasıl işlediğini incelemek yerinde olacaktır. Bu kısımda günümüzde en popüler olan SDR-RAM ve DDR-RAM bellek tiplerinin temel çalışma prensibi olan dinamik RAM nasıl çalışır hep birlikte göreceğiz. Bahsettiğimiz gibi, banka, esas olarak belli sayıda satır ve sütunlardan oluşan bir byte tablosu. Bu tablodan byte'larımızı okumak için satır ve sütun numarasını yani adresini vermemiz yeterli. Simdi byte'larımızı oluşturan bitlerimize yani RAM hücrelerimize döndüğümüzde nasıl oluyor da bu hücrelerde saklanan veri ile dışarı dünya arasında iletişim sağlanıyor biraz daha yakından bakalım.



RAM hücremizi dışarıya bir vanayla bağlı olan bir hazne olarak düşünelim. Verimizi yani hücrelerde saklanan 0 veya 1 değerlerinden birini saklayan bitlerimizi de haznemizin boş ya da dolu olma durumu olarak, suyu ise yine aktığını varsayabileceğimiz elektriksel yük yani elektronlar olarak modelleyelim. Buna modele göre, RAM hücrelerimiz, yani küçük su hazneciklerimiz, saklayacakları veri 0 ise boş, 1 ise dolu oluyor. Bellek tablomuzda bir sütunda yer alan yani dikey olarak komşu olan haznelerin tümü ortak bir boruya bağlı. Her sütunda bulunan bu ortak borunun elektronikteki karşılığı bit hattı. Bit hattına her okuma veya yazma işleminden önce ayrı bir vana üzerinden su dolduruluyor. Buna birazdan daha detaylı deyineceğiz. Bu boruların bir ucunda, borudaki su seviyesini algılayan algı yükselticisi denilen birimler bulunuyor. Erişim sırasında, önce adresin gösterdiği satırdaki bütün hazneleri bulundukları sütunlardaki ana boruya bağlayan küçük vanalar aynı anda açılıyor ve tüm satırın sakladığı veri okunuyor. Sıra geliyor bu satırın hangi sütununun ayıklanacağına. Bunun için, bir kısmı satırla ilgili işlemlere eş zamanlı olarak, adresin gösterdiği sütun numarası çözümleniyor, o sütuna ait byte'ın algılayıcılarına algıla komutu veriliyor ve o byte okunmuş oluyor.

Hazne 0 mı yoksa 1 mi saklıyor bilmek istediğimizde, yani hücremizi okumak istediğimizde, haznemizi bit hattına bağlayan vanasını açıyoruz. Haznemiz boş ise önceden ağzına kadar suyla dolu olan borudaki (bit hattı) suyun haznemizin alabileceği kadar kısmı haznemizin içine doluyor ve ana borumuzdaki su biraz eksiliyor. Bit hattımızın ucunda yer alan su seviyesi algılayıcısı (algı yükselticisi), boru tamamen su doluysa 1, bir hazne kadar su eksilmişse 0 veriyor. Her sütunun altında o sütunun ana borusuna bağlı bir algılayıcı yer alıyor. Tekrar okuma işlemine geri dönersek, haznemiz okuma öncesi haznemiz boş ise yani 0 saklıyorsa vanası açıldığında ana borudaki su içine doluyor, ana borudaki su seviyesi düşüyor ve algılayıcımız 0 veriyor yani hücremizde saklanan veriyi doğru olarak dışarı aktarıyor. Haznemiz okuma öncesi zaten dolu ise (1 saklanıyorsa) haznemizin vanası açıldığında hiçbir su akışı olmuyor ve algılayıcımız dışarıya 1 değerini doğru olarak iletiyor. Bu noktada önemli bir konuyu açıklamak gerekiyor ki eminim bazı okuyucularımızın dikkatinden kaçmamıştır. Haznemiz 0 saklıyorsa yani boşsa, okuma işleminden sonra içine su doluyor, dolayısıyla içeriği bozuluyor ve bir anda 1 saklıyormuş durumuna geliyor. Aynı olay 1 saklama durumunda gerçekleşmiyor. Peki bu pratikte nasıl engelleniyor? Unutmayalım ki amacımız hazneyi, içeriğini bozmadan okuyabilmek. Basit bir fikir olarak, okuma işleminden sonra algılayıcımızın algıladığı değeri hücremize tekrar yazmak aklımıza gelebilir ancak bu performans açısından büyük kayıp olur. Düşünsenize, 0 olan her bit için her okuma sonrası bir de yazma işlemi için bekle. Gerçekte olay çok daha basit: Haznemiz ana borudaki suyun içine akmasına izin veriyor ancak bu suyu içinde saklamıyor, bunun yerine bir bakıma kanalizasyon diye nitelendirecegimiz çok daha büyük ve bellekteki her hazne tarafından paylaşılan başka bir hazneye başka bir kanalla boşaltıyor. Hücremizi kanalizasyona bağlayan kanal yine bir vana tarafından kontrol ediliyor. Haznemiz doluyken, kendi içindeki bir geri beslemeyle bu vana kapalı tutuluyor ve böylece hazneden kanalizasyona su kaçışı engelleniyor. Hazne boşken ise bu vana açılıyor. Bu kanalizasyonun elektronikteki karşılığı toprak. Böylece boşsa yine boş kalarak ama yapması gerektiği gibi bağlı olduğu sütunun bit hattındaki yani ana borusundaki suyun seviyesini azaltarak sakladığı verinin algılayıcı tarafından doğru olarak algılanmasını sağlıyor.



RAM Nasıl Çalışır?
Umut Ekşi - 15 Temmuz 2003 0:11
Nasıl Çalışır? » Bellek Etiketler: bellek, ram
Yazdırılabilir Sayfa Gönder del.icio.us 47 yorum
Çalışma Prensipleri
Anakartlarımızdaki bellek soketlerine yerleştirdiğimiz baskı devreleri, anakarta bağlandıkları veri yolunun genişliğine göre DIMM (Dual Inline Memory Module) ve SIMM (Single Inline Memory Module) gibi kısaltmalarla adlandırıyoruz; sanırız bunun da haklı bir sebebi var (!). Bugünlerde en popüler olanı, üzerinde genellikle bant genişliği yüksek ve dolayısıyla daha geniş veriyoluna ihtiyaç duyan DDR bellek yongalarını barındıran DIMM'ler. Dizüstü bilgisayarlarda kullanılan DIMM'ler fazla yer kaplamamaları için küçük olduklarından SO-DIMM (Small Outline Dual Inline Memory Module) yani küçük izdüşümlü RAM adını alıyorlar. DIMM'lere baktığımızda, genellikle 4,8 ya da 16 gibi belli sayılarda bellek yongaları, dirençler ve kondansatörlerin yanısıra SPD (Serial Presence Detect) denilen bir ROM yongası bulunduğunu görebiliriz.



DIMM üzerindeki bellek yongaları (büyük olanlar) ve SPD yongası (sol alt köşe)


SPD yongası üzerinde, yazımızın ilerleyen bölümlerinde daha detaylı değineceğimiz, baskı devre üzerindeki bellek yongalarıyla ilgili çeşitli parametreler saklanır. Bu parametrelerin zamanlamayla ilgili olanları (örn. CAS gecikmesi), üretimden sonra yapılan perfromans testleri sonucunda modülün kararlı olarak çalışabileceği en üst performansı gerçekleyecek şekilde belirlenir ve SPD üzerine işlenir. Bellek modülü anakarta yerleştirildikten sonra, SPD üzerindeki bu parametreler boot esnasında BIOS tarafından okunur ve sistemin bellek kontrolüyle ilgili kısımları (yonga seti) gerektiği şekilde haberdar edilir, böylece bellekle olan iletişim sağlanmış olur. Bellek modülünün üreticisi olan firmanın kodu, modülün üretim tarihi, seri numaralrı, bellek yongalarının kapasiteleri ve erişimleriyle ilgili bilgiler SPD yongasında saklanan diğer bilgiler arasında yer alır.

Bizi ilgilendiren asıl kısım ise bellek yongaları. Bunlar, tıpkı mikroişlemciler gibi, kılıflanmış tümleşik devreler. Üretim teknolojisi yani transistörlerin minyatürleştirilmesi bakımından bazı durumlarda işlemcilerden bir nesil önde gidenlerine rastlamak bile mümkün. Yonga üzerinde yer alan ve milyonlarcasının bir araya gelerek bellek dizisini oluşturduğu temel yapı, verinin en temel hali olan bir bitlik veriyi yani ikilik düzendeki 0 veya 1 bilgisini saklamakla sorumlu RAM hücresidir. Bir yongada bu hücreden milyonlarcası kullanıldığından, tasarım ve üretimde çalışan mühendisleri meşgul tutan ve para kazanmalarını sağlayan konuların başında bu bellek hücresini en az yer kaplayacak, en az fireyle en verimli şekilde üretilebilecek şekilde tasarlamak yer alır.

Bellek yongasının nasıl çalıştığını anlamak için önce bu tümdevrenin yapısını inceleyelim. Elimizde bir bellek dizini var. Bu dizini belli sayıda satır ve sütünlardan oluşan iki boyutlu bir tablo olarak düşünebiliriz. Tablomuzun yapıtaşları ise bahsettiğimiz RAM hücreleri. Bu tablo üzerindeki herhangi bir hücreye erişmek (yazmak ya da okumak) için o hücrenin tablodaki konumunu, yani, hangi satır ve sütünun kesişim noktasında bulunduğunu vermemiz gerekir. Bu konum bilgisine adres diyoruz. Erişimi kolaylaştırmak için genelde bellek tablomuz yonga üzerinde daha küçük alt tablolara bölünmüştür. Bu alt tablolara banka (bank) deniyor. Günümüzde bellek yongaları genelde 4 bankalı olarak tasarlanıyor. Kısaca, adresimiz satır ve sütün numaralarının yanısıra bir banka numarasını da içeriyor. Bu sayede bellek yongası hangi bankanın kaçıncı satırındaki kaçıncı sütunundaki hücreye erişim yapılmak istendiğini biliyor. İşlemcilerin belleğe erişirken kullandığı en küçük veri birimi tek bir bit yerine 8 bitten oluşan bayt (byte)'tır. Bu yüzden bellek yongalarında erişilebilen en küçük veri birimi de byte olarak düzenlenmiştir. Böylece bellek tablomuz satır, sütun ve banka adres bilgileriyle erişilen byte'lardan oluşuyor. Diğer bir deyişle bir byte'ı oluşturan ve tablomuzda yanyana konumlanmış olan 8 RAM hücresi aynı anda okunuyor ya da yazılıyor. Bu aslında gerçekte olanın basitleştirilmiş hali. Kullandığımız bellek modüllerinde anakarta bağlantıyı sağlayan veri yolunun genişliği göze önüne alındığında - ki bu DIMMlerde 128 bittir - aynı anda çok sayıda byte okumak mümkün (128bit/8bit=16 byte).

Sanıyorum ki bu noktada bir bankanın yapısını ve nasıl işlediğini incelemek yerinde olacaktır. Bu kısımda günümüzde en popüler olan SDR-RAM ve DDR-RAM bellek tiplerinin temel çalışma prensibi olan dinamik RAM nasıl çalışır hep birlikte göreceğiz. Bahsettiğimiz gibi, banka, esas olarak belli sayıda satır ve sütunlardan oluşan bir byte tablosu. Bu tablodan byte'larımızı okumak için satır ve sütun numarasını yani adresini vermemiz yeterli. Simdi byte'larımızı oluşturan bitlerimize yani RAM hücrelerimize döndüğümüzde nasıl oluyor da bu hücrelerde saklanan veri ile dışarı dünya arasında iletişim sağlanıyor biraz daha yakından bakalım.



RAM hücremizi dışarıya bir vanayla bağlı olan bir hazne olarak düşünelim. Verimizi yani hücrelerde saklanan 0 veya 1 değerlerinden birini saklayan bitlerimizi de haznemizin boş ya da dolu olma durumu olarak, suyu ise yine aktığını varsayabileceğimiz elektriksel yük yani elektronlar olarak modelleyelim. Buna modele göre, RAM hücrelerimiz, yani küçük su hazneciklerimiz, saklayacakları veri 0 ise boş, 1 ise dolu oluyor. Bellek tablomuzda bir sütunda yer alan yani dikey olarak komşu olan haznelerin tümü ortak bir boruya bağlı. Her sütunda bulunan bu ortak borunun elektronikteki karşılığı bit hattı. Bit hattına her okuma veya yazma işleminden önce ayrı bir vana üzerinden su dolduruluyor. Buna birazdan daha detaylı deyineceğiz. Bu boruların bir ucunda, borudaki su seviyesini algılayan algı yükselticisi denilen birimler bulunuyor. Erişim sırasında, önce adresin gösterdiği satırdaki bütün hazneleri bulundukları sütunlardaki ana boruya bağlayan küçük vanalar aynı anda açılıyor ve tüm satırın sakladığı veri okunuyor. Sıra geliyor bu satırın hangi sütununun ayıklanacağına. Bunun için, bir kısmı satırla ilgili işlemlere eş zamanlı olarak, adresin gösterdiği sütun numarası çözümleniyor, o sütuna ait byte'ın algılayıcılarına algıla komutu veriliyor ve o byte okunmuş oluyor.

Hazne 0 mı yoksa 1 mi saklıyor bilmek istediğimizde, yani hücremizi okumak istediğimizde, haznemizi bit hattına bağlayan vanasını açıyoruz. Haznemiz boş ise önceden ağzına kadar suyla dolu olan borudaki (bit hattı) suyun haznemizin alabileceği kadar kısmı haznemizin içine doluyor ve ana borumuzdaki su biraz eksiliyor. Bit hattımızın ucunda yer alan su seviyesi algılayıcısı (algı yükselticisi), boru tamamen su doluysa 1, bir hazne kadar su eksilmişse 0 veriyor. Her sütunun altında o sütunun ana borusuna bağlı bir algılayıcı yer alıyor. Tekrar okuma işlemine geri dönersek, haznemiz okuma öncesi haznemiz boş ise yani 0 saklıyorsa vanası açıldığında ana borudaki su içine doluyor, ana borudaki su seviyesi düşüyor ve algılayıcımız 0 veriyor yani hücremizde saklanan veriyi doğru olarak dışarı aktarıyor. Haznemiz okuma öncesi zaten dolu ise (1 saklanıyorsa) haznemizin vanası açıldığında hiçbir su akışı olmuyor ve algılayıcımız dışarıya 1 değerini doğru olarak iletiyor. Bu noktada önemli bir konuyu açıklamak gerekiyor ki eminim bazı okuyucularımızın dikkatinden kaçmamıştır. Haznemiz 0 saklıyorsa yani boşsa, okuma işleminden sonra içine su doluyor, dolayısıyla içeriği bozuluyor ve bir anda 1 saklıyormuş durumuna geliyor. Aynı olay 1 saklama durumunda gerçekleşmiyor. Peki bu pratikte nasıl engelleniyor? Unutmayalım ki amacımız hazneyi, içeriğini bozmadan okuyabilmek. Basit bir fikir olarak, okuma işleminden sonra algılayıcımızın algıladığı değeri hücremize tekrar yazmak aklımıza gelebilir ancak bu performans açısından büyük kayıp olur. Düşünsenize, 0 olan her bit için her okuma sonrası bir de yazma işlemi için bekle. Gerçekte olay çok daha basit: Haznemiz ana borudaki suyun içine akmasına izin veriyor ancak bu suyu içinde saklamıyor, bunun yerine bir bakıma kanalizasyon diye nitelendirecegimiz çok daha büyük ve bellekteki her hazne tarafından paylaşılan başka bir hazneye başka bir kanalla boşaltıyor. Hücremizi kanalizasyona bağlayan kanal yine bir vana tarafından kontrol ediliyor. Haznemiz doluyken, kendi içindeki bir geri beslemeyle bu vana kapalı tutuluyor ve böylece hazneden kanalizasyona su kaçışı engelleniyor. Hazne boşken ise bu vana açılıyor. Bu kanalizasyonun elektronikteki karşılığı toprak. Böylece boşsa yine boş kalarak ama yapması gerektiği gibi bağlı olduğu sütunun bit hattındaki yani ana borusundaki suyun seviyesini azaltarak sakladığı verinin algılayıcı tarafından doğru olarak algılanmasını sağlıyor.



Okuma işlemini biraz olsun açıklığa kavuşturduktan sonra bakalım yazma işlemi nasıl gerçekleşiyor. Yazma işleminde amacımız haznemizin içeriğini gereken durumlarda değiştirmek. Gereken durumlardan kastettiğimiz, hücremize yazmak istediğimiz değer, hücremizin hali hazırda sakladığıyla aynıysa, herhangi bir değişikliğe gerek olmaması. Mekanizma, okumayla hemen hemen aynı. Yazma işlemi öncesi tıpkı okumada olduğu gibi sütuna ait ana boru suyla dolduruluyor. Bunun yapılma sebebi, önceden gerçekleşmiş bir yazma veya okuma işlemi nedeniyle ana borudaki su seviyesinde azalma olduysa bu eksiği tamamlamak, çünkü gördüğümüz gibi bu temel çalışma prensiplerinden birisi. Yazma işlemi sırasında istenilen hücrenin (haznenin) vanası açılıyor ve yazmak istediğimiz verinin 0 ya da 1 olmasına göre algılayıcıların bulunduğu ucundan ya haznenin bağlı bulunduğu sütundaki ana borudan yüksek basınçla su emiliyor (0) ya da boruya yüksek basınçta su basılıyor (1). Haznemiz boşsa vanası açılınca bir ucundan zaten ana borudan su emildiği için yine boş kalıyor, içine su dolmuyor. Aynı şekilde haznemiz doluysa ve 1 yazılmak isteniyorsa boruya basınçlı bir şekilde su basıldığı için haznemiz yazma işlemi sırasında yine dolu kalıyor. Öte yandan, haznemiz boş ise ve 1 yazılacaksa, yani dolması isteniyorsa, vanası açıldığında ana borudaki basınçlı su, hücrenin kanalizasyona olan su akışını bastırarak dolmasını sağlıyor ve hazne dolunca da geri besleme mekanizmasıya kanalizasyona açılan vana kapanıyor, haznemiz dolu kalıyor ve böylece sakladığı yeni veri 1 olarak değişmiş oluyor. Benzer şekilde, haznemiz dolu ise ve 0 yazılmak yani boşaltılmak isteniyorsa, yazma işlemi sırasında borunun ucundan basınçla su emiliyor, haznemizin vanası açıldığında emme gücüyle dolu olan haznemizdeki su da ana boruya çekilerek emiliyor. Hazne boşaldığında kanalizasyona olan bağlantı da boşalma işlemine destek olarak açılıyor ve işlem sonunda ana boruya bağlantı vanası kapandığımnda hücremiz boş olarak yeni verisi olan 0'ı saklamış oluyor.



Bellek yongaları

Bir seviye üste çıktığımızda, bankaların ortak bir veri hattına birarada bağlanmasıyla ana bellek tablomuzun oluştuğunu görürüz. Bellek tablosunun yanında, adreste gösterilen banka numarasını çözen, yongayı gerektiğinde güç tasarrufu gibi nedenlerle kapatıp açılmasını, belirli komutların çalıştırılmasını kontrol eden kontrol yazmaçları (mode register) ve saat sinyalinin alınıp bankalara dağıtılmasını sağlayan sürücü devreleri bellek yongasını oluşturur.