FreeBSD 11.0-RC1 – نخستین دیدار

امروز بعد از مدتها به وبسایت محبوب و معروف دیستروواچ سر زدم و دیدم که یکی از سیستم عامل های محبوبم یعنی FreeBSD یک نسخه نامزد انتشار منتشر کرده!

خب با خوشحالی تمام دانلودش کردم.

اولین چیزی که در FreeBSD 11 برام جالب شد، این بود که توی نصاب خیلی ریز شده بودن و سوال پرسیده بودن، یعنی عمده پیکربندی رو جزئی از نصاب کردن که این خودش یک پوئن مثبت در نوع خودش محسوب میشه. و یک پیشرفت خیلی بزرگ، چون عمده کاربران FreeBSD مدیران سیستم ها هستند، پس این تیپ پیکربندی هنگام نصب بدرد میخوره.

خب، بعد نصب، تصمیم گرفتم اول pkg رو راه بندازم. بعد nano رو نصب کردم (ادیتور محبوب من در CLI ! یه چیز تنبل پسند و عالی!) ، بعدش تصمیم گرفتم دسکتاپ رو راه اندازی کنم. دیدم توی هندبوک، به gnome3 اشاره شده، اونجا بود که فهمیدم احتمالا گنوم شل دوست داشتنیمون هم اومده به FreeBSD . پس gnome3 رو نصب کردم و این خطوط رو به rc.conf افزودم :

کد   
dbus_enable="YES"
hald_enable="YES"
 
#Running GNOME and GDM services
 
gdm_enable="YES"
gnome_enable="YES"

و بعد از یک ریبوت، چشممون به جمال گنوم شل با 3D Acceleration روشن شد :

و این عکس هم به جهت تایید اصالت سیستم عامل :

در مورد این دسکتاپ، که خب یک دسکتاپ مدرن محسوب میشه و تا مدتها در FreeBSD پیداش نبود، میشه گفت که با اضافه شدنش بدون مشکل به سیستم عامل، میتونه به پیشرفت این سیستم عامل در حوزه دسکتاپ کمک کنه. البته، در کل 11 نرم تر از ۹ و ۱۰ بود که قبل تر تست کرده بودم و حتی به عنوان سیستم عامل اصلی ازشون استفاده میکردم.

موفق باشید :)

FacebookTwitterGoogle+Share

تجربه استفاده از اسنپ

unnamed

اسنپ، یکی از چیزایی بود که همیشه دوست داشتم استفاده کنم و تجربه‌ش کنم. حداقل برای یک بار هم که شده. خب، امروز تونستم بالاخره ازش استفاده کنم و از دانشگاه تا خونه رو با اسنپ برم. اولین چیزی که توجه شما رو به خودش جلب میکنه، اینه که اونقدری طول نمیکشه تا یکی از راننده های نزدیک به شما، قبول میکنه که سفر شما رو بر عهده بگیره (لازم به ذکره این کانسپت توسط تاکسی بیسیم ها هم پیاده میشه) ، ولی قضیه جالب تر این بود که اونقدری طول نکشید که راننده بهم زنگ زد و مکان دقیق من رو جویا شد. چندین دقیقه بعد راننده رسید دقیقا همونجایی که ایستاده بودم، و بعد سوار شدم. حالا میتونیم بریم سراغ برشمردن نقاط مثبت و منفیش :

نقاط مثبت :

  • هزینه مناسب : اگر از دم در ورودی دانشگاه (که جدیدا ایستگاه تاکسی شده 😐 ) میخواستم ماشینی رو کرایه کنم، باید حدود ۲۰ هزار تومن، اگر از میدون پونک میخواستم ماشین کرایه کنم حدود ۱۵ هزار تومن باید میدادم. این در صورتیه که با اسنپ همون مسیر رو ۱۱ هزار تومن پرداخت کردم (نزدیک ۹ هزار تومن صرفه جویی، دقیقا از همونجایی که سوار شدم!)
  • کولر : خب، تابستونه و هوا گرم، و اکثر راننده ها به بهونه مصرف بالا و قیمت بنزین، کولر رو روشن نمیکنن (واقعا استهلاک مغز و پوست و گرمازدگی و ….، به اندازه بنزین مهم نیست یعنی؟‌ 😀 ). در صورتی که ماشین اسنپ، از همون اول که سوارش شدم کولرش روشن بود، و خب این توی تابستون یک نقطه مثبت به شمار میاد.
  • مسیر : درسته که مسیر رو از روی نقشه انتخاب کرده بودم، ولی خب راننده هم راه های احتمالی رسیدن به مقصد رو بررسی کرد، و از من خواست که بهینه ترینش رو بهش معرفی کنم. به نظرم این دو حالت داره : اول این که شاید راننده یک مسیر بهتر در نظر داره، و دیگری این که شاید مسیری که من میگم رو راننده به خاطر میسپاره تا مسافر بعدی رو از این مسیر (که از چیزایی که توی ذهن خودش هست، بهینه تره) به مقصد برسونه.

نقاط ضعف :

  • نقشه : اسنپ از نقشه درستی استفاده نمیکنه. اسم خیلی از محله ها، درست وارد نشده، در صورتی که اگر از نقشه گوگل استفاده میکردن، این مشکل پیش نمیومد (حتی میشد مسیر پیشنهادی رو هم از همونجا داد بهشون!)
  • مسیرهای پرکاربرد : به نظرم، باید مسیرهایی که یک مسافر به تعداد زیاد سفر میکنه (مثلا از خونه به دانشگاه و برعکس) ، توی اسنپ سیو بشه، اینطوری راحت میتونیم بگیم میخوایم به فلان مسیر بریم، و خب این خودش یک پوئن مثبته (البته یک بخش «آدرس های منتخب» دارن ولی باز هم این کار رو نمیکنه)

در کل، سفر درون شهری خوب و بی دردسری بود، و از همه مهم تر این که اسنپ بعد از اتمام سفر، از شما نظراتتون در مورد سفر و راننده رو میپرسه، به نظرم این هم جالبه و میتونه کمک کنه به بهتر شدنشون.

FacebookTwitterGoogle+Share

بررسی معماری MIPS

خب، همونطور که داریم سلسله آموزش های ساخت کامپیوتر ساده در Logisim رو دنبال میکنیم، گفتم این وسط یه توضیحی هم در مورد معماری MIPS داشته باشیم. در واقع MIPS یکی از ساده ترین و کم دستور ترین معماری های ممکنه، و البته پیاده سازی دوبارش در نرم افزارهایی مثل Logisim بسیار ساده. میشه.

این یک ALU بسیار ساده بر اساس میپس هست (که البته یک بیتی پیاده شده) :

MIPS

در اینجا، برای تفریق مدار جداگانه ای در نظر نگرفته، بلکه مقدار B رو با یک، XOR کرده (هوشمندانه به نظر میرسه، نه؟) و از less هم برای مقایسه، از یک مالتی پلکسر ۸ به ۱ هم برای انتخاب عملیات استفاده شده (به جای استفاده از دیکدر و گیت های AND )، در کل میشه یک ساختار خیلی قشنگ براش قائل شد، البته بهتر از این هم میشد الگوریتم هایی مثل تفریق رو هم پیاده کرد (مثلا با استفاده از یه mux میشد انتخاب کرد که خود B نیازه یا نقیضش؟ و البته نیاز بود که cin هم حتما روشن شه که مکمل ۲ گرفته شه).

زبان ماشین این ALU هم خیلی سادس، به ازای مقدار ۰ ، عملیات AND ، به ازای ۱ عملیات OR ، به ازای ۲ عملیات XOR ، به ازای ۳ عملیات NOR ، به ازای ۴ عملیات ADD و به ازای ۵ عملیات مقایسه رو انجام میده (البته برای مقایسه هم میشه از XNOR استفاده کرد و تساوی رو سنجید).

امیدوارم که این مطلب به دردتون خورده باشه، همچنین میتونید این معماری رو پیاده کنید و نتیجش رو حتی روی برد بُرد بیارید :) .

موفق باشید.

FacebookTwitterGoogle+Share

ساخت یک کامپیوتر ساده در Logisim – قسمت دوم (مجموعه دستور العمل ها)

در قسمت قبلی، چالش رو مطرح کردیم که کامپیوتر هشت بیتی خودمون رو بسازیم. ببینیم چه مداراتی نیاز داریم؟!

خب ما دو ورودی هشت بیتی A و B رو خواهیم داشت، پس به این موارد نیاز داریم :

  1. مداری برای NOT کردن ورودی A
  2. مداری برای NOT کردن ورودی B
  3. مداری برای AND کردن هر دو ورودی
  4. مداری برای OR کردن هر دو ورودی
  5. مداری برای جمع کردن دو ورودی
  6. مداری برای تفریق دو ورودی

خب، چون ما از یک قطعه به اسم «دیکدر» برای انتخاب دستورات استفاده میکنیم، و دیکدرها هم یک ورودی با سایز n میگیرن، و خروجی اونها «دو به توان n» هست، و ما اینجا «مجموعه دستور العمل» یا Instruction Set مون دارای ۶ دستور هست، بهینه ترین حالت استفاده از یک دیکدر ۳ به ۸ هست. خب، با این حساب، باید کد عملیات ها یا Operation Code ها رو به این شکل تعریف کنیم :

Operation Code
NOT A 000
NOT B 001
AND A, B 010
OR A, B 011
ADD A , B 100
SUB A, B 101

خب الان ما میدونیم که کامپیوتر محترم باید چه دستوراتی رو اچرا کنه. در واقع، وقتی میگیم ۰ ، کامپیوتر اون رو به دیکدر میده و میفهمه که باید نقیض A رو بهمون بده. وقتی ۱ رو فراخوانی میکنیم، باید نقیض B بهمون داده شه، وقتی میگیم ۵ در واقع مقدار B رو از A کم میکنیم و … . با توجه به این که الان، ما یک دیکدر ۳ به ۸ در مدار «واحد محاسبه و منطق» داریم، میتونیم ۴ دستور العمل دیگه هم بهش اضافه کنیم (با شما :) ). در قسمت بعدی این آموزش، میرسیم به این که ورودی ها و خروجی ها رو چطوری مدیریت کنیم. بعدش هم در مورد ساختار کلی ALU صحبت میشه و بعد از چند پست دیگه، یک ALU کامل با هم خواهیم داشت. پس فعلا در مورد بلاهایی که سر ۸ بیت ورودی میشه آورد فکر کنید و شاد باشید :)

FacebookTwitterGoogle+Share

ساخت یک کامپیوتر ساده در Logisim – قسمت اول

بالاخره یه سری پست جدید تصمیم گرفتم بنویسم، و خب این سری قراره که مرحله به مرحله پیش بریم تا یک کامپیوتر ساده بسازیم. تنها دانشی که شما برای این سری از پست ها نیاز دارید :

۱. دونستن کمی مدار منطقی (که قبلا در وبلاگ راجع بهش حسابی صحبت کردم)

۲. بلد بودن کار با Logisim (که میشه گفت مثل نقاشی کشیدن میمونه و همین پست ها رو دنبال کنید یاد میگیرید.).

راه اندازی محیط کار

برای این که بتونیم مداراتمون رو طراحی و آزمایش کنیم، نیاز داریم که نرم افزار Logisim رو داشته باشیم. یه نسخه خوب از این نرم افزار به اسم Logisim Evolution طراحی شده که کار ما رو به شدت ساده تر کرده، خروجی گرفتن ازش بی دردسر تره، و همچنین مدارات و ویژگی هاشون دقیق تر طراحی شده. برای دانلود و نصب و روش راه اندازیش میتونید به اینجا برید. فقط هم نیازه که جاوا روی سیستمتون نصب باشه.

چالش های پیش رو

خب، برای این که بیایم یک کامپیوتر بسیار ساده طراحی کنیم نیاز داریم که یک سری سوالات از خودمون بپرسیم و جواب بدیمشون، اینطوری راحت تر میتونیم مدارات مورد نیاز رو طراحی کنیم و از پیچیدگی محصول نهایی جلوگیری کنیم.

کامپیوتر ما باید چه عملیاتی انجام بده؟

یک کامپیوتر ساده که بتونه به راحتی قابل درک هم باشه، هم باید Word Size کوچیکی داشته باشه (توی آموزش ها با ۸ بیت میریم جلو) و هم Instruction Setش باید کوچیک باشه. یک سری دستور پایه هست که هر کامپیوتری میتونه انجامش بده، ما کامپیوترمون رو اینطور طراحی مکنیم که AND, OR, NOT رو بتونه انجام بده، علاوه بر اون بتونه جمع و تفریق هم بکنه. پس باید :

  1. مداری طراحی کنیم که بتونه ۸ بیت رو NOT کنه
  2. مداری طراحی کنیم که بتونه ۸ بیت رو OR کنه
  3. مداری طراحی کنیم که بتونه ۸ بیت رو AND کنه
  4. و مدار(ها)ی طراحی کنیم که بتونن ۸ بیت رو جمع و تفریق کنن.

حالا به سادگی میتونیم بفهمیم که چی میخوایم. البته این صرفا واحد محاسبه و منطق هست، ما باید یک واحد حافظه، یک واحد کنترل و چند واحد حافظه موقتی و کوچک هم طراحی کنیم که با چسبوندنشون به هم، بتونیم به کامپیوتر کامل برسیم.

در پست های بعدی، زیرمدارهای کامپیوتر خودمون رو میسازیم. در این پست صرفا با کامپیوتر ساده و کوچیکمون آشنا شدیم :)

FacebookTwitterGoogle+Share

نوشتن اسمبلی ۳۲ بیت

در گذشته، پست هایی که در مورد اسمبلی قرار دادم، همه در مورد اسمبلی ۱۶ بیت بودن اما حالا میخوایم بریم سراغ اسمبلی ۳۲ بیت. خب فرق ۱۶ با ۳۲ بیت در چیه؟!

اولین نکته، سایز ثبات هاست! در ۱۶ بیت در هر ثبات میتونستیم حداکثر یک مقدار ۴ رقمی هگزادسیمال ذخیره کنیم ولی در ۳۲ بیت این مقدار به ۸ رقم میرسه! حالا خیلی مسائل دیگه مثل دیتاباس و کنترل باس و … که بماند (چون اینجا داریم برنامه نویسی میکنیم و بیشتر با ثبات ها کار داریم).

اینجا، قضیه یه فرقای کوچولویی داره، مثلا اسمبلر nasm قراره استفاده بشه (گرچه قبلا در ساخت اون سیستم عامل کوچک ازش استفاده کردیم) و همچنین وقفه ها و system call هایی که استفاده میکنیم شماره و مقدارشون و مکانشون متفاوته.

بیاید این برنامه رو در نظر بگیریم :

کد   
section .text
	global_start
 
_start:
	mov edx, len
	mov ecx, msg
	mov eax, 0x04
	int 0x80
 
	mov eax, 0x01
	int 0x80
 
section .data
	msg db 'Hello, World!', 0xa
	len equ $ - msg

 

خب در بخش اول، تابعی که نیاز داریم فراخوانی کنیم رو تعریف کردیم. بعدش اومدیم start رو نوشتیم. حالا بیاید این بخش رو بررسی کنیم :

کد   
mov edx, len
mov ecx, msg
mov eax, 0x04
int 0x80

اینجا، مقدار طول رشته ای که خواستیم چاپ کنیم رو توی EDX یا رجیستر داده قرار دادیم. بعدش اومدیم پیامی که میخوایم چاپ بشه رو قرار دادیم درو نECX .

بعدش سیستم کال ۴ یا sys_write رو توی eax قرار دادیم و وقفه ۸۰ رو صدا زدیم. حالا وقفه ۸۰ با مقدار ۴ که توی eax ذخیره شده، میگرده دنبال رشته ای که توی ecx هست و بعدش چاپش میکنه.

حالا بخش دوم کد سگمنت رو بررسی میکنیم :

کد   
mov eax, 0x01
int 0x80

اینجا هم مقدار ۰۱ یا sys_exit رو وارد eax کردیم، تا برنامه پس از اجرا، خارج شه. بعد از این هم باز وقفه ۸۰ رو صدا زدیم.

بخش دیتا هم، مثل همه برنامه های قبلی، تمام داده های مورد نیاز رو با Directive ها تعریف کردیم که بتونیم به راحتی توی کد سگمنت ازشون استفاده کنیم و چون قبلا توضیح داده شده، دیگه دوباره کاری نمی کنم. فقط این پست رو نوشتم تا فرقهای اسمبلی ۳۲ و ۱۶ بیت رو ببینیم. که درآینده بسطش خواهم داد به ۶۴ بیت.

امیدوارم که این پست، بدردتون خورده باشه.

موفق و موید باشید!

FacebookTwitterGoogle+Share

درآمدی بر پردازنده ها

ALUwithRegister

پس از مدتها تحقیق و بررسی در مورد پردازنده های مرسوم، و همچنین خوندن داکیومنت های مربوط به ساخت و پیاده سازی پردازنده ها، تصمیم گرفتم یک داکیومنت ساده دست و پا کنم، که توی اون از ساده ترین قطعات و بخش های کامپیوتر، به یک پردازنده ساده برسیم که بتونه چند عملیات انجام بده و نتیجه رو ذخیره کنه.

داکیومنت از اینجا قابل دریافت هست.

با تشکر.

FacebookTwitterGoogle+Share

زبان ماشین، رمزگشای دستور العمل

در پست های گذشته بسیار بسیار در مورد زبان ماشین و اسمبلی بحث کردیم، اما این بار میخوایم بررسی کنیم که یک دستور، چطور کار میکنه. برای این کار، ما از ساده ترین دستورات استفاده میکنیم. قبل از اون، باید ببینیم که چه اتفاقی میفته که دستورات ما، شناسایی میشن! پس میایم و دستوراتمون رو بررسی میکنیم.

یک دستور در ماشین چطور خونده میشه؟

این خیلی مهمه که بدونیم یک دستور به چه شکلی خونده میشه. بسیار خوب، دستور زیر رو در نظر بگیرید :

کد   
MOV AX, 0

 

این دستور ماشین کد به این شکل داره :

کد   
B8 0000

 

که البته این ماشین کد، یک ماشین کد هگزادسیمال هست. اون چهار صفری که داریم که مقداری هست که خواستیم توی AX قرار بدیم و باهاش کاری نداریم، ولی B8 ما ، همون دستوریه که لازمه رمزگشایی شه و به صورت دو دویی به این شکل در میاد :

کد   
1011 1000

 

خب ما یک «دیکدر» (که یک مدار متشکل از n ورودی و دو به توان n خروجی هست) داریم، که این اعداد رو به ترتیب روشن و خاموش میکنه، و به این شکله که ما به  دستور میرسیم. در واقع مدارات مربوط به دستور رو خواهیم داشت.

بسیار خوب، حالا که میدونیم چه چیزی باعث میشه که ما بتونیم زبان ماشین رو درک کنیم، بیایم بررسی کنیم که :

زبان ماشین از چند بخش تشکیل شده؟

زبان ماشین، اول به صورت اسمبلی نوشته میشه که به زبون انسان خیلی خیلی نزدیکه. یعنی هرکس کمی انگلیسی بدونه میدونه که کلمه ای مثل ADD یعنی جمع کردن. اما، حالا مشکلی که هست اینه که وقتی «اسمبلی» به «آبجکت کد» یا همون کد هگزادسیمال تبدیل میشه رو هرکسی نمیتونه بخونه. پس راه حل چیه؟

اول باید ببینیم که یک خط آبجکت کد از چیا تشکیل میشه! بیاید این مثال رو در نظر بگیریم باز :

کد   
MOV AX, 0 ;B8 0000

 

خب اینجا من آبجکت کد رو به صورت کامنت در آوردم. دو بخش داریم، یکیش چهارتا صفر، که بهش عملوند یا Operand میگیم و دیگری «کد عملیات» یا Operation Code هست. مثلا برای انتقال به AX همیشه از B8 استفاده میشه. چرا؟ چون اینتل اینطور خواسته 😀 . بعد از این، این کد هگزادسیمال به یک کد باینری تبدیل میشه که CPU میتونه اون رو برای ما اجرا کنه.

از کجا آبجکت کد رو بخونیم؟

همه اسمبلر های موجود میتونن فایلی تولید کنن که آبجکت کد، سمبلهای به کار رفته و … رو شامل شه، و در اسمبلر MASM این فایل با پسوند LST ساخته میشه. شما میتونید با باز کردن این فایل با یک ویرایشگر متنی و خوندنش، ببینید که هر دستوری چه کدی رو داره.

یک برنامه نمونه

خب، من یک برنامه اسمبلی خیلی ساده نوشتم که اجرا کردنش هیچ خروجی ای نداره (:D ) ولی خب آبجکت کد ها تولید شده و اسمبل بدون مشکل صورت گرفته. این برنامه با آبجکت کدهاش به صورت کامنت به این شکله (بررسی دستور MOV در ۱۲ حالت مختلف) :

کد   
.MODEL SMALL
.8086
.STACK 
.DATA
.CODE
MOV AX, 0 ;B8 0000
MOV BX, 0 ;BB 0000
MOV CX, 0 ;B9 0000
MOV DX, 0 ;BA 0000
MOV AH, 0 ;B4 00
MOV BH, 0 ;B7 00
MOV CH, 0 ;B5 00
MOV DH, 0 ;B6 00
MOV AL, 0 ;B0 00
MOV BL, 0 ;B3 00
MOV CL, 0 ;B1 00
MOV DL, 0 ;B2 00
END

برای جلوگیری از ابهام هم مقداری که توی رجیسترها ریخته شده صفر هست، به این شکل کد ماشین بسیار ساده تر شده.

تا پست های بعدی، و اسمبلی بیشتر، موفق و موید و آزاد و شاد باشید! :)

FacebookTwitterGoogle+Share

روز آفتابی و لامپ روشن

سلام. در این مطلب، قصد داریم در مورد ساختار کامپیوتر بحث کنیم. البته بیشترین چیزی که توی این مطلب بهش پرداخته میشه، دروازه های منطقی هستند و این که چطور میتونیم اون ها رو بسازیم.

بسیار خوب، عنوان مطلب به قدر کافی گویا هست که قراره چی رو به چی ربط بدیم، ولی بیاید این مثال رو در نظر بگیریم :

یک اتاق داریم که پنجره های زیادی داره و موقعیتش طوریه که در طول روز، بسیار نورگیره. واردش میشیم و می بینیم که یه لامپ روشنه. بعد دنبال کلید میگردیم. می بینیم که دو تا کلید کنار در هست، که هردو در وضعیت خاموش قرار داره. اولین احتمالی که پیش خودمون در نظر میگیریم، اینه که برقکار محترم کلید رو برعکس بسته. خب میگیم ایرادی نداره. یکی رو میزنیم، چراغ خاموش نمیشه. برش میگردونیم به حالت اول و اون یکی رو میزنیم. بازم چراغ خاموش نمیشه. یهو کنجکاو میشیم که هر دو کلید رو با هم در حالت روشن قرار بدیم، اون موقعه که می بینیم چی شد؟ چراغ خاموش شد!

حالا چه چیزی باعث شد که چراغ ما خاموش بشه؟ اینجاست که به جادوی ترانزیستورها باید ایمان بیاریم. در واقع دو کلید ما به یک مدار به این شکل وصل هستند :

0 -NAND Gate using transistors

 

این مدار، یک مدار یا بهتر بگم دروازه منطقیه که بهش NAND میگن. این مدار رو ما توی اون کلید قرار دادیم، و جدول درستیش به این شکله که هر وقت هر دو ورودی صحیح باشن، خروجی غلط میشه. حالا برای نمایش دادن بهتر این گیت، از این نماد استفاده میشه :

1- NAND gate

خب، سایر گیت ها (که با نماد های دیگه ای نشون داده میشن) رو میتونیم از این گیت بسازیم. اما چیزی که هست اینه که این گیت، چیزیه که کامپیوتر رو میسازه. در واقع در عمده IC هایی که خریداری میکنیم تعداد زیادی گیت NAND قرار داره که با وصل کردنش به هم، میتونیم گیت های دیگه ای رو هم بسازیم.

2-NAND Logic

خب، حالا فرض کنیم که به جای دو تا ورودی، یه ورودی دادیم به گیت NAND . یعنی از یک کلید، دو سیم به هر دو ورودی گیت وصل کردیم، به این شکل :

3-NOT Logic using NAND

حالا، اگر این کلید رو بزنیم، خروجی غلط و اگر خاموشش کنیم خروجی درست میشه. این ترکیب رو «نقض کننده» یا NOT هم بهش میگیم. در واقع گیت NOT که یک گیت با یک ورودی هست رو میتونیم به این شکل بسازیم.

الان میدونیم که یک NOT یا نقیض وجود داره. حالا میتونیم به جای اون ورودی، یک NAND با دو ورودی قرار بدیم که به این شکل در بیاد :

4-AND Logic using NAND

خب این مدار، یکم پیچیده شد. ولی دقت کنید که داره نقیض نتیجه NAND رو به ما میده. یعنی چی؟ یعنی در صورتی خروجی درست میشه که هر دو ورودی درست باشن. این منطق و این مدار هم که AND هست، و اگر جبر بول رو کمی بدونید میدونید که از بیسیک ترین دستورات جبر بول هست.

حالا، یه مدل دیگه این گیت ها رو پیش هم میچینیم. چطوری؟ این بار به جای نقض کردن نتیجه، نقیض ورودی ها رو به عنوان ورودی میدیم به یک گیت NAND . در واقع به این شکل :

5-OR Logic using NAND

حالا نتیجه به این شکل هست که «درصورتی که حداقل یکی از ورودی ها درست باشه، نتیجه درست میشه». و این منطق، منطق OR هست. در واقع گیت OR رو هم با NAND پیاده سازی کردیم.

یک مدار دیگه هم میمونه که نوع خیلی خاصی از OR هست. در واقع به این شکله :

6-XOR Logic using NAND

توی این گیت جدید، ما در واقع وقتی به نتیجه درست میرسیم، که تعداد «فرد» از ورودی ها (در اینجا یک، چون دو تا ورودی بیشتر نداریم) درست باشن. این منطق و این گیت رو «یای انحصاری» یا XOR میگن. اگر یک IC داشته باشیم که ۵ تا گیت NAND داخلش باشه، میتونیم ازش یک XOR بسازیم.

همه ما میدونیم که این گیت ها خودشون نماد انحصاری دارن و وقتی قراره چیزی با استفاده ازشون طراحی کنیم، بهتره (و باید!) از نمادهای خودشون استفاده کنیم، ولی یکی از دلایلی که این مطلب رو نوشتم این بود که میخواستم شما رو با ساختار درونی گیت ها آشنا کنم، همچنین میخواستم بررسی کنم که با استفاده از IC هایی که گیت NAND داخلشون هست، چطور میشه به سایر گیت ها رسید.

سال نو مبارک، موفق باشید :)

FacebookTwitterGoogle+Share

دیدار با 8086 + کد روشن و خاموش کردن LED

نرم افزارهای زیادی برای کار با مدارات، تراشه ها و سایر دیوایس های الکترونیکی ساخته شده، ولی دو روزی هست که با Proteus دارم کار میکنم و میتونم بگم در این زمینه، از بهترین هاست. یکی از خوبی هاش داشتن تراشه های متعدد، با قابلیت اجرای برنامست. یکی از معروف ترین ریزپردازنده هایی که در این نرم افزار به کار رفته، پردازنده 8086 از اینتل هست. من این رو با این پردازنده ساختم (البته اصلا و ابدا مطمئن نیستم که مدارم درست باشه! ولی خود برنامه ایرادی ازش نگرفت) :

8086led

 

خب این مدار قراره چه کنه؟! قراره به کمک 8086 و یک مدار مجتمع 8255 ، چند تا LED رو به ترتیب خاموش و روشن کنه. یکی از ویژگی های پرتئوس اینه که تراشه هایی که داخلش هستند، همه برنامه پذیرند. البته شما باید برنامه هاتون رو بنویسید بعد اسمبل (یا کامپایل، بسته به نوع برنامه) کنید و بعد فایل اجراییتون رو به خورد تراشه بدید. بسیار خوب، برنامه ای که برای روشن و خاموش کردن LED نوشتم اینه :

کد   
.MODEL SMALL
.8086
.STACK
.CODE
MOV AL, 80
MOV DX, 0FF36h
OUT DX, AL
BEGIN: MOV AL,00
MOV DX, 0FF30h
OUT DX, AL 
CALL DELAY
MOV AL, 0FFh
OUT DX, AL 
CALL DELAY 
JMP BEGIN 
DELAY: MOV CX, 0FFFFh
P0 : DEC CX 
JNE P0 
RET
.DATA
END

خب، این برنامه رو باید با masm32 اسمبل کنید، که مراحلش به این شکله (مراحل اسمبل و لینک کردن در سیستم عامل ویندوز اینطوره، برای لینوکس هم سعی میکنم راه حلش رو پیدا کنم) :

کد   
ml /c /Zi /Zd LED.asm
link16 /CODEVIEW LED.obj,LED.exe,,, nul.def

دقت کنید که کد ها باید پشت سر هم وارد شن، همچنین ، بعد از این عملیات، چنانچه OpCode ها رو بخواید بخونید، میتونید از فایل LST تولید شده توسط اسمبلرتون استفاده کنید، که من اینجا OpCode رو میذارم (حواستون باشه این فقط برای کد سگمنت هست) :

OpCode

این هم از آپکد های این برنامه.

حواستون باشه مداری که کشیده شده ممکنه درست نباشه، در صورتی که برنامه درست اجرا میشه (برنامه تست شده و از این بابت مطمئنم).

امیدوارم شما هم با 8086 لحظات شادی رو تجربه کنید، درسته که یه پردازشگر قدیمیه، ولی کار باهاش شدیدا فانه!

موفق باشید :)

FacebookTwitterGoogle+Share