تجربه هایی از یک پروژه – StrongPC

پروژه های فان، که یک دفعه جدی میشن، همیشه هستند. بعضی وقتا ممکنه یک عده دانشجو بشینن دور هم و بگن خب ما میخوایم یک سیستم عامل بنویسیم و … ، نتیجه‌ش بشه سیستم عاملی که همه بهش یه طوری محتاجن! و خب از این دست پروژه ها در هر رشته و گرایشی در دنیا، کم نیستند. حالا من هم از این قاعده مستثناء نبودم در ایجاد این پروژه های فان و خب پروژه هایی هم بودند که جدی شدند و کمک های زیادی هم برای من بودند. یکی از این پروژه ها، پروژه StrongPC هست که البته اوایل به اسم LadyBug ایجاد شده بود.این پروژه خیلی خیلی آکادمیکه و خب، اولین قدم هاش هم کاملا فان برداشته شد. در این پست، تقریبا تجربیات مفید این پروژه رو میگم و همچنین مطرح میکنم که «چرا باید ادامه‌ش بدم».

اولین قدمها

همیشه اولین قدمها مهم ترین قدم ها در شکل گیری یک ایده یا پروژه هستند، چیزایی که باعث میشن شما بیش از پیش علاقمند به تحقیق و توسعه بشید و بیش از پیش؛ کار کنید. اولین قدم های پروژه هم از اینجا زده شد : طراحی یک کامپیوتر ساده. دوست عزیزی، کتابی با عنوان But How Do it know رو بهم داده بود که معماری کامپیوتر رو خیلی ساده توضیح میداد و چیزایی که من از کتاب یاد گرفتم، همه‌ش در این پروژه ساده پیاده شد. یادگیری معماری کامپیوتر با اون کتاب، نه تنها کمک کرد که این پروژه ساخته بشه، بلکه در درسهای مدار منطقی؛ معماری، ریزپردازنده، الکترونیک دیجیتال و حتی زبان ماشین هم کمک بسزایی به من کرد. در سال ۲۰۱۶ بود (طبق چیزی که از وبسایت StrongPC هم بر میاد ، ژوئن ۲۰۱۶) که پروژه StrongPC با اسم LadyBug استارت خورد و خب این اولین دیزاینی هست که برای پروژه انجام شده. و حتی دیزاین رو صفحه اول وبسایت هم قرار دادم :

 

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

هدف پروژه

شاید هدفی مثل «تولید کامپیوتر» یا حتی تولید بخشی از اون، اون هم در ایران کمی دور از ذهن باشه. گرچه نشدنی نیست ولی خب کمی دورتر از چیزی هست که الان داریم. شاید خب این که یکی از ایده هایی که هزاران بار پیاده شدند رو برای بار ۱۰۰۱م پیاده کنیم، یک اپ آندروید بزنیم و روز دوم سقوط کنیم و بعد ۴ سال توی لینکدین بنویسیم «دارای سابقه ۶۲ استارتاپ شکست خورده» ، بسیار ساده تر باشه. اما بهرحال عقیده شخصی من اینه که «مطالعات و کارهای آکادمیک» همیشه نیازن. این ها نباشن، اون ها (استارتاپ ها و …) هم نیستند. هدف پروژه هم مطلقا چیزی مثل تولید CPU نیست چون مطمئنا بازار قوی ای مثل اینتل نخواهد داشت. ولی یک «معماری آزاد» میتونه داشته باشه که خب این خودش به خودی خود، قابل قبول و خوبه! و این «معماری آزاد» میتونه بیاد روی FPGA و … اجرا بشه. یه جورایی هدف پروژه این شد که بشه یک مرجع آکادمیک یا بهتر بگم «بستری برای یادگیری».

دستاورد پروژه؟

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

چرا باید ادامه پیدا کنه؟

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

Share

آغاز به یادگیری هوش مصنوعی

در پست قبلی وبلاگ، در مورد چیستی هوش مصنوعی توضیح دادم. در این یکی پست، قصدم اینه که به شما بگم برای یادگیری هوش مصنوعی لازمه چه چیزهایی بلد باشیم و چه چیزهایی رو در طول زمان یاد میگیریم. خب، پس بریم سراغ این که برای هوش مصنوعی چه پیش‌نیازی لازمه، بعد کم کم بریم سراغ سیر یادگیری و … .

  • الگوریتم:
    این که بتونید برای یک برنامه، یک الگوریتم بهینه پیدا کنید یا پیشنهاد بدید، مهم ترین عامل در یادگیری و انجام پروژه های هوش مصنوعی به حساب میاد. اگرچه این مورد، همه جا کاربرد داره و کلا برای برنامه نویس و دولپر خوب شدن لازمش داریم؛ ولی اینجا لازمه که به الگوریتم و الفبای موضوع مسلط باشیم. پس، باید یاد بگیریم که چطور با استفاده از الگوریتم ها یک برنامه بسازیم. خب برای یادگیری الگوریتم (اگر بلد نیستید) پیشنهاد من کتاب CLRS هست. هم ترجمه این کتاب در بازار موجوده و هم زبان اصلیش در اینترنت هست.
  • برنامه نویسی :
    برای این که بتونید پروژه هوش مصنوعی انجام بدید باید برنامه نویسی بلد باشید؛ بهرحال بخشی از کامپیوتره و نمیشه ازش در رفت. گرچه ممکنه شما صرفا ایده پردازی یک پروژه هوش مصنوعی رو انجام داده باشید ولی موضوع مهم اینه که شما بتونید همون ایده رو هم چندین بار تست کنید و بعد ارائه‌ش کنید به یک تیم. پس، برنامه نویسی بلد بودن هم از شرایط یادگیری و انجام پروژه در هوش مصنوعی هست. پیشنهاد من هم برای یادگیری زبان، پایتونه که الان تبدیل شده به ابزار شماره یک پروژه های هوش مصنوعی.
  • علوم شناختی :
    علوم شناختی یا Cognitive Science ترکیبیه از روانشناسی، فلسفه ذهن، زیست شناسی مغز و علوم کامپیوتر. البته انقدر ها هم خلاصه نیست و من دارم انقدر خلاصه میگم. برای این که بتونیم پروژه های هوش مصنوعی بزنیم؛ لازم داریم که بلد باشیمش. گرچه طوریه که در حین یادگیری هوش مصنوعی هم، این موضوع رو یاد میگیریم. خیلی از ایده ها و … که در هوش مصنوعی (به ویژه شبکه های عصبی مصنوعی) مطرح شده، حاصل کار دانشمندان شناختی بوده.
شبکه عصبی مصنوعی
شبکه عصبی مصنوعی

 

  • با مغز انسان آشنا بشید!
    این مورد از مهم ترین مواردی هست که باید به عنوان کسی که کار هوش مصنوعی میکنه، بلد باشیم. کاری که ما میخوایم بکنیم این هست که یک سری اعمال انسانی مثل تفکر، تصمیم گیری و یادگیری رو برای ماشین پیاده سازی کنیم و ماشین ما قراره فکر کنه برای ما. پس، بهتره که ساختار مغز رو بشناسیم و باهاش آشنا بشیم. در این زمینه هم کتاب و رفرنس زیاد داریم.
  • از منابع مختلف استفاده کنید!!!
    و در آخر هم، استفاده از منابع متعدد مثل یوتوب، وبسایت های هوش مصنوعی و کتابها توصیه میشه. به این شکل شما میتونید به راحتی و بدون هیچ مشکلی، هوش مصنوعی یاد بگیرید و از انجام پروژه های هوش لذت ببرید.
Share

میکروکنترلرها، طراحی و پیاده سازی – ریلیز شد!

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

سرفصل های کتاب :

فصل اول : میکروکنترل چیست؟
در این فصل کلیت یک میکروکنترلر و این که چه بخش هایی درونش به کار رفته، توضیح داده شده.

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

فصل سوم : عملیات محاسباتی
در این فصل در مورد انجام عملیات ریاضی در مبنای دو صحبت شده.

فصل چهارم : عملیات منطقی
در این فصل در مورد جبر بول و نحوه انجام عملیات بولین صحبت شده.

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

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

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

فصل هشتم : حافظه
اینجا رسیدیم به مدارهای ترتیبی و حافظه ای، در اینجا لچ S-R رو ساختیم، در مورد لچ Active High و Active Low توضیح دادیم.

فصل نهم : رجیستر فایل
اینجا چندین رجیستر رو چیدیم کنار هم و یک رجیستر فایل طراحی کردیم.

فصل دهم : معماری کامپیوتر
اینجا با کلیت معماری کامپیوتر و مفاهیم تئوری قضیه آشنا شدیم. چیزایی که لازمه برای یادگیری معماری بلد بود رو آوردیم اینجا.

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

فصل دوازدهم : کامپیوتر (تئوری)
در اینجا به صورت تئوری و روی کاغذ کامپیوتر اصل کاری طراحی شده. تصمیم گیری شده که چه کارهایی انجام بده و «سازمان کامپیوتر» در این نقطه مشخص شده.

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

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

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

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

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

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

Share

سلول های دیجیتال!

بعد از مدتها، یک تاپیک قشنگ برای نوشتن پیدا کردم، شاید مدتها هم در همین مورد در وبلاگم بنویسم. موضوعی که در جهان، در کنار موضوعات دیگر مطرح هست، موضوعی هست به اسم زیست شناسی مصنوعی که به نوعی میشه گفت پیوند علوم مختلف با زیست شناسی، و تغییر در ساختار بیولوژیک موجوداتی هست که در اطراف ما زندگی میکنن. لینکی را در توییتر دیدم (و البته خاطرم نیست که کجا دیدمش، وگرنه لینک میکردم بهش) که نوشته بود دانشمندان با استفاده از DNA تونستند مدار منطقی بسازند. همونجا خشکم زد و گفتم چطوری میشه؟! تا این که این ویدئو رو دیدم. حقیقت اینه که تا قبل از این، دیده بودم که از نورون (سلول های عصبی) برای انتقال اطلاعات و پیاده سازی منطق های مختلف استفاده بشه، ولی استفاده از DNA برای من به شدت جدید و جذاب بود. و فکر نمیکردم که بشه از DNA ها، ساختار ترانزیستوری گرفت.

در حقیقت، چیزی که اینجا برای ما صفر و یک میسازه، الکتریسیته نیست. بلکه پروتئین ها هستند. در واقع شما دو نوع پروتئین دارید، که یکی نماینده صفر منطقی و دیگری نماینده یک منطقی به حساب میاد. حالا یکم دقیق تر پیش بریم، اگر ویدئو رو ببینید، خواهید دید که ساختار DNA یک نوع باکتری به اسم E.coli (با تلفظ ایکولای) مثل یک گیت NOR هست. یعنی همه منطق های موجود رو میشه با استفاده از این DNA طراحی کرد! نکته جالب تر و شگفت آورتر قضیه هم اینجاست که دانشگاه MIT پلتفرمی به اسم سلوکد منتشر کرده که شما با مراجعه بهش، میتونید کد Verilog بنویسید و تحلیل DNA ایش رو ببینید! و از همه جالبتر اینه که MIT کدهای نوشته شده شما رو، روی سلول های زنده تست میکنه!

تست سلوکد

خب برای این که این پلتفرم دوست داشتنی رو تست کنم، نشستم و یک معکوس کننده یا گیت NOT رو با Verilog HDL نوشتم :

کد   
module NOT(output out, input in);
 always@(in)
   begin
   case({in})
   1'b0: {out} = 1'b1;
   1'b1: {out} = 1'b0;
   endcase
  end
endmodule

بعد از این که روی دکمه Run کلیک کردم (البته یادتون باشه که قبلش تعدادی DNA Sequence رو به عنوان ورودی و خروجی انتخاب کنید تا تحلیل های درست و بهتری تحویل بگیرید) ، شروع کرد به تحلیل کردن. حالا نتایج رو با هم می بینیم!

شکل گیت NOT به صورت قسمتی از DNA :

inverter_A000_dnaplotlib_Eu_outخب، این شکلی هست که در «زیست شناسی مصنوعی» برای بخش های کوچک DNA و نمایندگی اون ها استفاده میشه. ورودی و خروجی های این طراحی ها Promoter هستند که اتصالات بین پروتئین ها رو میتونن به وجود بیارن. پس میشه در یک سلول زنده منطق های مختلف داشت، و ساخت. حالا، جدول درستی این ساختار رو با هم می بینیم :

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

inverter_wiring_agrn

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

و آخرین چیزی که توجهم رو به خودش جلب کرد، نمودار زیستی ای بود که در خروجی قرار داشت و عملکرد گیت رو به صورت کاملا زیستی تحلیل میکرد :

inverter_A000_xfer_model_P1_PhlF

و البته یک ساختار گیتی دیگر هم داره، که «جنس» ورودی خروجی ها، همون پروتئین هایی که نماینده صفر و یک منطقی هستند رو برای ما مشخص میکنه :

inverter_A000_wiring_grn

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

موفق باشید 🙂

Share

پیشنهادهای شما برای پیاده سازی یک ایده سخت افزاری

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

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

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

ایده هایی که در ذهن خودم هستن اینان :

  • پیاده سازی یه دستگاه ساده با استفاده از میکروکنترلرهایی که توی بازار موجودند، و روبرو شدن با چالش هایی مثل مطالعه معماری، برنامه نویسی برای ریزپردازنده، طراحی مدارهای واسط و … .
  • پیاده سازی یه دستگاه ساده با استفاده از آردوینو و ماژول هاش
  • پیاده سازی یک دستگاه ساده IoT طور با استفاده از Cubieboard یا رزبری
  • و …

حالا از شماها که این پست رو میخونید، میخوام در این باره کمک بدید. اول این که «دستگاه ساده» چی میتونه باشه (مثلا ساعت؟! تقویم رومیزی؟ سیستم اطفاء حریق و …) و دوم این که با چی و چطوری پیاده سازی بشه. بعد از این که ایده مشخص بشه، مرحله مرحله پیاده سازیش در همین وبلاگ، گزارش میشه.

Share

دوستی با محصول جدید اتودسک

اکثرا میدونیم که شبیه سازی و استفاده از بردهای آردوینو و AVR و … ، برای کاربران لینوکس خیلی مشکله. حتی شبیه سازی ساده مدارهای الکتریکی و الکترونیکی هم مشکلیه که اکثرا کاربران لینوکس باهاش روبرو هستند. اما امروز، میخوام ابزاری رو معرفی کنم، که هم رایگانه و هم تحت وب. به شما امکان کد زدن روی آردوینو و تست کردن مدارهای مجتمع، ساختن مدارهای دیجیتال و آنالوگ رو میده.

شرکت اتودسک که پیش تر با محصولاتی مثل اتوکد و مایا شناخته شده بود، الان اومده محصولی به اسم 123D Circuits رو ارائه کرده که با ساختن یک اکانت و عضویت درش، میتونید به راحتی آزمایشات الکترونیکی خودتون رو انجام بدید.

این هم نمونه مداری که بستم، یک آی سی 7408 هست که داره دو ورودی رو با هم AND میکنه :

کافیه روی start simulation کلیک کنید و بعد با کلید ها بازی کنید تا تغییرات توی ولت متر و LED قرمز رنگ روی برد بورد رو شاهد باشید.

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 کامل با هم خواهیم داشت. پس فعلا در مورد بلاهایی که سر ۸ بیت ورودی میشه آورد فکر کنید و شاد باشید 🙂

Share

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Share

ساخت یک کامپیوتر ۴ بیتی ساده با استفاده از مدارات منطقی

یک زمانی، حتی فکر کردن به این که بتونیم با چندتا مدار ساده یک کامپیوتر (حتی ۴ بیتی) هم داشته باشیم، احمقانه و ناممکن به نظر میرسید. چرا که هزینه شبیه سازی خیلی از مدارها و تستشون بسیار بالا بود. اما توی این دوره، شما با خوندن چند تا داکیومنت و نصب چند نرم افزار ساده، میتونید کامپیوتر خودتون رو بسازید. بسیار خوب، منبع این پست ، این مقالست که یک ویدئوی خوب هم داره. توی این مقاله به جای استفاده مستقیم از مدارات منطقی، اومدن و از ترانزیستور استفاده کردن، اما باز هم استفاده از ترانزیستور منطقی به نظر نمیرسه، چرا که مدارهای منطقی کوچک ترن و فهمشون هم راحت تره.

مدارهای منطقی چی هستن؟

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

برای پردازنده کوچکمون چی نیازه؟

اول از همه، نیاز داریم که یک مدار Adder بسازیم. مدارهای Adder معمولا از چند تا Full Adder یک بیتی تشکیل میشن، و هر فول ادر یک بیتی هم از دو تا Half-adder .

برای ساخت Half-adder کافیه که یک بار ورودی A رو NOT کنیم و با B اون رو AND کنیم، سپس B رو NOT کنیم و با A اون رو AND کنیم. آخر هم نتیجه دو تا AND رو با هم OR کنیم. برای بدست آوردن رقم نقلی هم کافیه که A و B رو مستقیما با هم AND کنیم.half-adder2

مدار Half Adder نهاییمون به این شکل میشه. اما استفاده مدوام از NOT و AND و OR باعث سخت شدن توسعه ماشین میشه، پس از مجموعه ای که برای ساخت Half Adder استفاده کردیم میتونیم صرف نظر کنیم و از مدار XOR استفاده کنیم. البته همچنان برای رقم نقلیمون به AND نیاز خواهیم داشت.

بسیار خوب، برای Full Adder نیاز داریم که از پیش تعیین کنیم رقم نقلی ای وجود داره؟ یا نه! و برای این کار غیر از A و B یک ورودی به اسم Carry In یا «رقم نقلی ورودی» خواهیم داشت. و سپس، رقم نقلی ورودی رو باید به عنوان ورودی به یک Half-Adder دیگه بدیم. سپس، نتیجه AND شدن A و B رو با نتیجه AND شدن اولین Half-Adder و Carry In رو با هم OR کنیم تا رقم نقلی کلی بدست بیاد. پس مدار ما به این شکل خواهد شد :

full adderخب، این دو مدار رو الان ساختیم. قدم بعدی، ساختن کامپیوترمونه!

برای ساختن یک Adder چهار بیتی، باید به این شکل فول ادر ها رو کنار هم بچینیم :

Slide11همونطور که دیدید، این روش چیدن Adder ها پشت هم، مدل Ripple Carry نامیده میشه. خب، این کامپیوتر کوچک، میتونه اعداد ۰ تا ۱۶ (در دنیای بدون علامت و با در نظر گرفتن رقم نقلی) و -۱۶ تا ۱۵ (در دنیای علامت دار و بدون در نظر گرفتن رقم نقلی) رو به ما نمایش بده. با خاموش و روشن کردن به موقع مدارها عملیات جمع و تفریق رو میتونید انجام بدید.

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

4-bit computer simulation

برای شبیه سازی چه نرم افزاری نیازه؟

من برای کشیدن نقشه Half Adder و Full Adder از تخته وایت برد اتاقم (بله! تخته وایت برد توی اتاقا الزامیه!) و نرم افزار Logisim (موجود در مخازن اوبونتو) استفاده کردم. برای شبیه سازی کلی ماشین هم از Logic.ly که آزمایشگاه آنلاین داره استفاده کردم. البته هر نرم افزار دیگه ای میتونه بهتون در شبیه سازی کمک کنه. حتی میتونید با VHDL هم بنویسیدش و تستش کنید!

امیدوارم که این پست هم براتون مفید واقع شده باشه!

موفق باشید.

Share