<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های zerotwo</title>
        <link>https://virgool.io/feed/@imfilbert</link>
        <description>می نویسم تا خودم یادبگیرم ; )</description>
        <language>fa</language>
        <pubDate>2026-06-18 02:48:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/256004/avatar/awNtBJ.png?height=120&amp;width=120</url>
            <title>zerotwo</title>
            <link>https://virgool.io/@imfilbert</link>
        </image>

                    <item>
                <title>اهمال کاری!</title>
                <link>https://virgool.io/@imfilbert/%D8%A7%D9%87%D9%85%D8%A7%D9%84-%DA%A9%D8%A7%D8%B1%DB%8C-m4x8gx8a4qbs</link>
                <description>شاید باورتون نشه ولی من همیشه به کسایی که شب امتحانی بودن حسودیم می شد! چرا؟ چون من صبح امتحانی بودم :/من حتی حاضر نبودم تو دقیقه 90 هم به مغز مبارکم فشار بیارم و همیشه رو وقت اضافه حساب باز می کردم!تو هم این تجربه رو داری؟ شده تا حالا تا اون لحظات آخر کارِت رو به تعویق بندازی؟ بعد بشینی با عذاب وجدان سریال مورد علاقتو نگاه کنی؟!اگه آره که خیلی خیلی خوشبختم از آشناییت و حس می کنم خیلی نقاط و خاطرات مشترک و حرفای زیادی با هم برای گفتن داریم :))) ! حالا اگه از تعریف خاطراتمون بگذریم ، من یه سری چیزها یاد گرفتم فکر می کنم به درد تو هم بخوره ، دنبالم بیا...اول از همه چیز باید به یه اصل پایبند باشیم و اونو باور کنیم ( از دکتر هلاکویی یاد گفتم ^-^) و اونم اینه که &quot; امروز درست مساوی  فرداست &quot; یعنی چی ؟ یعنی درد امروز همون درد فرداست .بعضیا علت اهمال کاریشون اینه که نمیخوان سختی انجام اون کار رو بکشن و با عقب انداختش میخوان درد اون رو کم تر بکنند! اگر ما باور داشته باشیم که امروز همون فرداست و درد امروز هم درد فرداست ، ترجیحمون این میشه که سختی رو اول از همه بکشیم و لذت رو برای فردا بذاریم ! این جوری هم نگرانی و دغدغه فکری کار نکرده رو نداریم و هم بعد از اون لذتی بدون نگرانی و دغدغه داریم.( یه چیزی تو مایه های همون قورباغه ات رو قورت بده ! )برای اینکه این باور رو تو خودمون ایجاد کنیم یه راه حل هست !کارهای روزانه ات رو به 4 بخش تقسیم کن :1) ضروری و مهم 2) نه ضروری نه مهم3) ضروری و نه مهم4) مهم و نه ضروریشاید برات جالب باشه که بفهمی آدم موفق کسیه که تو خونه چهارمه! چون وقتی کارهایی که مهم هستند اما تایم زیادی برای انجام اون ها داری و ضروری نیستند رو انجام بدی دیگه اصلا وارد خونه اول نمیشی!تو خونه دوم بودن هم حماقته ! خونه سوم هم مختص اتفاق های پیش بینی نشده روزته !حالا اگه توهم مثل من میخوای این باور رو بوسیله این تمرین برای خودت تبدیل به عادت کنی ، بزن که بررریم ... ^_^</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Fri, 19 Feb 2021 09:43:31 +0330</pubDate>
            </item>
                    <item>
                <title>سمی به نام مقایسه!</title>
                <link>https://virgool.io/@imfilbert/%D8%B3%D9%85%DB%8C-%D8%A8%D9%87-%D9%86%D8%A7%D9%85-%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-texwbhjtiveh</link>
                <description>امروز داشتم با خودم راجع به این موضوع فکر می کردم ، که آیا واقعا میشه مقایسه رو به کل از زندگی حذف کرد؟و به این نتیجه رسیدم که در واقعیت خیرررر...چرا ؟ چون به نظرم مقایسه کردن یکی از اصل های بقا تو آدمیزاده ! درکل مقایسه به آدم کمک می کنه در هر رقابتی به وسیله مقایسه ، جایگاه خودش رو نسبت به رقبا بسنجه و به تبع اون بفهمه چقدر راه دیگه مونده ، چقدر باید انرژی بیشتری بذاره ، چقدر دیگه باید تلاش کنه و ....رقابت تو زندگی یه امر اجتناب ناپذیره ! چون منابع محدودن و متقاضی ها زیاد! پس اصل لانه کبوتری هم بخوایم در نظر بگیریم متقاضی ها در رقابت برای بدست آوردن منابع قرار می گیرند.اما آیا واقعا تمام زندگی ، دنیای رقابته ؟اینکه کی از همه قشنگتره ؟ کی از همه موفق تره ؟ کی از همه شادتره؟ کی از همه پولدارتره؟ و کی ...اینجوری نگاهمون به آدما شبیه کالا نمیشه ؟امروز با خودم به این نتیجه رسیدم که بزرگ ترین اشتباه آدم ها میتونه این باشه که کل زندگی رو برد و باخت ببینند! پس به خودم گفتم حواست باشه که مقایسه رو کجاهای زندگیت دخیل می کنی! حواست باشه که چه چیزهایی رو توی زندگیت رقابت می دونی!</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 31 Jan 2021 03:47:00 +0330</pubDate>
            </item>
                    <item>
                <title>سبزی پاک کردن !</title>
                <link>https://virgool.io/@imfilbert/%D8%B3%D8%A8%D8%B2%DB%8C-%D9%BE%D8%A7%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-p0iz2evnqash</link>
                <description>شده تا حالا وقتی باید درس بخونی ، دلت بخواد اون لحظه حتی سبزی پاک کنی ولی سمت درس و کتاب نری ؟!تمام امروز این شکلی بودم ?اگه تجربه اش کردی راه حلت چی بوده تو این اوضاع؟ من تمام امروز هیچی نخوندم !پ ن: درگیر مصیبت کنکور </description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sat, 23 Jan 2021 01:52:42 +0330</pubDate>
            </item>
                    <item>
                <title>معضلی به نام انگیزه!</title>
                <link>https://virgool.io/@imfilbert/%D9%85%D8%B9%D8%B6%D9%84%DB%8C-%D8%A8%D9%87-%D9%86%D8%A7%D9%85-%D8%A7%D9%86%DA%AF%DB%8C%D8%B2%D9%87-qyhqocgnubco</link>
                <description>نمیدونم شما هم تا حالا به این مشکل خوردید که همیشه انگیزه اتون برای 10 قسمت پشت هم سریال دیدن بیش تر از یک ساعت درس خوندن باشه؟یا انگیزه اتون برای خوردن پیتزا بیش تر از انگیزه نگه داشتن رژیم غذایی تون باشه؟اگه آره ! نگران نباشید بهتون قول میدم که خیلی از آدم های دیگه هم مثل من و شما درگیر همین چیزها هستند !راستش یه کاری که نسبتا به من کمک میکنه انگیزه انجام اون کار سخته رو بیشتر کنم اینه که قبل از شروع کردنش تو آینه با خودم حرف بزنم !شما چطور ؟ چه راه حل هایی به ذهنتون میرسه؟امروز هم همش 3 ساعت خوندم ?(درگیر مصیبت کنکور! چرا؟ چون نیازش دارم )</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Fri, 22 Jan 2021 03:11:06 +0330</pubDate>
            </item>
                    <item>
                <title>سعیدمون اسپانیایی بلده!</title>
                <link>https://virgool.io/@imfilbert/%D8%B3%D8%B9%DB%8C%D8%AF%D9%85%D9%88%D9%86-%D8%A7%D8%B3%D9%BE%D8%A7%D9%86%DB%8C%D8%A7%DB%8C%DB%8C-%D8%A8%D9%84%D8%AF%D9%87-zxpi2rj7wkff</link>
                <description>بچه ها تو قدم دوم تصمیم گرفتم از اولین کاری که باید قبل از شروع هرکاری کنیم بنویسم!فکر کنم شماهم مثل من تاحالا هزار بار تو گوگل سرچ زدین: چگونه هدف گذاری کنم؟چجوری به هدفم پایبند باشم؟چجوری به هدفم برسم؟چگونه هدف زندگی ام را پیدا کنم؟میدونی چیه ، راستش ممکنه دوباره یه سری جمله تو همین باب سرچ زده باشی و سر از نوشته من درآورده باشی!فکر کنم باز هم مثل من تا الآن کلی نوشته راجع به همه این سوالا ، انواع هدف گذاری ها ، نحوه هدف گذاری ها ، مولفه هایی برای پیدا کردن هدف مناسب و ... خونده باشی!شاید مثل من بعد از خوندن و سرچ کردن باز نتونستی به هدف گذاریت پایبند باشی ، یا بعد از مدتی فهمیدی نوچ اینم هدف مناسبی نیست!اگه تا همین جای مطلب شبیه من بودی، پس بذار بهت بگم چی به من تو انتخاب هدف کمک کرد که شاید بعد از اینم باز شبیه من باشی و به تو هم کمک کنه!من مهم ترین مولفه ای که برای انتخاب اهدافم در نظر می گیرم اینه که بهشون نیاز داشته باشم !فکر کن همین الان بر حسب علاقه شروع کنی به اسپانیایی یاد گرفتن ، درصد اینکه یه روزی سر از کشور اسپانیایی زبان هم دراری بذار 1 درصد و بازهم فرض کن این زبان هیچ درآمدی برات نداره و تغییری توی وضعیت زندگیت هم ایجاد نمی کنه ! اون وقت زمانی که به جاهای سخت تلاش و یادگیری میرسی دیگه علاقه کم میاره و از خودت میپرسی چرا اصلا خودم رو تو سختی بندازم؟!اما وقتی به چیزی نیاز داری ! وسطش که نوبت پرسیدن سوال اصلا که چی میشه؟ میتونی جواب بدی چون نیازش دارم و ادامه بدی...این راه حل واسه من که جواب داده ^-^ شاید به توهم کمک کرد ...راستی امروز با عرض تاسف فقط سه ساعت خوندم !!!!(درگیر مصیبت کنکور! چرا؟ چون نیازش دارم)</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Thu, 21 Jan 2021 01:40:32 +0330</pubDate>
            </item>
                    <item>
                <title>چی شد که اینجوری شد؟!</title>
                <link>https://virgool.io/@imfilbert/%DA%86%DB%8C-%D8%B4%D8%AF-%DA%A9%D9%87-%D8%A7%DB%8C%D9%86%D8%AC%D9%88%D8%B1%DB%8C-%D8%B4%D8%AF-gsoicau9ywts</link>
                <description>والا داشتم مطالبی که می خوندم رو یاد میدادم که یهو دیدم ای دل غافل کنکور از رگ گردن هم بهم نزدیک تره!خلاصه ایشالا عمری باشه بتونم بقیه آموزش هارو هم بنویسم ولی فعلا نمی تونم وقتم رو روش بذارم و مجبورم شیرجه بزنم وسط درس خوندن.ولی به جاش یه کار دیگه ای به ذهنم رسید که انجام بدم ، اونم اینکه تو این 130 روز باقی مونده هر آنچه که وسط دریای کنکور یاد گرفتم و تجربه کردم رو تو چند قدم بنویسم .خلاصه که اگر تهش نشد که بشه ، اونوقت باشد که عبرتی باشم برای دیگران ^-^ ! اگرهم شد که بشه که فبها بخونید شاید به شما هم تو راهی که هستید کمک کرد!</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Wed, 20 Jan 2021 00:26:16 +0330</pubDate>
            </item>
                    <item>
                <title>فصل3 معماری کامپیوتر(RTL)</title>
                <link>https://virgool.io/@imfilbert/%D9%81%D8%B5%D9%843-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1rtl-srtopaunotnb</link>
                <description>خب میریم که باهم فصل 3 رو شروع کنیم و در کنار هم یادبگیریم.با تعریف خود کلمه RTL شروع می کنیم که مخفف register transfer language به معنی زبان انتقال ثبات هست. در واقع RTL یک زبان برای توصیف سخت افزار هست مانند VHDL و Verilog منتهی سطح بالاتر به گونه ای که با RTL نمی توان مثلا ترانزیستور را توصیف کرد.در واقع RTL از دو بخش مهم تشکیل شده به نام بخش کنترل و بخش ریزعملیات که در آن اگر بخش کنترل فعال بود ، بخش ریزعملیات اجرا می شود:P : R2 &lt;- R1مثلا در خط بالا داریم اگر P فعال بود یعنی یک بود ، R1 رو بریز داخل R2!حالا باهم می خوایم این دستور رو سنتز کنیم.به کاری که در تصویر بالا انجام دادیم ، عمل سنتز می گویند.الان در شکل بالا ما اومدیم سیگنال کنترلی P را به عنوان پایه load به رجیستر R2 وصل کردیم ، بدین معنا که هرگاه سیگنال P برابر یک بود ، محتوای R1 را وارد محتوای R2 کند. هر دو رجیستر هم به لبه مثبت کلاک حساس هستند.برای این که ممکنه خیلی ها بحث رجیستر از مدارمنطقی رو به یاد نیارن ، با هم یه دوره روی این مبحث می کنیم.همانطور که می دانید یک رجیستر 4 بیتی از 4 flipflop تشکیل شده است ، که معمولا از Dflipflop استفاده می کنند ، که باز کردن آن چندان به این موضوع مرتبط نیست!هر رجیستر یه سری پایه می تونه داشته باشه :پایه clk: جهت سنکرون کردن کل اعضا.پایه load: وقتی فعال شود data در رجیستر load می شود.پایه clear: هنگامی که فعال شود تمام flipflop ها درون رجیستر را صفر می کند.پایه pre: زمانی که فعال شود تمامی flipflop ها درون رجیستر یک می شوند.پایه inc: هنگامی که فعال می شود مقدار درون رجیستر یک واحد زیاد می شود.پایه dec: هنگامی که فعال می شود ، مقدار درون رجیستر یک واحد کم می شود.پایه shr: هنگامی که فعال می شود مقدار درون رجیستر یک واحد شیفت راست می خورد.پایه shl: هنگامی که فعال می شود ، مقدار درون رجیستر یک واحد شیفت به چپ می خورد.نکته مهم در مورد پایه ها این است که اکثر پایه ها با clk سنکرون هستند یعنی اگر مقدار آن ها یک باشد اما clk در لبه منفی خود قرار داشته باشد ، آن پایه ها عمل نمی کنند . به جز پایه های pre و clear.یک نکته دیگر در مورد رجیستر این است که ، پایه ها در حالت کلی active high هستند یعنی وقتی مقدار آن ها یک است فعال هستند و وقتی مقدار آن ها صفر هست غیر فعال هستند ، اما می توانند active low هم باشند یعنی وقتی مقدار آن ها صفر است یعنی فعال هستند و زمانی که مقدار آن ها یک است به معنای این است که غیر فعال هستند.یک رجیستر 4 بیتی ، 4 پایه ورودی و 4 پایه خروجی دارد، زمانی که می خواهیم چیزی درون رجیستر بنویسیم ، یا تغییری بر روی آن اعمال کنیم نیاز به زدن کلاک وجود دارد ، اما مقداری که در رجیستر هست روی پایه های خروجی آن نیز وجود دارد ، بنابراین خواندن از روی رجیستر نیازی به زدن کلاک ندارد.الان در شکل بالا هنگامی که پایه load فعال شود و کلاک در لبه مثبت خود باشد مقدار 0011 وارد رجیستر می شود و در جای 1000 قرار می گیرد، و تا زمانی که 1000 درون رجیستر قرار دارد همین مقدار روی پایه های خروجی نیز وجود دارد و در هر لحظه قابل خواندن است.مثال: عبارت زیر را سنتز کنید.p+q: R1&lt;-R1+R2 , R2&lt;-R1یک نکته که باید بهش توجه کنید اینه که عمل + در بخش کنترلی به معنای or و در بخش ریز عملیات ها به معنای جمع ریاضی است.ریزعملیات یعنی عملی که در یک کلاک انجام می شود.پس دو عمل بالا هر کدوم به صورت موازی و باهم در یک کلاک انجام می شوند ، پس فرقی در ترتیب نوشتن آن ها نمی کند.به ریزعمل هایی که در یک کلاک باهم انجام می شوند ریز دستور یا micro instruction می گویند.نکته مهم در این سوال این است که مثلا فرض کنید مقدار اولیه R1 و R2 به ترتیب 40 و 50 است ، هنگامی که p برابر یک می شود مقدار بعدی R1 برابر 90 یعنی جمع R1 و R2 ، و مقدار نهایی R2 برابر 40 یعنی مقدار اولیه R1 است. به این علت این اتفاق می افتد که این دو عمل به صورت موازی انجام می شوند. بعدا در این باره بیشتر توضیح میدم!در واقع سخت افزار از دو بخش تشکیل شده است یکی بخش datapath که همون ریز عملیات ها هستند و دیگری بخش control که به datapath سیگنال می دهند و بخش کنترلی هستند.برای سنتز کردن مرحله اول باید datapath رو رسم کنیم و سپس بخش کنترلی رو پیاده کنیم.برای پیاده سازی بخش datapath بالا نگاه می کنیم می بینیم دو رجیستر داریم :در شکل بالا datapath رو کامل کردیم و حالا نوبت به بخش کنترلی میرسه که باید به datapath سیگنال بده ، و در واقع سیگنال کنترلی ما به عنوان پایه load باید به رجیستر های R1 و R2 متصل بشه تا load در این رجیستر هارو کنترل کنه.الان ما دو سیگنال کنترلی p و q را با گیت or به هم متصل کردیم و به پایه load دو رجیستر R1 و R2 متصل کردیم.توجه: در RTL نیازی به رسم کلاک نیست.در شکل بالا از کجا مشخص است که هر دو ریز عملیات ها در یک کلاک انجام می شوند؟هنگامی که سیگنال های کنترلی در لبه مثبت کلاک فعال می شوند ، در همان لبه ریزعملیات ها انجام نمی شوند!!! بلکه در لبه مثبت بعدی انجام می شوند و در فاصله این دو لبه جمع کنده فرصت این را می یابد که عمل جمع خود را انجام دهد و همچنین خواندن از رجیستر اتفاق می افتد و در کل تاخیر ها سپری می شود.حالا باهم چند مثال دیگه رو بررسی می کنیم:عبارت رو به رو را سنتز کنید:p.q: R1&lt;- R1+R , R1&lt;-R3این عبارت را نمی توان سنتز کرد ، زیرا دارای خطای conflict یا ناسازگاری است ، یعنی بر روی یک رجیستر نمی توان همزمان چند کار انجام داد.عبارت زیر را سنتز کنید:p.q: R1 &lt;- R1+R2p:R1 &lt;-R2یک نکته مهم که در رابطه با این سوال وجود دارد این است که در RTL ما ترتیب نداریم مثل زبان های دیگر ! یعنی چی ؟ یعنی دستورات به همان ترتیبی که نوشته می شوند به همان ترتیب اجرا نمی شوند . هر دستوری که سیگنال کنترلی آن فعال باشد اجرا می شود مثلا می شود دستور اول و آخر با هم اجرا شوند . پس در این سوال هم هیچ تضمینی وجود ندارد که p و q باهم یک نباشند ، زیرا اگر باهم یک باشند آنگاه ما خطای conflict داریم چون بر روی رجیستر R1 در یک زمان دو عمل دارد صورت می گیرد.مثال: عبارت زیر را سنتز کنید:p.q: R1&lt;-R1+R2p.q!: R1&lt;-R2در این جا خطای conflict نداریم زیرا هر دو سیگنال کنترلی نمی توانند با هم یک شوند ، پس قابل سنتز است.طبق معمول اول datapath را می کشیم و سپس بخش کنترلی را :حالا بیاید با هم بررسی کنیم چجوری load مربوط بهR1 را بدست آوردیم؟ خب چه زمانی بر روی R1 عملیات نوشتن انجام می شود؟ زمانی که یا p.q برابر یک شود و یاp.!q بنابراین :p.q + p.q! = p ( q+ q!)= p. 1 = pیعنی هرگاه p برابر یک باشد حالا چه q برابر یک باشد چه نه بر روی R1 عملیات نوشتن انجام می شود پس سیگنال کنترلی که باید به load رجیستر R1 متصل شود همان p است.حالا باید بدانیم هرگاه بحث انتخاب وسط بود ، یعنی ما چند ورودی به یک رجیستر داشتیم و باید بین ورودی ها انتخاب کنیم نیاز به multiplexer داریم تا این انتخاب را برای ما انجام دهد ، پس به یک خط select برای mux خودمون نیاز داریم ، که آن را q می گذاریم ، زیرا هر وقت q صفر باشد باید عمل جمع اتفاق بیفتد و هروقت q برابر یک باشد باید محتوای رجیستر R2 در R1 لود شود.به همین راحتی و خوشمزگی این مثال رو هم سنتز کردیم!در قسمت بعدی با هم چند مثال دیگه رو سنتز می کنیمپس فعلا ;)</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 13 Dec 2020 15:46:51 +0330</pubDate>
            </item>
                    <item>
                <title>ارزیابی کارآیی(فصل 2 معماری کامپیوتر)</title>
                <link>https://virgool.io/@imfilbert/%D8%A7%D8%B1%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A2%DB%8C%DB%8C%D9%81%D8%B5%D9%84-2-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-av7fn6ilwmu5</link>
                <description>در قسمت قبلی با MIPS و فرمول آن آشنا شدیم.حالا می ریم سراغ یادگیری قانون آمدال، مثل همیشه یادگیری رو با یک مثال شروع می کنیم:مثال: اگر 40 درصد زمان اجرای یک برنامه ، 5 برابر سریع شود ، کل برنامه چقدر سریع می شود؟اگر زمان کل اجرای برنامه رو قبل از تسریع t در نظر بگیریم ، بعد از اینکه تسریع رو انجام دادیم 60 درصد t بدون تغییر باقی می ماند ، و 40 درصد آن به علت اینکه 5 برابر سریع شده ، زمانش تقسیم بر 5 خواهد شد.بنابراین زمان جدید اجرای برنامه برابر است با :after improvement:  0.4*(t/5) + 0.6*t = 0.68tbefore improvement: tبرای بدست آوردن نسبت اینکه برنامه پس از بهبود چقدر سریع شده کافی ست ، زمان قبل از بهبود رو به زمان پس از بهبود تقسیم کنیم:ratio : t / 0.68t = 100/68یعنی برنامه ما به میزان 100/68 سریع تر از قبل شده است.در قانون آمدال داریم که اگر کسر fraction از برنامه ، که این کسر باید بین صفر و یک باشد ، به اندازه speedup سریع تر شود ، کل برنامه به اندازه زیر سریع تر می شود:همانطور که می بینید ، فرمول بالا چیزی برای حفظ کردن نداره و ما خودمون تونستیم مثال قبل رو بدون دونستن قانون آمدال حل کنیم.بیاید با همدیگه یک مثال دیگه حل کنیم:مثال: فرض کنید 50 درصد زمان اجرای یک برنامه ، مربوط به محاسبات ممیز شناور است ، و 30 درصد زمان مربوط به ضرب اعداد صحیح و 20 درصد بقیه هم مربوط به عملیات های دیگر.برای بهبود برنامه دو پیشنهاد داریم ، شما کدوم رو پیشنهاد می کنید:الف) سرعت میز شناور را 2 برابر کنیم.ب) سرعت ضرب صحیح را 6 برابر کنیم.برای بدست آوردن تسریع برنامه پس از بهبود برای هر دو قسمت قانون آمدال رو می نویسیم:a) 1/(0.5t) + (0.5t/2) = 100/75b) 1/ (0.7t) + (0.3t/6) = 100/75همانطور که می بینید ، هر دو روش به یک میزان سرعت برنامه را افزایش می دهند و فرقی نمی کند کدام یک را انتخاب کنیم.حالا میریم سراغ مفهوم جدیدی به نام FLOPS که مخفف floating point operations per second هست یعنی متوسط تعداد دستور ممیز شناور در ثانیه ، مثل MIPS یک پارامتر ارزیابی کارآیی می باشد. و بیشتر در پردازنده هایی کاربرد دارد که در آن ها محاسبات علمی زیادی انجام می شود.مقدار FLOPS از تقسیم تعداد دستور ممیز شناور بر زمان اجرا بدست می آید.در محاسبه FLOPS باید به یک نکته مهم توجه کرد ، که اون نکته رو در قالب یک مثال بیان می کنم:مثال: فرض کنید در یک برنامه 200 میلیون عمل ممیز شناور انجام شده است ، زمان اجرای برنامه 10 ثانیه است که از این زمان 50 درصد آن صرف اجرای دستورات ممیز شناور شده است و سایر زمان صرف سایر عملیات ها شده است . FLOPS رو بیابید:FLOPS: 200*10^6 / 10s = 20 * 10^6 flops or 20 Mflopsنکته مثال در این جاست که باید تعداد دستور ممیزشناور را بر زمان اجرای کل برنامه تقسیم کرد ، نه زمانی که فقط صرف انجام دستورات ممیز شناور شده است ، همانطور که در مثال بالا ما بر ده تقسیم کردیم نه بر 5!معنای Mflops به معنای تعداد میلیون دستور ممیز شناور در ثانیه است و از تقسیم flops بر 6^10 بدست می آید.پایان فصل دومدر قسمت بعدی باهم فصل 3 معماری کامپیوتر رو شروع می کنیم.</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 13 Dec 2020 10:10:17 +0330</pubDate>
            </item>
                    <item>
                <title>ارزیابی کارآیی(فصل 2 معماری کامپیوتر)</title>
                <link>https://virgool.io/@imfilbert/%D8%A7%D8%B1%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A2%DB%8C%DB%8C%D9%81%D8%B5%D9%84-2-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-irc2vyksgabq</link>
                <description>در این قسمت می خواهیم به کمک هم و در کنار هم فصل 2 معماری کامپیوتر یعنی ارزیابی کارآیی رو یاد بگیریم.در ابتدای فصل لازمه باهم یک تعریف رو مرور کنیم :کلاک پالس یا کلاک سایکل(clock cycle): سیگنالی ست که متناوبا صفر و یک می شود. در همه ی ماشین های ترتیبی وجود دارد و اعضای یک ماشین رو باهم هماهنگ یا سنکرون می کند.هر کلاک پالس شامل چهار قسمت می باشد : سطح مثبت ، سطح منفی ، لبه مثبت و لبه منفیپریود کلاک: و همچنین به فاصله بین دو لبه مثبت و یا دو لبه منفی یک سایکل یا clock cycle time یا پریود می گویند.پریود هر کلاک را با T نمایش می دهند و واحد آن ثانیه است، اما ثانیه واحد بزرگی برای T است ، به همین علت از مشتقات میلی ثانیه ، میکروثانیه ، نانو ثانیه و پیکو ثانیه استفاده می کنند.فرکانس کلاک:معکوس clock cycle time را فرکانس کلاک و یا نرخ کلاک می نامند و به معنای تعداد کلاک پالس در یک ثانیه است . واحد آن هرتز است اما هرتز واحد کوچکی برای فرکانس کلاک است به همین خاطر از مشتقات کیلوهرتز، مگاهرتز ، گیگاهرتز و تراهرتز استفاده می کنند.حالا که با هم یه سری پیش نیاز هارو دوره کردیم بریم سراغ اصل مطلب و اون معرفی MIPS هست.تعریف MIPS: MIPS در واقع یه پارامتر ارزیابی کارآیی و میشه بوسیله آن پردازنده هارو با هم مقایسه کرد. در واقع MIPS که مخفف million instruction per second به معنای تعداد میلیون دستور در هر ثانیه است .با تعریف MIPS بوسیله یک مثال بهتر آشنا می شویم.مثال: یک پردازنده دارای 4 کلاس دستور است ، برنامه ای روی این پردازنده اجرا شده که در جدول زیر مشخصات برنامه آمده است. اگر نرخ کلاک پردازنده 200 مگاهرتز باشد MIPS را بیابید.برای حل این مثال باید اول بدست آوریم که هر دستور متوسط چند کلاک می خورد؟average clock per instruction: (0.2*6) + (0.3*4) + (0.1*14) + (0.4*3) = 5یعنی به طور متوسط برای اجرای هر دستور باید پنج کلاک زده شود . به این مولفه ای که بدست آوردیم CPI یا همون clock per instruction می گویند.البته CPI همیشه از این روش بدست نمیاد و اکثر مواقعی که به ما جدول می دهند از این روش استفاده می کنیم . راه دیگر برای بدست آوردن CPI این است که به ما می گویند به ازای x تعداد دستور y تعداد کلاک زده می شود و در اینجا تنها با تقسیم کردن y بر x می توانیم CPI را بدست آوریم.برای حل مثالمون حالا باید بدانیم که هر دستور ما چه مدت طول می کشد که اجرا شود ، از یافته های مسئله داریم که نرخ کلاک برابر 200 مگاهرتز است و از قبل می دانیم پریود و فرکانس رابطه عکس دارند. بنابراین فرکانس برابر عکس 200 مگاهرتز یعنی یک بر روی 200 میکرو ثانیه خواهد بود. بنابراین متوسط زمان اجرای هر دستور برابر :average time per instruction: 5 * 1/200 =1/40 micro secپس متوجه شدیم که در 1/40 میکروثانیه یک دستور ما اجرا می شود ، حالا سوال این جاست که در یک ثانیه چند دستور می توانیم اجرا کنیم؟ با یک تناسب ساده به جواب خواهیم رسید.پس با این تناسب متوجه شدیم که در هر ثانیه 40 میلیون دستور اجرا می شود ، با توجه به تعریف MIPS که تعداد میلیون دستور در هر ثانیه است پس پاسخ MIPS ما 40 است.در ارزیابی کارآیی مفهوم دیگری به نام IPC هم داریم که به معنای این است که در هر کلاک چند دستور اجرا می شود که پاسخ آن عکس CPI است.مثلا در مثالی که با هم حل کردیم ، CPI را برابر 5 آوردیم پس IPC برابر 1/5 خواهد بود یعنی در هر ثانیه 1/5 دستور اجرا می شود.چند تعریف دیگر را نیز با هم یاد میگیریم تا به یه فرمول ساده تر برای بدست آوردن جواب MIPS برسیم.متوسط زمان اجرای یک دستور : برابر ضرب CPI در T است که در حل مثال قبل از آن استفاده کردیم.تعداد دستور : تعداد دستور را با IC نمایش می دهیم که مخفف instruction count است.مدت زمان اجرای یک برنامه : IC را در زمان اجرای یک دستور ضرب می کنیم.حالا وقت این هست که یک فرمول ساده تر برای MIPS بیابیم.همانطور که می بینید با محاسبات ساده بالا ، به این موضوع رسیدیم که می توان مقدار MIPS را از تقسیم فرکانس (با واحد مگاهرتز) بر CPI بدست آورد.حالا اگر از همین فرمول در مثالی که با کمک همدیگه در بالا حل کردیم استفاده کنیم فقط کافیه نرخ کلاک که 200 مگاهرتز بود رو بر CPI که 5 بدست آوردیم تقسیم کنیم و خیلی راحت تر به عدد 40 می رسیدیم.من همه سعیم رو کردم که تمام نکات رو بهتون بگم .تو قسمت بعدی با همدیگه این فصل رو کامل می کنیم .</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Mon, 07 Dec 2020 20:17:43 +0330</pubDate>
            </item>
                    <item>
                <title>BCD adder(تفریق)</title>
                <link>https://virgool.io/@imfilbert/bcd-adder%D8%AA%D9%81%D8%B1%DB%8C%D9%82-gfgqhjpimzry</link>
                <description>از قبل می دانیم عمل تفریق در هر مبنایی به فرض r به صورت زیر انجام می شود:A - B = A + r&#x27;th complete Bیعنی عمل تفریق A و B برابر با جمع عدد A با مکمل r عدد B است.مثلا در مبنای 2 برای تفریق عدد اول را با مکمل دو عدد دوم جمع می کردیم که مکمل 2 همان مکمل 1 بعلاوه 1 است. و در مبنای ده باید عدد اول را با مکمل 9 عدد دوم بعلاوه 1 جمع کنیم.چون BCD عددی در مبنای ده است که هر رقم آن به صورت دودویی نمایش داده می شود پس در تفریق A-B باید عدد A را با مکمل 9 عدد B بعلاوه یک جمع کنیم.برای بدست آوردن مکمل 9 در دهدهی هر رقم را منهای 9 می کردیم اما در BCD اینگونه نیست و دو روش داریم:1) اول عدد را با 0110 جمع کرده سپس تمام ارقام را not کنیم.2)تمام ارقام عدد را not کرده و سپس با 1010 جمع کنیم و از carry آن صرف نظر کنیم.مثال :مکمل 9 عدد 1100 را بدست آورید:result: not(1100 + 0110) =1101مثال: تفریق دو عدد 0110 -1001 را به صورت bcd انجام دهید:ابتدا مکمل 9 عدد 0110 را بدست می آوریم:result: not(0110 + 0110 ) = 0011پاسخ تفریق برابر است با جمع bcd اعداد زیر:result: 1001 + 0011 + 0001= 0001 0001که جواب نهایی ما رقم یکان یعنی 0001 است و دهگان به عنوان carry در نظر می گیریم و از آن صرف نظر می کنیم. زیرا از قبل در مکمل 2 به یاد داریم هنگامی که عدد A بزرگتر از عدد B باشد carry برابر یک می شد و بالعکس carry برابر صفر می شد.پس برای اینکه مدار تفریق bcd رو کامل کنیم ، نیاز به یک مکمل 9 کننده داریم که ابتدا عدد B رو مکمل نه آن را حساب کند سپس وارد bcd adder بشود و همچنین cin رو به bcd adder باید 1 بدیم به عنوان اون یکی که باید با عدد مکمل 9 B جمع شود ، پس داریم:طبق شکل بالا ، الان چالش پیش روی ما در این است که این مکمل 9 کننده رو بسازیم!همانطور که از قبل گفته شد ، برای بدست آوردن مکمل9 bcd دو روش داشتیم ، ساخت هر دو روش به صورت زیر خواهد بود:سپس در آخر یکی از دو مدار بالا را در شکل اول به جای مکمل 9 کننده جایگذاری می کنیم و تمااام! حالا ما یک مکمل9 کننده داریم!سوال: یک ورودی کنترلی مانند M در نظر بگیرید و جمع کننده ، تفریق کننده bcd بسازید.***یعنی تصور کنید اگر M مقدارش یک بود عمل تفریق انجام شود و اگر مقدار M برابر صفر بود عمل جمع انجام شود.از درس مدار منطقی با xor آشنا هستید . در xor هرگاه عددی با یک xor شود برابر not آن عدد و اگر با صفر xor شود برابر خودش خواهد بود.از همین مزیت xor استفاده کرده و ورودی کنترلی M را وارد bcd adder خودمون می کنیم و به شکل زیر می رسیم:همچنین می توان به عنوان روش دوم از یک مالتی پلکسر استفاده کرد که اگر ورودی کنترل کننده یک باشد مکمل 9 عدد B را به bcd adder بفرستد و اگر ورودی کنترل کننده صفر باشد خود عدد B را به bcd adder بفرستد.سوال: آیا می توانید یک جمع کننده و تفریق کننده باینری نیز بسازید؟ ( باینری adder ما ripple carry adder است)بله می شود از خاصیت xor در این جا هم استفاده کرد و به شکل زیر رسید:و حالا با همدیگه bcd adder رو کامل یاد گرفتیم ;))))</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Mon, 07 Dec 2020 00:37:40 +0330</pubDate>
            </item>
                    <item>
                <title>BCD adder</title>
                <link>https://virgool.io/@imfilbert/bcd-adder-tolrfsspzpnu</link>
                <description>در دو قسمت قبل با BCD adder آشنا شدیم. حالا باهم چند مثال از BCD adder حل می کنیم.سوال: جمع دو عدد 4 رقمی 6512 و 2815 را بوسیله BCD adder انجام دهید؟!پاسخ: جمع این دو عدد باید به صورت زیر باشد:قبول دارید در هر ستون ما یک جمع کننده bcd احتیاج داریم، که بعد از انجام جمع یکان را به عنوان حاصل و دهگان را به عنوان رقم نقلی به ستون بعدی بفرستد؟ بنابراین برای جمع دو عدد 4 رقمی به روش bcd به 4 bcd adder احتیاج داریم ، که شکل آن به صورت زیر خواهد شد:من اعداد رو به صورت دهدهی نوشتم که کامل متوجه منظورم بشید.حالا اگه بخوایم تاخیر رو برای این جمع حساب کنیم آیا پاسخ 4 * 16t می شود؟ خیر!طبق معمول لازم هست که مسیر بحرانی را پیدا کنیم، همانطور که می بینید مسیر بحرانی از bcd adder اول میگذره و از طریق دهگان آن وارد bcd adder دوم می شود سپس از طریق دهگان وارد bcd adder سوم می شود و مجدد از طریق دهگان وارد bcd adder چهارم می شود و در آخر از طریق یکان bcd adder چهارم خارج می شود. پس ما تاخیر رو برای بدست آوردن سه دهگان و یک یکان داریم که برابر :result: 3*10 + 16 =46در شکل بالا این بار اعداد رو به صورت bcd نوشتم که دیگه ازم اشکال نگیرید ! ;))اگر بخوایم مطلب بالا رو به جمع دو عدد n رقمی بسط بدیم به فرمول زیر می رسیم:delay= (n-1)tدهگان + t یکانسوال: آیا می توان سخت افزار جمع bcd را کاهش داد؟بله ! امیدوارم از قبل به یاد داشته باشید که FA اول در باینری adder دوم بلا استفاده بود چون عملا یک عدد را با دو صفر جمع می کرد. پس از طرفی این جمع carry نیز نخواهد داشت، بنابراین FA دوم دو عدد را جمع می کند پس نیازی به FA نیست و می توان از HA به جای آن استفاده کرد.اما FA سوم سه عدد را جمع می کند و باید در جای خود باقی بماند ، اما FA چهارم مجدد یک عدد را با carry و صفر جمع می کند و باز می توان به جای آن از HA استفاده کرد.(می توان از xor هم استفاده کرد چون carry آن برای ما کاربردی ندارد)مفهوم حرف خودم رو در تصویر زیر بهتر نشان خواهم داد:در قسمت بعدی با هم تفریق bcd رو یاد میگیریم...</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 06 Dec 2020 21:52:47 +0330</pubDate>
            </item>
                    <item>
                <title>BCD adder</title>
                <link>https://virgool.io/@imfilbert/bcd-adder-dvsfrt5c8oof</link>
                <description>در قسمت قبلی تفاوت باینری adder و bcd adder رو توضیح دادم و متوجه شدیم که تفاوت این دو روش جمع تنها در رنج 10 تا 19 می باشد که اختلاف آن ها برابر 0110 که برابر عدد 6 دهدهی است، و در رنج 0 تا 9 حاصل آن ها با هم تفاوتی ندارد.پس روش ما برای جمع باید به گونه ای باشد که اعداد را اول به صورت باینری جمع کنیم ، سپس ببینیم آیا عدد ما در رنج 10 تا 19 هست یا خیر اگر بود آن را با 0110 مجدد جمع کنیم تا برابر حاصل جمع در BCD شود ، در غیر این صورت نیازی به تغییر نیست.حالا مشکل این جاست که ببینیم چگونه اعداد 10تا 19 را پیدا کنیم!؟فرض کنیم دو عدد 4 بیتی را می خواهیم به صورت باینری جمع کنیم :طبق تصویر بالا در حاصل ما یه عدد پنج بیتی به صورت زیر داریم:carry sum3 sum2 sum1 sum0زمانی که carry برابر 1 باشد ، عدد بزرگ تر و مساوی 16 خواهد بود. زمانی که ، sum3 و sum2 هر دو باهم یک باشند عدد بزرگ تر مساوی 12 خواهد بود.   و زمانی که sum3 و sum1 هر دو باهم یک باشند عدد بزگ تر مساوی 10 خواهد بود. پس زمانی که یک یا دو یا هر سه شرط برقرار باشد قطعا عدد ما در رنج 10 تا 19 خواهد بود ، به همین راحتی!اگر بخوایم سه شرط خودون رو بر روی جمع باینری اعمال کنیم به تصویر زیر می رسیم:حالا وقتی که رنج عددمون رو پیدا کرده ایم ، پس نیاز داریم عدد را اگر در رنج 10 تا 19 بود با 0110 جمع کرده و اگر در بازه 0 تا 9 بود با 0000 جمع کنیم.پس مجددا نیاز به یک باینری adder دیگر داریم.پس از تکمیل شکل به تصویر زیر می رسیم:همانطور که در بالا گفته شد ، زمانی که خروجی or ما یک باشد ، عدد در رنج 10 تا 19 خواهد بود ، اما اگر خروجی or صفر باشد عدد در رنج 0 تا 9 خواهد بود .پس ما خروجی or رو اگر با z نمایش دهیم ، به شیوه زیر به 4bit adder دوم وصل می کنیم:دلیل این کار این است که اگر خروجی or یا همون z یک باشد ، به معنای بازه 10 تا 19 است و عدد باید با 0110 جمع شود و اگر z برابر صفر باشد به معنای بازه 0 تا 9 است پس عدد با 0000 جمع می گردد.یکان حاصل جمع BCD ما همان حاصل جمع 4bit adder دوم می باشد، و دهگان جمع BCD ما همان z یا حاصل or می باشد.البته دهگان را می شود به روش دیگری نیز محاسبه کرد :الف) میدانیم carry در 4bit adder اول زمانی یک می شود که حاصل بین 16 تا 19 باشد.ب) و همچنین carry در 4bit adder دوم زمانی یک می شود که حاصل در رنج 10 تا 15 باشد ( زیرا جمع اعداد 10 تا 15 با عدد 0110 موجب ایجاد carry می گردد) نتیجه: پس با این حساب با or کردن carry های دو 4bit adder می توانیم دهگان را بسازیم.سوال: در جمع BCD چهار بیتی چند حالت مجاز داریم؟پاسخ:دو ورودی A و B تنها اعداد 0 تا 9 را می توانند بپذیرند، بنابراین هر کدام ده حالت دارند ، ورودی cin نیز دو حالت صفر و یک دارد ، بنابراین :result: 100*100*2=200تاخیر در BCD adder:فرض کنیم از ripple carry adder برای جمع باینری استفاده کرده ایم و تاخیر برای sum و carry در ripple carry adder برابر 2t باشد. حالا تاخیر در BCD adder چقدر است؟ابتدا باید مسیر بحرانی را پیدا کنیم:مسیر بحرانی ما ، مسیر بنفش رنگی ست که در شکل مشخص کرده ام .علت اینکه FA اول در باینری adder دوم در مسیر بحرانی ما نیست این است که FA اول در واقع s0 را با دو تا صفر جمع میزند یعنی در واقع عملی انجام نمی دهد و می توان آن را حذف کرد.پس مسیر بحرانی ما شامل 4 FA در باینری adder اول گیت and و گیت or و 3 FA در باینری adder دوم می باشد. یعنی در مجموع برابر 16t می باشد.( تاخیر گیت and و or را t فرض کرده ایم)*اما اگر سوال از ما بپرسد که تاخیر برای دهگان BCD چقدر است؟ جواب 16t نخواهد بود ، زیرا دهگان برابر حاصل گیت or بود که اصلا وارد باینری adder دوم نمی شد پس از سه FA آخر عبور نخواهد کرد، بنابراین برابر 10t خواهد بود.در قسمت بعدی با هم چند سوال از BCD adder حل می کنیم.</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 06 Dec 2020 18:55:09 +0330</pubDate>
            </item>
                    <item>
                <title>BCD adder</title>
                <link>https://virgool.io/@imfilbert/bcd-adder-cudcwj8xga08</link>
                <description>برای یادگرفتن BCD adder ابتدا یه مرور بر اعداد BCD می کنیم. اعداد BCD اعدادی شامل عدد 0 تا 9 هستند، که به صورت زیر نمایش داده می شوند:پس BCD adder روشی برای جمع و یا تفریق اعداد BCD است. حالا سوال اینجاست که تفاوت آن با binary adder چیست؟در جمع باینری جمع دو عدد 0111 و 1000 که اعداد 7 و 8 در مبنای ده هستند به صورت 1111 که به معنای 15 در مبنای ده هست نمایش داده می شود.اما در BCD adder جمع دو عدد 0111 و 1000 باید به صورت 0101 0001 نمایش داده می شود، که 4 رقم سمت راست به معنای یکان که معادل عدد 5 و 4 رقم سمت چپ برابر دهگان که معادل عدد 1 است می باشد.به عنوان مثال جمع اعداد BCD زیر را در نظر بگیرید:a) 0110 + 0101= 0001 0001b)0101 + 0101= 0001 0000جمع اول حاصل جمع اعداد 5 و 6 است که برابر عدد 11 که به صورت 0001 0001 نمایش داده شده است می باشد و جمع دوم نیز برابر جمع دو عدد 5 و 5 است که برابر 10 دهدهی و به صورت 0000 0001 نمایش داده شده است.پس حتما تا الآن متوجه شده اید که جمع دو عدد BCD همانند جمع دهدهی انجام می شود ، منتهی هر رقم به صورت دودویی نوشته می شود.مثلا جمع دو عدد 6 و 7 برابر عدد 13 است که نمایش عدد 3 در دودویی به صورت 0011 و نمایش عدد 1 در دودویی به صورت 0001 می باشد ، پس جمع دو عدد 6 و7 به صورت BCD برابر 0011 0001 خواهد بود.طبق توضیحات پس BCD adder باید مداری شبیه به شکل زیر داشته باشد:طبق شکل بالا اعداد A و B فقط مقادیر صفر تا 9 را می توانند داشته باشند ، پس حاصل یک BCD adderباید مقداری بین صفر (زمانی که تمامی ورودی ها صفر هستند) و 19( زمانی که A و B برابر 9 و cin برابر 1 باشد) باشد.اگر کمی دقت بخرج بدیم متوجه می شویم تا زمانی که حاصل BCD adder دهگان صفر داشته باشد حاصل با جمع دودویی تفاوتی نخواهد کرد.به عنوان مثال جمع دو عدد 0101 و 0100 را در نظر بگیرید ، در جمع دودویی حاصل برابر 1001 برابر عدد نه دهدهی و در BCD adder حاصل برابر 1001 0000 که مجدد برابر نه دهدهی است می باشد. از آنجایی که صفر پشت عدد بی اثر است پس حاصل یکسان است.پس تا زمانی که حاصل جمع دو عدد بین صفر تا 9 باشد جمع باینری با جمع BCD هیچ تفاوتی ندارند.اما زمانی که حاصل بین 10 تا 19 باشد حاصل جمع باینری به اندازه 0110 از حاصل جمع BCD کمتر است، یعنی اگر حاصل جمع باینری مقداری بین 10 تا 19 داشته باشد با اضافه کردن 0110 به آن به حاصل جمع BCD می رسیم.مثال: جمع دو عدد 5 و 6 را در نظر بگیرید:binary adder) 0110 + 0101 = 1011BCD adder) 1011 + 0110 = 0001 0001پس متوجه شدیم برای ساخت یک BCD adder یک باینری adder نیاز داریم ، سپس باید خروجی آن را چک کنیم اگر حاصلی بین 0 تا 9 داشته باشد ، حاصل بدون تغییر باقی می ماند ، اما اگر در بازه 10 تا 19 باشد باید با عدد 0110 جمع باینری شود تا برابر مقدار حاصل در جمع BCD گردد.در قسمت بعدی با هم این BCD adder رو می سازیم. </description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sun, 06 Dec 2020 00:21:34 +0330</pubDate>
            </item>
                    <item>
                <title>carry look ahead</title>
                <link>https://virgool.io/@imfilbert/carry-look-ahead-vylh9bqi8wvu</link>
                <description>از قبل با ripple carry adder آشنا شدیم ، و متوجه شدیم که مشکل اساسی ripple carry adder در این است که در آن هر FA برای محاسبات خود باید منتظر carry حاصل از FA قبلی خود باشد.پس ما به دنبال راهی هستیم که حاصل carry را به صورت مستقل بدست آوریم. به همین دلیل به روش carry look ahead پیش بینی رقم نقلی نیز می گویند.این بار FA را حاصل or کردن دو HA در نظر می گیریم:پس طبق شکل بالا برای هر FA داریم:در واقع هر FA شامل سه قسمت ، بدست آوردن PG ، بدست آوردن carry و بدست آوردن sum می باشد.حالا شاید براتون سوال شده باشه که خب تا اینجا چه تفاوتی با ripple carry adder کرد؟ الان هم که هر carry وابسته به carry قبل از خودش است.اما بیاید فرض کنیم که دو عدد 4 بیتی را می خواهیم باهم جمع بزنیم، پس ما باید 4 carry رو محاسبه کنیم ( C0 که به ما داده شده است ، C1 تا C4 را باید بدست آوریم)حال طبق فرمولی که از FA بدست آوردیم تک تک carry هارو می نویسیم ، منتهی در هر carry فرمول carry قبلی را جایگذاری می کنیم، پس به فرمول زیر می رسیم:حالا می بینید که می تونیم مستقل از هر FA و با این فرمول ها carry هارو محاسبه کنیم.حالا اگر بخوایم مدار carry look ahead adder رو برای جمع دو عدد 4 بیتی بکشیم ، به شکل زیر می رسیم:با فرض اینکه هر ستون به صورت موازی اجرا می شوند و تاخیر برای هر ستون t است ، پس در کل تاخیر برای 4bit carry look ahead برابر 4t می باشد. اما این تاخیر خیلی واقعی نیست چون همیشه تاخیر گیت xor بیشتر از گیت های دیگه است ، پس اگر تاخیر گیت xor  را برابر 2t در نظر بگیریم تاخیر 4bit carry look ahead در کل برابر 6t خواهد شد.یک نکته حائز اهمیت این است که در برخی منابع Pi رو برابر ai + bi  در نظر می گیرند به جای xor. پس با این فرض به مدار زیر می رسیم:حال طبق شکل بالا و مجدد با فرض اینکه اخیر گیت xor برابر 2t باشد تاخیر مدار بالا یعنی تاخیر برای 4bit carry look ahead برابر 5t خواهد بود.پس در نتیجه اینکه تاخیر برای 4bit carry look ahead بین 6t و 4t خواهد بود.در بالا و در قبل اشاره کردم که در carry look ahead ما سه قسمت اصلی رو بدست می آوریم اول PG سپس carry و در آخر sum ، یعنی به طور خلاصه مدار carry look ahead برابر شکل زیر است:که تاخیر هر قسمت را 2t فرض می کنند.سوال : آیا برای هر nbit carry look ahead adder تاخیر ثابت باقی می ماند و تمامی گیت ها به صورت موازی اجرا می شوند؟به صورت تئوری بله! اما در عمل این کار امکان پذیر نیست ! زیرا ما محدودیت سخت افزار داریم مثلا گیت and هشت ورودی یا بالاتر وجود ندارد.پس در نتیجه برای پیاده سازی جمع اعداد 8 بیتی ، 12 بیتی و ... باید چند carry look ahead adder چهاربیتی را به هم به صورت ripple adder متصل کنیم.مثال: فرض کنید می خواهیم دو عدد 12 بیتی را باهم جمع بزنیم !پس ما نیاز داریم سه 4bit carry look ahead adder را به صورت ripple به هم متصل کنیم. آیا می توان گفت تاخیر برای هر carry look ahead adder برابر 6t است بنابراین تاخیر کل 3 *6t یعنی 18t خواهد بود؟خیر!!! باید مدار را کشیده و مسیر بحرانی بدست آوریم:اگر هر مستطیل را یک carry look ahead adder در نظر بگیرید ، هر دایره درون آن برابر بدست آوردن سه مقدار اصلی PG و carry و sum است که تاخیر برای هر دایره نیز برابر 2t می باشد.اگر این سه 4bit carry look ahead adder را بهم متصل کرده باشیم ، طولانی ترین مسیر یا همان مسیر بحرانی ما خط سبز رنگیست که در شکل مشخص کرده ام ، اگر دقت کنید شامل 5 دایره می باشد ، از آنجایی که  تاخیر برای هر دایره برابر 2t است پس تاخیر کل برابر 5*2t یعنی 10t خواهد بود.اگر جمع دو عدد 12 بیتی را با ripple carry adder پیاده سازی می کردیم ، تاخیر برابر 24t میشد که خب این تفاوت چشمگیری است.در قسمت بعدی با همدیگه BCD adder رو یاد می گیریم.</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sat, 05 Dec 2020 22:08:44 +0330</pubDate>
            </item>
                    <item>
                <title>ripple carry adder!</title>
                <link>https://virgool.io/@imfilbert/ripple-carry-adder-tcwbtsummoez</link>
                <description>در روش های جمع کننده و تفریق کننده چند بیتی ، حتما اسم ripple carry adder به گوشتون خورده!حالا بیاین با هم بررسی کنیم درواقع این ripple carry adder چجوری دو عدد چند بیتی رو باهم جمع می کنه!جمع دو عدد 4 بیتی باینری 1011 و 0010 که در تصویر بالا هست رو در نظر بگیرید:با فرض اینکه با شروع هر جمع یک carry0 از جمع های پیشین که انجام شده داریم ، پس با این حساب برای جمع دو عدد چند بیتی به اضافه carry ها داریم در هر ستون سه عدد رو با هم جمع می کنیم.( ai و bi و ci)آیا FA رو از مباحث قبلی یادتون هست؟بیاین با هم یه نگاهی به FA بیاندازیم:ساختار FA که در شکل بالا می بینید ، به گونه ای بود که سه عدد Aو B و Cin رو باهم جمع می کرد و دو عدد با عنوان sum و carry به ما تحویل می داد.حالا دوباره یه نگاه به جمع قبلی بندازید تا متوجه بشید FA چرا به کار ما میاد!درسته!!! می تونیم برای بدست آوردن جمع هر ستون از FA استفاده کنیم و حاصل SUM رو به عنوان Si در نظر بگیریم و carry رو هم به ستون بعدی بفرستیم.پس در واقع برای مثال خودمون که جمع دو عدد 4 بیتی بود ما به 4 FA احتیاج داریم چون 4 تا ستون داریم.در واقع به این روش جمع ripple carry adder میگن، به همین راحتی!بچه ها اگر یه سری مباحث از مدار منطقی رو یادتون باشه میتونید به یاد بیارید که ساختار داخلی FA به صورت زیر بود:از شکل بالا می تونیم متوجه بشیم که :حالا اگر مدارهای sum و carry رو رسم کنیم به شکل زیر می رسیم:با فرض بر اینکه گیت های موجود در هر قسمتی که با خط فاصل نارنجی متمایز کردم به صورت موازی کار کنند و تاخیر هر قسمت را برابر t قرار دهیم پس تاخیر هر FA برابر 2t خواهد بود.با توجه به شکلی که در بالا برای aipple carry adder برای جمع دو عدد 4 بیتی قرار دادم ، مسیر بحرانی برای آن شکل زمانی ست که با جمع a0وb0وc0 شروع شده و به c4 ختم می شود:پس مسیر بحرانی ما برای ripple carry adder 4 بیتی شامل گذر کردن از 4 FA می شود ، تاخیر هر FA طبق محاسبات قبلی ما برابر 2t بود ، پس تاخیر برای ripple carry adder چهاربیتی برابر 8t می باشد.می توان محاسبات انجام شده را تعمیم داد و اینگوه بیان کرد ، که تاخیر برای هر ripple carry adder n بیتی برابر 2nt می باشد.(زیرا مسیر بحرانی شامل n عدد FA و تاخیر برای هر FA برابر 2t است)*تاخیر: یعنی حداکثر زمان برای تولید خروجی!ممکن است در سوال به ما بگویند فرض را بر این بگذارید که تاخیر بدست آوردن carry در FA برابر 2t و تاخیر بدست آوردن sum در FA برابر 3t باشد آنگاه تاخیر n bit ripple carry adder چقدر است؟اگر به مسیر بحرانی ای که برای 4bit ripple carry adder بدست آوردیم نگاه بیاندازید می بینید که شامل بدست آوردن 3 carry و یک sum است .حال اگر این موضوع را تعمیم بدهیم به n bit ripple carry adder متوجه می شویم که مسیر بحرانی آن شامل n-1 carry و یک sum خواهد بود ، پس تاخیر برابر :(n-1)2t + 3tهمانطور که در صحبت های قبلی پیداست ، هر FA در واقع carry خود را از FA قبلی می گیرد.به نوعی می توان گفت اشکال بزرگ روش ripple carry adder در همین موضوع است که هر FA باید منتظر آمدن carry از سمت FA قبلی خود باشد تا محاسباتش را انجام دهد.برای حل این مشکل در ripple carry adder چه روشی رو پیشنهاد می کنید؟آیا میشود carry ها را بدون هر گونه وابستگی محاسبه کرد؟در قسمت بعدی با روش carry look ahead آشنا می شویم.</description>
                <category>zerotwo</category>
                <author>zerotwo</author>
                <pubDate>Sat, 05 Dec 2020 20:20:11 +0330</pubDate>
            </item>
            </channel>
</rss>