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

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

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

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

تقوم الدورة الأولى بتحميل العنوان في سجل العناوين ، بينما تقوم الدورة الثانية بتحميل الرقم في مُراكم
Acc أو في
ذاكرة البيانات .
قم بتوصيل علمين بالبطارية:
1. العلم
لجنة التنسيق الإدارية = 0 . يتم رفع العلم إذا كانت محتويات
الحمار صفر.
2. علم
لجنة التنسيق الإدارية> 0 . يتم رفع العلم إذا كانت محتويات
الحمار أكبر من الصفر.

والنتيجة هي مثل هذا المخطط ، والذي يمكن
تنزيله من هنا.
هناك حاجة إلى خط الذهاب إلى إدخال متساهل للبطارية بحيث الدائرة ليست عربات التي تجرها الدواب.
قم بإيقاف تشغيل بعض الأوامر وكتابة برنامج يقوم بتحميل الخلية الصفرية
لذاكرة البيانات على العنوان المخزن في الخلية الصفرية. في الدورة ، سنزيد قيمة الخلية الصفرية بواحدة. تي أو سنقوم بملء
ذاكرة البيانات بالأرقام التسلسلية.
1401 تحميل في
لجنة التنسيق الإدارية الرقم
11100 إضافة الرقم في
Acc إلى الرقم في الخلية صفر
2000 حفظ النتيجة في الخلية صفر
2080 حمّل الرقم من
الحساب على العنوان المشار إليه بالخلية الصفرية
0010 القفز إلى بداية البرنامج

سنكتب برنامج يلخص
أعداد طبيعية.
سنكتب الأرقام الطبيعية في الخلية الأولى ، ومجموعها في الخلية 0.
أولاً ، اكتب برنامجًا يقوم بتحميل الأرقام الطبيعية في الخلية الأولى
1401 تحميل في
لجنة التنسيق الإدارية الرقم
1إضافة
1101 الرقم في
Acc إلى الرقم في الخلية الأولى
2001 احفظ النتيجة في الخلية الأولى
في الخلية 0 ، سنقوم بإجراء الجمع. بعد زيادة الرقم في الخلية الأولى ، تحتاج إلى إضافة هذا الرقم إلى الخلية 0.
تحميل
1300 في
acc الرقم من الخلية 0
إضافة
1101 الرقم في
Acc إلى الرقم في الخلية الأولى
2000 حفظ النتيجة في الخلية 0
0010 القفز إلى بداية البرنامج
النص الكامل للبرنامج
1401110120011300110120000010من أجل حساب
من حيث التقدم الحسابي ، من الضروري تحميل المصطلح الأول في الخلية 0
، في الخلية الأولى تحميل الفرق من التقدم الحسابي
.
بعد ذلك ، تحتاج إلى تلخيص:
تحميل
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.