آلة ذاكرة الوصول العشوائي


الجزء الأول
الجزء الثاني
الجزء الثالث
الجزء الرابع
الجزء الخامس


تم بالفعل نشر مقال عن جهاز ذاكرة الوصول العشوائي على حبري.
بشكل عام ، توجد مقالة حول جهاز RAM على ويكيبيديا.

تحتوي ذاكرة الوصول العشوائي RAM-machine ، التي ورد ذكرها في كتاب "تجميع وتحليل الخوارزميات الحسابية": Aho، Hopcroft، Ulman - على مجموعة محدودة من الإرشادات الحسابية (الجمع والطرح والضرب والقسمة) ، أمر قفزة غير مشروط ، أمرين للقفز الشرطي. في حالتنا ، من الأوامر الحسابية ، لن يكون هناك سوى الجمع والطرح ، وستكون أوامر الفرع (الانتقال) مطابقة للأوامر الواردة في الكتاب.

الفرق بين LIttle Man Computer (الذي وصفته في الأجزاء السابقة من الدورة) من جهاز RAM هو الآلية التي توفر عنونة غير مباشرة (القدرة على العمل مع الرقم المخزن في الذاكرة كعنوان).

من أجل التعامل مع الرقم المخزن في الذاكرة كعنوان ، قم بالاتصال بإدخال عنوان ذاكرة البيانات معدد إرسال MUX الذي يحدد بين العنوان نفسه (القادم من ذاكرة القيادة ) والرقم الذي يمثل العنوان ومخزن في ذاكرة البيانات .



سنقوم بتحميل الرقم من الذاكرة في السجل في كل مرة يتم فيها جلب أمر جديد من ذاكرة القيادة . عند التبديل معدد MUX ، ينتقل إلى العنوان المسجل في سجل العنوان.



سنقوم أيضًا بتحميل ، وتحميل عنوان الأمر في بطارية Acc كعدد ، لذلك سنزيد عمق البت في إدخال عنوان معدد الإرسال ، الذي يحدد البيانات المراد تحميلها في Ass البطارية. يتم تحميل العنوان على الإدخال الرابع من المضاعف.



سيتم تنفيذ الأمر في تدبيرين. للقيام بذلك ، قم بتوصيل جهازي D-flip-flops بالساعة ، مما يؤدي إلى تبديل كل منهما الآخر عند وصول إشارة الساعة.



تقوم الدورة الأولى بتحميل العنوان في سجل العناوين ، بينما تقوم الدورة الثانية بتحميل الرقم في مُراكم Acc أو في ذاكرة البيانات .

قم بتوصيل علمين بالبطارية:

1. العلم لجنة التنسيق الإدارية = 0 . يتم رفع العلم إذا كانت محتويات الحمار صفر.

2. علم لجنة التنسيق الإدارية> 0 . يتم رفع العلم إذا كانت محتويات الحمار أكبر من الصفر.


والنتيجة هي مثل هذا المخطط ، والذي يمكن تنزيله من هنا.



هناك حاجة إلى خط الذهاب إلى إدخال متساهل للبطارية بحيث الدائرة ليست عربات التي تجرها الدواب.

قم بإيقاف تشغيل بعض الأوامر وكتابة برنامج يقوم بتحميل الخلية الصفرية لذاكرة البيانات على العنوان المخزن في الخلية الصفرية. في الدورة ، سنزيد قيمة الخلية الصفرية بواحدة. تي أو سنقوم بملء ذاكرة البيانات بالأرقام التسلسلية.

1401 تحميل في لجنة التنسيق الإدارية الرقم 1
1100 إضافة الرقم في Acc إلى الرقم في الخلية صفر
2000 حفظ النتيجة في الخلية صفر
2080 حمّل الرقم من الحساب على العنوان المشار إليه بالخلية الصفرية
0010 القفز إلى بداية البرنامج




سنكتب برنامج يلخص نأعداد طبيعية.
سنكتب الأرقام الطبيعية في الخلية الأولى ، ومجموعها في الخلية 0.
أولاً ، اكتب برنامجًا يقوم بتحميل الأرقام الطبيعية في الخلية الأولى
1401 تحميل في لجنة التنسيق الإدارية الرقم 1
إضافة 1101 الرقم في Acc إلى الرقم في الخلية الأولى
2001 احفظ النتيجة في الخلية الأولى

في الخلية 0 ، سنقوم بإجراء الجمع. بعد زيادة الرقم في الخلية الأولى ، تحتاج إلى إضافة هذا الرقم إلى الخلية 0.
تحميل 1300 في acc الرقم من الخلية 0
إضافة 1101 الرقم في Acc إلى الرقم في الخلية الأولى
2000 حفظ النتيجة في الخلية 0
0010 القفز إلى بداية البرنامج

النص الكامل للبرنامج
1401
1101
2001
1300
1101
2000
0010

من أجل حساب نمن حيث التقدم الحسابي ، من الضروري تحميل المصطلح الأول في الخلية 0 a0، في الخلية الأولى تحميل الفرق من التقدم الحسابي د.
بعد ذلك ، تحتاج إلى تلخيص:
تحميل 1300 في acc الرقم من الخلية 0
إضافة 1101 الرقم في Acc إلى الرقم في الخلية الأولى
2000 حفظ النتيجة في الخلية 0
بعد ذلك ، تحتاج إلى القفز 3 فرق مرة أخرى وتكرار هذه المجموعة من العمليات نمرات.


يمكن تنزيل محاكي جهاز ذاكرة الوصول العشوائي الكلاسيكية (مع أشرطة منفصلة للقراءة / الكتابة) من هنا .



دعونا نتحقق من كيفية عمل الدائرة التي تتكون من اثنين من مشغلات d. توفر هذه الدائرة وضع لمدة ساعتين.
فلنكتب مخطط المشغل العادي (بدون إعادة الضبط والتمكين). سيكون لديه منفذي الإدخال - منفذ البيانات ومنفذ الساعة.
module dff ( input [1:0] key, output led ); wire clk; assign clk = key [0]; //   wire d = key [1]; //   reg q; always @(posedge clk) q <= d; assign led = q; endmodule 


يُظهر مؤشر LED LED حالة المشغل d.
نحن نربط اثنين dffs إلى الدائرة المشتركة.
سيتم الإشارة إلى حالة أول مشغل d بواسطة q1_led LED.
سيتم الإشارة إلى حالة المشغل d الثاني باستخدام مصباح LED q2_led .
نخرج إشارة الساعة إلى مصباح LED q3_led منفصل.

 module dff_dff ( input clk, output q1_led, q2_led,q3_led ); assign q3_led = clk; wire d1_in; assign d1_in=~q2_led; dff dff1( .clk(clk), .d(d1_in), .q(q1_led) ); wire d2; assign d2=q1_led; dff dff2( .clk(clk), .d(d2), .q(q2_led) ); endmodule 

يبدو نموذج RTL لوحدة dff_dff بهذا الشكل

لن تعمل هذه الدائرة على جميع اللوحات ؛ فمن الضروري في بعض اللوحات تهيئة d-flip-flops. للسبب نفسه ، لن يتم محاكاة هذا المخطط في ModelSim.

Source: https://habr.com/ru/post/ar432726/


All Articles