---
# System prepended metadata

title: 3 Microprocessor sending samples with solved

---

<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 |