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

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

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

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

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

Share

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

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

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

MIPS

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

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

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

موفق باشید.

Share

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

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

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

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

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

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

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

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

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

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

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

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

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

Share

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

ALUwithRegister

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

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

با تشکر.

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 لحظات شادی رو تجربه کنید، درسته که یه پردازشگر قدیمیه، ولی کار باهاش شدیدا فانه!

موفق باشید 🙂

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