PDA

نسخه کامل مشاهده نسخه کامل : گام‌هاي طراحي مدارهاي ديجيتال٬‌ از معماري تا سنتز



javadshahvand
10-09-2007, 09:24
مقدمه

فرايند طراحي سخت‌افزار و مدارهاي ديجيتال امروزه آنچنان توسعه پيدا کرده است که در يک مقاله نمي‌توان تمامي جوانب آن را پوشش داد٬ در مقاله "درآمدي بر زبان‌هاي توصيف سخت‌افزاري ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])" به تکامل طراحي ديجيتال به کمک کامپيوتر اشاره کرديم و گفتيم که امروزه طراحي سخت‌افزارهاي پيچيده کاملا وابسته به زبان‌هاي توصيف‌سخت‌افزاري يا زبان‌هاي توصيف سيستمي مي‌باشد٬ سپس به بررسي زبان‌هاي توصيف سخت‌افزاري متداول پرداخته و در انتها آنها را مقايسه کرديم اما اينکه اين زبان‌ها چگونه در فاز طراحي به کمک طراح آمده و طراحي مبتني بر اين شيوه خود چه مراحل ديگري را به دنبال دارد موضوعي است که در اين مقاله ضمن تشريح مثال طراحي شمارنده برنامه‌پذير به آن خواهيم پرداخت.





[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]





اصولا با توجه به پيچيدگي سخت‌افزار مورد طراحي٬ سطحي از ساده‌سازي يا Abstraction براي آغاز فرايند طراحي انتخاب مي‌شود٬ در واقع اين سطح نوع نگاه به جزئيات آن سخت‌افزار را بيان مي‌کند٬ به عنوان مثال در سطح سيستمي٬ طراح تنها بر روي جزئيات سيستماتيک سخت‌افزار تمرکز کرده و سخت‌افزار را توصيف مي‌کند يا در سطح رفتاري ٬ طراح تنها بر روي ويژگي‌هاي رفتاري و عملکردي سخت‌افزار تمرکز کرده و ساير جزئيات طراحي ابزارهاي کامپيوتري واگذار مي‌کند.



در طراحي شمارنده‌برنامه پذير ميزان پيچيدگي سخت‌افزار در سطحي نيست که نياز به توصيف سيستمي آن وجود داشته باشد به همين خاطر به توصيف رفتاري آن بسنده کرده و گام‌هاي طراحي را از توصيف رفتاري يک مدار به کمک زبان توصيف سخت‌افزاري Verilog‌ آغاز مي‌کنيم ٬ اما قبل از کدنويسي و توصيف هر سخت‌افزاري نياز است با در نظر گرفتن ويژگي‌هاي سخت‌افزار٬ معماري براي اجزاي تشکيل دهنده‌ آن طراحي کرد.


گام اول:


گام اول: تعيين کردن مشخصات

در اولين گام بايد تعيين کنيم که سخت‌افزار مورد نياز چه ويژگي‌ها و مشخصاتي بايد داشته باشد٬ حالت‌هاي کاري آن به چه صورت است و چه عملکردي در هر حالت نسبت به ورودي‌هاي مختلف بايد از خود نشان دهد.
در مثال طراحي اين مقاله٬ ما يک شمارنده برنامه‌پذير را هدف طراحي قرار داده‌ايم و در گام اول مشخصات آن را تعيين مي‌کنيم. اين شمارنده در واقع يک تايمر 8 بيتي است که در سه مد علمياتي کار مي‌کند اين سه مد عبارتند از تايمر one-shot ٬ pulse generator و 50% waveform generator که در ادامه به جزئيات تک تک اين سه مد کاري اشاره خواهد شد. در هر مد کاري٬ پيش از آغاز به کار شمارنده عددي داخل آن بارگزاري مي‌شود تا محدوده شمارش و توليد خروجي مطلوب تعيين گردد. اين شمارنده جهت مشخص کردن مد کاري خود از يک ثبات داخلي استفاده مي‌کند که Control_word_register نام گذاري شده٬ با ارزش‌ترين بيت اين ثبات سه بيتي٬ وصعيت فعال بودن يا غير فعال بودن شمارنده را مشخصي مي‌کند و دو بيت کم ارزش‌تر ديگر٬ مد کاري شمارنده را تعيين مي‌کنند٬ با توجه به شکل 1 هر گاه بيت سوم اين ثبات 1 باشد٬ شمارنده فعال خواهد شد.



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 1: ثبات control_word_register و بيت‌هاي تشکيل‌دهنده آن


هريک از مدهاي کاري شمارنده عبارتند از:

مد 00 – One-Shot Timer : در اين مد ابتدا شمارنده با يک عدد هشت بيتي بارگزاري شده سپس سه بيت 100 داخل control_world_register نوشته مي‌شوند تا شمارنده را در مد 00 فعال نمايد٬ سپس شمارنده در هر لبه بالا رونده کلاک شروع به شمارش مي‌کند تا زماني که عدد بارگزاري شده به مقدار FF برسد و يک کلاک پالس 1 در خروجي اعمال شود. پس از اينکه در خروجي يک پالس 1 نوشته شد (One-Shot) شمارنده به صورت خودکار با ارزشترين بيت CWR (سرنام Control_word_register) را 0 مي‌کند و شمارنده غير فعال مي‌شود. براي ادامه کار One-shot Times ٬ با ارزشترين بيت CWR بايد مجددا 1 شده تا شمارنده پس از شمارش مجدد ٬ يک پالس 1 ديگر در خروجي ارائه کند.


مد 01- pulse generator: در اين مد نيز ابتدا شمارنده با يک عدد هشت بيتي بارگزاري شده و سپس مقدار 101 داخل CWR نوشته مي‌شود تا شمارنده را در مد 01‌ فعال کند٬ سپس شمارنده با لبه مثبت کلاک شروع به شمارش کرده تا زماني که مقدار بارگزاري شده به FF برسد٬ سپس در خروجي يک پالس 1 ظاهر شده و شمارنده مجددا از عددي که در ابتدا داخل آن بارگزاري شده بود شروع به شمارش مي‌کند. بر خلاف مد 00 در اين مد شمارنده پس از رسيدن به مقدار FF غير فعال نشده و از مقدار بارگزاري شده مجددا شروع به شمارش مي‌کند تا به طور پيوسته با رسيدن به مقدار FF يک پالس 1 در خروجي توليد کند.


مد 10- 50% Waveform generator : اين مد توليد کننده شکل موج‌هاي متقارن نام‌گذاري شده است٬ شمارنده ابتدا توسط يک عدد باينري هشت بيتي بارگزاري مي‌شود سپس برخلاف دو مد 00‌و 01 شمارنده به صورت کاهشي از عدد بارگزاري شده شروع به شمارش کرده تا زماني که به نصف مقدار بارگزاري شده برسد٬ پس از آن خروجي 1‌شده و تا زماني که شمارنده به عدد صفر برسد خروجي همچنان 1 مي‌ماند. پس از اينکه شمارنده به عدد صفر رسيد ٬ خروجي 0‌ شده و شمارنده به صورت خودکار مجددا بارگذاري شده و شروع به شمارش کاهشي مي‌کند. در اين مد شمارنده تا زماني که باارزشترين بيت CWR به صورت دستي 1 نشود٬ متوقف نخواهد شد و به طور پيوسته شکل موج متقارن و فرکانسي معادل با عددي که در شمارنده بارگزاري شده است توليد مي‌کند.


مد 11 نيز در اين طراحي استفاده نشده است.

گام دوم:

گام دوم : طراحي معماري سخت‌افزار

بر اساس ويژگي‌ها و مشخصات تعريف شده سخت‌افزار در گام اول٬ مي‌توان ساختار اجزاي تشکيل دهنده و معماري سخت‌افزار را طراحي کرد ٬ در اين گام با توجه به اين که مشخصات سخت‌افزار کاملا معيين شده‌‌اند بايد اينترفيس ارتباطي و اجزاي تشکيل دهنده آن را مشخص کرد.
در مرحله اول به اينترفيس ارتباطي شمارنده برنامه‌پذير مي‌پردازيم٬ همانطور که در شکل 2 مشاهده مي‌کنيد٬ اين شمارنده با مشخصات تعريف شده در گام اول به شش سيگنال ورودي و يک سيگنال خروجي نياز دارد:



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 2 : نمايي از سيگنال‌هاي ورودي و خروجي شمارنده برنامه پذير

عملکرد هريک از اين سيگنال‌هاي عبارتند از :
Reset : فعال شدن سيگنال اين pin حالت مدار ترتيبي شمارنده برنامه پذير را به حالت شناخته‌شده‌ي اوليه مي‌برد.
Ceb : سرنام Chip Enable Bit که زماني که سيگنال روي اين pin مقدار 0 داشته باشد٬ شمارنده فعال خواهد بود.
Data_in : ورودي 8 بيتي داده به شمارنده جهت بارگزاري در ثبات‌هاي داخلي آن است.
Write : فعال شدن سيگنال اين pin ٬ امکان نوشتن بر روي ثبات سه بيتي CWR را از سه بيت ابتدايي Data_in فراهم مي‌کند
Load : فعال شدن سيگنال اين pin٬ امکان بارگزاري ثبات شمارنده را از خطوط ورودي Data_in فراهم مي‌کند٬ اين مقدار بارگزاري شده نقطه آغاز شمارش افزايشي/کاهشي شمارنده خواهد بود.
Data_out : پين سيگنال خروجي شمارنده برنامه‌پذير
Clk : پين ورودي کلاک به شمارنده برنامه‌پذير

جهت ذخيره سازي مقدار CWR به يک ثبات سه بيتي نياز داريم که بايد در معماري شمارنده آن را در نظر بگيريم٬ علاوه بر اين چون در مد 01 و 10 شمارنده به طور مداوم با مقدار بارگزاري اوليه٬بارگزاري شده و شروع به شمارش مجدد مي‌کند٬ به يک ثبات هشت بيتي ديگر نيز نياز داريم که بتوان مقدار بارگزاري اوليه را در آن ذخيره کرد. اين ثبات با نام Latch در شکل 3 نشان داده شده است. که در توصيف مدار latch_counter نام گرفته است.




[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 3 ٬ معماري داخلي شمارنده برنامه‌پذير


پس از عناصر ذخيره سازي٬ يک مدار ترتيبي شمارنده هشت بيتي که توانايي شمارش افزايشي و کاهشي را داشته باشد نيز در نظر گرفته شده است که با توجه به حالت‌هاي اين مدار ترتيبي يک مدار ترکيبي decoder‌ براي توليد خروجي مورد نظر بايد طراحي شود.
با توجه به شکل 3 ٬ معماري شمارنده برنامه‌پذير تا آنجايي که ممکن بود به اجزاي کوچکتر شکسته شد تا طراحي آن ساده تر گردد.

گام سوم:


گام سوم: ترسيم دياگرام‌هاي جرياني

پيش از نوشتن کد‌هاي توصيف‌سخت افزاري ٬ طراح مي‌بايست بخشي از وقت خود را صرف ترسيم دياگرام‌هاي‌ جرياني جهت مشخص کردن جريان پردازش اطلاعات و عملکرد مدار کند. اين دياگرام‌هاي انواع متعددي دارند که بسته به سليقه و نياز طراح٬ بايد به خدمت گرفته شوند.
در طراحي شمارنده برنامه پذير نيز ما چندين دياگرام جرياني ترسيم کرده‌ايم که کار نوشتن کدهاي Verilog از روي‌ آنها بسيار ساده‌تر مي‌باشد. براي اين کار ابتدا فرض مي‌کنيم که معماري توصيف شده طراحي شده است و حالت‌هاي مختلف کاري آنرا بررسي مي‌کنيم. در ابتدا بايد شمارنده بارگزاري شده و مدکاري آن در CWR‌ نوشته شود٬ لذا پيش از هر کاري به سراغ ترسيم نمودار جرياني که شرايط بارگزاري شمارنده را پوشش مي‌دهد مي‌رويم اين نمودار را مي‌توانيد در شکل 4 مشاهده کنيد :


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 4: نمودار جرياني بارگزاري شمارنده و نوشتن روي CWR

با توجه به شکل 4 هريک از مسير‌هاي اين نمودار به صورت زير تفسير مي‌شوند
مسير 1: زماني که سيگنال‌هاي ceb‌ و load در منطق 0 هستند و سيگنال write در منطق 1 قرار دارد٬ دستور نوشتن داده روي CWR مي‌باشد٬ لذا داده‌هاي روي پين 2 تا 0 سيگنال data_in بايد در ثبات سه بيتي CWR نوشته شوند.
مسير 2: زماني‌ که سيگنال‌هاي ceb و write در منطق 0‌ هستند و سيگنال load در منطق 1 قرار دارد٬ دستور بارگزاري داده روي شمارنده مي‌باشد٬ لذا داده‌هاي Data_in بايد در latch_counter ذخيره شوند٬ latch_counter ثباتي است که در مد کاري 01 و 10 جهت ذخيره سازي عدد بارگزاري شده در شمارنده به آن نياز داريم.
مسير 3: زماني که سيگنال ceb در منطق 1 باشد٬ شمارنده برنامه‌پذير غير فعال خواهد شد و بايد مقدار ذخيره شده در latch_counter و CWR پاک شود.

قبل از آنکه به سراغ طراحي دياگرام‌جرياني مدهاي کاري شمارنده برنامه پذير برويم٬ ابتدا دياگرام جرياني reset‌ شدن مدار را ترسيم مي‌کنيم؛ سيگنال reset از آنجا در طراحي اين شمارنده به خدمت گرفته شد که پيش از انجام هر کاري٬ با فعال کردن آن بتوانيم حالت مدار ترتيبي شمارنده را به يک حالت شناخته شده اوليه برده و فرآيند شمارش را دنبال کنيم. همانطور که در گام دوم مشخص کرديم شمارنده با لبه بالا رونده سيگنال reset ٬ بايد مقادير ذخيره شده در داخل ثبات‌هاي خود را پاک کند ٬ با توجه به شکل 5 تنها يک مسير در اين دياگرام وجود دارد که در اين مسير در صورت مشاهده لبه مثبت سيگنال reset تمامي ثبات‌هاي داخلي شمارنده که flag_counter و flag_half_counter و counter نام‌گذاري شده‌اند٬ پاک خواهند شد.



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 5: دياگرام جرياني reset

سرانجام به سراغ ترسيم دياگرام‌هاي جرياني اصلي شمارنده مي‌رويم٬ اين دياگرام‌ها ريز عملکرد مدار را در مد‌هاي کاري مختلف بيان مي‌کنند. با توجه به اين که شمارنده برنامه پذير يک نوع مدار ترتيبي ساده به شمار مي‌رود٬ ما از ساختار ماشين Moore براي طراحي آن استفاده کرده‌ايم٬ در اين ساختار همانطور که شکل زير نشان داده شده است٬ يک مدار مجزا براي محاسبه حالت‌هاي مدار ترتيبي و يک مدار جهت محاسبه خروجي در نظر گرفته مي‌شود.


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بنابر اين در مرحله ترسيم دياگرام‌هاي جرياني مد‌هاي کاري شمارنده٬ تنها بر روي محاسبه حالت‌هاي داخلي مدار تمرکز کرده و ايجاد سيگنال خروجي را به يک مدار ترکيبي ديگر واگذار مي‌کنيم.

شکل 6 دياگرام جرياني شمارنده در مد 00 را نشان مي‌دهد٬ شبه‌کدهاي نوشته شده در داخل اين نمودار به طور کامل بيان‌گر ريز عملکرد شمارنده در مد 00 مي‌باشند٬ در واقع اين شماتيک توصيف مشخصاتي که در گام اول براي مد 00نوشته شده بودند٬ به صورت الگوريتميک درآورده طوري که نوشتن کدهاي توصيف سخت‌افزاري از روي آن ساده‌تر مي‌باشد.


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

شکل 6: دياگرام جرياني مد 00


با توجه به شکل 6 در لبه بالا رونده کلاک٬ بيت سوم CWR با مقدار 1 مقايسه مي‌شود٬ اين بيت بيانگر فعال‌ بودن يا غير فعال بودن شمارنده مي‌باشد٬ در صورتي که شمارنده فعال بود٬ دو بيت ديگر CWR با مقدار 00 مقايسه مي‌شوند تا مدکاري شمارنده مشخص شود٬ در صورتي که مقدار اين دو بيت 00 نبود٬ مد 01 فراخوني خواهد شد. در صورتي که مد کاري 00 بود٬ مقدار ثبات flag_counter ارزيابي مي‌شود٬ اين ثبات پرچم٬ به نشانه بارگزاري شدن counter از روي ثبات‌ latch_counter مي‌باشد٬ در صورتي که اين عمليات صورت نگرفته باشد٬ مقدار flag_counter برابر 0 خواهد بود و لذا در گام بعدي counter توسط latch_counter بارگزاري شده و flag_counter برابر 1 مي‌شود.
در صورتي که flag_counter برابر 1 باشد٬ به اين معني خواهد بود که قبلا مقدار latch_counter داخل counter‌ بارگزاري شده است لذا شمارنده وارد مرحله شمارش مي‌شود٬ در اين مرحله ابتدا مقدار counter با FF مقايسه مي‌شود تا مشخص شود که شمارش به انتها رسيده است يا نه٬ سپس در صورتي که شمارش به انتها نرسيده بود٬ مقدار counter يک واحد افزايش پيدا کرده و فرايند مجددا تکرار مي‌شود.
در صورتي که شمارش به انتها رسيده بود نيز شمارش با 0 کردن بيت سوم CWR متوقف شده و شمارنده غير فعال مي‌شود.

شکل 7 در ادامه شکل 6 مربوط به دياگرام جرياني عملکرد شمارنده برنامه پذير در مد 01 مي‌باشد.



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 7: دياگرام جرياني مد 01

دياگرام جرياني مد 01 از محل اتصال Mode1 در شکل 6 آغاز مي‌گردد٬ ابتدا دو بيت ابتدايي شمارنده با مقدار 01 مقايسه مي‌شوند تا مشخص شود که شمارنده در مد کاري 01 قرار دارد يا نه ٬ در صورتي که شمارنده در اين مد نيز نبود٬ مد 10 فراخواني خواهد شد.
سپس مقدار flag_counter که علامت پرچم بارگزاري counter به شمار مي‌رود بررسي مي‌شود و در صورتي که counter بارگزاري نشده بود يا نياز به بارگزاري مجدد داشت٬ اين کار صورت گرفته و دياگرام مجددا به حالت شروع مي‌رود.
پس از حصول اطمينان از بارگزاري counter٬ شمارنده وارد مرحله شمارش شده و ابتدا مقدار counter با FF مقايسه مي‌شود تا رسيدن به پايان عمليات شمارش بررسي شود٬ در صورت رسيدن به پايان عمليات شمارش ٬ مقدار flag_counter صفر مي‌شود تا در مرحله بعدي counter مجددا بارگزاري شود و عمليات شمارش دوباره از سر گرفته شود.
شکل 8 در ادامه شکل 7 مربوط به دياگرام جرياني عملکرد شمارنده در مد 10 مي‌باشد.



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل 8: دياگرام جرياني مد 10

از محل اتصال mode2 در شکل 8 روال کاري دياگرام جرياني مد 10 آغاز مي‌شود٬ در ابتدا جهت حصول اطمينان از فعال بودن شمارنده در مد 10 ٬ دو بيت ابتدايي CWR با مقدار 10 مقايسه مي‌شود و درصورتي که مقدار آن برابر 10 نبود٬ مجددا به حالت شروع مي‌رود. در ادامه مقدار flag_counter که علامت پرچم بارگزاري counter به شمار مي‌رود بررسي مي‌شود و در صورتي که counter بارگزاري نشده بود يا نياز به بارگزاري مجدد داشت٬ اين کار صورت گرفته و دياگرام مجددا به حالت شروع مي‌رود.
پس از حصول اطمينان از بارگزاري counter٬ مقدار آن با نصف مقدار اوليه خود مقايسه مي‌شود٬ اين عمليات تقسيم بر 2 با يک شيفت به راست ساده latch_counter به کمک عملگر concatenate زبان Verilog صورت گرفته است. در صورتي که مقدار counter با نصف مقدار اوليه خود برابر نبود اينقدر شمارش کاهشي را ادامه مي‌دهد تا به آن برسد و زماني که مقدار counter با نصف مقدار اوليه خود برابر شود ٬ پرچم flag_half_counter‌ فعال خواهد شد.
شکل‌هاي 6 ٬ 7 و 8 ٬ علمکرد داخلي شمارنده برنامه‌پذير را در سه مدکاري آن به صورت الگوريتميک بيان مي‌کنند٬ با اين حال براي توليد سيگنال‌ خروجي نياز به يک decoder داريم که با توجه به حالت‌هاي فعلي مدار ترتيبي٬ خروجي مطلوب را ايجاد کند. شکل 9 دياگرام اين مدار ترکيبي را نشان مي‌دهد:



[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

شکل 9 : مدار ترکيبي توليد کننده سيگنال‌خروجي


با توجه به شکل 9 سيگنال خروجي data_out زماني برابر 1 خواهد شد که در :
مد 00 : زماني که flag_counter برابر 1 باشد و مقدار CWR برابر 100 بوده و counter به FF رسيده باشد.
مد 01 : زماني که CWR برابر 101 بوده و مقدار counter به FF رسيده باشد.
مد 10 : زماني که CWR برابر 110 بوده و مقدار flag_half_counter برابر 1 باشد.
توجه داشته باشيد که توليد سيگنال خروجي بر اساس محتواي بيت پرچم flag_counter که بيانگر بارگزاري شدن counter از latch_counter مي‌باشد تنها در مد 00 صورت گرفته است٬ به اين خاطر که در اين مد ( One-Shot) خروجي تنها يک پالس بايد 1 شود و flag_counter نيز پس از رسيدن counter به مقدار FF تنها يک پالس ساعت 1 مي‌ماند.

گام چهارم و پنجم :

گام چهارم: کد نويسي و توصيف سخت‌افزار

پس از ترسيم نمودار‌هاي جرياني و حالت مدار ديجيتال٬ نوشتن کدهاي توصيف کننده آن به کمک يک زبان توصيف سخت‌افزاري مانند Verilog يا يک زبان توصيف سيستمي مانند SystemC کار بسيار ساده‌اي خواهد بود٬ با وجود نمودارهاي حالت حتي مي‌توان فرايند کدنويسي را به برنامه‌هايي که براي اين کار توسعه يافته اند مانند stateCAD سپرد.

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

نسخه اوليه کد توصيف سخت‌افزاري مدار را مي‌توانيد در اينجا ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) مشاهده نماييد.


گام پنجم : شبيه سازي و ارزيابي عملکرد مدار

پس از توصيف مدار به وسيله يک زبان توصيف سخت‌افزاري يا توصيف سيتمي٬ جهت ارزيابي عملکرد مدار بايد آنرا شبيه سازي کرد٬ به اين وسيله مي‌توان تشخيص داد کدهاي توصيف کننده٬ دقيقا همان سخت‌افزاري را توصيف مي‌کنند که در گام اول مشخصات آن را تعيين کرديم.
براي اين کار روش‌هاي متعددي وجود دارد که با توجه به پيچيدگي سخت‌افزار روش‌هايي به خدمت گرفته مي‌شود که به صورت ساده تر با جزئيات کمتر٬ مدار را ارزيابي کند.
در مثال طراحي شمارنده برنامه‌پذير٬ به کمک نرم‌افزار شبيه ساز ModelSim 5.7 SE کد‌ Verilog توصيف کننده مدار را شبيه سازي کرديم٬ براي اين کار علاوه بر کد verilog شمارنده٬ نياز به يک ماژول محرک يا Testbench نيز داريم که بردار ورودي‌ها و کلاک شمارنده را توليد نمايد٬ به همين خاطر براي هر مدکاري شمارنده برنامه‌پذير ٬ يک ماژول Testbench نوشته شده است که به واسطه هر يک از اين ماژول‌هاي محرک مي‌توان عملکرد صحيح مدار را مورد ارزيابي قرار داد.
تمامي اين فايل‌ها را مي‌توانيد از اين صفجه ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) دانلود کرده و آنها را با فرايند شبيه‌سازي همراه نماييد.
در تصوير زير مي‌توانيد نمونه شکل موج‌هاي صحيحي که به کمک ماژول محرک mode 1 توليد شده است مشاهده کنيد.



[][ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][/
براي بزرگ‌شدن تصوير روي آن کليک کنيد


همانطور که در اين تصوير مشاهده مي‌کنيد٬ ابتدا latch_counter و CWR مقدار گرفته و شمارش counter تا زماني که به مقدار FF برسد ادامه پيدا مي‌کند٬ سپس data_out به اندازه يک پالس 1 شده و مجددا عمليات شمارش از مقدار ذخيره شده در latch_counter دنبال مي‌شود

گام آخر:

گام ششم: سنتز مدار

پس از حصول اطمينان از عملکرد صحيح مدار در فرايند شبيه‌سازي٬ نوبت به سنتز مدار و تبديل توصيف‌هاي سخت‌افزاري به معادل‌هاي منطقي/ الکترونيکي خود مي‌رسد. در اين مرحله نيز ابزار هاي متعددي وجود دارند که با توجه به تکنولوژي‌ که در نهايت مدار ديجيتال بايد بر روي آن پياده سازي شود٬ کد RTL توصيف کننده سخت‌افزار را به مدارهاي منطقي معادل تبديل مي‌کنند.

در مثال طراحي شمارنده برنامه پذير پس از شبيه سازي با نرم‌افزار Modelsim از ابزار سنتز Leonardo Spectrum بهره برده شده است٬ اين برنامه به صورت کاملا خودکار کدهاي توصيف کننده سخت‌افزار را بررسي کرده و مدار منطقي ديجيتالي معادل آن را توليد مي‌کند٬ در صورتي که کد‌هاي توصيف سخت‌افزاري قابل سنتز نبوده يا در نوشتن‌ آنها فاکتورهاي قابل سنتز بودن مدار در نظر گرفته نشده باشد ٬ اين برنامه خطاهاي متعددي جهت اصلاح کد گزارش مي‌کند.

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

نکته کليدي که کد اوليه شمارنده برنامه‌پذير را نيز در ابزار سنتز با خطا مواجه کرده بود٬ انتصاب دو درايور به ثبات CWR مي‌باشد که اين دو انتصاب هر يک در يک بلاک always از ديد طراح پنهان مانده و به صورت همزمان دو مقدار متفاوت را به CWR وارد مي‌کنند.

لذا با به کار گيري يک سيگنال داخلي به نام Disable_CWR اين هم پوشاني اين دو سيگنال در نسخه دوم کد توصيف کننده شمارنده برنامه پذير مرتفع گرديد.

علارقم اينکه نسخه دوم کد نگاشته شده به درستي توسط ابزار سنتز٬ سنتز شده و مدار منطقي معادل حاصل مي‌شود اما براي اينکه مدار منطقي معادل از نظر ظاهري با آنچه که در معماري تعريف کرديم مطابقت داشته باشد٬ اجزاي تشکيل دهنده آن را در نسخه سوم ٬ تفکيک کرديم٬ پس از سنتز نسخه سوم کد ٬ مدار منطقي حاصل در شکل 10 نشان داده شده است:


][ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][/URL]
شکل 10: نماي کلي شمارنده برنامه‌پذير پس از سنتز


همانطور که در شکل 10 مشاهده مي‌کنيد٬ شمارنده برنامه‌پذير پس از سنتز به سه مدار CWR و Counter و Decoder شکسته شده است که در شکل 10 ساختار ارتباطي آنها نشان داده شده٬ در شکل 11 مدار منطقي تشکيل دهنده CWR را مشاهده مي‌کنيد :


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][/URL]
شکل 11: مدار منطقي تشکيل دهنده CWR


همانطور که در شکل 11 مشاهده مي‌کنيد ابزار سنتز سه فليپ‌فلاپ براي ثبات CWR و هشت فليپ‌فلاپ براي ثبات latch_counter در نظر گرفته است. در شکل 12 اجزاي تشکيل دهنده مدار counter را مشاهده مي‌کنيد:


[[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][/URL]
شکل 12: مدار منطقي تشکيل دهنده Counter



در شکل 12 نيز ابزار سنتز 8 فليپ‌فلاپ براي ثبات‌ counter و سه فليپ‌فلاپ براي ثبات‌هاي پرچم flag_counter و flag_half_counter و disable_CWR در نظر گرفته است. در شکل 13 آخرين بخش شمارنده برنامه پذير٬ decoder را مشاهده مي‌کنيد:


[[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][/URL]
شکل 13: مدار منطقي تشکيل دهنده Decoder


در اين شکل نيز ابزار سنتز با در نظر گرفتن يک مقايسه کننده٬ decoder توصيف شده در کد verilog را به درستي به مدار منطقي معادل خود سنتز کرده است.



منبع :سخت افزار

nima_fad
22-10-2007, 11:22
سلام

از توضیحاتتون ممنون . اما میشه بگید از کجا میشه این نرم افزار ها رو گیر آورد ؟ من یه سری Cd نرم افزارهای مهندسی الکترونیک رو خریدم . توی اون Modelsim 2005 بود و Leonardo98 . متاسفانه Leonardo اصلا" کار نکرد ! و هر چقدر هم گشتم چیزی جز اون پیدا نکردم . ممنون میشم اگه راهنمایی کنید.