رفتن به مطلب

اموزش مقدماتی fpga


ارسال های توصیه شده

چگونه و از کجا کار با FPGA را شروع کنیم؟

:ws38:

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

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

ماهیت و ساختار FPGA چیست؟

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

در سالهای بعد که کاربردهای پیچیده تری را طراحی میکردید به سراغ یکی از انواع میکروکنترلرها مثل 8051، AVR یا PLC میرفتید و روتین فانکشنهای متنوع تری را به کمکشان پیاده سازی میکردید.

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

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

اما آیا واقعا هیچ راه سریعی برای پیاده سازی یک سیستم دیجیتالی پیچیده و بزرگ به صورت سخت افزاری نیست؟؟

خوشبختانه این امکان وجود دارد و راه آن استفاده از FPGA ها است.

*******ادامه دارد...******:banel_smiley_4:

Untitled.jpg

لینک به دیدگاه

FPGAچیست؟یک تراشه (chip) یا مدار مجتمعفشرده (IC)است. در ظاهر، مشابه بسیاری از آی سی های دیگر است.شکل زیر یک FPGAاست.همانند آی سی های دیگر، پایه های FPGA برای آی سی های کوچکتر در کنار وبرای آی سی های بزرگتر معمولا به صورت ماتریسی و در زیر آی سی قرار دارد.اما تفاوتFPGA

باآی سی های دیگر نه در ظاهر که در درون آن است.

t76lbtbz3p9tt8cotsn6.jpg

 

 

برای درک مفهوم FPGA میتوان از شکلزیر کمک گرفت.gufljhpaui19a0p6y2so.jpg

در این شکل، چندین سیر دیجیتالی شامل گیتهایمختلف وجود دارد. مدار شامل سه ورودی A,B و C و خروجی Fاست.همچنین، سوییچهایی وجود دارندکه میتوانند مسیر سیگنال را عوض کنند.اگر وضعیتسویچها مشابه آنچه در شکل فوق نمایش داده شده است باشد، تابع خروجی Fبرابر خواهد بود با:F=(A xor B) or (A and C)اجازه دهید یکبار آنچه را گفتیم مرور کنیم:مجموعه ای از سخت افزارهای دیجیتالی مثل گیت هایپایه به همراه تعدادی سوییچ که وضعیتشان قابل تغییر است به صورت ثابت در اختیارماست. ما میتوانیم تنها با تغییر وضعیت این سوییچها، توابع مختلفی را در خروجی اینسیستم ایجاد کنیم. به عبارت دیگر، با تغییر وضعیت این سوییچها، مدارات مختلفدیجیتالی را به صورت سخت افزاری طراحی می کنیم.با اطلاعاتی که تا کنون بدست آوردیم میتوان FPGA[font= ]ها را اینگونه تعریفکرد:

FPGAها مدارات مجتمعی هستند شامل دریایی از منابع دیجیتالی مثلگیتهای منطقی و همچنین سوییچهایی برای ایجاد مسیرهای مختلف که به کمک آنها میتوانانواع مدارت دیجیتالی را پیاده سازی کرد.

حال اجازه دهید کمی دقیقتر و نزدیکتر به واقع بهبررسی ماهیت FPGAبپردازیم. از درس مدارات منطقی، احتمالا به یاد دارید که هر تابع منطقی به کمک یکحافظه پیاده سازی نمود. اگر هم این موضوع را فراموش کرده اید ایرادی ندارد، چون درادامه یک مثال آن را یادآوری میکنم.فرض کنید تابع سه متغیره منطقی زیر را میخواهیمبه کمک یک حافظه پیاده سازی کنیم.? = ?? + ??̅ ?̅ +? ̅ ?[font= ]این یک تابع دارای سه ورودی [/font]A,B و C است.بنابراین 2^3=8 حالت برای ورودی آن میتوان ایجاد کرد هر یکاز این هشت حالت وروردی منجر به مقدار صفر یا یک در خروجی می شود.جدول درستی زیر،خروجی تابع F به ازای تمامحالات ورودی را نشان می دهد.مثلا اگرA=1,B=0 و C=1 باشد، خروجی برابر خواهد بود با F=1. این حالت، در جدول یا پس زمینه خاکسترینشان داده شده است.

sycqw15b9pbqyqfgesqn.jpg

 

******ادامه دارد*******:banel_smiley_4::banel_smiley_4:

[/font]

لینک به دیدگاه

برای پیاده سازی تابع تاپیک قبل (اموزش مقدماتی FPGA 2 ) به صورت یک سخت افزار می توان به دو روش عمل کرد:

 

 

  1. به کمک گیتهای منطقی آن را پیاده سازی نمود.

شکل زیر تابع ذکر شده را به کمک گیتهای پایه نشان می دهد.

rz27tmb94lxg2ur0xv0e.png

 

 

 

2. به کمک یک حافظه ان را پیاده سازی کرد.

 

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

برای پیاده سازی تابع مطرح شده در این مثال کافی است خطوط آدرس حافظه را به ورودی های A,BوC تابع وصل کنیم و از خروجی دیتای آن به عنوان خروجی F استفاده کنیم. در این حالت، باید مقدار تابع F به ازای ورودی های مختلف را از جدول درستی تابع، درون حافظه قرار داد که در شکل زیر نشان داده شده است.

vh25dborx0trtxtc9sg.png

 

~حال هر ترکیبی از ورودی های A,BوC که به مدار اعمال شود، خروجی مشابه خروجی محاسبه شده در جدول درستی را ایجاد خواهد کرد. این پیاده سازی با پیاده سازی با گیت های منطقی نشان داده شه در شکل فوق معادل است.مشابه مثال جدول درستی، اگر A=1,B=0و C=1 باشد، ششمین خانه حافظه انتخاب خواهد شد و خروجی تابع پیاده سازی شده برابر خواهد بود با F=1 این حالت، در شکل فوق با پس زمینه خاکستری نشان داده شده است.

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

به این حافظه های کوچک که برای پیاده سازی یک تابع کوچک استفاده میشوند اصطلاحا look-up table یا LUT گفته میشود. مدار سخت افزاری برای تحقق این LUTها در FPGA، در عمل به شکل زیر است.همان طور که در شکل زیر نشان داده شده است، با تغییر مقادیر A,Bو C به عنوان ورودی های تابع ( خطوط آدرس حافظه)، یکی از خانه های حافظه از طریق مالتی پلکسرهای 1*2 انتخاب شده و به خروجی منتقل میشود. خط چین قرمز، نحوه انتخاب خروجی را برای ورودی A=1,B=0 و C=1 که در مثالهای قبلی به رنگ خاکستری مشخص شده بود نشان میدهد.

 

m0nu1kjauj4d8e3gw.png

 

 

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

***** ادامه دارد *****:banel_smiley_4::banel_smiley_4:

لینک به دیدگاه

برای پیاده سازی مدارات بزرگتر چه باید کرد؟

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

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

از آنجا که ابتدا معلوم نیست که سیمها چگونهباید به هم متصل شوند و بسته به مداری که می خواهید طراحی کنید، سیم یندی هایمتفاوت نیاز است، باید سیمهای زیادی بین LUTها وجود داشته باشد و همچنین، امکان اتصال آنهابه یکدیگر یا به LUTها توسط سویئچهایی فراهم شود. به فرایند تعیین مسیر و متصلکردن سیمها در اصطلاح routingگفته میشود.

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

ها عبور کرده است.

7nrmwab3o2qkgr72ifkn.png

 

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

!!آی سی فرضی مثال فوق همان FPGA است!!

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

****************************************************************************************************************************************************************************************

مطمئنا در این لحظه سوالات بسیاری در ذهنتان شکل گرفته است:یک مدار دیجیتالی را چگونه به توابع کوچک تجزیه کنیم؟؟؟ مدار تجزیه شده را چگونهدرون تراشه FPGA قراردهیم؟ در یکی از بخشهای همین نوشته، به این سوالات پاسخ خواهم داد. —{--@

********************************************************************************************************************************************************************************************

 

 

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

 

 

را نشان میدهد.

 

073pz50nnzce26d4frrc.png

 

منابع دیجیتالی در FPGA عبارتند از:

jmozuwbee2ij13pm37x.png

 

 

****** ادامه دارد *****:banel_smiley_4::banel_smiley_4:

لینک به دیدگاه

Logic Blockها: یا Cell blockها (LC) که جزء اصلی تشکیل دهنده FPGAها هستند و به تعداد زیاد در هر FPGA موجود هستند،در حقیقت همان LUTها هستند. معماری LCها در هر FPGA ممکن است کمی متفاوت باشد، اما معمولا به شکل زیر است:

همانطور که در شکل دیده می شود، یک LCشامل یک LUT،فلیپ فلاپ و مالتی پلکسر است. حضور فلیپ فلاپ و کلاک متصل به آن، قابلیت طراحی مدارات ترتیبی سنکرون را به FPGAمیدهد.

Routing Matrix:شامل سیم و اتصالات قابل برنامه ریزی آنها است و همانطور که گفته شد، می تواند به هر نحوی به یکدیگر یا به LCها متصل شوند.

درون FPGA و پشت هر پین یا پایه FPGAمداری قرار دارد که I/O Blockنامیده می شود. این مدار، خود نیز قابل برنامه ریزی است.میتوان به کمک آن از پایه های FPGA به صورت ورودی، خروجی و یا به صورت دوطرفه استفاده کرد.

همچنین میتوان با توجه به اینکه پایه ها به چه قطعه جانبی وصل شده اند، استاندارد I/O خاصی را برای هر پایه تنظیم کرد.مثلا مقدار جرین دهی پایه های خروجی را تعیین کرد، یا سطح ولتاژ I/O رامتناسب با قطعه متصل شده به آن تغییر داد.

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

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

ضرب کنندهها: چون عمل ضرب در بسیاری از پیاده سازی ها موردنیاز است، در هر FPGAتعدادی ضرب کننده به صورت سخت افزاری ساخته می شود. گرچه می توان عمل ضرب را به کمک LCها و LUTهای داخل آنها نیز پیاده سازی کرد، ولی استفاده از ضربکننده های سخت افزاری موجود در FPGAها باعث می شود منابع LC به سرعت اشغال نشده و برای کاربردهای دیگری به کار روند. از طرف دیگر، ضرب کننده های سخت افزاری از سرعت بیشتری هم نسبت به ضرب کننده های پیاده سازی شده توسط LUTها برخوردارند.

Clock Blockها: در طراحی سیستمهای دیجیتال ترتیبی سنکرون، کلاک نقش مهمی دارد. در یک سیستم سنکرون، تمام تغییرات و فعالیتها همزمان با کلاک انجام می شوند. از طرف دیگر، FPGAشامل مدار بسیار بزرگی است و کلاک سیستم برای رسیدن به تمام بخشهای FPGAباید از مسیرهای طولانی و مختلفی عبور کند. هر کدام از این مسیرها تاثیری دارند که بی توجهی به آنها مشکلات جدی در مدار سنکرون پیاده سازی شده ایجاد می کنند.

منابع کلاک موجود در FPGAها و تمهیداتی که برای مسیر کلاک در FPGAاندیشیده شده است باعث می شوند کلاک به همه سیستم به صورت دقیق و همزمان ارسالشود.

از جمله قابلیت های دیگری که منابع کلاک FPGA فراهم می کنند، امکان ساخت فرکانسهایی متفاوت از کلاک اصلی سیستم است. مثلا فرض کنید روی بردی که FPGAقرار دارد، یک اسیلاتور با فرکانس 50 مگاهرتز برای تولید کلاک سیستم قرار دارد.این درحالی است که پیاده ساز نیاز به کلاک 128 مگاهرتز دارد. در FPGAمیتوان به کمک یکی از منابع کلاک به نام DCM، فرکانس مورد نیاز را به کمک فرکانس 50 مگاهرتز تولید کرد. به عبارت دیگر، کلاک 50 مگاهرتز به عنوان ورودی ومرجع DCMاستفاده میشود و فرکانس 128 مگاهرتز یا هر فرکانس دیگر در خروجی DCMتولید شده و به عنوان کلاک سیستم به کار می رود.

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

****** ادامه دارد ******:banel_smiley_4::banel_smiley_4:

لینک به دیدگاه

برنامه نویسی یا طراحی سخت افزار؟! :ws52::ws52:

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

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

اما برای FPGA این موضوع به چه صورت است؟؟؟؟؟؟؟؟

همانطور که قبلا اشاره کرده ام، FPGAها تراشه هایی هستند که در آنها دریایی از منابع سخت افزاری دیجیتالی مثل LUTها، ضرب کننده ها و حافظه ها وجود دارند.

این منابع دیجیتالی، در ابتدا هیچ قابلیتی ندارند و تفسیر کننده هیچ سخت افزاری نیستند. بنابراین، نه تنها در FPGA واحدی مثل CPU وجود ندارد، بلکه اساسا در ابتدای کار، هیچ سخت افزار دارای عملکرد مشخصی هم وجود ندارد. در نتیجه، برای FPGAها نمیتوان برنامه نویسی کرد.

حال فرض کنید شما نیاز دارید محتوای دو رجیستر A و B را با هم جمع کنید. در میکروکنترلرها، این دو مقدار در رجیسترهای از پیش تعیین شده CPU قرار داده می شوند و توسط دستور ADD که در برنامه نرم افزاری قرار میگیرد با هم جمع میشوند.

در FPGAها اما اصولا سخت افزاری برای عمل جمع در ابتدا وجود ندارد. حتی رجیستری هم برای ذخیره سازی مقدار A و B وجود ندارد. بنابراین، کاربر باید از ابتدا دو رجیستر و یک سخت افزار جمع کننده را در FPGA به کمک منابع دیجیتالی در دسترس مثل LUTها طراحی کند تا قادر باشد عمل جمع را در FPGA انجام دهد. بنابراین در استفاده از FPGA شما در حال طراحی و پیاده سازی "سخت افزار" هستید و نه "برنامه نویسی" و طراحی "نرم افزار".

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

.......... تفاوت FPGAها با پردازنده هایی مانند AVR، ARM و DSP چیست؟؟؟

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

nonbmfdmkrbxvvk0sxe.png

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

........ چرا سرعت پردازش در FPGAها اینقدر زیاد است؟!!

********** ادامه دارد ***********:banel_smiley_4::banel_smiley_4:

 

 

لینک به دیدگاه

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

 

  1. در FPGAها می توان تعداد نامحدودی عملیات منطقی را به صورت موازی وهمزمان انجام داد.


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

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

شکل زیر، نحوه اجرای دستورات در یک پردازنده رانشان می دهد. همانطور که در شکل دیدید، در پردازنده، یک CPU وجود دارد که می تواند در هر لحظه، یک دستور را روی دیتا اجرا کند. بنابراین، ابتدا دستور C1 روی دیتای D1 وسپس دستور C2 روی دیتای D2

انجام می شود.

vmjobcolg9r0qbds0.png

 

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

اما چطور؟

شکل زیر، پیاده سازی معادل پردازنده فوق را در FPGAنشان می دهد. در FPGA میتوان برای انجام دستور C1 یکسخت افزار و برای انجام دستور C2 سخت افزار دیگری را به طور مجزاطراحی و پیاده سازی کرد. سپس دیتای D1 و D2 را به طورهمزمان به دو سخت افزار اعمال کرد. واضح است که این موازی سازی می تواند به طرزچشمگیری سرعت انجام روتینها و الگوریتم ها را در FPGA افزایش دهد.rdxqsy8fxsebtt17uw11.png

 

 

  1. 2. چون FPGAها مثل پردازنده ها دارای یک معماری ثابت نیستند، می توان آنها را برای هر کاربرد به صورت بهینه طراحی کرد.


دلیل دومی که باعث اقزایش سرعت انجام الگوریتمها در FPGAها می شود نیز به قابلیت FPGAها در طراحی اختصاصی الگوریتم ها و روتین هامربوط می شود. با یک پردازنده سروکار دارید، برای پیاده سازی هر الگوریتمی، تنهاابزاری که در اختیار دارید یک CPU و دستورات از پیش تعریف شده آناست. شما مجبور هستید به کمک آن دستورات، الگوریتم خود را بازنویسی و پیاده سازی کنید.اما در مورد FPGAها، چون هر سخت افزاری را از ابتدا طراحی میکنید، بنابراین می توانید آن را برای کاربرد خاص مورد نظرتان به بهترین نحوه ممکن طراحی کنید تا آن الگوریتم را به صورت بهینه از نظر سرعت انجام دهد. فکر میکنم با مطالبی که تا اینجا بیان شد، دیدخوبی نسبت به ماهیت و ساختار FPGAها و همچنین قابلیتها و برتری های آن نسبت به پردازنده هابه دست آورید. اما هنوز چند سوال است که باید به آنها داده شود!!وقتی با یک پردازنده کار میکنیم، یه کمک "دستورات برنامه نویسی" می توانیم یک روتین یا الگوریتم را در آن پیاده سازی کنیم. به عبارت دیگر، "زبان برنامه نویسی" در اینجا ابزاری است که به کمک آن،ایده ای را که در ذهن داریم توسط پردازنده پیاده سازی می کنیم.این روند در مورد FPGAها چگونه است؟ ایده، طرح و مدار دیجیتالی را که در ذهن یا روی کاغذ طراحی کرده ایم، چگونه و به کمک چه ابزاری می توان به FPGAمعرفی و در آن پیاده سازی کرد؟؟؟

 

******* ادامه دارد *******:banel_smiley_4::banel_smiley_4:

 

 

لینک به دیدگاه

چگونه یک مدار دیجیتال را برای FPGA توصیف کنیم؟

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

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

مثلا فرض کنید که به نحوی توانستید این مدار بزرگ را رسم کنید. حال اگر خطایی در آن وجود داشته باشد، روشن است که یافتن آن چقدر می تواند دشوار یا حتی غیر ممکن باشد!!!!!!! بنابراین، شاید بتوان گفت که استفاده از ترسیم مدار برای توصیف و معرفی آن به FPGA، فقط برای مدارات کوچک عملی خواهد بود.

در نتیجه نیاز به ابزاری دیگر برای معرفی مدارات بزرگ و پیچیده به FPGA وجود دارد......

زبان توصیف سخت افزاری

روش دوم برای نوصیف یک مدار دیجیتال و معرفی آن به FPGA، استفاده از یک یبان توصیف سخت افزاری یا Hardware Description Language (HDL) است. یک زبان توصیف سخت افزاری، به کمک ساختارها و عباراتی که در آن وجود دارد، می تواند رفتار مدارات دیجیتال را توصیف کند.

توجه کنید که برعکس زبانهای برنامه نویسی، یک زبان توصیف سخت افزاری از مجموعه ای از دستورات تشکیل نشده است. چون دستورات، مربوط به CPU هستند؛ در حالی که در مورد FPGA نه تنها CPU بلکه هیچ نوع سخت افزار از پیش آماده شده ای وجود ندارد. بنابراین، زبان توصیف سخت افزاری شامل دستورات نمی شود.

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

بدون اینکه بخواهم وارد جزئیات شوم و تنها برای اینکه یک دید اولیه در مورد ماهیت زبانهای توصیف سخت افزاری بدهم، کد HDL زیر را در نظر بگیرید:

 

jh6ntv6x8kgxw1es0eq8.png

 

~این کد در ظاهر، شبیه یک برنامه نرم افزاری است که از ساختار شرطی if استفاده کرده است. در صورتیکه مقدار C=0 باشد، محتوای A به F منتقل می شود و در غیر اینصورت ( یعنی وقتیکه C=1) مقدار B به F منتقل می شود. این توصیف در مدارات شما را به یاد بلوک معروفی نمی اندازد؟؟؟؟؟

درست حدس زدید!! مالتی پلکسر 1*2 ...

 

9mi0jgp3riy7d4npatkr.png

 

~بنابراین در این کد، شرط if یک دستور تعریف شده برای CPU نیست و عبارات نوشته شده، یک برنامه نرم افزاری نیست. بلکه این عبارات، یک توصیف سخت افزاری است.

زبانهای توصیف سخت افزاری مختلفی برای کار با FPGAها وجود دارند؛ ولی دو تا از آنها از همه معروفتر و پرکاربردتر است: VHDL(Very high speed integrated circuit Hardware Description Language) و Verilog. علی رقم تفاوتهایی که این دو زبان در ساختار و ظاهرشان دارند، هر نوع مدار دیجیتال را به کمک هر کدام می توان طراحی کرد.

روند طراحی یک مدار دیجیتال با FPGA

همانطور که در بخشی از این مقاله به آن اشاره کردم، مراحل مختلف طراحی دیجیتال با FPGA به کمک نرم افزارهایی انجام می شود. به کمک این نرم افزارها می توان اعمال زیر را انجام داده:

 

1hxgnnp5h0p033vhsdh.png

 

ورود طرح: به یکی از زبانهای VHDL یا Verilog می تواند در هر ادیتور فایل متنی انجام شود.

منظور از سنتز یعنی پیاده سازی مدار توصیف شده به کمک یک زبان HDL به وسیله منابع دیجیتالی موجود در FPGA. نرم افزاری که عمل سنتز را انجام میدهد، کد توصیف کننده سخت افزاری را که توسط طراح به زبان VHDL یا Verilog نوشته شده است، به کمک منابع دیجیتالی FPGA مثل LUTها، ضرب کننده ها و حافظه ها پیاده سازی می کند.

در مرحله جانمایی (placement) مشخص می شود که محل قرار گرفتن منابعی که در مرحله سنتز استفاده شده اند، دقیقا کجای FPGA است. مثلا فرض کنید بعد از سنتز یک کد VHDL، 20 عدد LUT از مجموع 4000 عدد LUTی موجود در یک FPGA به کار گرفته شده است. در مرحله جانمایی مشخص می شود که کدام 20 عدد از این 4000 عدد LUT در پیاده سازی استفاده خواهند شد.

بعد از مشخص شدن محل فیزیکی هر کدام ازمنابع دیجیتالی به کار رفته در طرح، باید سیم بندی بین منابع انجام شود تا به نحو مناسب به هم متصل شود. این کار در مرحله مسیریابی (routing) توسط نرم افزار انجام میشود.

بعد از انجام مراحل سنتز، جانمایی و مسیریابی، باید نتایج حاصل از این سه مرحله به FPGA منتقل شود. برای این منظور، یک فایل بیتی با پسوند .bit ایجاد می شود که به کمک آن FPGAرا پیکره بندی (configuration) می کنند.اما محتوای این فایل بیتی، وقتی به FPGA منتقل می شود چه تغییری در آن ایجاد می کند؟

محتوای این فایل، تعیین کننده محتوای LUTهای بکار رفته در طرح و همچنین تعیین کننده مسیرهای مورد استفاده در آن است، به نحوی که بعد از پیکره بندی، FPGA تبدیل به مدار دیجیتالی توصیف شده توسط طراح می شود.

 

******* ادامه دارد ******:banel_smiley_4::banel_smiley_4:

 

لینک به دیدگاه

خلاصه روند طراحی دیجیتال با FPGA

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

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

....... وظیفه طراح چیست؟

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

1. نوشتن کد توصیف سخت افزاری مناسب به یکی از زبانهای HDL.

 

2. بررسی نتایج حاصل از مراحل سنتز، جانمایی و مسیریابی و اتخاذ تصمیمات مناسب.

ممکن است در این مرحله بعضی از نتایج بدست آمده با نیازهای شما همخوانی نداشته باشند. مثلا منابع سخت افزاری استفاده شده در مرحله سنتز بیش از تعداد موجود در FPGA مورد نظرتان باشد. یا حداکثر فرکانس کلاک قابل اعمال به مدار، کمتر از مقدار مورد نیازتان باشد. این موارد در قالب گزارشهایی توسط نرم افزار به شما ارائه می شود.در این صورت، باید نسبت به انجام تغییرات مناسب در طرح اقدام کنید.

3. انجام انواع شبیه سازی برای اطمینان از صحت عملکرد مدار.

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

4. تست نهایی طرح بعد از پیکره بندی FPGA.

بعد از اینکه FPGA را پیکره بندی کردید(فایل بیتی را در آن پروگرام کردید)، باید آن را به طور عملی تست کنید. برای این منظور هم امکانات نرم افزاری و سخت افزاری وجود دارد که می توانید به کمک آنها مدارتان را در حین اجرا روی FPGA تست کنید.

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

برای شروع، چه مهارت ها و ابزارهایی لازم است؟

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

ابتدایی ترین ابزار شما برای پیاده سازی، زبان HDL است.بنابراین، آشنایی با یکی از زبانهای توصیف سخت افزاری مثل VHDL یا Verilog ضروری است.

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

دو شرکت معروف در زمینه FPGA، شرکت Xilinx و شرکت Altera هستند. در ایران هم بیشتر شرکتها، از محصولات این دو شرکت بزرگ استفاده می کنند. طبق آمارهای گرفته شده که در اینترنت قابل دسترسی است، شرکت Xilinx بیشترین مشتری و گستردگی را در بازار دارد. بنابراین، پیشنهاد من برای شروع، استفاده کنید.

نرم افزار اصلی شرکت Xilinx برای سالیان طولانی، نرم افزار ISE بوده است. گرچه تولید نسخه های جدیدتر این نرم افزار از اواخر سال 2013 به بعد متوقف شده است، ولی هنوز هم در اکثر شرکتها از این نرم افزار استفاده می شود. نرم افزار جدید این شرکت Vivado نام دارد.

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

با تسلط بر یک زبان HDL و استفاده از نرم افزار ISE می توانید انواع مدارات دیجیتال را طراحی و شبیه سازی کنید. اما برای تست عملی مدارتان نیاز به یک برد مبتنی بر یکی از FPGAهای شرکت Xilinx هم دارید. این بردها را به راحتی می توانید از بازار داخلی و از قیمت حدودا 300 هزار تومان به بالا تهیه کنید.

با این مجموعه از امکانات می توانید درمنزل و بدون نیاز به تجهیزات گران قیمت آزمایشگاهی، اقدام به طراحی مدارات دیجیتال کنید.

******** ادامه دارد******* :banel_smiley_4::banel_smiley_4:

 

لینک به دیدگاه

کجا از FPGA استفاده کنیم؟

 

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

t2ww7yj03azujxq0er.png

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

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

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

دو سوال اساسی برای انتخاب تکنولوژی مناسب پیاده سازی

سوال اول: برای پیاده سازی الگوریتم مورد نظر، چه مقدار حجم محاسباتی وجود دارد؟

سوال دوم: برای انجام حجم محاسباتی که در سوال اول به دست آمد، چه مقدار زمان وجود دارد؟

اجازه دهید برای روشن تر شدن موضوع، یک مثال ساده را بررسی کنیم. فرض کنید می خواهیم به کمک یک دوربین از یک ناحیه فیلم برداری کنیم و در صورتی که جسم متحرکی در محدوده دید دوربین قرار گرفت، یک آژیر هشدار در کمتر از 10میلی ثانیه به صدا دربیاید.

روش کار به این صورت است که اطلاعات تصویری که به کمک دوربین بدست می اید به یک الگوریتم دیجیتال وارد شده و توسط آن، حرکت در تصویر تشخیص داده می شود. از لحظه ای که جسم متحرک وارد محدوده دید دوربین می شود، 10میلی ثانیه فرصت برای فعال کردن آژیر هشدار وجود دارد. از شما خواسته شه است تا تکنولوژی مناسبی برای پیاده سازی این الگوریتم انتخاب کنید. بنابراین باید به دو سوال اساسی در مورد این مثال پاسخ دهیم.

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

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

دوم: برای انجام حجم محاسباتی فوق، چه مقدار زمان در اختیار داریم؟

با توجه به صورت مساله، در صورتی که جسم متحرک در محدوده دید دوربین قرار بگیرد، 10میلی ثانیه برای فعال کردن آژیر هشدار زمان وجو دارد. اگر فرض کنیم الگوریتم مورد استفاده برای تشخیص حرکت، 10میلی ثانیه زمان لازم داشته باشد تا یکبار اجرا شود، محدودیت گفته شده در صورت سوال مساله براورده نمی شود؛ چون اگر به فرض، بعد از سه میلی ثانیه از زمان شروع الگوریتم روی یک مجموعه تصویر به دست آمده از دوربین، جسم متحرک به محدوده دید دوربین وارد شود، هفت میلی ثانیه زمان لازم است تا الگوریتم قبلی به پایان برسد. سپس مجموعه تصاویری که این بار شامل جسم متحرک هستند دریافت و به الگوریتم اعمال شود و 10میلی ثانیه هم زمان بریا انجام الگوریتم روی اطلاعات تصاویری که این بار شامل جسم متحرک است لازم است که در مجموع 17میلی ثانیه طول خواهد کشید.

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

حال که پاسخ دو پرسش اساسی را به دست آوردیم، می توانیم تکنولوژی مناسب برای پیاده سازی این الگوریتم را انتخاب کنیم. فرض کنید انتخاب های موجود برای پیاده سازی، یک پردازنده AVR با فرکانس کلاک 20 مگاهرتز و یک پردازنده ARM با فرکانس کلاک 400 مگاهرتز است. در صورتی که هیچکدام از این تکنولوژی ها نتوانستند الگوریتم مورد نظر را در پنج میلی ثانیه اجرا کنند، می توان FPGA را به عنوان انتخاب بعدی در نظر گرفت.

در مورد پردازنده AVR، چون کلاک آن 20 مگاهرتز است، پش هر سیکل برای اجرای یک دستور، 50 نانو ثانیه طول می کشد، چون:

gz9pp5k4488vev3dtb2h.png

 

اگر فرض کنیم هر عمل جمع و ضرب در یک کلاک انجامشود، پس مدت زمان لازم برای یکبار اجرای الگوریتم برابر با 250 میلی ثانیه می شود،چون:

dmvfs5qhojxgo7wu4ot.png

 

این زمان، بسیار بیشتر از زمان لازم (پنج میلی ثانیه) برای اجرای الگوریتم است. بنابراین، نمی توان از AVR به عنوان تکنولوژی پیاده سازی این الگوریتم استفاده کرد.

به همین روش، مدت زمان برای انجام این الگوریتم توسط پرازنده ARM برابر 12.5 میلی ثانیه به دست می آید. این مدت زمان بیش از زمان موجود برای انجام الگوریتم تشخیص حرکت در مثال ماست. بنابراین، می توان به سراغ FPGA رفتو با طراحی یک سخت افزار بهینه و استفاده از قابلیت موازی سازی آن، اگوریتم مورد نظر را پیاده سازی کرد.

توجه کنید که مثال فوق و فرضهای به کار رفته در آن بسیار ساده در نظر گرفته شده اند تا مفهوم اصلی راحت تر منتقل شود. همچنین، در نظر داشته باشید که در عمل، یگ الگوریتم به تهایی برای انتخاب تکنولوژی ملاک نیست و مجموعه ای از عوامل باید در نظر گرفته شود. مثلا فرض کنید برای پیاده سازی بخشی از سیستم، مجبور به استفاده از FPGA بوده ایم. در این حالت، بسیاری از الگوریتم ها و بخش های دیگر سیستم را گرچه ممکن است بتوان با تکنولوژی دیگر هم پیاده سازی کرد، ولی چون FPGA از قبل برای تحقق بخشی از سیستم انتخاب شده است، بهتر است الگوریتم های دیگر را نیز به کمک آن پیاده سازی کرد.

نکته بعدی در ارتباط با انتخاب تکنولوژی این است که در بسیاری از سیستمهای پیجیده، طراح مجبور است از ترکیبی از تکنولوژی ها استفاده کند. مثلا FPGA به همراه یک پردازنده ARM روی یک برد که اطلاعات را بین یکدیگر به اشتراک می گذارند. با این روش، می توان از مزایای هر دو تکنولوژی به نحو مناسب استفاده کرد.

 

 

 

​​

لینک به دیدگاه

سلام دوستان عزیزم
:ws3:

امیدوارم تا اینجا از مطالبی که نوشتم راضی بوده و و با FPGA تا حدی آشنایی پیدا کرده باشید. تا اینجا در رابطه با FPGA و یژگی ها و کاربرداهاش مطالب زیادی را گفتم.

همانطور که از قبل هم به آن اشاره کردم نرم افزاری که قراره از آن استفاده کنم ISE از شرکت XIlinix هستش. لذا قبل از اینکه وارد محیط برنامه نویسی آن بشوم نحوه نصب و کرک آن را در اختیارتون می گذارم. امیدوارم که مورد رضایتتون واقع بشود. همچنین در آخر پست آدرس دانلود آخرین ورژن این نرم افزار را قرار می دهم تا هر کس که تمایل داشت بتواند به راحتی آن را دانلود کند.

 

نصب و کرک نرم افزار ISE

 

1. ابتدا به محل دانلود فایل بروید و سپس نصب را آغاز کنید.

 

jr6cysmic5zthrp6v.png

 

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

 

citkcsi2esjvloj7ni.png

 

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

3. در این مرحله شما 4 ثسمت را مشاهده می کنید. قسمت اول برای پیدا کردن license بعد از نصب است که ما به آن نیازی نداریم لذا تیکش را بردارید. قسمت چهارم درواقع فیدبکی از عملکردها و فایلهای اجرایی شما را به شرکت Xilinx مخابره می کند که به این قسمت هم نیازی نداریم. قسمت سوم که قسمت مهمی است حتما باید تیک داشته باشد.در وتقع این قسمت دستور نصب کابلهای مورد نیاز پروگرامر را صادر می کند.

i00h6gxqrlro5z53c8ug.png

 

4. بعد از تعیین محل نصب نرم افزار، نصب آغاز میشود. در طی انجام نصب از شما اجازه نصب کابلها را میگیرد که تنها لازم است OK را انتخاب کنید.

5. سوال بعدی که طی نصب از شما می پرسد آدرس نصب نرم افزار متلب است. چراکه این نرم افزار قابلیتی برای نرم افزار ISE و FPGAهای شرکت Xilinx دارد. که می توانید از طریق نرم افزار ISE آن قابلیتها را صدا بزنید. البته به شرطی که در این قسمت متلب را به آن معرفی کنید. البته اگر الان این نرم افزار روی سیستمتان نصب نیست اشکالی ندارد. بعدا از داخل ISE هم می توان متلب را به آن معرفی کرد.

qz6z6nmv2vkeittdqt.png

 

6. پس از اتمام نصب و کلیک finish یک پنجره به طور اتومات برایتان باز می شود.

dy0utiresezibx6puovu.png

 

 

در اینجا می توانید license مورد نظر نرم افزار را معرفی کنید. پس از تیک زدن گزینه چهارم به نب بعدی بروید.

 

ayb87t7dpww66n9fdzlj.png

 

در قسمت load license لایسنس را از قسمت کرک انتخاب کنید. پس از لود کردن آن روی ستون چهارم (expiration date) کلیک کنید. اگر تاریخ 2025 را مشاهده کردید یعنی لود لایسنس شما درست بوده است. و در آخر close را بزنید.

نصب نرم افزار کامل شد. حال از طریق منوی پنجره نرم افزار را اجرا کنید. (به 32 بیتی و یا 64 بیتی بودن ویندوزتان دقت کنید.)

 

آدرس لینک نرم افزار:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

قابلیتهای نرم افزار ISE

 

ادیتور ورود طرح ....... انجام بهینه سازی

شبیه سازی طرح ....... تست حین اجرا

سنتز مدار......... IP Coreهای آماده

جانمایی و مسیریابی....... تحلیل زمانی

ساخت فایل پیکره بندی....... تحلیل وان مصرفی

پیکره بندی FPGA ........ ارائه گزارشات مفصل

 

در اینجا قالبیتهای FPGA را به صورت موردی و خلاصه نوشتم.

حال زمان این است که نگاهی به درون نرم افزار بیاندازیم. موافقید؟؟؟:w16:

1. بعد از اینکه نرم افزار را باز کردید این صفحه را می بینید:

 

666xb9piysbsulqz243z.png

 

 

بسته به اینکه از قبل پروژه ای را آغاز کرده باشید یا نه دو انتخاب وجود دارد. از جایی که این دفعه اولیست که شروع به کار کردیم گزینه New Project را انتخاب میکنیم.

 

za80vg7kt06615agmrwp.png

 

2. اسم پروژه و محل ذخیره آن را مشخص می کنم و next می زنم.

 

mvpkybqu0tmojb7ct.png

 

3. حال خانواده ی FPGA مورد نظر را انتخاب می کنیم. مثلا spartan6. سپس نام قطعه مورد نظر را انتخاب می کنیم مثلا XC6SLX9. و به طور مثال بسته بندی TQG144. سپس speed grade را انتخاب می کنیم که روی تراشه هر FPGA نوشته شده است. سپس next را می زنیم.

 

81g237lvuceka8wpuncl.png

 

4. در قسمت hierarchy سلسله مراتب فایلها را نشان میدهد. در مربع پایینی اعمالی مثل سنتز، جانمایی و.... را انجام می دهیم. در مستطیل خاکستری اصل برنامه نوشته میشود.

در قسمت hierarchy راست کلیک می کنیم. دو گزینه add source و new source هست. از جایی که منبعی را تا به حال تعریف نکرده ایم، new source را انتخاب می کنیم.

 

5axdj6ewraizf8xrfk2b.png

 

5. در پنجره جدید باز شده VHDL Module را انتخاب می کنیم. در قسمت file name اسمی را به طور مثال adder برای آن انتخاب می کنیم. سپس next میزنیم.

 

oxestkdcihp8t1enwcp.png

 

6. در این قسمت پینهای مورد نظر را به نرم افزار معرفی می کنیم. سپس next را می زنیم. در نهایت خلاصه ای از اعمال ما را نشان می دهد. و در آخر finish را می زنیم.

 

dz1il4recw11h44ni6jd.png

 

 

7. پنجره جدیدی که برایمان باز می شود یک کد نسبتا از پیش اماده شده ای را برایمان ایجاد کرده است. و آن بخش entity است. در زبان VHDL برای comment گذاری از دو منها استفاده می کنیم. برای اینکه برنامه تمیزی داشته باشیم commenyهای اضافی را پاک می کنم. در قسمت entity دقت کنید نام آن با نامی که انتخاب کردهایم - در اینجا adder - یکی باشد. همانطور که ملاحظه می کنید در این قسمت پرتها، مدشان و تایپشان که از نوع STD LOGIC هست نشان داده شده است.

 

xckbu0afxvt2i95nppd.png

 

 

8. در قسمت begine برنامه خود را می نویسیم. به طور مثال من در اینجا برنامه یک adder را نوشته ام. کد را سیو کنید. در قسمت process - مربع سمت چپ پایین - عمل سنتز را انجام می دهیم. سپس place and rout را انتخاب می کنیم. ودر نهایت generate programming file را انتخاب می کنیم تا بیت فایل را ایجاد کنیم. بسته به پیچیده بودن برنامه عمل سنتز و روتینگ می تواند تا نیم ساعت طول بکشد. بعد از ایجاد بیت فایل باید آن را روی FPGA پروگرام کنید تا به تیدیل به قطعه ای بشود که آن را به کمک VHDL پیاده سازی کرده ایم.

 

 

لینک به دیدگاه
  • 2 هفته بعد...

در تاپیک قبلی تا حدودی با نرم افزار ISE آشنا شدیم و یک نمونه کد VHDL را اجرا کردیم.

حال در اینجا قصد دارم تا شما را با زبان VHDL آشنا کنم. امید است برای شما دوستان عزیزم مفید باشد. :ws3:

 

زبان توصیف سخت افزاری (HDL)

 

* زبان HDL ابزاری است برای توصیف یک مدار دیجیتالی و معرفی آن به نرم افزار مخصوص پیاده سازی (ISE)

* زبان HDL می تواند انواع مختلف سخت افزار دیجیتال را برای پیاده سازی با FPGA توصیف کند.

* مفاهیم و اصول هر دو زبان VHDL و Verilog یکسان هستند و فقط syntaxها متفاوت است.

 

ذهنیت مناسب برای کدنویسی HDL

 

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

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

* FPGA قبل از پیکره بندی، سخت افزار مشخصی را ارائه نمی کند و فقط شامل دریایی از منابع دیجیتال مثل LUTها و سیم ها است.

انواع مدارات منطقی

 

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

dcvx4wtuykbiabp3t7z.png

 

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

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

یک زبان HDL از جمله VHDL به ما این امکان را می دهد که هر دو حالت سنکرون و آسنکرون را برای مدارات خود داشته باشیم.

ساختار کد VHDL

هر کد VHDL از دو بخش اصلی تشکیل شده است:

Entity: تعریف پورتهای ورودی و خروجی

Architecture: توصیف مدار دیجیتال

 

7hmgp1bcbeurfqyqk6o.png

 

حال بیایید به ساختار Entity یک نگاهی بیاندازیم. اساسا ساختار Entity که بر پایه معرفی پورتهای ورودی و خروجی هستش، با کلمه Entity شروع می شود. بعد از آن اسم Entity ( به طور مثال Adder) و بعد کلمه کلیدی is، و بعد Port و سپس بین دو پرانتز پورتهای ورودی و خروجی را مشخص می کنیم و در نهایت کلمه end و اسم Entity. نحوه معرفی پورتها بسیار ساده است. ابتدا نام پرتها بعد مد(تعیین ورودی، خروجی) و تایپ آن، مثلا بیت؛ همانطور که می دانید این نوع پرتها تنها مقادیر 0یا 1 را می شناسند. البته در عمل این نوع پرت کاربردی ندارد و تایپی که برای پرت تک بیتی در عمل به جای بیت استفاده می شود تایپ STD_LOGIC هست.

 

v6qxh2bwcv1nocwg8oju.png

 

ساختار Architecture

سه ناحیه در محیط Architecture وجود دارد:

تعریف سیگنال و ماجول

محیط concurrent برای توصیف مدار ترکیبی

محیط sequential برای تعریف مدار ترتیبی

ساختار Architecture به این صورت هست که ابتدا کلمه Architecture سپس نام آن مثلا behavioral بعد کلمه of سپس نام Entity و در آخر کلمه is. ناحیه خاکستری رنگ محل تعریف سیگنالها و ماجول ها است که declaration نام دارد. قسمت آبی محل توصیف مدار ترکیبی یا همان concurrent است. اگر خواستید مدار ترتیبی تعریف کنید کافیست دستورات خود را در دل این قسمت ( ناحیه زرد رنگ) تعریف کنید( sequential). لازم به ذکر است که عمده مدارات ما در همین قسمت خواهد بود.

 

ke9rw6pviltw3jr7pna5.png

 

محیط concurrent

برای ارجاع از علامت => استفاده می شود: A

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

در محیط concurrent فقط زمانی که یک ارجاع ارزیابی می شود که سیگنال سمت راست آن تغییر کند و خطوط کد نسبت به هم اولویت ندارند.

در اصطلاح VHDL وقتی تغییری در یک سیگنال ایجاد شود، می گویند روی آن event رخ داده است.

در واقع بیایید اینجوری بگیم در محیط concurrent یک عبارت assignment فقط زمانی ارزیابی می شود که روی یکی از سیگنالهای سمت راست یک event رخ داده باشد.

خب حالا بیایید به محیط نرم افزار برویم. مثال قبل را به خطر بیاورید. در مثال قبل محیط Entity را نوشتم و توضیحی در رابطه با آن دادم. حال با توجه به توضیحاتی که در این تاپیک دادم دقیقتر به آن نگاه کنید. دو دستور در قسمت Architecture وجود دارد برای سادگی من آن را به این شکل می نویسم.

 

r35mq81onw8i6fngqxl.png

 

این دستورات B و C را با هم AND می کند و در A می ریزد. سپس مقدار A به D منتقل می شود. توجه کنید در محیط concurrent (برخلاف خیلی از نرم افزارها) اولویتی بین دستورات وجود ندارد. در واقع تنها عملی که باعث ایحاد تغییر در دستورات می شود همانطور که قبلا گفتم زمانی است که روی سمت راست سیگنال event رخ دهد. بنابراین زمانی A مقدار خواهد داشت یا مقدارش تغییر می کند که به B و C مقداری داده شود و یا مقدارشان تغییر کند.

حال بیایید به مثال قبل بازگردیم. در این مثال هم دو سطر assignment داریم. در سطر اول مقدار sum و در سطر دوم مقدار Cout تعریف کردم. در این جا هم ملاک ارزیابی عبارات سمت راست و رخ دادن event در آنهاست و اینکه کدام یک اول نوشته شود اهمیتی ندارد.

 

0vy5rg0d7tich53bp2i3.png

 

ادامه دارد...........:banel_smiley_4::banel_smiley_4:

 

لینک به دیدگاه
  • 2 هفته بعد...

سلام.

:a030::ws3: در این پست قصد دارم به شما دوستان نحوه پیاده سازی مدارات ترکیبی را آموزش دهم. اما قبل از آن یک یادآوری از پست قبلی خواهیم داشت.

 

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

 

حال مدارات ترکیبی در زبان VHDLرا چگونه تعریف می کنند؟ به کمک دو نوع ارجاع می توان مدارات ترکیبی را در محیط concurrent توصیف کرد:

 

*عبارت ارجاع انتخابی – selected signalassignment

 

*عبارت ارجاعشرطی – conditionalsignal assignment

 

که البته فعلا در این پست دررابطه با عبارت ارجاع انتخابی صحبت خواهم کرد. بدین منظور برای آشنا شدن با اینعبارت از یک مثال استفاه می کنم. مطمئنا از درس مدارات منطقی به یاد دارید که قطعه مالتی پلکسر قطعه ای است که در مدارات ترکیبی استفاده می شود. مالتی پلکسرها چند سیگنال ورودی ویک سیگنال خروجی و چند خط کنترلی دارند که با توجه به مقداری که خط کنترلی به خود می گیرد یکی از سیگنالها به خروجی منتقل می شود. به طور مثال در اینشکل ما یک مالتی پلکسر چهار ورودی، یک خروجی داریم و چون چهار ورودی داریم به دوخط کنترلی نیازمندیم که با توجه به مقداری که در خط کنترلی قرار می گیرد یکی ازورودی های A,B,C یا D به خروجی منتقل می شود. لذا با توجه به جدول صحت اگر S0و S1 مقدار 00 به خود بگیرند A،اگر 01، B، اگر 10، Cو اگر 11، D به خروجی منتقل می شود.

dxxm09rrcapalulseqm5.png

خب حالا بریم ببینیم در زبان VHDL و به کمک ارجاع انتخابی چگونه مالتی پلکسر را تعریف کنیم؟؟؟؟همانطور که در پست قیلی هم گفتم، محیط ISE دوبخش اصلی دارد یکی entity که محل تعریف پورتهاست و دیگری architecture هستش که در آن مدار مرد نظر را توصیف می کنیم. البته بک بخش ابتدایی هم وجود داردکه ما در آن کتابخانه IEEE را صدا می کنیم که در این کتابخانه تمامی ساختارهایی که ما در کد نویسی زبان VHDL استفاده می کنیم وجود دارد که همیشه باید در اولی نخط برنامه تان قرار بگیرد. این کتابخانه پکیج های مختلفی دارد که چند تا از آنهاپر کاربرد هستند که یکی از آنها – باید همیشه در خط اول صدا زده شود – STD_LOGIC_1164 هستش که برای صدا کردن از کلمه کلیدی use استفاده می کنیم و بعد از آن اسم خود IEEE و بعد نام پکیج؛ و چون خود پکیج قابلیتهای فراوانی دارد، برای اینکه از تمامی آن استفاده کرده باشیم از کلمه ALL در انتها استفاده می کنیم.

9h2c9k8tqlzrvup0ir5m.png

خب برای اینکه مالتی پلکسر راتوصیف کنیم ابتدا باید پورتها را تعریف کنیم. لذا سراغ قسمت entity می رویم. ابتدا ورودی های تک بیتی A,B,C و D، خروجی F را تعریف می کنیم. اما..... چطور خطوط کنترلی را تعریف کنیم؟ آنهاکه تک بیتی نیستند؟!! خب جوابش بسیار راحت است کافی است یا دو سیگنال تک بیتیتعریف کنید ( که من خیلی از این کار خوشم نمی آید!!) یا بیایید از یک تایپ جدید به نام std_logic_vector استفاده کنید و در ادامه عرض آن را مشخص کنید - در واقع از این تایپ زمانهایی استفاده می شود که عرض سیگنال بیش از یک بیت باشد – در اینجا چون عرض سیگنال دو بیت است لذا می نویسیم (1 downto 0)که این بدین معنی است که ما یک سیگنال دو بیتی با مقادیر 0 و 1 داریم.

در روش ارجاع انتخابی ما با with شروع کرده و سپس نام سیگنال – در اینجا S – و سپس کلمه کلیدی select را می نویسیم. و در ادامه می گوییم به سیگنال خروجی F، A ارجاع شود هنگامیکه 00 داشته باشیم که این همان مقدار S است. و در خط آخر Dرا به F ارجاع می دهیم زمانیکه هیچ کدام از این حالات رخ ندهد (when others).

خب برای اینکه ببینیم خطای سینتکس داریم یا نه در قسمت hierarchy روی فایل کدمان کلیک میکنیم سپس در قسمت process روی checksynax کلیک میکنیم. حال اگر عبارت process “check syntax” completed successfully را دیدید یعنی کدمان درست کار می کند.

حال برای اینکه با ارجاع انتخابی بیشتر آشنا شویم، کمی مثال مالتی پلکسر را گسترش می دهیم. می آییم به غیراز پایه های S0 و S1 پایه کنترلی جدیدی را به نام En اضافه می کنیم،این پایه نقش فعال ساز مالتی پلکسر را ایفا می کند، هر گاه یک شود مالتی پلکسرمانند قبل عمل می کند و اگر صفر بود خروجی هم صفر خواهد بود.

حال چگونه باید به کمک ساختارارجاع انتخابی این مدار را پیاده سازی کنیم؟

:ws38::ws38:

 

5huozrvmjcki6jugvc5.png

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

عملگری در زبان VHDL وجود دارد به نام concatenationکه در زبان VHDL آن را با & نشان می دهند.

15v53vret0yufkl09pl.png

 

فرض کنید دو رجیستر در زبان VHDL تعریف کردیم به نامهای Aو B که به ترتیب سه بیتی و پنج بیتی هستند. حال اگر از عبارت ارجاع C

pjrale8girye7f3d9wg.png

 

سپس دو سیگنال Sو En را به کمک عملگر concatenationبه هم متصل می کنیم. همانطور که میبینید سیگنال SEn یک سیگنال سه بیتی است که بیت سبکتر آن En وبیت سنگین آن Sخواهد بود. حال می توانیم در ساختار ارجاع انتخابی سیگنال SEn را ارجاع دهم ولی می دانیم که این سیگنال در دل خود دو سیگنال S و En را دارد. حال دستورات را بازنویسی میکنم و می نویسم A را به F راجاع بده در صورتیکه سیگنال SEn برابر 001 باشد. و در آخر اگر هیچ کدام از حالات فوق نبود(when others) مقدار 0 را به Fارجاع بده. و به این نکته توجه کنید اگر خواستید مقداری را به یک سیگنال ارجاع دهید اگر تک بیتی بود داخل دو و اگر بیش از یک بیت بود داخل دو " بنویسید.به این ترتیب ما با هم یک مالتی پلکسر 1*4 را با پایه فعال ساز Enبه کمک زبان VHDL طراحی کردیم.

تمرین: یک مالتی پلکسر1*8 باپایه فعال ساز En طراحی کنید. :gnugghender::whistle:

 

************ ادامه دارد *********** :banel_smiley_4::banel_smiley_4:

 

 

 

 

 

 

لینک به دیدگاه
  • 2 هفته بعد...

سلام.

:a030:

در پست قبلی در مورد مداراتترکیبی و نحوه ی توصیف آنها با استفاده از دو روش ارجاع انتخابی و ارجاع شرطی – کهالبته تنها روش اول را مفصلا توضیح دادم - صحبت کردم. حال در این پست می خواهم شمارا با روش دوم ارجاع آشنا کنم.

خب، همانطور که به یاد داریددر پست قبلی آموزش را به کمک کالتی پلکسر 1*4 انجام دادم؛ در این آموزش نیز از اینمثال استفاده می کنم. مطمئنا مالتی پلکسر و نحوه عملکرد آن را به یاد دارید،المانی است که دارای چند خط ورودی و کنترلی است که با توجه به مقداری که خطوطکنترلی به خود می گیرند یکی از ورودی ها به خروجی منتقل می شود. خب حال ببینیم کهچگونه می توانیم این المان را توسط روش ارجاع شرطی پیاده سازی کنیم.

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

تعبیر مالتی پلکسر در روش ارجاع شرطی به شکل زیر خواهد بود:

 

k0vgwykorajc97840l1.png

 

 

این دستور می گوید: زمانیکه s=00 ، w0 را به f ارجاع بده، در غیر اینصورت، زمانیکه s=01، w1 را به f ارجاع بده و... در غیراینصورت آخر در واقع منظورش این است که w3 را زمانی به f ارجاع دهد که s سه باشد. ]در کل من به شخصه این روش را به روش اننخابی ترجیح می دهم چراکه به نظرم وا ضح تر است.[

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

 

kpjx8lzxqp6cwe1s3me.png

 

 

انکدری که اینجا داریم چهار ورودی w0 تا w3، و دو خروجی y0 و y1 را دارد. با توجه به جدول صحتی که داریم می توانیم عملکرد انکدر را مورد بررسی قرار دهیم. همانطور که می بینید، به ازای یک شدن یک ورودی در هرمرحله خروجی مقادیر مختلفی را به خود می گیرد – که این نحوه عملکرد انکدر عادی است که در هر لحظه تنها یکی از ورودی ها یک شده اند. اما سوالی که پیش می آید این است که اگر بیش از یک ورودی یک بودند انکدر چگونه عمل می کند در حالی که همانطور که می دانیم در انکدر در هر لحظه فقط یکی از ورودی ها باید یک باشد؟؟؟ راه حل خیلی ساده است.... انکدر اولویت دار!!!!! این انکدر می تواند اولویت را از سمت بیت سنگین یعنی w3 یا از سمت بیت سبک w0 مشخص کند. به طور مثال فرض کنید که می خواهیم انکدر اولویت را از سمت بیت سنگین w3 در نظر بگیرد. لذا اگر بیش از یک ورودی مقدار یک داشته باشد انکدر می آید خروجی را براساس اولویت بیت سنگین تر مقدار دهی میکند. یعنی اگر به طور مثال w3 مقدار یک داشت خروجی را 11 می کند و به بقیه مقادیر ورودی ها توجهی نمیکند. جدول صحت چنین انکدری به شکل زیر است.

 

ehaoid4p4bvtw1tayuuu.png

 

همانطور که می بینید به طور مثال زمانیکه w2=1 و w3=0 انکدر بدون توجه به سایر مقادیر- با توجه به یک بودن اولین بیت سنگین – خروجی را مقداردهی می کند. در واقع سایر مقادیر don’t care هستند!

خب حالا بیایید ببینیم که چگونه می توانیم این طراحی را توسط زبان VHDL پیاده سازی کنیم. در بخش entity ورودی w و خروجی y را مشخص کرده ایم. با توجه به اینکه ورودی چهار بیت دارد w را برداری با مقدار( 3 downto 0 )، و چون خروجی دو بیت دارد y را برداری با مقدار( 1 downto 0 ) تعریف می کینم. برای پیاده سازی می خواهیم از ساختار conditional signal assignment استفاده کنیم. در اینجا می گوییم مقدار 11 را به y ارجاع بده زمانیکه w3 مقدار 1 را داشته باشد؛ درغیراینصورت، مقدار 10 را به y ارجاع بده زمانیکه w2 مقدار 1 را داشت ...... توجه کنید در هر مرحله سنگین ترین بیت مد نظر است و مقدار سایر بیتها اهمیتی ندارد.

 

unrqyiiva3zckbn8bmls.png

 

 

 

حالا اگر خواستیم از سمت بیت سبکتر باشد کافیست جای اندیسها تغییر کند یعنی اولین بیتی که مورد بررسی قرار می کرفت دیگر w3 نیست بلکه w0 خواهد بود.

 

 

تمرین : مالتی پلکسر 1*2 ای با پایه فعال سازی بنویسید که ورودی هایش را از خروجی یک انکدر اولویت دار بگیرد :gnugghender::gnugghender:

 

****** ادامه دارد ***** :banel_smiley_4::banel_smiley_4:

لینک به دیدگاه
  • 3 هفته بعد...

سلام. :a030:

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

 

انواع شبیه سازی:

*شبیه سازی عملکرد – Functional Simulation

هدف چک کردن منطق عملکرد مدار است؛ یعنی، مثلا اگر شما یک جمع کننده طراحی کرده اید با استفاده از این روش می توانید چک کنید که آیا به درستی عمل می کند یا خیر. در این روش تاخیر همه عملگرها و توابع صفر در نظر گرفته می شود؛ یعنی ، در یک گیت AND، به طور مثال، اگر در یکی از ورودیها تغییر اعمال شود در صفر ثانیه به خروجی اعمال می شود. که خب این در عمل وجود ندارد! چرا که در هر کدار دیجیتالی ورودی با یک تاخیر انتشار (propagation delay) به خروجی اعمال می شود.

 

*شبیه سازی زمانی – Timing Simulation

این روش همان روش فوق است با این تفاوت که تاخیرها را هم در نظر می گیرد. و این روش – در روند طراحی یک مدار دیجیتال – بعد از سنتز، جانمایی و مسیریابی است. بعد از عمل سنتز، از قطعات واقعی درون FPGA برای شبیه سازی استفاده می کنید و هر کدارم از این قطعات تاخیری دارند. و همانطور که گفتم در این روش شبیه سازی تاخیرهای انتشار هم در نظر گرفته می شود. مثلا اگر همان گیت AND را در نظر بگیریم وقتی که ورودی تغییری می کند خروجی بعد از یک تاخیری – که می تواند بسته به نوع FPGA متغیر باشد – مثلا 1نانو ثانیه تغییر خواهد کرد.

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

 

Testbench

خب برای اینکه کار با ISim شروع کنیم سراغ یک فایل به نام testbench می رویم. اولین مرحله در فرایند شبیه سازی، ساخت قایل تست بنچ است. این فایل یک فایل VHDL مخصوص است که ماجول شما را در خود صدا می زند و می توانید مقدار ورودیهای ماجول را مشخص کنید. البته این فایل قابل پیاده سازی نیست و صرفا برای شبیه سازی استفاده می شود.

خب پیش به سوی شبیه سازی انکدر اولویت دار توسط نرم افزار ISim. برای این کار در قسمت hierarchy راست کلیک میکنید و گزینه new source را انتخاب می کنید. سپس گزینه VHDL Test Bench را انتخاب کرده و در قسمت File name اسمی برای آن به طور مثال Encoder_tb انتخاب کرده و در نهایت next را بزنید.

 

j002qkwkeyuiw2brk1y3.png

 

خب در قسمت بعد، از شما می پرسد که این فایل تست بنچ را برای کدام یک از ماجولهایتان می خواهید که ما در اینجا Encoder را می خواهیم و بعد next می زنیم و در نهایت هم دکمه finish را فشار می دهیم.

 

wnbhfn4pkhpr036gs7uj.png

 

 

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

 

770so4iavmfhczutwgy1.png

 

 

خب همانطور که می دانید فایل تست بنچ ماجول مورد نظرمان را صدا می زند. کاری که باید انجام دهیم مقدار دهی به آن است. این کار را در قسمت insert stimulus here انجام می دهیم. به طور مثال مقدار 0110 را وارد می کنیم و با توجه با اینکه حساس به بیت سنگین است انتظار داریم در خروجی مقدار دو ظاهر شود.

 

3ok40wt5wgiuz9d3w9h.png

 

~خب برای شبیه سازی کافیست در قسمت بالای hierarchy گزینه simulation را فعال کنید. سپس در قسمت process ابتدا با دابل کلیک کردن روی behavioral چک کنید که خطای سینتکس نداشته باشید سپس روی simulate behavioral دابل کلیک تا از طریق ISE نرم افزار ISim فراخوانده شود.

 

gde9qt398bqd4jifawdu.png

 

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

 

f4990judrn06kqkp930w.png

 

در این قسمت سیگنالها به شما نشان داده می شود. انکدر ما یک ورودی 4 بیتی و یک خروجی دو بیتی داشت که در قسمت name مشاهده می کنید. در قسمت value مقادیر هر یک نشان داده شده است و میبینید همانطور که انتظار داشتیم خروجی مقدار 10 یا همان دو را داراست. هر بار که شما نرم افزار ISim صدا بزنید به طور پیش فرض شبیه سازی در 1میکرو ثانیه انجام می شود. ابتدای شبیه سازی مشخص نیست شما می توانید با زدن گزینه zoom to full view کل شبیه سازی را نیز مشاهده کنید.

اگر خواستید شبیه سازی دیگری را انجام دهید می توانید در قسمت قرمز رنگ زمان را تغییر دهید مثلا 2میکرو ثانیه و سپس گزینه run - قسمت سبز – را بزنید تا دو میکرو ثانیه دیگر هم شبیه سازی انجام شود. همانطور که می بینید تا 3میکرو ثانیه شبیه سازی انجام شده است.

 

2ew1kje54qvn3ym7bmzm.png

 

اگر خواستید یک قسمت خاصی را بزرگنمایی کنید کافیست روی قسمت مورد نظر کلیک کنید و سپس گزینه zoom in را فشار دهید و با هر بار فشردن اون قسمت بزرگتر می شود.

حال اگر بخواهیم ورودی را عوض کنیم چکار کنیم؟؟ یکی از راه ها این است که به فایل تست بنچ برگردیم و یک مقدار جدید وارد کنیم.

 

6uyj7g1p0vrvuencfzq.png

 

توجه کنید دو مقدار نمی توانند پشت سر هم باشند لذا یک تاخیر مثلا 50نانو ثانیه ای بین دو دستور ایجاد می کنیم. همانطور که می بینید در ابتدای دستور نیز یک تاخیر 100نانو ثانیه ای وجود دارد. سپس به محیط ISim برگردید و دکمه relaunch را برای اعمال تغییرات جدید فشار دهید. خب همانطور که میبینید از 100 تا 150 نانو ثانیه ورودی اول و از 150 نانو ثانیه به بعد ورودی دوم اعمال شده است.

 

azd5c2mol3ih34j86xwm.png

 

تمرین : مالتی پلکسر 1*4 با پایه en شبیه سازی کنید.​ :gnugghender::ws38:

 

********* ادامه دارد ********:banel_smiley_4::banel_smiley_4:

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...