<style> body { font-family: "Vazirmatn", sans-serif; direction: rtl; text-align: right; line-height: 1.8; } ul, ol { direction: rtl; text-align: right; list-style-position: inside; padding-right: 1.5em; } li { margin-bottom: 0.5em; } code { background-color: #f5f5f5; color: #c7254e; font-family: "Courier New", monospace; font-size: 90%; padding: 0.2em 0.4em; border-radius: 4px; direction: ltr; unicode-bidi: embed; } pre { background-color: #2d2d2d; color: #f8f8f2; font-family: "Courier New", monospace; font-size: 14px; padding: 1em; border-radius: 8px; overflow-x: auto; direction: ltr; text-align: left; line-height: 1.6; } pre code { background: none; color: inherit; font-size: inherit; padding: 0; } p, h1, h2, h3, h4, h5, h6, li { direction: rtl; unicode-bidi: embed; } </style> ## 1 سوالات --- ### ۱. الگوریتم و پردازش را توضیح دهید. (۱ نمره) پاسخ : ### **الگوریتم (Algorithm) و پردازش (Processing)** #### **۱. تعریف الگوریتم** الگوریتم مجموعه‌ای از **دستورالعمل‌های مرحله‌به‌مرحله، دقیق و محدود** است که برای **حل یک مسئله یا انجام یک کار مشخص** طراحی می‌شود. **ویژگی‌های یک الگوریتم خوب:** ✅ **ورودی (Input):** باید داده‌های ورودی را به‌وضوح مشخص کند. ✅ **خروجی (Output):** باید نتیجه مشخصی داشته باشد. ✅ **قطعی بودن (Definiteness):** هر مرحله باید بدون ابهام باشد. ✅ **محدودیت (Finiteness):** پس از تعداد محدودی مرحله پایان یابد. ✅ **کارایی (Effectiveness):** هر مرحله باید قابل اجرا باشد. **مثال:** الگوریتم جمع دو عدد: ``` 1. دو عدد A و B را بگیر. 2. مقدار C را مساوی A + B قرار بده. 3. C را نمایش بده. ``` --- #### **۲. تعریف پردازش (Processing)** پردازش به **اجرای عملیات‌های محاسباتی یا منطقی روی داده‌ها** توسط یک سیستم کامپیوتری (مثل ریزپردازنده) گفته می‌شود. **مراحل پردازش در ریزپردازنده:** ``` 1. دریافت داده‌ها (Fetch): داده‌ها از حافظه خوانده می‌شوند. 2. رمزگشایی (Decode): دستورالعمل تفسیر می‌شود. 3. اجرا (Execute): عملیات موردنظر (مثل جمع، ضرب، مقایسه) انجام می‌شود. 4. ذخیره نتیجه (Store): نتیجه در حافظه یا رجیسترها ذخیره می‌شود. ``` **مثال:** - وقتی ریزپردازنده دستور `ADD R1, R2` را اجرا می‌کند: - مقادیر رجیسترهای R1 و R2 را می‌خواند. - آن‌ها را جمع می‌کند. - نتیجه را در R1 ذخیره می‌کند. --- #### **۳. ارتباط الگوریتم و پردازش** - **الگوریتم** → **طرح کلی حل مسئله** (مثل دستور پخت غذا). - **پردازش** → **اجرای واقعی الگوریتم** (مثل آشپزی کردن بر اساس دستور). **مثال در ریزپردازنده:** - الگوریتم: ``` 1. عدد X را از حافظه بخوان. 2. عدد Y را از حافظه بخوان. 3. Z = X + Y محاسبه کن. 4. Z را در حافظه ذخیره کن. ``` - پردازش: ریزپردازنده مراحل بالا را به ترتیب اجرا می‌کند. --- #### **۴. تفاوت الگوریتم و برنامه** | **الگوریتم** | **برنامه** | |--------------|------------| | مستقل از زبان برنامه‌نویسی است. | وابسته به یک زبان خاص (مثل اسمبلی یا C) است. | | به صورت مفهومی و ریاضی بیان می‌شود. | به صورت کدهای قابل اجرا نوشته می‌شود. | | مثال: فلوچارت جمع دو عدد. | مثال: کد اسمبلی `ADD AX, BX`. | --- **جمع‌بندی:** - **الگوریتم** → راه‌حل نظری مسئله. - **پردازش** → اجرای عملی الگوریتم توسط سخت‌افزار (مثل CPU). <hr style="border: 4px solid GREEN;"> ### ۲. بزرگ بودن Add.Bus و DataBus هر یک چه مزایایی دارند؟ (۱ نمره) پاسخ: ### **مزایای بزرگ بودن **Address Bus** و **Data Bus** در ریزپردازنده** #### **۱. بزرگ بودن **Address Bus** (گذرگاه آدرس)** **گذرگاه آدرس** تعیین می‌کند که ریزپردازنده **چقدر حافظه را می‌تواند آدرس دهی کند**. - **تعداد آدرس‌های قابل دسترسی = $$ 2^n $$** (که n = تعداد خطوط Address Bus). **مزایا:** ✅ **حافظه بیشتر قابل دسترسی است:** - مثلاً یک پردازنده با **۳۲ بیت Address Bus** می‌تواند $$ 2^{32} = 4 $$ گیگابایت حافظه را آدرس دهی کند. - اگر **۶۴ بیت** باشد، $$ 2^{64} $$ آدرس (حافظه بسیار عظیم) پشتیبانی می‌شود. ✅ **پشتیبانی از برنامه‌های حجیم و سیستم‌عامل‌های پیشرفته:** - برنامه‌های سنگین (مثل نرم‌افزارهای مهندسی، بازی‌ها) به فضای آدرس بزرگی نیاز دارند. ✅ **افزایش کارایی در سیستم‌های چندکاره (Multitasking):** - سیستم‌عامل می‌تواند حافظه بیشتری را به پردازه‌های مختلف اختصاص دهد. --- #### **۲. بزرگ بودن **Data Bus** (گذرگاه داده)** **گذرگاه داده** تعیین می‌کند که **چه مقدار داده در یک سیکل کلاک منتقل می‌شود**. **مزایا:** ✅ **انتقال داده سریع‌تر:** - یک **Data Bus 32 بیتی** در هر سیکل ۴ بایت (۳۲ بیت) منتقل می‌کند، در حالی که **۱۶ بیتی** فقط ۲ بایت انتقال می‌دهد. - مثال: اگر CPU بخواهد یک عدد ۳۲ بیتی را از RAM بخواند، با **Data Bus 32 بیتی** در **یک سیکل** انجام می‌شود، اما با **۱۶ بیتی** به **دو سیکل** نیاز است. ✅ **کارایی بالاتر در پردازش داده‌ها:** - دستورات سنگین (مثل محاسبات ممیز شناور) سریع‌تر اجرا می‌شوند. ✅ **بهبود عملکرد در پردازش گرافیکی و چندرسانه‌ای:** - انتقال داده‌های حجیم (مثل تصاویر و ویدیوها) سریع‌تر انجام می‌شود. --- ### **مقایسه کلی** | **ویژگی** | **Address Bus بزرگ‌تر** | **Data Bus بزرگ‌تر** | |----------------|----------------------|----------------------| | **تأثیر اصلی** | افزایش فضای آدرس دهی حافظه | افزایش سرعت انتقال داده | | **مثال** | پشتیبانی از RAM بیشتر | اجرای سریع‌تر دستورات | | **محدودیت** | نیاز به حافظه فیزیکی بیشتر | مصرف توان بالاتر | --- **جمع‌بندی:** - **Address Bus بزرگ‌تر → حافظه بیشتر در دسترس.** - **Data Bus بزرگ‌تر → سرعت بالاتر در پردازش.** <hr style="border: 4px solid GREEN;"> ### ۳. یک حافظه ۴ گیگابایتی به چه اندازه Add.Bus نیازمند است؟ (۱ نمره) پاسخ: ### **محاسبه اندازه‌ی مورد نیاز Address Bus برای یک حافظه‌ی ۴ گیگابایتی** برای تعیین اندازه‌ی **گذرگاه آدرس (Address Bus)** مورد نیاز یک حافظه‌ی ۴ گیگابایتی، از رابطه‌ی زیر استفاده می‌کنیم: $$ \text{تعداد آدرس‌های قابل دسترسی} = 2^n $$ $$ \text{حجم حافظه (بر حسب بایت)} = 2^n \times \text{اندازه‌ی هر خانه حافظه (معمولاً ۱ بایت)} $$ #### **۱. تبدیل ۴ گیگابایت به بایت:** $$ 4 \text{ گیگابایت} = 4 \times 1024 \times 1024 \times 1024 = 2^{32} \text{ بایت} $$ #### **۲. محاسبه‌ی تعداد خطوط Address Bus:** $$ 2^n = 2^{32} \implies n = 32 $$ #### **۳. نتیجه:** یک حافظه‌ی **۴ گیگابایتی** به یک **Address Bus 32 بیتی** نیاز دارد. --- ### **توضیح بیشتر:** - هر خط Address Bus یک بیت از آدرس را حمل می‌کند. - با **۳۲ بیت Address Bus**، می‌توان $$ 2^{32} = 4,294,967,296 $$ آدرس منحصربه‌فرد ایجاد کرد که معادل **۴ گیگابایت** حافظه است (با فرض اینکه هر خانه حافظه ۱ بایت باشد). - مثال‌های واقعی: - پردازنده‌های ۳۲ بیتی (مثل برخی از مدل‌های قدیمی Intel x86) فقط تا ۴ گیگابایت RAM پشتیبانی می‌کنند. - پردازنده‌های ۶۴ بیتی (مثل Intel Core i7) از آدرس دهی بسیار بیشتر (تا $$ 2^{64} $$ بایت) پشتیبانی می‌کنند. --- **جواب نهایی:** ✅ یک حافظه‌ی **۴ گیگابایتی** به **گذرگاه آدرس ۳۲ بیتی (32-bit Address Bus)** نیاز دارد. <hr style="border: 4px solid GREEN;"> ### ۴. در واحد ALU، رجیسترهای Temp و Acc به چه منظور استفاده می‌شوند. همچنین مفاهیم هر بیت فلگ رجیستر را بنویسید. (۲ نمره) | S | Z | --- | AC | --- | P | --- | CY | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | پاسخ: ### **واحد ALU و رجیسترهای Temp و Acc** **۱. رجیستر **Temp** (موقت):** - **کاربرد:** برای نگهداری موقت داده‌ها در حین انجام عملیات محاسباتی استفاده می‌شود. - **مثال:** هنگام ضرب دو عدد، یکی از اعداد در Temp ذخیره می‌شود تا در مراحل مختلف پردازش مورد استفاده قرار گیرد. **۲. رجیستر **Acc (اکومولاتور):** - **کاربرد:** اصلی‌ترین رجیستر برای ذخیره نتایج عملیات ALU است. - **مثال:** پس از اجرای دستور `ADD`، نتیجه در Acc ذخیره می‌شود. --- ### **توضیح بیت‌های **Flag Register** (رجیستر وضعیت)** رجیستر فلگ برای نشان دادن **وضعیت نتایج عملیات** در ALU استفاده می‌شود. ساختار آن در معماری ۸۰۸۵ به صورت زیر است: | **بیت** | **نام** | **توضیح** | **مثال** | |---------|---------|------------|----------| | **S (Sign)** | علامت | اگر نتیجه منفی باشد (MSB=1)، `S=1` می‌شود. | `10000000` → `S=1` | | **Z (Zero)** | صفر | اگر نتیجه صفر باشد، `Z=1` می‌شود. | `00000000` → `Z=1` | | **AC (Auxiliary Carry)** | حمل کمکی | اگر در بیت ۳ به ۴ حمل رخ دهد، `AC=1` می‌شود (برای عملیات BCD). | `00001111 + 1` → `AC=1` | | **P (Parity)** | توازن | اگر تعداد بیت‌های `1` در نتیجه زوج باشد، `P=1` می‌شود. | `11000011` → `P=1` (۴ بیت ۱) | | **CY (Carry)** | حمل | اگر در عملیات جمع/تفریق از MSB حمل رخ دهد، `CY=1` می‌شود. | `11111111 + 1` → `CY=1` | --- ### **جمع‌بندی:** - **Temp:** ذخیره موقت داده در حین محاسبات. - **Acc:** نگهداری نتیجه نهایی عملیات. - **Flag Register:** نشان‌دهنده وضعیت پردازش (مانند خطاهای محاسباتی). <hr style="border: 4px solid GREEN;"> ### ۵. چرخه عملکرد CPU را رسم کنید. (۱ نمره) پاسخ : ### **چرخه عملکرد CPU (دستورالعمل Fetch-Decode-Execute)** چرخه اصلی اجرای دستورات در CPU شامل **۴ مرحله کلیدی** است که به صورت مداوم تکرار می‌شوند. در برخی معماری‌های پیشرفته، این مراحل به صورت **خط لوله (Pipeline)** اجرا می‌شوند تا کارایی افزایش یابد. --- #### **۱. مرحله **Fetch (واکشی)** - **وظیفه:** دریافت دستورالعمل بعدی از حافظه. - **اجرا:** - آدرس دستورالعمل از **Program Counter (PC)** به **Address Bus** ارسال می‌شود. - دستورالعمل از حافظه خوانده شده و از طریق **Data Bus** به **Instruction Register (IR)** منتقل می‌شود. - **PC** به اندازه طول دستورالعمل افزایش می‌یابد. --- #### **۲. مرحله **Decode (رمزگشایی)** - **وظیفه:** تفسیر دستورالعمل و آماده‌سازی برای اجرا. - **اجرا:** - واحد **Control Unit (CU)** کد عملیات (Opcode) را تشخیص می‌دهد. - مشخص می‌کند کدام رجیسترها یا بخش‌های حافظه باید استفاده شوند. --- #### **۳. مرحله **Execute (اجرا)** - **وظیفه:** انجام عملیات محاسباتی/منطقی. - **اجرا:** - اگر دستورالعمل **محاسباتی** باشد (مثل `ADD`، `SUB`)، **ALU** عملیات را انجام می‌دهد. - اگر دستورالعمل **انتقال داده** باشد (مثل `MOV`)، داده بین رجیسترها یا حافظه جابه‌جا می‌شود. - اگر دستورالعمل **پرش** باشد (مثل `JMP`)، مقدار **PC** تغییر می‌کند. --- #### **۴. مرحله **Store (ذخیره نتیجه)** *(اختیاری بسته به نوع دستورالعمل)* - **وظیفه:** ذخیره نتیجه در حافظه یا رجیستر. - **مثال:** پس از اجرای `ADD AX, BX`، نتیجه در **AX** ذخیره می‌شود. --- ### **نمودار چرخه عملکرد CPU** ```mermaid flowchart LR Fetch --> Decode --> Execute --> Store Store --> Fetch ``` ### **توضیح تکمیلی:** - **چرخه ماشین (Machine Cycle):** ترکیبی از چند **چرخه کلاک** برای تکمیل یک مرحله. - **تفاوت در معماری‌ها:** - در CPUهای **پیشرفته** (مثل x86)، مراحل ممکن است **به صورت موازی** در خط لوله اجرا شوند. - در CPUهای **ساده** (مثل 8085)، هر مرحله به صورت **متوالی** انجام می‌شود. --- **مثال عملی در معماری ۸۰۸۵:** - دستور `MOV A, B` (کپی مقدار رجیستر B به A): 1. **Fetch:** خواندن کد دستور از حافظه. 2. **Decode:** تشخیص عملیات `MOV` توسط CU. 3. **Execute:** انتقال داده از B به A. <hr style="border: 4px solid GREEN;"> ### ۶. وقفه چیست و انواع یادآوری وقفه را بنویسید؟ (۱ نمره) پاسخ : #### **وقفه (Interrupt) و انواع آن** #### **۱. تعریف وقفه (Interrupt)** وقفه یک **مکانیسم سیگنال دهی** است که توسط سخت‌افزار یا نرم‌افزار به CPU ارسال می‌شود تا پردازنده را از انجام برنامه جاری منحرف کرده و به یک **روال خاص (ISR - Interrupt Service Routine)** هدایت کند. پس از اتمام روال، CPU به برنامه اصلی بازمی‌گردد. #### **۲. دلایل استفاده از وقفه** - پاسخگویی سریع به رویدادهای خارجی (مثل فشار دادن کلید کیبورد) - مدیریت دستگاه‌های ورودی/خروجی (I/O) بدون نیاز به Polling - رسیدگی به خطاهای سخت‌افزاری (مثل تقسیم بر صفر) - اجرای چندوظیفگی (Multitasking) #### **۳. انواع وقفه از نظر منبع** | نوع وقفه | منبع | مثال | ویژگی‌ها | |----------|------|-------|-----------| | **سخت‌افزاری (External)** | دستگاه‌های خارجی | کلید کیبورد، ماوس | غیرهمزمان (Asynchronous) | | **نرم‌افزاری (Software)** | دستورالعمل CPU | INT 21h در x86 | همزمان (Synchronous) | | **استثناها (Exceptions)** | خطای پردازش | تقسیم بر صفر | همزمان (Synchronous) | #### **۴. انواع وقفه از نظر قابلیت Mask شدن** | نوع | قابلیت مسدودسازی | مثال | |-----|------------------|-------| | **قابل Mask (Maskable)** | قابل غیرفعال کردن توسط دستور CLI | وقفه تایمر | | **غیرقابل Mask (Non-Maskable - NMI)** | همیشه فعال | خطای حافظه، قطع برق | #### **۵. مراحل پردازش وقفه** 1. دریافت سیگنال وقفه 2. ذخیره وضعیت فعلی (Context Saving) 3. پرش به آدرس ISR 4. اجرای روال سرویس وقفه 5. بازگشت به برنامه اصلی (Context Restoring) #### **۶. وقفه در معماری‌های مختلف** - **x86:** دارای جدول برد وقفه (IVT - Interrupt Vector Table) - **ARM:** از سیستم NVIC (Nested Vectored Interrupt Controller) استفاده می‌کند - **AVR:** وقفه‌ها در آدرس‌های ثابت حافظه برنامه قرار دارند #### **۷. مفاهیم مهم در وقفه** - **اولویت وقفه (Interrupt Priority)** - **تاخیر وقفه (Interrupt Latency)** - **تو در تویی وقفه (Interrupt Nesting)** **نمودار فرآیند وقفه:** ```mermaid flowchart TD A[برنامه در حال اجرا] --> B{وقفه رخ داده؟} B -->|Yes| C[ذخیره وضعیت فعلی] C --> D[اجرای ISR] D --> E[بازگردانی وضعیت] E --> A B -->|No| A ``` **مثال عملی:** در سیستم عامل، وقتی کاربر کلیدی را فشار می‌دهد: 1. کنترلر کیبورد وقفه ایجاد می‌کند 2. CPU برنامه فعلی را متوقف می‌کند 3. به روال خواندن کیبورد پرش می‌کند 4. پس از خواندن کلید، به برنامه قبلی بازمی‌گردد <hr style="border: 4px solid GREEN;"> ### ۷. در یک 8255 (GPIO)، می‌خواهیم قسمت A را در مود ۱ تنظیم کنیم، سپس بیت‌های ۱ و ۳ و ۷ قسمت C را یک و مابقی را صفر کنیم؟ رجیسترهای مرتبط با این تنظیمات را بنویسید. (۴ نمره) **جدول Selection** | CS | A1 | A0 | Action | | :-: | :-: | :-: | :------: | | ۰ | ۰ | ۰ | PORTA | | ۰ | ۰ | ۱ | PORTB | | ۰ | ۱ | ۰ | PORTC | | ۰ | ۱ | ۱ | Cont.REG | | ۱ | X | X | Not.select| **جدول Control Reg** | IO/BSR | GA,MODE ۲ | GA,MODE ۱ | GA,MODE ۰ | PA,I/O | PCU,I/O | GB,MODE ۰ | PB,I/O | PCD,I/O | | :----: | :------: | :------: | :------: | :----: | :-----: | :------: | :----: | :-----: | پاسخ : ### **پاسخ به سوال ۷: تنظیمات 8255 (PPI)** #### **۱. تنظیم Port A در Mode 1 (Input)** برای تنظیم Port A در Mode 1 (ورودی با Handshaking): - **Mode 1** برای Port A نیاز به: - **Group A Mode = 01** (Mode 1) - **Port A Direction = 1** (Input) - **Port C Upper = Input** (برای سیگنال‌های Handshaking) #### **۲. تنظیم بیت‌های Port C** می‌خواهیم بیت‌های 1، 3 و 7 از Port C را **1** و بقیه را **0** کنیم: - مقدار باینری برای Port C: `10001010` (0x8A) - بیت 7: 1 - بیت 6: 0 - بیت 5: 0 - بیت 4: 0 - بیت 3: 1 - بیت 2: 0 - بیت 1: 1 - بیت 0: 0 #### **۳. محاسبه مقدار Control Register** مقدار Control Register برای این تنظیمات: - **D7 (IO/BSR Mode):** 1 (برای BSR Mode) - **D6-D3:** برای Port A Mode 1 Input: `1 0 1 1` (0xB) - **D2 (Group B Mode):** 0 (Mode 0) - **D1 (Port B Direction):** 0 (Output) - **D0 (Port C Lower Direction):** 0 (Output) مقدار نهایی Control Register: - **BSR Mode:** `1xxx0000` (برای تنظیم بیت‌های Port C) - **IO Mode:** `10110000` (0xB0) برای تنظیم Port A در Mode 1 Input #### **۴. مراحل برنامه‌نویسی** 1. **تنظیم Port A در Mode 1 Input:** - ارسال `0xB0` به Control Register 2. **تنظیم بیت‌های Port C:** - تنظیم بیت 7: ارسال `0x0F` به Control Register (BSR Mode: `1` برای بیت 7) - تنظیم بیت 3: ارسال `0x07` به Control Register (BSR Mode: `1` برای بیت 3) - تنظیم بیت 1: ارسال `0x03` به Control Register (BSR Mode: `1` برای بیت 1) #### **۵. کد اسمبلی نمونه** ```assembly MOV AL, 0xB0 ; تنظیم Port A در Mode 1 Input OUT 63h, AL ; آدرس Control Register معمولاً 63h است ; تنظیم بیت‌های Port C MOV AL, 0x0F ; تنظیم بیت 7 OUT 63h, AL MOV AL, 0x07 ; تنظیم بیت 3 OUT 63h, AL MOV AL, 0x03 ; تنظیم بیت 1 OUT 63h, AL ``` #### **۶. جدول مقادیر Control Register** | بیت | مقدار | توضیح | |----|-------|-------| | D7 | 1 | BSR Mode فعال | | D6-D3 | 1011 | Port A در Mode 1 Input | | D2 | 0 | Group B در Mode 0 | | D1 | 0 | Port B به عنوان Output | | D0 | 0 | Port C Lower به عنوان Output | #### **۷. نکات مهم** - در **Mode 1**، بخشی از Port C به عنوان سیگنال‌های Handshaking استفاده می‌شود. - مقداردهی بیت‌های Port C در BSR Mode باید **به صورت جداگانه** انجام شود. - آدرس‌دهی به رجیسترها بستگی به اتصال A0 و A1 دارد (معمولاً Control Register در آدرس پایه + 3). <hr style="border: 4px solid GREEN;"> ### ۸. در 8279 (Key Board & Disp.) به سوالات زیر پاسخ دهید. (۵ نمره) **الف)** مفهوم over run در قسمت کلید چیست؟ **ب)** نحوه نمایش دو نمایشگر را به اختصار یا بلوکی توضیح دهید؟ **پ)** کلیدهای ۱۷ و ۶ از صفحه دوم و ۴۵ تاچ می شود کدهای تولید شده از کلیدها را در مود 2Key_Lockout بنویسید؟ پاسخ : ### **تنظیمات و عملکرد 8279 (Keyboard/Display Controller)** #### **الف) مفهوم Overrun در قسمت کلید** **Overrun** خطایی است که هنگامی رخ می‌دهد که: - **بافر کیبورد پر باشد** (دو کلید یا بیشتر فشرده شده باشند) - **پردازنده موفق به خواندن کد کلید قبلی نشده باشد** - **کلید جدیدی فشرده شود** در این حالت: - بیت **Overrun (O)** در **Status Register** برابر **1** می‌شود - کد کلید جدید **از دست می‌رود** - برای رفع مشکل باید وضعیت بافر بررسی و ریست شود **راه حل:** برنامه باید قبل از خواندن کد کلید جدید، وضعیت Overrun را چک کند. --- #### **ب) نحوه نمایش روی دو نمایشگر** **۱. روش مالتی پلکس (Multiplexing):** - 8279 از **دو خط اسکن (SL0, SL1)** برای انتخاب نمایشگرها استفاده می‌کند - **دو حالت نمایش وجود دارد:** - **۸ نمایشگر (۸-digit):** هر نمایشگر به صورت جداگانه آدرس‌دهی می‌شود - **۱۶ نمایشگر (۱۶-digit):** با استفاده از مالتی پلکسینگ **۲. بلوک دیاگرام نمایش دو نمایشگر:** ``` 8279 Display Control: +---------------------+ | OUTA0-OUTA3 (Data) |---> Segment Lines (a-g, dp) | OUTB0-OUTB3 (Data) | | SL0-SL1 (Scan Lines)|---> Digit Selection (Digit 1/Digit 2) +---------------------+ ``` - **SL0=0, SL1=0:** نمایشگر اول فعال - **SL0=0, SL1=1:** نمایشگر دوم فعال - داده از **OUTA و OUTB** به سگمنت‌ها ارسال می‌شود **۳. تنظیمات رجیسترها:** - **Display Mode Register:** `00` برای نمایشگرهای ۸ کاراکتری - **Scan Frequency:** باید به اندازه‌ای باشد که چشم انسان متوجه خاموشی نشود (~100Hz) --- #### **پ) کدهای تولید شده برای کلیدها در Mode 2-Key Lockout** در این حالت: - فقط **آخرین کلید فشرده شده** ثبت می‌شود - **کلیدهای دیگر نادیده گرفته می‌شوند** تا زمانی که کلید اول رها شود **کدهای تولید شده:** - **صفحه کلید ۸×۸** (64 کلید) با کدهای **۶ بیتی** (دو بیت برای صفحه، ۴ بیت برای ردیف/ستون) - **فرمت کد کلید:** `SHIFT | CNTL | SCAN2 | SCAN1 | SCAN0 | RTL2 | RTL1 | RTL0` **محاسبه کدها:** 1. **کلید ۱۷ (صفحه ۲):** - صفحه ۲ → `CNTL=0`, `SHIFT=1` (اگر صفحه دوم با Shift فعال شود) - آدرس کلید ۱۷ → ردیف ۲، ستون ۱ (فرضاً) - کد نهایی: `1 0 0 0 1 0 0 1` (0x89) 2. **کلید ۶ (صفحه ۲):** - صفحه ۲ → `SHIFT=1` - آدرس کلید ۶ → ردیف ۰، ستون ۶ - کد نهایی: `1 0 0 0 0 1 1 0` (0x86) 3. **کلید ۴۵ (صفحه ۱):** - صفحه ۱ → `SHIFT=0` - آدرس کلید ۴۵ → ردیف ۵، ستون ۵ (فرضاً) - کد نهایی: `0 0 1 1 0 1 1 0` (0x36) **نکته:** - در **2-Key Lockout**، اگر کلید ۱۷ و ۶ همزمان فشرده شوند، فقط کد **آخرین کلید** (مثلاً ۰x۸۶) در بافر ذخیره می‌شود. --- ### **جمع‌بندی نهایی** | بخش | پاسخ | |------|-------| | **Overrun** | خطای ناشی از پر بودن بافر کیبورد | | **نمایشگر دوگانه** | مالتی پلکس با اسکن لاین‌های SL0/SL1 | | **کدهای کلید** | 0x89 (کلید ۱۷), 0x86 (کلید ۶), 0x36 (کلید ۴۵) | <hr style="border: 4px solid GREEN;"> ### ۹. تفاوت Risc و Cisc را بنویسید و دلیل استفاده از Cisc را بیان کنید. (۱ نمره) پاسخ : ### **تفاوت‌های اصلی RISC و CISC** #### **۱. تعریف معماری‌ها** | **مشخصه** | **RISC (Reduced Instruction Set Computer)** | **CISC (Complex Instruction Set Computer)** | |------------------|--------------------------------------------|--------------------------------------------| | **تعداد دستورالعمل‌ها** | کم (~100 دستور) | زیاد (~300-500 دستور) | | **طول دستورالعمل** | ثابت (مثلاً ۳۲ بیتی) | متغیر (۱ تا ۱۵ بایت) | | **اجرا در چرخه کلاک** | معمولاً ۱ چرخه | چند چرخه (بسته به پیچیدگی) | | **حافظه دسترسی** | فقط Load/Store مستقیم به حافظه | دستورات مستقیم روی حافظه | | **مثال‌های پردازنده** | ARM, RISC-V, MIPS | x86 (Intel, AMD), 8051 | --- #### **۲. تفاوت‌های کلیدی** | **معیار** | **RISC** | **CISC** | |------------------|----------|----------| | **طراحی دستورات** | ساده و بهینه | پیچیده با قابلیت‌های چندگانه | | **مصرف توان** | پایین (مناسب موبایل/سیستم‌های نهفته) | بالا (سرور/دسکتاپ) | | **سرعت اجرا** | بالاتر به دلیل خط لوله کارآمد | کندتر به دلیل پیچیدگی | | **فضای اشغالی تراشه** | کوچک‌تر | بزرگ‌تر | | **برنامه‌نویسی اسمبلی** | نیاز به کد بیشتر | فشرده و سطح بالا | --- ### **دلایل استفاده از CISC** ۱. **سازگاری عقبرو (Backward Compatibility)** - پردازنده‌های x86 برای حفظ سازگاری با نرم‌افزارهای قدیمی از CISC استفاده می‌کنند. ۲. **کاهش حجم کد برنامه** - دستورات پیچیده (مثل `MOVSB` در x86) نیاز به کدنویسی کمتری دارند. ۳. **بهینه‌سازی برای کاربردهای خاص** - دستورات اختصاصی (مثل محاسبات رمزنگاری) در CISC کارایی بهتری دارند. ۴. **مدیریت حافظه پیشرفته** - پشتیبانی از آدرس‌دهی‌های پیچیده (مثل `[EAX + EBX*4 + 10h]`). ۵. **کاربرد در سیستم‌های عمومی** - مناسب برای برنامه‌های سنگین (مثل ویرایش ویدیو، بازی‌ها). --- ### **جمع‌بندی: کجا از کدام معماری استفاده می‌شود؟** | **کاربرد** | **معماری ترجیحی** | **دلیل** | |------------------|------------------|----------| | موبایل/تبلت | RISC (ARM) | مصرف انرژی پایین | | سرور/دسکتاپ | CISC (x86) | سازگاری و قدرت محاسباتی | | سیستم‌های نهفته | RISC | سادگی و قیمت پایین | | پردازش ابری | هر دو (ARM/x86) | بسته به نیاز | **نکته جالب:** امروزه مرز بین RISC و CISC شده است. مثلاً پردازنده‌های x86 مدرن از **ترجمه دستورات CISC به ریزعملگرهای RISC** استفاده می‌کنند (مثل µops در اینتل). <hr style="border: 4px solid GREEN;"> <hr style="border: 4px solid GREEN;"> <hr style="border: 4px solid GREEN;"> ## 2 سوالات --- ### ۱. الگوریتم را به اختصار شرح دهید؟ (۱) پاسخ: **الگوریتم** مجموعه‌ای از **دستورالعمل‌های مرحله‌به‌مرحله، دقیق و محدود** است که برای **حل یک مسئله یا انجام یک کار مشخص** طراحی می‌شود. ### **ویژگی‌های کلیدی الگوریتم:** 1. ورودی (Input): داده‌های اولیه را دریافت می‌کند. 2. خروجی (Output): نتیجه مشخصی تولید می‌کند. 3. قطعی بودن (Definiteness): هر مرحله واضح و بدون ابهام است. 4. محدودیت (Finiteness): پس از مراحل محدود پایان می‌یابد. 5. کارایی (Effectiveness): هر مرحله قابل اجرا است. ### **مثال ساده:** الگوریتم جمع دو عدد: 1. عدد اول را بگیر (A). 2. عدد دوم را بگیر (B). 3. A و B را جمع کن (C = A + B). 4. نتیجه (C) را نمایش بده. --- ### **تفاوت الگوریتم با برنامه:** - الگوریتم **مفهومی و مستقل از زبان برنامه‌نویسی** است (مثل دستور پخت غذا). - برنامه **پیاده‌سازی الگوریتم با یک زبان خاص** است (مثل کد C++ یا اسمبلی). **نکته:** هر الگوریتم می‌تواند به روش‌های مختلفی برنامه‌نویسی شود! <hr style="border: 4px solid GREEN;"> ### ۲. ظرفیت یک حافظه با خط آدرس ۱۰ بیت چقدر است؟ (۰.۵) پاسخ: ### **محاسبه ظرفیت حافظه با ۱۰ بیت خط آدرس:** #### **فرمول محاسبه:** $$ \text{ظرفیت حافظه} = 2^n \quad \text{(تعداد خانه‌های حافظه)} $$ $$ \text{(هر خانه معمولاً ۱ بایت داده ذخیره می‌کند)} $$ #### **محاسبه برای ۱۰ بیت آدرس:** $$ 2^{10} = 1024 \ \text{خانه حافظه} $$ $$ 1024 \ \text{بایت} = \textbf{۱ کیلوبایت (KB)} $$ #### **نتیجه نهایی:** ✅ یک حافظه با **۱۰ بیت خط آدرس** می‌تواند **۱ کیلوبایت (KB)** داده را آدرس‌دهی کند. --- ### **توضیح تکمیلی:** - **مثال:** اگر هر خانه حافظه **۱ بایت** (۸ بیت) فضا داشته باشد: - آدرس‌دهی از `0000000000` (آدرس ۰) تا `1111111111` (آدرس ۱۰۲۳) خواهد بود. - **کاربرد:** این مدل حافظه‌ها در سیستم‌های قدیمی (مثل ماشین‌حساب‌های اولیه) استفاده می‌شد. --- **نکته:** اگر هر خانه حافظه بیشتر از ۱ بایت (مثلاً ۱۶ بیت) ذخیره کند، ظرفیت کل افزایش می‌یابد، اما همچنان **۱۰۲۴ آدرس منحصربه‌فرد** وجود دارد. <hr style="border: 4px solid GREEN;"> ### ۳. مزیت بزرگ بودن گذرگاه داده چیست؟ (۰.۵) پاسخ: ### **مزیت بزرگ بودن گذرگاه داده (Data Bus) در یک جمله:** ✅ **انتقال داده‌های بیشتر در هر سیکل کلاک → افزایش سرعت پردازش!** --- ### **توضیح کوتاه و فنی:** - **گذرگاه داده عریض‌تر (مثلاً ۳۲ بیت به جای ۱۶ بیت):** - در هر سیکل کلاک، **داده بیشتری منتقل می‌شود** (مثلاً ۴ بایت به جای ۲ بایت). - مثال: خواندن یک عدد ۳۲ بیتی با **Data Bus 32 بیتی** در **۱ سیکل** انجام می‌شود، اما با ۱۶ بیت به **۲ سیکل** نیاز دارد. - **نتایج:** - کاهش تاخیر در عملیات‌های حافظه - بهبود عملکرد در پردازش تصویر، ویدیو و محاسبات سنگین --- **مثال ملموس:** پردازنده‌های ۶۴ بیتی امروزی نسبت به ۳۲ بیتی‌های قدیمی، به دلیل **عرض بیشتر گذرگاه داده**، سرعت بسیار بالاتری دارند! <hr style="border: 4px solid GREEN;"> ### ۴. مفهوم بیت‌های فلگ رجیستر واحد ALU را به اختصار شرح دهید؟ (۱.۵) | S | Z | --- | AC | --- | P | --- | CY | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | پاسخ: ### **شرح مختصر بیت‌های فلگ رجیستر در واحد ALU:** **فلگ رجیستر (وضعیت)** یک رجیستر ویژه در CPU است که **نتیجه عملیات محاسباتی/منطقی** ALU را گزارش می‌دهد. مهم‌ترین بیت‌های آن: | **بیت فلگ** | **نام** | **شرح عملکرد** | **مثال** | |-------------|--------------|-------------------------------------------------------------------------------|-------------------------------| | **CY (Carry)** | حمل | اگر در جمع/تفریق از بیت MSB حمل ایجاد شود، ۱ می‌شود. | `11111111 + 1` → CY=1 | | **Z (Zero)** | صفر | اگر نتیجه عملیات صفر باشد، ۱ می‌شود. | `5 - 5` → Z=1 | | **S (Sign)** | علامت | برابر با بیت MSB نتیجه (۱=منفی، ۰=مثبت). | `10000000` → S=1 | | **P (Parity)** | توازن | اگر تعداد بیت‌های ۱ در نتیجه زوج باشد، ۱ می‌شود. | `11000011` (۴ بیت ۱) → P=1 | | **AC (Aux Carry)** | حمل کمکی | اگر در بیت ۳ به ۴ حمل رخ دهد، ۱ می‌شود (مهم برای محاسبات BCD). | `00001111 + 1` → AC=1 | --- ### **کاربردهای کلیدی:** 1. پرش شرطی (مثال: `JZ` اگر Z=1 باشد پرش می‌کند). 2. تشخیص خطا (مثل تقسیم بر صفر با ترکیب CY/Z). 3. پشتیبانی از محاسبات پیشرفته (مثل عملیات روی اعداد بزرگتر از طول رجیستر با استفاده از CY). --- **نکته:** در معماری‌های مختلف (مثل x86، ARM، AVR) ممکن است نام/تعداد این فلگ‌ها متفاوت باشد، اما مفهوم کلی یکسان است. <hr style="border: 4px solid GREEN;"> ### ۵. تفاوت رجیسترهای General Purpose با Special Purpose در ۸۰۸۵ را بنویسید و دو رجیستر قابل دسترس را نام ببرید؟ (۲) پاسخ: ### **تفاوت رجیسترهای General Purpose و Special Purpose در 8085** #### **۱. رجیسترهای General Purpose (همه‌منظوره)** - **ویژگی‌ها:** - برای ذخیره **داده‌های موقت** و **محاسبات عمومی** استفاده می‌شوند. - توسط برنامه‌نویس **به طور مستقیم قابل دسترسی و تغییر** هستند. - در عملیات ریاضی و منطقی (مثل جمع، انتقال داده) کاربرد دارند. - **رجیسترهای اصلی در 8085:** - **B, C, D, E, H, L** (هر کدام ۸ بیتی) - امکان ترکیب به صورت **جفت رجیستر ۱۶ بیتی** (مثل BC, DE, HL) #### **۲. رجیسترهای Special Purpose (ویژه)** - **ویژگی‌ها:** - برای **اهداف خاص پردازنده** طراحی شده‌اند. - معمولاً **غیرمستقیم** توسط دستورالعمل‌ها کنترل می‌شوند. - تغییر برخی از آن‌ها مستقیماً توسط برنامه‌نویس ممکن نیست. - **مثال‌ها در 8085:** - **Accumulator (A):** ذخیره نتیجه عملیات ALU - **Program Counter (PC):** نگهداری آدرس دستور بعدی - **Stack Pointer (SP):** مدیریت پشته - **Flag Register:** نشانگر وضعیت پردازش --- ### **دو رجیستر قابل دسترس (Accessible) برای برنامه‌نویس** 1. **Accumulator (A)** - **کاربرد:** ذخیره نتایج عملیات محاسباتی (مثل `ADD B` نتیجه را در A می‌ریزد). - **دسترسی:** مستقیماً در دستورالعمل‌ها استفاده می‌شود (مثال: `MOV A, B`). 2. **Register Pair HL** - **کاربرد:** - اشاره‌گر به حافظه (مثال: `MOV A, M` داده را از آدرس HL به A می‌آورد). - محاسبات ۱۶ بیتی (مثل `DAD H` که HL = HL + HL). - **دسترسی:** هر دو بخش H و L قابل نوشتن/خواندن هستند (مثال: `MOV H, B`). --- ### **جمع‌بندی در یک نگاه** | **نوع رجیستر** | **مثال‌ها** | **قابل دسترسی؟** | **کاربرد اصلی** | |-----------------------|-------------------------|------------------|---------------------------------| | General Purpose | B, C, D, E, H, L | ✅ بله | ذخیره داده/آدرس موقت | | Special Purpose | A, PC, SP, Flag | ❌ برخی (مثل A) | کنترل پردازش (پشته، وضعیت و...)| **نکته:** رجیسترهای **PC** و **SP** معمولاً با دستورالعمل‌های خاص (مثل `CALL`, `PUSH`) مدیریت می‌شوند، نه مستقیم! <hr style="border: 4px solid GREEN;"> ### ۶. چرخه پردازش CPU را همراه با وقفه رسم کنید؟ (۱) پاسخ: ### **چرخه پردازش CPU همراه با وقفه (Interrupt Cycle)** ``` mermaid graph TD Start[شروع] --> Fetch["دریافت دستور"] Fetch --> Decode["رمزگشایی"] Decode --> Execute["اجرا"] Execute --> CheckInterrupt["بررسی وقفه"] CheckInterrupt --> NoInterrupt["وقفه نیست"] NoInterrupt --> Fetch CheckInterrupt --> YesInterrupt["وقفه هست"] YesInterrupt --> SaveState["ذخیره وضعیت"] SaveState --> JumpToISR["پرش به ISR"] JumpToISR --> RunISR["اجرای ISR"] RunISR --> RestoreState["بازگردانی"] RestoreState --> Fetch ``` #### **توضیح مراحل:** 1. **چرخه عادی Fetch-Decode-Execute** - CPU دستورات را به ترتیب اجرا می‌کند. 2. **تشخیص وقفه** - اگر سیگنال وقفه (مثل `INTR` در 8085) فعال باشد، CPU پس از اتمام دستور جاری واکنش نشان می‌دهد. 3. **ذخیره وضعیت (Context Saving)** - مقدار **PC** (آدرس دستور بعدی) و **Flag Register** در پشته ذخیره می‌شوند. 4. **پرش به ISR** - CPU با استفاده از **بردار وقفه**، آدرس روال سرویس وقفه (ISR) را از حافظه خوانده و به آن پرش می‌کند. 5. **اجرای ISR** - کدهای مربوط به وقفه (مثل خواندن داده از کیبورد) اجرا می‌شود. 6. **بازگشت به برنامه اصلی** - با دستور `RETI` (Return from Interrupt)، وضعیت ذخیره‌شده از پشته بازیابی شده و اجرای برنامه اصلی ادامه می‌یابد. --- ### **نقاط کلیدی در معماری 8085:** - **خط وقفه:** `INTR` (قابل Mask) یا `TRAP` (غیرقابل Mask). - **ذخیره خودکار:** PC در پشته ذخیره می‌شود. - **بردار وقفه:** آدرس ISR معمولاً ثابت است (مثل `003Ch` برای وقفه RST 7.5). **مثال:** وقفه تایمر در 8085: 1. تایمر سیگنال `RST 6.5` را فعال می‌کند. 2. CPU پس از ذخیره PC، به آدرس `0034h` پرش می‌کند. 3. پس از اجرای ISR، با `RETI` به برنامه بازمی‌گردد. --- **تفاوت با چرخه عادی:** - در چرخه عادی، CPU فقط مراحل Fetch-Decode-Execute را تکرار می‌کند. - در چرخه با وقفه، **مراحل اضافه‌شده** (ذخیره وضعیت، پرش به ISR، بازگشت) باعث تأخیر در اجرای برنامه اصلی می‌شوند. <hr style="border: 4px solid GREEN;"> ### ۷. وقفه چیست و انواع وقفه را نام ببرید ضمنا نحوه اعمال وقفه را نام ببرید؟ (۲) پاسخ: #### **۱. تعریف وقفه (Interrupt)** وقفه یک **مکانیسم سخت‌افزاری/نرم‌افزاری** است که پردازنده را از اجرای برنامه جاری منحرف کرده و به یک **روال ویژه (ISR)** هدایت می‌کند. پس از اتمام ISR، CPU به برنامه اصلی بازمی‌گردد. #### **۲. انواع وقفه در ریزپردازنده‌ها** | **دسته‌بندی** | **نوع وقفه** | **منبع** | **مثال‌ها** | **ویژگی‌ها** | |-----------------------|---------------------------|--------------------------|--------------------------------|-----------------------------| | **سخت‌افزاری** | قابل Mask (INTR) | دستگاه‌های خارجی | کیبورد، ماوس | قابل غیرفعال‌سازی با CLI | | | غیرقابل Mask (NMI) | خطاهای حیاتی | قطع برق، خطای حافظه | فوراً پردازش می‌شود | | **نرم‌افزاری** | دستور INT | برنامه‌نویس | INT 21h در x86 | عمدی و کنترل‌شده | | **استثنا (Exception)** | خطای پردازش | CPU | تقسیم بر صفر، دستور نامعتبر | خودکار توسط CPU ایجاد می‌شود | #### **۳. نحوه اعمال وقفه در ۸۰۸۵** ۱. **فعال‌سازی وقفه:** - دستور `EI` (Enable Interrupts) برای فعال‌سازی وقفه‌های Maskable. - وقفه‌های NMI همیشه فعال هستند. ۲. **دریافت وقفه:** - دستگاه خارجی (مثل تایمر) سیگنال وقفه (مثل `RST 5.5`) را فعال می‌کند. ۳. **پاسخ CPU:** - ذخیره PC و وضعیت فعلی در پشته. - پرش به آدرس ثابت در **بردار وقفه** (مثال: `RST 5.5 → 002Ch`). ۴. **اجرای ISR:** - کدهای مدیریت وقفه اجرا می‌شوند (مثل خواندن داده از پورت). ۵. **بازگشت:** - دستور `RETI` (Return from Interrupt) برای بازگردانی وضعیت. #### **۴. مثال عملی در ۸۰۸۵** ```assembly ORG 0000h JMP MAIN ORG 002Ch ; آدرس ISR برای RST 5.5 PUSH PSW ; ذخیره وضعیت CALL READ_KEYBOARD POP PSW ; بازیابی وضعیت RETI ; بازگشت MAIN: EI ; فعال‌سازی وقفه HERE: JMP HERE ; حلقه بی‌نهایت ``` #### **۵. تفاوت وقفه با Polling** - **وقفه:** دستگاه خارجی CPU را آگاه می‌کند (کارآمدتر). - **Polling:** CPU مدام وضعیت دستگاه را چک می‌کند (هدررفت منابع). #### **۶. نکات کلیدی** - **اولویت وقفه‌ها:** TRAP (بالاترین) > RST 7.5 > RST 6.5 > RST 5.5 > INTR. - **زمان تأخیر (Latency):** فاصله بین وقوع وقفه تا شروع ISR. <hr style="border: 4px solid GREEN;"> ### ۸. نحوه عملیات آی‌سی ۸۲۵۹ (توسعه وقفه) را به اختصار شرح دهید؟ (۱) پاسخ: #### ** نحوه عملکرد آی‌سی ۸۲۵۹ (کنترلر وقفه برنامه‌پذیر - PIC)** آی‌سی **۸۲۵۹ (Programmable Interrupt Controller - PIC)** یک تراشه واسط است که برای **مدیریت وقفه‌های سخت‌افزاری** در سیستم‌های مبتنی بر ریزپردازنده (مانند x86) استفاده می‌شود. این تراشه امکان **اولویت‌بندی وقفه‌ها** و **کاهش بار پردازش وقفه‌ها توسط CPU** را فراهم می‌کند. --- #### **۱. وظایف اصلی ۸۲۵۹:** - **پذیرش و اولویت‌بندی وقفه‌ها** (۸ سطح وقفه در حالت عادی، قابل گسترش تا ۶۴ سطح با اتصال آبشاری چند ۸۲۵۹). - **ارسال سیگنال INTR به CPU** برای اطلاع از وقفه درخواستی. - **ارسال شماره بردار وقفه (Interrupt Vector)** به CPU پس از پاسخ **INTA** (Acknowledge). --- #### **۲. بلوک‌های اصلی ۸۲۵۹:** - **IRR (Interrupt Request Register):** وقفه‌های درخواست شده اما هنوز تایید نشده را ثبت می‌کند. - **ISR (In-Service Register):** وقفه‌هایی که در حال سرویس‌دهی هستند را نگه می‌دارد. - **IMR (Interrupt Mask Register):** وقفه‌های غیرفعال (ماسک) شده را مشخص می‌کند. - **Priority Resolver:** اولویت بین وقفه‌های فعال را تعیین می‌کند. --- #### **۳. مراحل پاسخ به وقفه توسط ۸۲۵۹:** 1. **درخواست وقفه (IR0-IR7):** یکی از خطوط IR فعال می‌شود. 2. **ثبت در IRR:** ۸۲۵۹ درخواست را در **IRR** ذخیره می‌کند. 3. **بررسی اولویت:** اگر وقفه با اولویت بالاتر از وقفه در حال اجرا باشد: - **INTR را به CPU می‌فرستد.** 4. **پاسخ CPU (INTA):** CPU پس از دریافت INTR، دو پالس **INTA#** ارسال می‌کند. - **پالس اول:** ۸۲۵۹ وقفه را از IRR به ISR منتقل می‌کند. - **پالس دوم:** ۸۲۵۹ **بردار وقفه (Interrupt Vector)** را روی گذرگاه داده قرار می‌دهد. 5. **پردازش وقفه توسط CPU:** CPU با استفاده از بردار وقفه، به **روال سرویس وقفه (ISR)** پرش می‌کند. 6. **پایان وقفه (EOI):** در پایان ISR، CPU باید **دستور EOI (End Of Interrupt)** را به ۸۲۵۹ ارسال کند تا ISR ریست شود. --- #### **۴. حالت‌های کاری ۸۲۵۹:** - **ICW (Initialization Command Words):** برای پیکربندی اولیه (مثل تعیین بردار وقفه، حالت آبشاری و ...). - **OCW (Operation Command Words):** برای کنترل عملیات (مثل EOI، تغییر اولویت و ...). --- #### **۵. کاربرد اصلی ۸۲۵۹:** - در سیستم‌های قدیمی x86 (مثل ۸۰۸۶) برای مدیریت وقفه‌های سخت‌افزاری (مثل صفحه‌کلید، تایمر و ...) استفاده می‌شد. - امروزه در پردازنده‌های مدرن، عملکرد آن در **APIC (Advanced PIC)** ادغام شده است. <hr style="border: 4px solid GREEN;"> ### ۹. مودهای عملیاتی ۸۲۵۵ (توسعه GPIO) را به اختصار شرح دهید؟ (۱) پاسخ: ### ** حالت‌های عملیاتی آی‌سی ۸۲۵۵ (PPI - Programmable Peripheral Interface)** آی‌سی **۸۲۵۵** یک تراشه **ورودی/خروجی برنامه‌پذیر (GPIO)** است که برای **افزایش پورت‌های I/O** در سیستم‌های مبتنی بر ریزپردازنده (مانند ۸۰۸۶) استفاده می‌شود. این تراشه دارای **۳ پورت ۸ بیتی (A, B, C)** است که می‌توانند در **حالت‌های مختلف** پیکربندی شوند. --- ### **۱. حالت‌های عملیاتی ۸۲۵۵:** #### **الف) حالت ۰ (Mode 0): حالت I/O ساده (Basic Input/Output)** - **ویژگی‌ها:** - هر پورت (**A, B, C**) می‌تواند به صورت مستقل **ورودی یا خروجی** باشد. - پورت **C** را می‌توان به دو نیمه **C‌upper (PC4-PC7)** و **C‌lower (PC0-PC3)** تقسیم کرد. - **بدون دستدهی (Handshaking)** و بدون کنترلر وقفه. - **کاربرد:** - اتصال به سوئیچ‌ها، LEDها، سنسورهای ساده و سایر دستگاه‌های بدون نیاز به همگام‌سازی. #### **ب) حالت ۱ (Mode 1): حالت I/O با دستدهی (Handshake)** - **ویژگی‌ها:** - از **پورت‌های A و B** برای **داده** و از **پورت C** برای سیگنال‌های کنترلی (Handshake) استفاده می‌شود. - **سیگنال‌های Handshake:** - **STB (Strobe Input):** دستگاه خارجی با این سیگنال به ۸۲۵۵ می‌گوید داده را دریافت کند. - **IBF (Input Buffer Full):** ۸۲۵۵ با این سیگنال تأیید می‌کند که داده را ذخیره کرده است. - **INTR (Interrupt Request):** در صورت فعال بودن، وقفه به CPU ارسال می‌شود. - **پورت A یا B می‌توانند ورودی یا خروجی باشند، اما نه همزمان در یک حالت.** - **کاربرد:** - ارتباط با دستگاه‌هایی مانند پرینتر، ADC و سایر تجهیزاتی که نیاز به تأیید دریافت/ارسال داده دارند. #### **ج) حالت ۲ (Mode 2): حالت باس دوطرفه (Bidirectional Bus)** - **ویژگی‌ها:** - **فقط پورت A** می‌تواند در این حالت کار کند. - **داده‌ها به صورت دوطرفه (هم ورودی و هم خروجی)** منتقل می‌شوند. - از **پورت C** برای سیگنال‌های کنترلی استفاده می‌شود: - **OBF (Output Buffer Full):** نشان‌دهنده آماده بودن داده برای دستگاه خارجی. - **ACK (Acknowledge):** دستگاه خارجی دریافت داده را تأیید می‌کند. - **INTR (Interrupt Request):** وقفه برای CPU ارسال می‌شود. - **کاربرد:** - ارتباط با حافظه‌ها یا دستگاه‌های دوطرفه مانند **هارددیسک‌های قدیمی**. --- ### **۲. نحوه پیکربندی ۸۲۵۵:** - **ثبات کنترل (Control Register)** تعیین می‌کند که هر پورت در چه حالتی کار کند. - **یک بایت کنترل** به ۸۲۵۵ ارسال می‌شود که حالت هر پورت را مشخص می‌کند. #### **مثال:** - **حالت ۰ با پورت A و B به صورت خروجی و پورت C به صورت ورودی:** ``` Control Word = 10000010 (0x82) ``` --- ### **۳. مقایسه حالت‌ها:** | **حالت** | **نوع ارتباط** | **پورت‌های مورد استفاده** | **کاربرد** | |------------|----------------------|--------------------------|-----------------------------| | **Mode 0** | ساده (بدون Handshake)| A, B, C (مستقل) | LED، سوئیچ، صفحه‌کلید | | **Mode 1** | با Handshake | A/B (داده) + C (کنترل) | پرینتر، ADC | | **Mode 2** | دوطرفه | A (داده) + C (کنترل) | حافظه، هارددیسک | --- ### **۴. نکته مهم:** - **پورت C** در حالت‌های ۱ و ۲ به عنوان **پورت کنترل** عمل می‌کند و نمی‌توان از تمام پین‌های آن به صورت I/O ساده استفاده کرد. <hr style="border: 4px solid GREEN;"> ### ۱۰. مطابق جدول زیر و رجیسترهای مربوط به ۸۲۵۵ ابتدا آی‌سی را در مود Simple قرار دهید، سپس بیت ۱ و ۲ از پورت A و ۷ و ۵ از پورت C را خروجی صفر قرار دهید؟ (۴) پاسخ: ### **پیکربندی ۸۲۵۵ در حالت ساده (Mode 0) و تنظیم بیت‌های خروجی** برای انجام این عملیات، مراحل زیر را دنبال می‌کنیم: #### **۱. قرار دادن ۸۲۵۵ در حالت ساده (Mode 0)** - **پورت A:** خروجی - **پورت B:** ورودی (فرضی، چون در سوال اشاره نشده) - **پورت C:** خروجی (برای بیت‌های مورد نظر) **مقدار ثبات کنترل (Control Register) برای حالت ساده:** - **فرمت بایت کنترل:** ``` D7 D6 D5 D4 D3 D2 D1 D0 ``` - **D7 = 1** (فعال‌سازی Mode Set) - **D6-D5 = 00** (Port A در Mode 0) - **D4 = 0** (Port A خروجی) - **D3 = 0** (Port C (Lower) خروجی) - **D2 = 0** (Port B در Mode 0) - **D1 = 1** (Port B ورودی - فرضی) - **D0 = 0** (Port C (Upper) خروجی) **مقدار نهایی:** ``` 1 0 0 0 0 1 0 0 → **0x84** (در مبنای هگز) ``` #### **۲. تنظیم بیت‌های خروجی در پورت‌ها** - **بیت ۱ و ۲ از پورت A را صفر می‌کنیم:** - پورت A یک پورت **خروجی** است، پس باید مقدار آن را طوری تنظیم کنیم که بیت‌های ۱ و ۲ صفر باشند. - مثال: اگر قبلاً **Port A = 0xFF (همه بیت‌ها ۱)** بوده، پس از تغییر: ``` Port A = 11111001 (0xF9) → بیت‌های ۱ و ۲ صفر شده‌اند. ``` - **بیت‌های ۷ و ۵ از پورت C را صفر می‌کنیم:** - پورت C نیز در حالت **خروجی** است. - مثال: اگر قبلاً **Port C = 0xFF** بوده، پس از تغییر: ``` Port C = 01011111 (0x5F) → بیت‌های ۷ و ۵ صفر شده‌اند. ``` --- ### **۳. کد اسمبلی نمونه (برای ۸۰۸۶)** ```assembly MOV AL, 84h ; مقداردهی ثبات کنترل (0x84) OUT 63h, AL ; آدرس ثبات کنترل ۸۲۵۵ (فرضی: 0x63) MOV AL, 0F9h ; تنظیم پورت A (بیت‌های ۱ و ۲ صفر) OUT 60h, AL ; آدرس پورت A (فرضی: 0x60) MOV AL, 5Fh ; تنظیم پورت C (بیت‌های ۷ و ۵ صفر) OUT 62h, AL ; آدرس پورت C (فرضی: 0x62) ``` --- ### **۴. جمع‌بندی:** 1. **پیکربندی ۸۲۵۵ در Mode 0** با ارسال **0x84** به ثبات کنترل. 2. **تنظیم بیت‌های ۱ و ۲ پورت A به صفر** با ارسال **0xF9** به پورت A. 3. **تنظیم بیت‌های ۷ و ۵ پورت C به صفر** با ارسال **0x5F** به پورت C. اگر آدرس‌های واقعی ۸۲۵۵ در سیستم شما متفاوت است، باید آدرس‌های **Control Port** و **Data Ports** را اصلاح کنید. <hr style="border: 4px solid GREEN;"> ### ۱۱. نحوه کار آی‌سی ۸۲۵۴ (کانتر) را شرح دهید؟ (۱) پاسخ: ### **نحوه عملکرد آی‌سی ۸۲۵۴ (Timer/Counter)** آی‌سی **۸۲۵۴** یک **تایمر/کاونتر برنامه‌پذیر** است که در سیستم‌های دیجیتال برای **تولید پالس، اندازه‌گیری فرکانس، تقسیم فرکانس و کنترل وقفه‌های زمانی** استفاده می‌شود. این تراشه شامل **۳ کانال مستقل ۱۶ بیتی (Timer 0, Timer 1, Timer 2)** است که هر کدام می‌توانند در **مودهای مختلف** پیکربندی شوند. --- ### **۱. بلوک‌های اصلی ۸۲۵۴:** - **کانال‌های ۰، ۱ و ۲:** هر کانال یک تایمر/کاونتر مستقل با ثبات‌های: - **CR (Count Register):** مقدار اولیه شمارش. - **OL (Output Latch):** ذخیره مقدار فعلی کاونتر. - **ثبات کنترل (Control Register):** تعیین مود عملیاتی هر کانال. - **باس داده (Data Bus):** ارتباط با CPU برای تنظیم پارامترها. --- ### **۲. مودهای عملیاتی ۸۲۵۴:** هر کانال می‌تواند در یکی از **۶ حالت** زیر پیکربندی شود: | **مود** | **نام** | **توضیح** | |---------|--------------------------|---------------------------------------------------------------------------| | **۰** | Interrupt on Terminal Count | پس از اتمام شمارش، خروجی HIGH شده و وقفه ایجاد می‌کند. | | **۱** | Hardware Retriggerable One-Shot | با فعال شدن Trigger، یک پالس منفرد تولید می‌کند. | | **۲** | Rate Generator | تقسیم فرکانس (پالس خروجی به صورت دوره‌ای). | | **۳** | Square Wave Generator | تولید موج مربعی با فرکانس برنامه‌ریزی شده. | | **۴** | Software Triggered Strobe | با نوشتن مقدار به کاونتر، یک پالس منفی تولید می‌کند. | | **۵** | Hardware Triggered Strobe | مشابه مود ۴، اما با Trigger خارجی. | --- ### **۳. نحوه عملکرد پایه‌ها:** - **CLK (Clock):** ورودی کلاک برای شمارش. - **GATE:** فعال/غیرفعال کردن کاونتر (مثلاً در مود ۱ با GATE=1 شروع می‌شود). - **OUT:** سیگنال خروجی (بسته به مود، پالس یا موج مربعی است). --- ### **۴. مراحل برنامه‌نویسی ۸۲۵۴:** 1. **تنظیم ثبات کنترل:** انتخاب کانال و مود عملیاتی. - مثال: `MOV AL, 00110110b` (کانال ۰، مود ۳، فرمت خواندن/نوشتن ۱۶ بیتی). - `OUT 43h, AL` (فرضاً آدرس ثبات کنترل ۰x43). 2. **بارگذاری مقدار اولیه کاونتر:** - مثال: `MOV AX, 1000` (تعداد پالس‌های مورد نظر). - `OUT 40h, AL` (ارسال بایت کم ارزش به کانال ۰). - `OUT 40h, AH` (ارسال بایت پر ارزش). 3. **فعال کردن کانال:** (با تنظیم GATE یا منتظر ماندن برای Trigger). --- ### **۵. مثال کاربردی (تولید وقفه تایمر در x86):** - **کانال ۰** در مود ۳ (موج مربعی) برای وقفه سخت‌افزاری تایمر سیستم (IRQ0) استفاده می‌شود. - مقدار کاونتر = `1193180 Hz / فرکانس مورد نظر` (مثلاً ۱ms = 1193). --- ### **۶. تفاوت ۸۲۵۴ با ۸۲۵۳:** - **۸۲۵۴** نسخه پیشرفته‌تر **۸۲۵۳** با پشتیبانی از فرکانس‌های بالاتر و قابلیت‌های اضافه است. --- ### **۷. کاربردهای رایج:** - **تولید وقفه زمانی** (مثل تایمر سیستم در کامپیوترهای قدیمی). - **مدولاسیون PWM** (کنترل سرعت موتور). - **اندازه‌گیری فرکانس سیگنال‌های خارجی.** <hr style="border: 4px solid GREEN;"> ### ۱۲. حافظه FIFO به چه صورت عمل می‌کند؟ (۰.۵) پاسخ: **FIFO** (First-In, First-Out) یک نوع حافظه یا بافر است که داده‌ها به ترتیب **ورود**، **خروج** پیدا می‌کنند (مثل صف انتظار). این حافظه در سیستم‌های دیجیتال برای **همگام‌سازی داده‌ها، کاهش هدزدن (Latency) و مدیریت جریان داده** استفاده می‌شود. --- ### **۱. ساختار FIFO:** - **دو اشارهگر (Pointer):** - **Write Pointer (WP):** نشان‌دهنده محل نوشتن داده جدید. - **Read Pointer (RP):** نشان‌دهنده محل خواندن داده قدیمی. - **ثبات‌های ذخیره‌سازی:** آرایه‌ای از سلول‌های حافظه (معمولاً SRAM یا رجیسترها). - **سیگنال‌های کنترلی:** - **Full:** نشان‌دهنده پر بودن FIFO. - **Empty:** نشان‌دهنده خالی بودن FIFO. --- ### **۲. نحوه عملکرد:** 1. **نوشتن داده (Write Operation):** - داده جدید در محل **WP** ذخیره می‌شود. - **WP** یک واحد افزایش می‌یابد. - اگر **WP = RP** و عملیات نوشتن انجام شود، **Overflow** رخ می‌دهد. 2. **خواندن داده (Read Operation):** - داده از محل **RP** خوانده می‌شود. - **RP** یک واحد افزایش می‌یابد. - اگر **RP = WP** و عملیات خواندن انجام شود، **Underflow** رخ می‌دهد. 3. **حالت‌های خاص:** - **FIFO خالی:** وقتی **RP = WP**. - **FIFO پر:** وقتی **WP یک دور کامل زده و به RP رسیده باشد**. --- ### **۳. انواع FIFO:** | **نوع** | **توضیح** | **کاربرد** | |-----------------|--------------------------------------------------------------------------|---------------------------------| | **سخت‌افزاری** | با تراشه‌های اختصاصی (مثل IDT720x) یا درون FPGA پیاده‌سازی می‌شود. | ارتباطات پرسرعت (USB, Ethernet)| | **نرم‌افزاری** | با آرایه‌ها و اشارهگرها در کد پیاده‌سازی می‌شود. | صف‌های پردازشی در سیستم‌عامل‌ها | --- ### **۴. مثال کاربردی:** - **ارتباط UART:** FIFO برای ذخیره داده‌های ارسالی/دریافتی استفاده می‌شود تا از از دست رفتن داده جلوگیری کند. - **پردازش تصویر:** بافر کردن پیکسل‌ها قبل از پردازش توسط CPU یا GPU. --- ### **۵. مزایای FIFO:** - مدیریت خودکار جریان داده بدون نیاز به وقفه. - کاهش هدزدن در سیستم‌های ناهمگام (مثل ارتباط بین دو ماژول با کلاک متفاوت). <hr style="border: 4px solid GREEN;"> ### ۱۳. پروگرام کانتر و استک پوینتر را به اختصار شرح دهید؟ (۱) پاسخ: #### **۱. پروگرام کانتر (Program Counter - PC)** - **تعریف:** یک رجیستر **۱۶ یا ۳۲ بیتی** در CPU که آدرس دستور بعدی برای اجرا را نگه می‌دارد. - **نحوه کار:** - پس از هر فراخوانی دستور، به صورت **خودکار افزایش** می‌یابد (مثلاً +۱ در AVR، +۲ در ۸۰۸۶ به دلیل حافظه بایت آدرسده). - در صورت **پرش (Jump)، فراخوانی زیرروال (Call)** یا **وقفه**، مقدار جدیدی می‌گیرد. - **کاربرد:** کنترل توالی اجرای دستورات در برنامه. #### **۲. استک پوینتر (Stack Pointer - SP)** - **تعریف:** یک رجیستر **۱۶ یا ۳۲ بیتی** که آدرس بالای استک (Last Used Address) را نشان می‌دهد. - **نحوه کار:** - **Push:** داده را در استک ذخیره و **SP کاهش** می‌یابد (در معماری‌های با استک نزولی مثل x86 و AVR). - **Pop:** داده را از استک بازیابی و **SP افزایش** می‌یابد. - **کاربرد:** ذخیره موقت داده‌ها، آدرس بازگشت از زیرروال‌ها و مدیریت وقفه‌ها. --- ### **مقایسه کلیدی:** | **ویژگی** | **پروگرام کانتر (PC)** | **استک پوینتر (SP)** | |--------------------|--------------------------------------|------------------------------------| | **نوع رجیستر** | اشاره‌گر به دستور بعدی | اشاره‌گر به بالای استک | | **تغییر مقدار** | اتوماتیک (اجرای دستورات/پرش) | دستی (Push/Pop) یا توسط Call/Ret | | **اهمیت** | حیاتی برای اجرای برنامه | حیاتی برای مدیریت حافظه موقت | --- ### **مثال در معماری‌های مختلف:** - **۸۰۸۶:** - **PC = IP (Instruction Pointer)**، **SP = SP** (نزولی، شروع از SS:SP). - دستور `CALL` آدرس بازگشت را Push می‌کند و `RET` آن را Pop می‌کند. - **AVR:** - **PC = ۱۶ بیتی**، **SP = ۸ یا ۱۶ بیتی** (بسته به مدل). - دستور `PUSH R16` مقدار رجیستر را در استک ذخیره می‌کند. <hr style="border: 4px solid GREEN;"> ### ۱۴. راه‌های اعلان کلید را بنویسید و هر یک را به اختصار شرح دهید؟ (۲) پاسخ: ### **راه‌های اعلان (تشخیص) کلید (Key Detection Methods)** در سیستم‌های دیجیتال، برای تشخیص فشرده شدن کلید (Key Press) از روش‌های مختلفی استفاده می‌شود. این روش‌ها به دو دسته **سخت‌افزاری** و **نرم‌افزاری** تقسیم می‌شوند: --- ### **۱. روش‌های سخت‌افزاری** #### **الف) ماتریس کلید (Keypad Matrix)** - **توضیح:** - کلیدها در یک ساختار **سطری-ستونی** (مثلاً ۴×۴) چیده می‌شوند. - با اسکن سطرها و بررسی تغییرات در ستون‌ها، کلید فشرده شده شناسایی می‌شود. - **مزایا:** - کاهش تعداد پایه‌های مورد نیاز (مثلاً ۸ پایه برای ۱۶ کلید). - **معایب:** - نیاز به اسکن مداوم (Polling) یا وقفه. #### **ب) مقاومت Pull-Up/Pull-Down** - **توضیح:** - هر کلید به یک پایه GPIO متصل است و با **مقاومت Pull-Up** (مثلاً به VCC) یا **Pull-Down** (به GND) تنظیم می‌شود. - فشرده شدن کلید باعث تغییر سطح منطقی (HIGH → LOW یا بالعکس) می‌شود. - **مزایا:** - ساده و ارزان. - **معایب:** - برای تعداد زیاد کلیدها به پایه‌های زیادی نیاز دارد. #### **ج) رمزگذار (Encoder)** - **توضیح:** - از آی‌سی‌های مانند **74HC148** (8-to-3 Encoder) استفاده می‌شود. - هر کلید یک کد منحصربه‌فرد تولید می‌کند. - **کاربرد:** - صفحه‌کلیدهای صنعتی با تعداد کلیدهای زیاد. --- ### **۲. روش‌های نرم‌افزاری** #### **الف) پولینگ (Polling)** - **توضیح:** - CPU به صورت مداوم وضعیت کلیدها را چک می‌کند. - مثال: در یک حلقه بی‌نهایت، پایه‌های GPIO خوانده می‌شوند. - **مزایا:** - پیاده‌سازی ساده. - **معایب:** - مصرف منابع CPU و کاهش کارایی. #### **ب) وقفه (Interrupt)** - **توضیح:** - کلیدها به پایه‌های وقفه (مثل INT0, INT1 در AVR) متصل می‌شوند. - با فشرده شدن کلید، یک وقفه ایجاد شده و CPU پردازش اصلی را متوقف می‌کند. - **مزایا:** - واکنش سریع و بهینه‌سازی مصرف انرژی. - **معایب:** - محدودیت در تعداد پایه‌های وقفه. #### **ج) دیبانس نرم‌افزاری (Debouncing)** - **توضیح:** - نویز مکانیکی کلید (Bounce) با تاخیر یا الگوریتم‌های نرم‌افزاری فیلتر می‌شود. - مثال: استفاده از تایمر یا چک کردن چندباره وضعیت کلید. - **مزایا:** - جلوگیری از تشخیص اشتباه چندباره کلید. --- ### **۳. مقایسه روش‌ها** | **روش** | **سرعت** | **مصرف منابع** | **پیچیدگی** | **کاربرد** | |-----------------------|----------|----------------|-------------|---------------------------| | **ماتریس کلید** | متوسط | متوسط | متوسط | صفحه‌کلید‌ها | | **ءPull-Up/Down** | سریع | کم | کم | کلیدهای تک | | **رمزگذار** | سریع | کم | بالا | سیستم‌های صنعتی | | **پولینگ** | کند | زیاد | کم | سیستم‌های ساده | | **وقفه** | بسیار سریع | کم | متوسط | سیستم‌های بلادرنگ | --- ### **۴. مثال کاربردی در AVR (با وقفه و دیبانس)** ```c #include <avr/io.h> #include <avr/interrupt.h> ISR(INT0_vect) { // وقفه هنگام فشرده شدن کلید _delay_ms(20); // دیبانس if (!(PIND & (1 << PD2))) { // چک مجدد کلید // کد واکنش به کلید } } int main() { DDRD &= ~(1 << PD2); // پایه PD2 به عنوان ورودی PORTD |= (1 << PD2); // فعال کردن Pull-Up داخلی EICRA |= (1 << ISC01); // وقفه روی لبه پایین‌رونده EIMSK |= (1 << INT0); // فعال کردن وقفه INT0 sei(); // فعال کردن وقفه‌های全局 while (1) { } } ``` <hr style="border: 4px solid GREEN;"> ### ۱۵. بایت تولید شده از فشردن کلید ۱۲ از صفحه کلید اول در مود 2Key بنویسید؟ (۱) پاسخ: ### **بایت تولید شده از فشردن کلید ۱۲ در صفحه‌کلید ماتریسی (مود 2Key)** در **مود 2Key Rollover** (تشخیص همزمان دو کلید)، صفحه‌کلید ماتریسی (مثلاً ۴×۴) با اسکن سطرها و ستون‌ها، یک **کد اسکن (Scan Code)** تولید می‌کند. برای کلید **شماره ۱۲** در یک صفحه‌کلید استاندارد: --- ### **۱. ساختار بایت خروجی در مود 2Key:** - بایت اسکن معمولاً به صورت **۱ بایت (۸ بیتی)** است و ترکیبی از **سطر (Row)** و **ستون (Column)** را نشان می‌دهد. - فرمت رایج: - **۴ بیت بالا (High Nibble):** شماره سطر (Row) - **۴ بیت پایین (Low Nibble):** شماره ستون (Column) --- ### **۲. محاسبه کد کلید ۱۲ در ماتریس ۴×۴:** - فرض کنید صفحه‌کلید شما **۴ سطر و ۴ ستون** دارد (۱۶ کلید، شماره‌گذاری از ۰ تا ۱۵). - کلید **۱۲** در این ماتریس: - **سطر (Row):** `12 / 4 = 3` (سطر چهارم، چون شماره‌گذاری از ۰ شروع می‌شود). - **ستون (Column):** `12 % 4 = 0` (ستون اول). - **مقدار بایت:** - سطر ۳ → `0011` (باینری) - ستون ۰ → `0000` (باینری) - ترکیب: `0011 0000` = **`0x30`** (هگزادسیمال). --- ### **۳. نکات مهم:** - **مود 2Key Rollover:** سیستم می‌تواند همزمان دو کلید فشرده شده را تشخیص دهد (مثلاً `0x30` برای کلید ۱۲ و `0x21` برای کلید ۹). - **دیبانسینگ:** برای جلوگیری از نویز، معمولاً یک تاخیر ۲۰-۵۰ میلی‌ثانیه‌ای اعمال می‌شود. - **تفاوت با مود NKRO:** در مود **N-Key Rollover**، تمام کلیدها به صورت جداگانه اسکن می‌شوند. --- ### **۴. مثال خروجی در برنامه‌نویسی:** ```c // مثال کد C برای خواندن کلید ۱۲ در AVR uint8_t key = 0x30; // بایت اسکن کلید ۱۲ if (key == 0x30) { printf("کلید ۱۲ فشرده شد!"); } ``` <hr style="border: 4px solid GREEN;"> ### ۱۶. معماری Risc و Cisc را تعریف و مقایسه کنید؟ همچنین علت اصلی استفاده از ریسک را بنویسید. (۱) پاسخ: #### **۱. تعریف معماری‌ها** #### **الف) CISC (Complex Instruction Set Computer)** - **تعریف:** - دارای **دستورات پیچیده و متنوع** است که هر کدام می‌توانند چندین عمل را انجام دهند. - مثال: یک دستور می‌تواند همزمان **بارگذاری از حافظه، محاسبه و ذخیره نتیجه** را انجام دهد. - **ویژگی‌ها:** - دستورات طولانی و با سایز متغیر (مثل x86). - ترانزیستورهای بیشتر برای پیاده‌سازی دستورات. - معمولاً **کدهای برنامه کوتاه‌تر** (به دلیل قدرت دستورات). #### **ب) RISC (Reduced Instruction Set Computer)** - **تعریف:** - دارای **دستورات ساده و ثابت‌طول** است که هر کدام فقط یک عمل ساده انجام می‌دهند. - مثال: دستور `ADD` فقط جمع می‌کند و دستور `LOAD` فقط داده را از حافظه می‌خواند. - **ویژگی‌ها:** - دستورات **۴ بایتی و یکنواخت** (مثل ARM، RISC-V). - تعداد ترانزیستور کمتر و مصرف انرژی پایین‌تر. - **نیاز به کدهای طولانی‌تر** (چون هر عمل ساده باید جداگانه اجرا شود). --- #### **۲. مقایسه RISC و CISC** | **معیار** | **CISC** (مثل x86) | **RISC** (مثل ARM, RISC-V) | |-------------------------|----------------------------------|----------------------------------| | **دستورات** | پیچیده، چندعملیاتی، متغیر‌طول | ساده، تک‌عملیاتی، ثابت‌طول | | **سرعت اجرا** | کندتر (به دلیل پیچیدگی) | سریع‌تر (بهینه‌سازی خط لوله) | | **مصرف انرژی** | بیشتر | کمتر (مهم در موبایل و IoT) | | **پیاده‌سازی سخت‌افزار**| پیچیده | ساده و مقرون‌به‌صرفه | | **کدنویسی** | برنامه‌ها کوتاه‌تر | برنامه‌ها طولانی‌تر | | **مثال‌ها** | Intel 8086، AMD64 | ARM Cortex، RISC-V، MIPS | --- #### **۳. علت اصلی استفاده از RISC** - **بهینه‌سازی عملکرد و مصرف انرژی:** - دستورات ساده‌تر باعث **اجرای سریع‌تر** (با Pipeline کردن) و **کاهش توان مصرفی** می‌شوند. - مناسب برای دستگاه‌های **موبایل،嵌入式 سیستم‌ها (Embedded) و پردازنده‌های مدرن** (مثل Apple M1). - **مقیاس‌پذیری:** - معماری‌های RISC (مثل ARM و RISC-V) انعطاف‌پذیر هستند و برای **پردازنده‌های چندهسته‌ای** مناسب‌ترند. - **کاهش هزینه طراحی:** - پیاده‌سازی سخت‌افزار ساده‌تر، هزینه تولید را کاهش می‌دهد. --- #### **۴. مثال کاربردی** - **پردازنده‌های CISC:** - Intel Core i7 (برای کامپیوترهای دسکتاپ با سازگاری بالا). - **پردازنده‌های RISC:** - ARM Cortex-A (موبایل)، ESP32 (IoT)، RISC-V (پردازنده‌های Open-Source). #### **نتیجه‌گیری:** امروزه به دلیل نیاز به **کارایی بالا و مصرف انرژی کم**، معماری RISC غالب شده است (مثل پردازنده‌های ARM در اکثر موبایل‌ها و آیوت‌ها). با این حال، CISC هنوز در بازار دسکتاپ به دلیل **سازگاری عقبرو** حفظ شده است. <hr style="border: 4px solid GREEN;"> <hr style="border: 4px solid GREEN;"> ## جداول --- ### جدول فرمت کلمه وضعیت/داده | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | Status of control | Status of shift | Row | Row | Row | Column | Column | Column | | | | | | --- ### جدول فرمت کلمه کنترل | Mode | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | **Control** | I/O-BSR | G_A Mode(0,1,2) | G_A Mode(0,1,2) | PA(I/O) | PCU(I/O) | G_B Mode(0,1) | PB(I/O) | PCL(I/O) | | **BSR** | I/O-BSR | - | - | - | Bit Select | Bit Select | Bit Select | S/R | | | | | | | | | | | --- ### جدول انتخاب (Action) | CS | A₁ | A₀ | Action | | :---: | :--: | :--: | :---: | | 0 | 0 | 0 | Port A | | 0 | 0 | 1 | Port B | | 0 | 1 | 0 | Port C | | 0 | 1 | 1 | Control Reg | | 1 | X | X | Not select | <hr style="border: 4px solid GREEN;"> <hr style="border: 4px solid GREEN;"> <hr style="border: 4px solid GREEN;"> ## 3 سوالات --- ### ۱. پردازش را به اختصار شرح دهید؟ (۱) --- ### ۲. مزیت بزرگ بودن Data BUS و Address BUS را بنویسید و ظرفیت یک حافظه با آدرس باس 5 بیتی را بنویسید؟ (۱.۵) --- ### ۳. مفهوم بیت‌های فلگ رجیستر واحد ALU را به اختصار شرح دهید؟ (۱.۵) | CY | P | AC | Z | S | | :--: | :--: | :--: | :--: | :--: | | | | | | | --- ### ۴. تفاوت رجیسترهای General Purpose با Special Purpose در 8085 را بنویسید و دو رجیستر قابل دسترس را نام ببرید؟ (۲) --- ### ۵. چرخه پردازش CPU را همراه با وقفه رسم کنید؟ (۱) --- ### ۶. وقفه چیست و انواع وقفه را نام ببرید ضمنا نحوه اعمال وقفه را نام ببرید؟ (۲) --- ### ۷. نحوه عملیات آی‌سی ۸۲۳۷ (DMA) را به اختصار شرح دهید؟ (۱) --- ### ۸. مودهای عملیاتی 8255 (توسعه GPIO) را به اختصار شرح دهید؟ (۱) --- ### ۹. مطابق جدول زیر و رجیسترهای مربوط به 8255 ابتدا آی‌سی را در مود Simple قرار دهید سپس بیت ۱ و ۲ از پورت A و ۷ و ۵ از پورت C را خروجی صفر قرار دهید؟ (۴) --- ### ۱۰. نحوه کار آی‌سی 8259 (توسعه وقفه) را شرح دهید؟ (۱) --- ### ۱۱. حافظه FIFO به چه صورت عمل می‌کند؟ (۰.۵) --- ### ۱۲. پروگرام کانتر و استک پوینتر را به اختصار شرح دهید و موارد استفاده آن را بنویسید؟ (۱) --- ### ۱۳. راه‌های اعلان کلید را بنویسید و هر یک را به اختصار شرح دهید؟ (۲) --- ### ۱۴. بایت تولید شده از فشردن کلید 12 از صفحه کلید اول و 53 از صفحه دوم در مود 2Key بنویسید؟ (۱) --- ### ۱۵. نحوه کار بخش Display در آی‌سی 8279 را شرح دهید؟ (۱) --- ### ۱۶. نحوه کار اعلام کلید در مود ۲ و ۱ در آی‌سی 8279 را شرح دهید؟ (۱) --- --- --- ## جداول --- **جدول ۱: فرمت کلمه وضعیت/داده** | D۷ | D۶ | D۵ | D۴ | D۳ | D۲ | D۱ | D۰ | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | Status of control | Status of shift | Row | Column | | | | | | --- **جدول ۲: فرمت کلمه کنترل** | Mode | D۷ | D۶ | D۵ | D۴ | D۳ | D۲ | D۱ | D۰ | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | **Control** | I/O | BSR | G_A Mode(۰,۱,۲) | PA(I|O) | PCU(I|O) | G_B Mode(۰,۱) | PB(I|O) | PCL(I|O) | | **BSR** | I/O | BSR | - | - | Bit Select | S|R | | | | | | | | | | | --- **جدول ۳: جدول انتخاب (Action)** | CS | A₁ | A₀ | Action | | :---: | :--: | :--: | :---: | | ۰ | ۰ | ۰ | Port A | | ۰ | ۰ | ۱ | Port B | | ۰ | ۱ | ۰ | Port C | | ۰ | ۱ | ۱ | Control Reg | | ۱ | X | X | Not select |