<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** را میتوان به دو نیمه **Cupper (PC4-PC7)** و **Clower (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 |