#PYNQ
#Python
#Essentials
✅ چگونه یک طراح نرم افزار کارش را با FPGA ها شروع کند؟
در نگاه اول به نظر می رسد، شما باید در یک زمان، تمام مفاهیم جدید، سخت افزار جدید و محیط توسعه جدید را مدیریت کنید. در حالت کلی تمامی مدارک، مستندات و مثال های آموزشی در این حوزه توسط مهندسین الکترونیک برای مهندسان الکترونیک ایجاد شده اند و این به مهندسان نرم افزار کمک نمی کند. این دقیقا نکته ایست که توجه شرکت Digilent را به خودش جلب کرد. بورد آموزشیPYNQ-Z1 برای حل این مشکل به افراد برنامه نویس اجازه می دهد به آرامی در انتهای کم عمق استخر شنا کنند، و کم کم به سمت مسائل پیچیده تر بروند.
اجرای کدها و کار با بورد در هر محیطی امکان پذیر است اما پیشنهاد خود سازندگان استفاده از Ubuntu است. به این ترتیب کار شروع می شود و شما به عنوان یک مهندس نرم افزار با اجرای کدهای پایتون یکسری فیدبک مثبت دریافت می کننید. کم کم همان طور که شما کد پایتون را اجرا می کنید، متوجه خواهید شد که تراشه Xilinx ZYNQ یک تراشه کاملا سازمان یافته است و به مرور نحوه اجرای کد روی آن را درک می کنید. البته اشتباه نکنید، شما در نهایت باید دست به کار شوید و به سطوح پایین تر طراحی بروید و مهارت کافی در بکاگیری مجموعه ابزارهای ارائه شده برای توسعه FPGA را بدست بیاورید. اما شما تنها پس از رسیدن به برخی از موفقیت ها و درک مفاهیم، شروع خواهید کرد. پس وقت را تلف نکنید و شروع کنید.
@Hexalinx
#Python
#Essentials
✅ چگونه یک طراح نرم افزار کارش را با FPGA ها شروع کند؟
در نگاه اول به نظر می رسد، شما باید در یک زمان، تمام مفاهیم جدید، سخت افزار جدید و محیط توسعه جدید را مدیریت کنید. در حالت کلی تمامی مدارک، مستندات و مثال های آموزشی در این حوزه توسط مهندسین الکترونیک برای مهندسان الکترونیک ایجاد شده اند و این به مهندسان نرم افزار کمک نمی کند. این دقیقا نکته ایست که توجه شرکت Digilent را به خودش جلب کرد. بورد آموزشیPYNQ-Z1 برای حل این مشکل به افراد برنامه نویس اجازه می دهد به آرامی در انتهای کم عمق استخر شنا کنند، و کم کم به سمت مسائل پیچیده تر بروند.
اجرای کدها و کار با بورد در هر محیطی امکان پذیر است اما پیشنهاد خود سازندگان استفاده از Ubuntu است. به این ترتیب کار شروع می شود و شما به عنوان یک مهندس نرم افزار با اجرای کدهای پایتون یکسری فیدبک مثبت دریافت می کننید. کم کم همان طور که شما کد پایتون را اجرا می کنید، متوجه خواهید شد که تراشه Xilinx ZYNQ یک تراشه کاملا سازمان یافته است و به مرور نحوه اجرای کد روی آن را درک می کنید. البته اشتباه نکنید، شما در نهایت باید دست به کار شوید و به سطوح پایین تر طراحی بروید و مهارت کافی در بکاگیری مجموعه ابزارهای ارائه شده برای توسعه FPGA را بدست بیاورید. اما شما تنها پس از رسیدن به برخی از موفقیت ها و درک مفاهیم، شروع خواهید کرد. پس وقت را تلف نکنید و شروع کنید.
@Hexalinx
#Essentials
🔖 حافظه ها درون FPGA به دو دسته تقسیم می شوند
✳️ حافظه های بلوکی یا #BLOCK_RAM
✳️ حافظه های توزیع شده یا #DISTRIBUTED_RAM
حافظه های بلوکی یکسری منابع اختصاصی سخت افزاری هستند و به صورت بلوک هایی با ظرفیت ذخیره سازی چند ده کیلوبیت روی تراشه های FPGA قابل فراخوانی هستد. ظرفیت هر هر کدام از بلوک های حافظه در تراشه های سری 7 ، 36 کیلوبیت است که البته به صورت بلوک های حافظه 18 کیلو بیتی نیز قابل استفاده هستند. با توجه به سری ساخت FPGA و نوع آن بلوک های حافظه ممکن است ظرفیت پایین تری داشته باشند، به عنوان مثال برای تراشه های Spartan 6 ظرفیت ذخیره سازی یک بلوک حافظه 18 کیلوبیت است و در صورت نیاز می تواند به صورت بلوک 9 کیلوبیتی نیز استفاده شود.
این که چه تعداد از این بلوک های حافظه در هر FPGA وجود دارد، بستگی به نوع FPGA دارد به عنوان مثال کوچکترین تراشه FPGA سری 7 یعنی تراشه XC7S6 از خانواده Spartan 7 تنها 5 بلوک حافظه 36 کیلوبیتی دارد در حالی تراشه های قدرتمند Virtex 7 می توانند تا 1880 بلوک حافظه داشته باشند، یعنی ظرفیت ذخیره سازی حدود 68 مگابیت !!! تعداد بلوک های حافظه برای تراشه های خانواده Spartan 6 بین 12 تا 268 بلوک 16 کیلوبیتی متغیر است.
زمانی که هر کدام از این بلوک های حافظه توسط طراح فراخوانی شوند، فارغ از اینکه چه مقدار اطلاعات قرار است در آنها ذخیره شود، کل فضای ذخیره سازی آن بلوک مورد استفاده قرار می گیرد، به عنوان مثال فرض کنید قرار است 128 کلمه 16 بیتی را درون یک حافظه بلوکی روی یکی از تراشه های Spartan 6 پیاده سازی کنیم. یعنی 2048 بیت یا 2 کیلو بیت، در صورت استفاده از یک حافظه 9 کیلوبیتی درون تراشه واضح است که 7 کیلوبیت آن بدون استفاده باقی می ماند و این یک اشکال در طراحی است. اجازه بدهید بحث در رابطه با حافظه های بلوکی را در همینجا متوقف کنیم و کمی به حافظه های توزیع شده بپردازیم.
برخلاف حافظه های بلوکی حافظه های توزیع شده، منابع اختصاصی سخت افزاری نیستند، و با استفاده از LUT ها ساخته می شوند و همانطور که از نامشان می توان تشخیص داد، می توانند در هر جایی از تراشه پیاده سازی شوند. این حافظه ها قابلیت ذخیره سازی تعداد محدودی بیت دارند و در مواردی که نیاز به ذخیره سازی حجم کمی از داده ها وجود داشته باشد، مورد استفاده قرار می گیرند، ظرفیت ذخیره سازی این حافظه ها ثابت نیست و می تواند کاملا سفارشی شده باشند، برای تراشه XC7S6 که پیشتر به عنوان کوچکترین تراشه خانواده Spartan 7 معرفی شد، کل ظرفیت حافظه های توزیع شده برابر با 70 کیلو بیت است. این عدد برای بزرگترین تراشه خانواده Virtex 7 حدود 21 مگابیت است.
در حالت کلی LUT ها برای انجام روابط منطقی بکار گرفته می شوند اما LUT های درون اسلایس های کامل #SLICEM که از قبل آنها را می شناسیم، می توانند به صورت حافظه پیکره بندی شوند، هر LUT در تراشه های سری 7 قابلیت ذخیره سازی حداکثر 64 بیت داده را دارد و با اتصال آبشاری LUT های درون یک اسلایس امکان افزایش این ظرفیت تا 256 بیت نیز وجود دارد.
البته با استفاده از چندین اسلایس و بخشی از منایع دیگر FPGA امکان افزایش ظرفیت حافظه های توزیع شده وجود دارد و به عنوان مثال با استفاده از 16 اسلایس می توان یک حافظه 16 بیتی با عمق ذخیره سازی 64 کلمه تولید کرد یعنی یک حافظه 1 کیلوبیتی.
❗️ حالا سوال اینجاست؟ برای طراحی از کدام حافظه استفاده کنیم، یا سوال مهمتر اینکه چگونه این حافظه ها را در کدهای خودمون فراخوانی کنیم و چگونه پیکره بندی آن ها را تنظیم کنیم.
پاسخ به این سوال بسیار ساده است، فقط باید درست کد نویسی انجام دهیم، ابزار سنتز به صورت اتوماتیک حافظه ها را به منابع درون تراشه نگاشت می کند. یعنی ابزار سنتز با توجه به ظرفیت حافظه بهترین جایگاه برای پیاده سازی را انتخاب می کند. می توان این مساله را با چند مثال توضیح داد اما قبل از ارائه مثال بهتر است با پیکره بندی های مختلف حافظه ها نیز آشنا بشویم.
✳️ حافظه های بلوکی و حافظه های توزیع شده می توانند به اشکال مختلفی پیکره بندی شوند. اگر علاقه مندید با آن ها آشنا بشوید، به شما توصیه می کنم مقاله بعدی ما در رابطه با حافظه ها که چند روز دیگر منتشر می شود را مطالعه کنید.
@Hexalinx
🔖 حافظه ها درون FPGA به دو دسته تقسیم می شوند
✳️ حافظه های بلوکی یا #BLOCK_RAM
✳️ حافظه های توزیع شده یا #DISTRIBUTED_RAM
حافظه های بلوکی یکسری منابع اختصاصی سخت افزاری هستند و به صورت بلوک هایی با ظرفیت ذخیره سازی چند ده کیلوبیت روی تراشه های FPGA قابل فراخوانی هستد. ظرفیت هر هر کدام از بلوک های حافظه در تراشه های سری 7 ، 36 کیلوبیت است که البته به صورت بلوک های حافظه 18 کیلو بیتی نیز قابل استفاده هستند. با توجه به سری ساخت FPGA و نوع آن بلوک های حافظه ممکن است ظرفیت پایین تری داشته باشند، به عنوان مثال برای تراشه های Spartan 6 ظرفیت ذخیره سازی یک بلوک حافظه 18 کیلوبیت است و در صورت نیاز می تواند به صورت بلوک 9 کیلوبیتی نیز استفاده شود.
این که چه تعداد از این بلوک های حافظه در هر FPGA وجود دارد، بستگی به نوع FPGA دارد به عنوان مثال کوچکترین تراشه FPGA سری 7 یعنی تراشه XC7S6 از خانواده Spartan 7 تنها 5 بلوک حافظه 36 کیلوبیتی دارد در حالی تراشه های قدرتمند Virtex 7 می توانند تا 1880 بلوک حافظه داشته باشند، یعنی ظرفیت ذخیره سازی حدود 68 مگابیت !!! تعداد بلوک های حافظه برای تراشه های خانواده Spartan 6 بین 12 تا 268 بلوک 16 کیلوبیتی متغیر است.
زمانی که هر کدام از این بلوک های حافظه توسط طراح فراخوانی شوند، فارغ از اینکه چه مقدار اطلاعات قرار است در آنها ذخیره شود، کل فضای ذخیره سازی آن بلوک مورد استفاده قرار می گیرد، به عنوان مثال فرض کنید قرار است 128 کلمه 16 بیتی را درون یک حافظه بلوکی روی یکی از تراشه های Spartan 6 پیاده سازی کنیم. یعنی 2048 بیت یا 2 کیلو بیت، در صورت استفاده از یک حافظه 9 کیلوبیتی درون تراشه واضح است که 7 کیلوبیت آن بدون استفاده باقی می ماند و این یک اشکال در طراحی است. اجازه بدهید بحث در رابطه با حافظه های بلوکی را در همینجا متوقف کنیم و کمی به حافظه های توزیع شده بپردازیم.
برخلاف حافظه های بلوکی حافظه های توزیع شده، منابع اختصاصی سخت افزاری نیستند، و با استفاده از LUT ها ساخته می شوند و همانطور که از نامشان می توان تشخیص داد، می توانند در هر جایی از تراشه پیاده سازی شوند. این حافظه ها قابلیت ذخیره سازی تعداد محدودی بیت دارند و در مواردی که نیاز به ذخیره سازی حجم کمی از داده ها وجود داشته باشد، مورد استفاده قرار می گیرند، ظرفیت ذخیره سازی این حافظه ها ثابت نیست و می تواند کاملا سفارشی شده باشند، برای تراشه XC7S6 که پیشتر به عنوان کوچکترین تراشه خانواده Spartan 7 معرفی شد، کل ظرفیت حافظه های توزیع شده برابر با 70 کیلو بیت است. این عدد برای بزرگترین تراشه خانواده Virtex 7 حدود 21 مگابیت است.
در حالت کلی LUT ها برای انجام روابط منطقی بکار گرفته می شوند اما LUT های درون اسلایس های کامل #SLICEM که از قبل آنها را می شناسیم، می توانند به صورت حافظه پیکره بندی شوند، هر LUT در تراشه های سری 7 قابلیت ذخیره سازی حداکثر 64 بیت داده را دارد و با اتصال آبشاری LUT های درون یک اسلایس امکان افزایش این ظرفیت تا 256 بیت نیز وجود دارد.
البته با استفاده از چندین اسلایس و بخشی از منایع دیگر FPGA امکان افزایش ظرفیت حافظه های توزیع شده وجود دارد و به عنوان مثال با استفاده از 16 اسلایس می توان یک حافظه 16 بیتی با عمق ذخیره سازی 64 کلمه تولید کرد یعنی یک حافظه 1 کیلوبیتی.
❗️ حالا سوال اینجاست؟ برای طراحی از کدام حافظه استفاده کنیم، یا سوال مهمتر اینکه چگونه این حافظه ها را در کدهای خودمون فراخوانی کنیم و چگونه پیکره بندی آن ها را تنظیم کنیم.
پاسخ به این سوال بسیار ساده است، فقط باید درست کد نویسی انجام دهیم، ابزار سنتز به صورت اتوماتیک حافظه ها را به منابع درون تراشه نگاشت می کند. یعنی ابزار سنتز با توجه به ظرفیت حافظه بهترین جایگاه برای پیاده سازی را انتخاب می کند. می توان این مساله را با چند مثال توضیح داد اما قبل از ارائه مثال بهتر است با پیکره بندی های مختلف حافظه ها نیز آشنا بشویم.
✳️ حافظه های بلوکی و حافظه های توزیع شده می توانند به اشکال مختلفی پیکره بندی شوند. اگر علاقه مندید با آن ها آشنا بشوید، به شما توصیه می کنم مقاله بعدی ما در رابطه با حافظه ها که چند روز دیگر منتشر می شود را مطالعه کنید.
@Hexalinx
#Essentials
🔖 مقاله ایی که خدمتتان ارائه می گردد، با توجه به معماری تراشه های 7 Series و خانواده Spartan 6 تهیه شده است، معماری CLB ها در سایر تراشه های Xilinx تا حدودی متفاوت است، اگر چه شباهت هایی نیز وجود دارد.
تمامی تراشه های FPGA شرکت Xilinx دارای تعداد زیادی بلوک #CLB هستند که هر کدام متشکل از دو اسلایس #Slice هستند. هر اسلایس نیز شامل 4 عدد #LUT شش ورودی، 8 عدد فلیپ فلاپ #FLIP_FLOP ، یک زنجیره بیت نقلی #CARRY_CHAIN و تعدادی مالتی پلکسر عریض #WIDE_MULTIPLEXER است. ساختار داخلی یک LUT در شکل بالا نشان داده شده است.
همانطور که در شکل می بینیم، هر #LUT داری شش ورودی مستقل به نام های D1 تا D6 و دو خروجی مستقل به نام های O5 و O6 می باشد. هر #LUT قابلیت پیاده سازی یک تابع 6 ورودی با هر نوع پیچیدگی را دارد، مثلا تابع f را به صورت زیر در نظر بگیرد.
f=((D1 and D2) or (D3 and not(D4 or D5)) and D6)
با یک مرور کوتاه به درس مدار منطقی به یاد می آوریم که یک جدول درستی با شش ورودی می توانست 64 خروجی مختلف داشته باشد. در حقیقت #LUT ها در FPGA کاملا مشابه جداول درستی با شش ورودی عمل می کنند. علاوه بر این یک #LUT می تواند مشابه یک حافظه با 64 عنصر حافظه نیز عمل کند.
هنگام پیاده سازی یک تابع شش ورودی روی FPGA ، ابتدا جدول درستی این تابع توسط ابزار سنتز در ISE و یا Vivado ساخته می شود و سپس روی #LUT ها نگاشت می شود و در نهایت روی تراشه FPGA پیکره بندی می شود.
نکته دیگری که باید به آن اشاره کرد این است که همانطور که شکل بالا نشان می دهد. یک #LUT شش ورودی می تواند همانند دو عدد #LUT مستقل 5 ورودی نیز مورد استفاده قرار بگیرد، البته این 5 ورودی بین هر دو #LUT مشترک هستند ولی هر #LUT می تواند جدول درستی اختصاصی خودش و البته خروجی اختصاصی خودش یعنی O5 یا O6 را داشته باشد. در حالتی که تابع مورد نظر برای پیاده سازی نیاز به استفاده همزمان از هر دو #LUT داشته باشد، یک #LUT شش ورودی ساخته می شود و تنها خروجی O6 استفاده می شود، ولی در صورت استفاده تکی از #LUT ها هر دو خروجی بکار گرفته می شوند.
از سوی دیگر هر #LUT می تواند در نقش یک حافظه ROM یا RAM جهت ذخیره سازی 64 عدد تک بیت یا 32 عدد دو بیتی استفاده شود. در اینجا هم در حالت اول فقط خروجی O6 و در حالت دوم هر دو خروجی O5 و O6 به صورت همزمان استفاده می شوند. توجه داشته باشید هنگامی که تعداد محدودی عدد چند بیتی (مثلا 128 عدد بیتی) در یک ROM ذخیره می کنیم، در صورت کدنویسی صحیح (تاکید می کنم، حتما باید ساختار کد صحیح باشد) ابزار سنتز به صورت اتوماتیک از #LUT ها جهت این کار استفاده می کند و به نوعی یک حافظه توزیع شده #DISTRIBURD_RAM سنتز می شود ولی اگر تعداد اعداد از یک حدی بیشتر باشند حافظه ROM ما به بلوک های حافظه داخللی نگاشت می شود.
❗️ تعیین آستانه برای انتخاب بین یک حافظه توزیع شده یا بلوک های حافظه به موارد متعددی بستگی دارد که در مقاله ای جداگانه به آن پرداخته می شود.
با ترکیب هر چهار #LUT درون یک اسلایس می توان حافظه های بزرگتری با ظرفیت حداکثر 256 بیت بدون استفاده از هیچ نوع منابع اضافی روی تراشه فراخوانی کرد. همانطور که در شکل زیر نشان داده شده است.
❗️درون هر اسلایس سه مالتی پلکسر عریض با نام های
1⃣ #F7AMUX
2⃣ #F7BMUX
3⃣ #F8MUX
وجود دارد که برای ترکیب کردن خروجی #LUT ها و ساخت حافظه های 128 و 256 بیتی مورد استفاده قرار می گیرند، وجود این مالتی پلکسرهای عریض به طراح اجازه می دهد تا با ترکیب کردن #LUT ها توابع منطقی با 7 و یا 8 ورودی را نیز به راحتی درون یک اسلایس طراحی کند. نام گذاری مالتی پلکسرهای عریض با توجه به تعداد ورودی های آن ها صورت گرفته و عناصر بسیار مهمی در طراحی هستند.
https://www.researchgate.net/publication/321234978/figure/fig1/AS:563666749333511@1511400033789/Partial-diagram-of-a-Xilinx-7-Series-configurable-logic-block-CLB-slice.png
✳️ بحث در رابطه با #CLB ها هنوز به پایان نرسیده و در مقاله بعدی به قابلیت های #CLB ها در انجام عملیات ریاضی و به خصوص عملکرد زنجیره بیت نقلی می پردازیم.
@Hexalinx
🔖 مقاله ایی که خدمتتان ارائه می گردد، با توجه به معماری تراشه های 7 Series و خانواده Spartan 6 تهیه شده است، معماری CLB ها در سایر تراشه های Xilinx تا حدودی متفاوت است، اگر چه شباهت هایی نیز وجود دارد.
تمامی تراشه های FPGA شرکت Xilinx دارای تعداد زیادی بلوک #CLB هستند که هر کدام متشکل از دو اسلایس #Slice هستند. هر اسلایس نیز شامل 4 عدد #LUT شش ورودی، 8 عدد فلیپ فلاپ #FLIP_FLOP ، یک زنجیره بیت نقلی #CARRY_CHAIN و تعدادی مالتی پلکسر عریض #WIDE_MULTIPLEXER است. ساختار داخلی یک LUT در شکل بالا نشان داده شده است.
همانطور که در شکل می بینیم، هر #LUT داری شش ورودی مستقل به نام های D1 تا D6 و دو خروجی مستقل به نام های O5 و O6 می باشد. هر #LUT قابلیت پیاده سازی یک تابع 6 ورودی با هر نوع پیچیدگی را دارد، مثلا تابع f را به صورت زیر در نظر بگیرد.
f=((D1 and D2) or (D3 and not(D4 or D5)) and D6)
با یک مرور کوتاه به درس مدار منطقی به یاد می آوریم که یک جدول درستی با شش ورودی می توانست 64 خروجی مختلف داشته باشد. در حقیقت #LUT ها در FPGA کاملا مشابه جداول درستی با شش ورودی عمل می کنند. علاوه بر این یک #LUT می تواند مشابه یک حافظه با 64 عنصر حافظه نیز عمل کند.
هنگام پیاده سازی یک تابع شش ورودی روی FPGA ، ابتدا جدول درستی این تابع توسط ابزار سنتز در ISE و یا Vivado ساخته می شود و سپس روی #LUT ها نگاشت می شود و در نهایت روی تراشه FPGA پیکره بندی می شود.
نکته دیگری که باید به آن اشاره کرد این است که همانطور که شکل بالا نشان می دهد. یک #LUT شش ورودی می تواند همانند دو عدد #LUT مستقل 5 ورودی نیز مورد استفاده قرار بگیرد، البته این 5 ورودی بین هر دو #LUT مشترک هستند ولی هر #LUT می تواند جدول درستی اختصاصی خودش و البته خروجی اختصاصی خودش یعنی O5 یا O6 را داشته باشد. در حالتی که تابع مورد نظر برای پیاده سازی نیاز به استفاده همزمان از هر دو #LUT داشته باشد، یک #LUT شش ورودی ساخته می شود و تنها خروجی O6 استفاده می شود، ولی در صورت استفاده تکی از #LUT ها هر دو خروجی بکار گرفته می شوند.
از سوی دیگر هر #LUT می تواند در نقش یک حافظه ROM یا RAM جهت ذخیره سازی 64 عدد تک بیت یا 32 عدد دو بیتی استفاده شود. در اینجا هم در حالت اول فقط خروجی O6 و در حالت دوم هر دو خروجی O5 و O6 به صورت همزمان استفاده می شوند. توجه داشته باشید هنگامی که تعداد محدودی عدد چند بیتی (مثلا 128 عدد بیتی) در یک ROM ذخیره می کنیم، در صورت کدنویسی صحیح (تاکید می کنم، حتما باید ساختار کد صحیح باشد) ابزار سنتز به صورت اتوماتیک از #LUT ها جهت این کار استفاده می کند و به نوعی یک حافظه توزیع شده #DISTRIBURD_RAM سنتز می شود ولی اگر تعداد اعداد از یک حدی بیشتر باشند حافظه ROM ما به بلوک های حافظه داخللی نگاشت می شود.
❗️ تعیین آستانه برای انتخاب بین یک حافظه توزیع شده یا بلوک های حافظه به موارد متعددی بستگی دارد که در مقاله ای جداگانه به آن پرداخته می شود.
با ترکیب هر چهار #LUT درون یک اسلایس می توان حافظه های بزرگتری با ظرفیت حداکثر 256 بیت بدون استفاده از هیچ نوع منابع اضافی روی تراشه فراخوانی کرد. همانطور که در شکل زیر نشان داده شده است.
❗️درون هر اسلایس سه مالتی پلکسر عریض با نام های
1⃣ #F7AMUX
2⃣ #F7BMUX
3⃣ #F8MUX
وجود دارد که برای ترکیب کردن خروجی #LUT ها و ساخت حافظه های 128 و 256 بیتی مورد استفاده قرار می گیرند، وجود این مالتی پلکسرهای عریض به طراح اجازه می دهد تا با ترکیب کردن #LUT ها توابع منطقی با 7 و یا 8 ورودی را نیز به راحتی درون یک اسلایس طراحی کند. نام گذاری مالتی پلکسرهای عریض با توجه به تعداد ورودی های آن ها صورت گرفته و عناصر بسیار مهمی در طراحی هستند.
https://www.researchgate.net/publication/321234978/figure/fig1/AS:563666749333511@1511400033789/Partial-diagram-of-a-Xilinx-7-Series-configurable-logic-block-CLB-slice.png
✳️ بحث در رابطه با #CLB ها هنوز به پایان نرسیده و در مقاله بعدی به قابلیت های #CLB ها در انجام عملیات ریاضی و به خصوص عملکرد زنجیره بیت نقلی می پردازیم.
@Hexalinx
#BARE_METAL
#Essentials
✅ آیا واژه bare-metal عنوان یک سیستم عامل است؟ طراحی یک سیستم bare-metal به چه معناست؟ آیا روی FPGA ها طراحی bare-metal انجام می شود؟
✳️ شاید برای شما هم پیش آمده باشد که در زمان مطالعه توصیف یک سیستم دیجیتال به واژه bare-metal برخورد کرده باشید و بدون اینکه معنای آن را درک کنید، از روی آن عبور کرده اید. بسیاری از دانشجویان و حتی طراحان با تجربه FPGA هم درک صحیحی از این واژه ندارند. 👇👇
@Hexalinx
#Essentials
✅ آیا واژه bare-metal عنوان یک سیستم عامل است؟ طراحی یک سیستم bare-metal به چه معناست؟ آیا روی FPGA ها طراحی bare-metal انجام می شود؟
✳️ شاید برای شما هم پیش آمده باشد که در زمان مطالعه توصیف یک سیستم دیجیتال به واژه bare-metal برخورد کرده باشید و بدون اینکه معنای آن را درک کنید، از روی آن عبور کرده اید. بسیاری از دانشجویان و حتی طراحان با تجربه FPGA هم درک صحیحی از این واژه ندارند. 👇👇
@Hexalinx
#Essentials
🔖 در این مقاله نحوه پیاده سازی یک جمع کننده را با استفاده از LUT ها بررسی می کنیم، توجه داشته باشید که عملیات جمع در کدنویسی Verilog و VHDL با عملگر + انجام می شود. اما مفهومی که در ادامه آموزش داده می شود نحوه نگاشت یک جمع کننده به CLB های درون تراشه FPGA است. آگاهی از این مساله باعث می شود، طراح کنترل بهتری روی منابع مصرفی روی تراشه داشته باشد.
از درس مدار منطقی بیاد داریم که یک جمع کننده n بیتی نیاز به n بلوک جکع کننده کامل دارد. یک جمع کننده کامل دو ورودی a و b را با ورودی نقلی cin جمع می کند و خروجی جمع sout و cout را تولید می کند. با فرض اینکه
P = a xor b
آنگاه برای sout و cout داریم:
Sout = (a xor b) xor cin = p xor cin
در شکل بالا نحوه پیاده سازی یک جمع کننده کامل با استفاده از یک LUT و زنجیره نقلی اطراف آن نشان داده شده است. واضح است که برای انجام یک جمع n بیتی، لازم است n بلوک کنار هم قرار بگیرند و خرجی نقلی i - ام به ورودی نقلی i+1 - ام متصل شود. ضمننا ورودی نقلی اولین جمع کننده کامل صفر است.
سوالی که مطرح می شود این است که علت قرار دادن زنجیره بیت نقلی در CLB ها (که هدف اصلی آن مشارکت در عملیات جمع است) بلافاصله بعد از LUT ها چیست؟ پیش تر اشاره کردیم که هر LUT دو خروجی مستقل O5 و O6 دارد که می توانند همزمان دو تابع 5 ورودی با ورودی های مشترک را پیاده سازی کنند. چرا مقدار cout با یکی از خروجی های این LUT ها تولید نمی شود؟
پاسخ به این سوال را باید در بحث مسیرهای بحرانی یا #CRITICAL_PATH جستجو کرد، اگر با مسیرهای بحرانی آشنا نیستید، لازم نیست نگران باشید، به زبان ساده مسیرهای بحرانی به طولانی ترین مسیرهای موجود روی تراشه اطلاق می شود. این مسیرهای طولانی باعث افزایش تاخیر انتشار و در نتیجه کاهش سرعت و کارایی مدار می شوند، کنترل این مسیرها یک تکنیک بسیار مهم در طراحی و از الزامات یک پیاده سازی خوب است، در آینده به شکل کاملتری این مساله توضیح داده می شود، پس اجازه بدهید به بحث اصلی برگردیم و پاسخمان را کمی بیشتر توضیح بدهیم. در عمل زنجیره بیت نقلی برای بالابردن سرعت محاسبات مورد استفاده قرار می گیرد، به لطف وجود زنجیره نقلی برای یک جمع کننده n بیتی، از n عدد LUT که به صورت ستونی زیر هم قرار گرفته اند استفاده می شود. مسیر بحرانی این مدار برابر با طول زنجیره نقلی می شود که خروجی cout را تولید می کند. واضح است که تاخیر جمع کننده در این حالت به شدت کاهش می یابد و مدار حاصل می تواند در فرکانس های بسیار بالا کار کند، حتی در مواردی که جمع کننده های بزرگ هم نیاز داشته باشیم بازهم کارایی مدار بسیار بالا خواهد بود.
در صورتی که زنجیره نقلی وجود نداشت و از LUT ها جهت تولید cout استفاده می شد، تاخیر نقلی خروجی ناشی از n عدد LUT بعلاوه مسیرهای routing مورد نیاز برای برقراری ارتباط بین آن ها بسیار زیاد می شد و با افزایش تعداد بیت ها فرکانس و کارایی مدار به شدت افت می کرد.
https://www.researchgate.net/profile/Raffaele_Giordano4/publication/291019054/figure/fig4/AS:536738776838151@1504979904869/The-CARRY4-primitive-available-in-7-Series-Xilinx-FPGAs.png
@Hexalinx
🔖 در این مقاله نحوه پیاده سازی یک جمع کننده را با استفاده از LUT ها بررسی می کنیم، توجه داشته باشید که عملیات جمع در کدنویسی Verilog و VHDL با عملگر + انجام می شود. اما مفهومی که در ادامه آموزش داده می شود نحوه نگاشت یک جمع کننده به CLB های درون تراشه FPGA است. آگاهی از این مساله باعث می شود، طراح کنترل بهتری روی منابع مصرفی روی تراشه داشته باشد.
از درس مدار منطقی بیاد داریم که یک جمع کننده n بیتی نیاز به n بلوک جکع کننده کامل دارد. یک جمع کننده کامل دو ورودی a و b را با ورودی نقلی cin جمع می کند و خروجی جمع sout و cout را تولید می کند. با فرض اینکه
P = a xor b
آنگاه برای sout و cout داریم:
Sout = (a xor b) xor cin = p xor cin
در شکل بالا نحوه پیاده سازی یک جمع کننده کامل با استفاده از یک LUT و زنجیره نقلی اطراف آن نشان داده شده است. واضح است که برای انجام یک جمع n بیتی، لازم است n بلوک کنار هم قرار بگیرند و خرجی نقلی i - ام به ورودی نقلی i+1 - ام متصل شود. ضمننا ورودی نقلی اولین جمع کننده کامل صفر است.
سوالی که مطرح می شود این است که علت قرار دادن زنجیره بیت نقلی در CLB ها (که هدف اصلی آن مشارکت در عملیات جمع است) بلافاصله بعد از LUT ها چیست؟ پیش تر اشاره کردیم که هر LUT دو خروجی مستقل O5 و O6 دارد که می توانند همزمان دو تابع 5 ورودی با ورودی های مشترک را پیاده سازی کنند. چرا مقدار cout با یکی از خروجی های این LUT ها تولید نمی شود؟
پاسخ به این سوال را باید در بحث مسیرهای بحرانی یا #CRITICAL_PATH جستجو کرد، اگر با مسیرهای بحرانی آشنا نیستید، لازم نیست نگران باشید، به زبان ساده مسیرهای بحرانی به طولانی ترین مسیرهای موجود روی تراشه اطلاق می شود. این مسیرهای طولانی باعث افزایش تاخیر انتشار و در نتیجه کاهش سرعت و کارایی مدار می شوند، کنترل این مسیرها یک تکنیک بسیار مهم در طراحی و از الزامات یک پیاده سازی خوب است، در آینده به شکل کاملتری این مساله توضیح داده می شود، پس اجازه بدهید به بحث اصلی برگردیم و پاسخمان را کمی بیشتر توضیح بدهیم. در عمل زنجیره بیت نقلی برای بالابردن سرعت محاسبات مورد استفاده قرار می گیرد، به لطف وجود زنجیره نقلی برای یک جمع کننده n بیتی، از n عدد LUT که به صورت ستونی زیر هم قرار گرفته اند استفاده می شود. مسیر بحرانی این مدار برابر با طول زنجیره نقلی می شود که خروجی cout را تولید می کند. واضح است که تاخیر جمع کننده در این حالت به شدت کاهش می یابد و مدار حاصل می تواند در فرکانس های بسیار بالا کار کند، حتی در مواردی که جمع کننده های بزرگ هم نیاز داشته باشیم بازهم کارایی مدار بسیار بالا خواهد بود.
در صورتی که زنجیره نقلی وجود نداشت و از LUT ها جهت تولید cout استفاده می شد، تاخیر نقلی خروجی ناشی از n عدد LUT بعلاوه مسیرهای routing مورد نیاز برای برقراری ارتباط بین آن ها بسیار زیاد می شد و با افزایش تعداد بیت ها فرکانس و کارایی مدار به شدت افت می کرد.
https://www.researchgate.net/profile/Raffaele_Giordano4/publication/291019054/figure/fig4/AS:536738776838151@1504979904869/The-CARRY4-primitive-available-in-7-Series-Xilinx-FPGAs.png
@Hexalinx
#Essentials
🔖 به صورت پیش فرض حافظه های توزیع شده دارای ورودی سنکرون و خروجی آسنکرون هستند، اما با استفاده از رجیسترهای موجود در خروجی هر اسلایس می توان خروجی ها را نیز به صورت سنکرون مورد استفاده قرار داد، این کار باعث بالا رفتن کارایی حافظه ها در سرعت های کلاک بالا می شود، اگر چه یک کلاک تاخیر در خروجی ایجاد می کند.
با توجه به نیازهای هر سیستم، مهندس طراح می تواند حافظه های توزیع شده در تراشه های سری 7 را به چهار صورت پیکره بندی کند که به شرح زیر است.
1️⃣ تک پورت: در این پیکره بندی از یک پورت برای خواندن آسنکرون و نوشتن سنکرون استفاده می شود
2️⃣ دو پورت: در این پیکره بندی یک پورت برای خواندن / نوشتن و یک پورت خواندن آسنکرون در نظر گرفته می شود
3️⃣ دو پورت ساده: در این پیکره بندی یک پورت برای نوشتن و یک پورت نیز برای خواندن آسنکرون در نظر گرفته می شود
4️⃣ چهار پورت: در این پیکره بندی یک پورت برای خواندن / نوشتن و سه پورت نیز برای خواندن آسنکرون در نظر گرفته می شود
❗️نحوه به اشتراک گذاری پورت های کنترلی و محدودیت های بکاگیری هر کدام از پیکره بندی های فوق خارج از حوصله این مقاله است و اطلاع از آن ها جز مهارت های تکمیلی یک مهندس پیاده ساز می باشد.
همانطور که قسمت اول مقاله هم اشاره کردیم، همه خانواده های تراشه های سری 7 از یک ساختار یکسان در بلوک های حافظه استفاده می کنند بلوک های حافظه همگی عملکرد سنکرون دارند، یعنی یک رجیستر در روی پورت خروجی این بلوک ها قرار داده شده است و هر بار که فرمان خواندن از این حافظه ها صادر شود، خروجی با یک کلاک تاخیر و البته سنکرون آماده می شود. این رجیستر پایپلاین نیز مشابه رجیستر اضافی در خروجی حافظه های توزیع شده عمل می کند و باعث افزایش کارایی حافظه در کاربردهای فرکانس بالا می شود.
ساختار بلوک های حافظه به صورت پیش فرض از دو پورت پشتیبانی می کند و هر دو پورت به یک فضای یکسان از حافظه دسترسی دارند. هر پورت دارای کلاک، ورودی آدرس، ورودی فعال ساز کلاک و ورودی فرمان مستقل برای خواندن از حافظه است.
حداکثر عرض بیت قابل پشتیبانی در این حافظه ها 72 بیت است. هر پورت می تواند برای پشتیبانی از عرض بیت مستقل پیکره بندی شود، علاوه بر این امکان نوشتن در این حافظه ها به صورت بایت به بایت نیز وجود دارد، یعنی می توان در یک آدرس از حافظه که توانایی ذخیره سازی مثلا 16 بیت را دارد، دو بار در یک کلاک مقادیر 8 بیتی نوشت. این قابلیت، یک مزیت بسیار کلیدی در هنگام استفاده از پردازنده کمکی همچون #Micoblaze فراهم می آورد.
حافظه های بلوکی به صورت های زیر قابل پیکره بندی هستند:
1️⃣ تک پورت: در این پیکره بندی از یک پورت برای خواندن و نوشتن به صورت سنکرون استفاده می شود
2️⃣ دو پورت ساده: در این پیکره بندی از یک پورت برای خواندن و از یک پورت برای نوشتن استفاده می شود، هر کدام از پورت ها دارای کلاک و سیگنال های کنترلی مستقل هستند.
3️⃣ دو پورت کامل: در این پیکره بندی دو پورت کاملا مستقل برای خواندن و نوشتن وجود دارد، کلاک ها و سیگنال های کنترلی هر دو پورت مستقل از هم هستند و حداکثر انعطاف پذیری را برای کنترل فرایند خواندن و نوشتن در اختیار کاربر قرار می دهند.
نوشتن در حافظه های بلوکی نیز می تواند با سه اولویت بندی متفاوت صورت بگیرد، این سه مد اولویت بندی عبارتند از:
1️⃣ مد WRITE_FIRST : داده نوشته شده در DIA روی DOA قرار می گیرد (به شکل مراجعه شود)
2️⃣ مد READ_FIRST : مقدار قبلی نوشته شده در حافظه در ADDRA روی DOA قرار می گیرد
3️⃣ مد NO_CHANGE : برای کاهش توان مصرفی در زمان نوشتن DOA همواره مقدار قبلیش را حفظ می کند
توضیح بییشتر و مقایسه این سه مد که بسیار مهم نیز هستند، در آینده خدمتتان ارائه می گردد. در این مقاله صرفا به معرفی اجمالی آن ها اکتفا می کنیم. ممکن است در نگاه اول فراگیری مطالب فوق کمی سخت به نظر برسد، که البته اینطور نیست و با کمی تکرار کاملا قابل درک است. ضمنا بد نیست به این نکته توجه داشته باشیم که هم حافظه های توزیع شده و هم حافظه های بلوکی با استفاده از IP Core های شرکت Xilinx قابل فراخوانی و سفارشی سازی هستند و طراح به راحتی می تواند با انتخاب پیکره بندی مورد نیازش به سریع ترین و بهینه ترین شکل ممکن حافظه ها را به کار بگیرد، با استفاده از IP Croe ها امکان فراخوانی پیکره بندی های اضافی با ترکیب کردن بلوک های حافظه و منابع منطقی نیز وجود دارد، که بهترین مثال آن پیکره بندی FIFO پرسرعت است.
https://forums.xilinx.com/t5/Embedded-Development-Tools/difference-between-distributed-and-block-ram/td-p/81867
@Hexalinx
🔖 به صورت پیش فرض حافظه های توزیع شده دارای ورودی سنکرون و خروجی آسنکرون هستند، اما با استفاده از رجیسترهای موجود در خروجی هر اسلایس می توان خروجی ها را نیز به صورت سنکرون مورد استفاده قرار داد، این کار باعث بالا رفتن کارایی حافظه ها در سرعت های کلاک بالا می شود، اگر چه یک کلاک تاخیر در خروجی ایجاد می کند.
با توجه به نیازهای هر سیستم، مهندس طراح می تواند حافظه های توزیع شده در تراشه های سری 7 را به چهار صورت پیکره بندی کند که به شرح زیر است.
1️⃣ تک پورت: در این پیکره بندی از یک پورت برای خواندن آسنکرون و نوشتن سنکرون استفاده می شود
2️⃣ دو پورت: در این پیکره بندی یک پورت برای خواندن / نوشتن و یک پورت خواندن آسنکرون در نظر گرفته می شود
3️⃣ دو پورت ساده: در این پیکره بندی یک پورت برای نوشتن و یک پورت نیز برای خواندن آسنکرون در نظر گرفته می شود
4️⃣ چهار پورت: در این پیکره بندی یک پورت برای خواندن / نوشتن و سه پورت نیز برای خواندن آسنکرون در نظر گرفته می شود
❗️نحوه به اشتراک گذاری پورت های کنترلی و محدودیت های بکاگیری هر کدام از پیکره بندی های فوق خارج از حوصله این مقاله است و اطلاع از آن ها جز مهارت های تکمیلی یک مهندس پیاده ساز می باشد.
همانطور که قسمت اول مقاله هم اشاره کردیم، همه خانواده های تراشه های سری 7 از یک ساختار یکسان در بلوک های حافظه استفاده می کنند بلوک های حافظه همگی عملکرد سنکرون دارند، یعنی یک رجیستر در روی پورت خروجی این بلوک ها قرار داده شده است و هر بار که فرمان خواندن از این حافظه ها صادر شود، خروجی با یک کلاک تاخیر و البته سنکرون آماده می شود. این رجیستر پایپلاین نیز مشابه رجیستر اضافی در خروجی حافظه های توزیع شده عمل می کند و باعث افزایش کارایی حافظه در کاربردهای فرکانس بالا می شود.
ساختار بلوک های حافظه به صورت پیش فرض از دو پورت پشتیبانی می کند و هر دو پورت به یک فضای یکسان از حافظه دسترسی دارند. هر پورت دارای کلاک، ورودی آدرس، ورودی فعال ساز کلاک و ورودی فرمان مستقل برای خواندن از حافظه است.
حداکثر عرض بیت قابل پشتیبانی در این حافظه ها 72 بیت است. هر پورت می تواند برای پشتیبانی از عرض بیت مستقل پیکره بندی شود، علاوه بر این امکان نوشتن در این حافظه ها به صورت بایت به بایت نیز وجود دارد، یعنی می توان در یک آدرس از حافظه که توانایی ذخیره سازی مثلا 16 بیت را دارد، دو بار در یک کلاک مقادیر 8 بیتی نوشت. این قابلیت، یک مزیت بسیار کلیدی در هنگام استفاده از پردازنده کمکی همچون #Micoblaze فراهم می آورد.
حافظه های بلوکی به صورت های زیر قابل پیکره بندی هستند:
1️⃣ تک پورت: در این پیکره بندی از یک پورت برای خواندن و نوشتن به صورت سنکرون استفاده می شود
2️⃣ دو پورت ساده: در این پیکره بندی از یک پورت برای خواندن و از یک پورت برای نوشتن استفاده می شود، هر کدام از پورت ها دارای کلاک و سیگنال های کنترلی مستقل هستند.
3️⃣ دو پورت کامل: در این پیکره بندی دو پورت کاملا مستقل برای خواندن و نوشتن وجود دارد، کلاک ها و سیگنال های کنترلی هر دو پورت مستقل از هم هستند و حداکثر انعطاف پذیری را برای کنترل فرایند خواندن و نوشتن در اختیار کاربر قرار می دهند.
نوشتن در حافظه های بلوکی نیز می تواند با سه اولویت بندی متفاوت صورت بگیرد، این سه مد اولویت بندی عبارتند از:
1️⃣ مد WRITE_FIRST : داده نوشته شده در DIA روی DOA قرار می گیرد (به شکل مراجعه شود)
2️⃣ مد READ_FIRST : مقدار قبلی نوشته شده در حافظه در ADDRA روی DOA قرار می گیرد
3️⃣ مد NO_CHANGE : برای کاهش توان مصرفی در زمان نوشتن DOA همواره مقدار قبلیش را حفظ می کند
توضیح بییشتر و مقایسه این سه مد که بسیار مهم نیز هستند، در آینده خدمتتان ارائه می گردد. در این مقاله صرفا به معرفی اجمالی آن ها اکتفا می کنیم. ممکن است در نگاه اول فراگیری مطالب فوق کمی سخت به نظر برسد، که البته اینطور نیست و با کمی تکرار کاملا قابل درک است. ضمنا بد نیست به این نکته توجه داشته باشیم که هم حافظه های توزیع شده و هم حافظه های بلوکی با استفاده از IP Core های شرکت Xilinx قابل فراخوانی و سفارشی سازی هستند و طراح به راحتی می تواند با انتخاب پیکره بندی مورد نیازش به سریع ترین و بهینه ترین شکل ممکن حافظه ها را به کار بگیرد، با استفاده از IP Croe ها امکان فراخوانی پیکره بندی های اضافی با ترکیب کردن بلوک های حافظه و منابع منطقی نیز وجود دارد، که بهترین مثال آن پیکره بندی FIFO پرسرعت است.
https://forums.xilinx.com/t5/Embedded-Development-Tools/difference-between-distributed-and-block-ram/td-p/81867
@Hexalinx
Xilinx
difference between distributed and block ram
hi all.. what is the difference between distributed and block ram while using FPGA? thanks
#Routeing
#Interconnect
#Essentials
✅ منابع متصل کننده(Interconnect Resources)
✳️ علاوه بر بلوک های قابل برنامه ریزی، حافظه ها، بلوک های ضرب کننده و منابع ورودی و خروجی، تراشه های FPGA دارای منابع بسیار مهم دیگری به نام منابع متصل کننده یا Interconnect Resources هستند. این منابع به صورت یک شبکه قابل برنامه ریزی وظیفه برقراری ارتباط بین ورودی ها، خروجی ها، و به طور کلی تمامی عناصر موجود درون تراشه را بر عهده دارند. این منابع تحت عنوان مسیر یا #routing شناخته می شوند. گام جانمایی و مسیر یابی #Place_and_Route در فرایند پیاده سازی در واقع به برنامه ریزی و بهینه سازی این منابع اختصاص دارد. نکته جالب اینجاست که این منابع به طور متوسط بیش از 60 درصد منابع درون FPGA را اشغال کرده اند. کنترل جزئیات فرایند #routing به شکل کامل در اختیار ابزارهای پیاده سازی است و به نوعی جز پتنت های شرکت سازنده محسوب می شود.
@Hexalinx
#Interconnect
#Essentials
✅ منابع متصل کننده(Interconnect Resources)
✳️ علاوه بر بلوک های قابل برنامه ریزی، حافظه ها، بلوک های ضرب کننده و منابع ورودی و خروجی، تراشه های FPGA دارای منابع بسیار مهم دیگری به نام منابع متصل کننده یا Interconnect Resources هستند. این منابع به صورت یک شبکه قابل برنامه ریزی وظیفه برقراری ارتباط بین ورودی ها، خروجی ها، و به طور کلی تمامی عناصر موجود درون تراشه را بر عهده دارند. این منابع تحت عنوان مسیر یا #routing شناخته می شوند. گام جانمایی و مسیر یابی #Place_and_Route در فرایند پیاده سازی در واقع به برنامه ریزی و بهینه سازی این منابع اختصاص دارد. نکته جالب اینجاست که این منابع به طور متوسط بیش از 60 درصد منابع درون FPGA را اشغال کرده اند. کنترل جزئیات فرایند #routing به شکل کامل در اختیار ابزارهای پیاده سازی است و به نوعی جز پتنت های شرکت سازنده محسوب می شود.
@Hexalinx
#Digital_Clock_Manager, #DCM
#Clock_Managment_Tile, #CMT
#Essentials
✅ معرفی منابع کلاک روی تراشه Spartan 6
✳️ تراشه Spartan 6 دارای دو شبکه کلاک کاملا متفاوت است.
1️⃣ شبکه اول Global Clock Network نام دارد و برای تامین کلاک واحدهای مختلف درون تراشه نظیر CLB ها و بلوک های حافظه بکار گرفته می شود. این شبکه می تواند حداکثر 16 کلاک متفاوت را پشتیبانی کند. حداکثر کلاک قابل پذیرش در این شبکه حدود 400 مگاهرتز است.
2️⃣ شبکه دوم IO Clock Network نام دارد و وظیفه آن تامین کلاک مورد نیاز برای بلوک های ورودی خروجی تراشه است. این شبکه قادر به پشتیبانی از قابلیت SerDes با حداکثر فرکانس کلاک 1 گیگاهرتز است که در ارتباطات پرسرعت مورد استفاده قرار می گیرند. اگر FPGA را به 4 قسمت تقسیم کنیم هر بخش دارای 8 بلوک کلاک IO است که در مجموع 32 بلوک کلاک IO می شود.
تراشه های Spartan 6 درای دو بلوک مدیریت کلاک به نام DCM و یک بلوک حلقه قفل فاز PLL در هر CMT هستند. در هر تراشه Spartan 6 بین یک تا شش CMT وجود دارد
@Hexalinx
#Clock_Managment_Tile, #CMT
#Essentials
✅ معرفی منابع کلاک روی تراشه Spartan 6
✳️ تراشه Spartan 6 دارای دو شبکه کلاک کاملا متفاوت است.
1️⃣ شبکه اول Global Clock Network نام دارد و برای تامین کلاک واحدهای مختلف درون تراشه نظیر CLB ها و بلوک های حافظه بکار گرفته می شود. این شبکه می تواند حداکثر 16 کلاک متفاوت را پشتیبانی کند. حداکثر کلاک قابل پذیرش در این شبکه حدود 400 مگاهرتز است.
2️⃣ شبکه دوم IO Clock Network نام دارد و وظیفه آن تامین کلاک مورد نیاز برای بلوک های ورودی خروجی تراشه است. این شبکه قادر به پشتیبانی از قابلیت SerDes با حداکثر فرکانس کلاک 1 گیگاهرتز است که در ارتباطات پرسرعت مورد استفاده قرار می گیرند. اگر FPGA را به 4 قسمت تقسیم کنیم هر بخش دارای 8 بلوک کلاک IO است که در مجموع 32 بلوک کلاک IO می شود.
تراشه های Spartan 6 درای دو بلوک مدیریت کلاک به نام DCM و یک بلوک حلقه قفل فاز PLL در هر CMT هستند. در هر تراشه Spartan 6 بین یک تا شش CMT وجود دارد
@Hexalinx
#Essentials
🔖پاسخ سوال فوق بله است. تمامی منابع و عناصر اصلی درون FPGA با کدنویسی قابل استنتاج نیستند. از نقطه نظر نحوه استنتاج منابع روی تراشه های FPGA به سه دسته تقسیم می شوند.
1️⃣ دسته اول منابعی هستند که توسط تمامی ابزارهای سنتز قابل استنتاج هستند. مثل شیفیت رجیسترها #SRLs ، مالتی پلکسرهای عریض #F7 و #F8 ، زنجیره بیت نقلی #Carry_Chain ، بلوک های ضرب کننده #DSP_Blocks ، بافرهای سرتاسری کلاک #BUFG ، بافرهای ورودی خروجی ساده #IOBUF و بافرهای ورودی DDR یا #IDDR .
2️⃣ دسته دوم منابعی هستند که تنها توسط برخی از ابزارهای سنتز قابل فراخوانی هستند. مهمترین عناصر در این دسته،
بلوک های حافظه #Block_RAMs ، بافرهای سرتاسری خاص منظوره کلاک
همچون #BUFGCE هستن. علاوه بر این برخی از فانکشنالیتی های خاص در بلوک های ضرب کننده نیز ممکن است توسط ابزارهای سنتز قابل استنتاج باشد.
3️⃣ دسته سوم منابعی هستند که به هیچ وجه به صورت اتوماتیک توسط ابزارهای سنتز قابل استنتاج نیستند و تنها راه استفاده از آن ها استفاده از primitive های آماده داخل کتابخانه های شرکت سازنده و یا استفاده از IP Core ها است. از آن جمله می توان به اینترفیس های تفاضلی روی IO ها ، بافرهای خروجی DDR یا #ODDR ، بلوک های مدیریت کلاک #DCM و #PLL و بافرهای محلی کلاک همچون #BUFR و #BUFIO اشاره کرد.
❗️استفاده از primitive ها در برنامه نویسی HDL یک تکنیک بسیار مناسب برای فراخوانی منابع است و به شدت توسط سازندگانی تراشه های قابل برنامه ریزی توصیه شده است. در واقع primitive ها به صورت قطعه کدهای آماده و در قالب یک کامپوننت توسط طراح بین سایر کدهای HDL قرار داده می شوند و یک بخش خاص از تراشه را فراخوانی می کنند. به طور کلی به عمل فراخوانی و قرار دادن کامپوننت ها درون کدها instantiation گفته می شود.
@Hexalinx
🔖پاسخ سوال فوق بله است. تمامی منابع و عناصر اصلی درون FPGA با کدنویسی قابل استنتاج نیستند. از نقطه نظر نحوه استنتاج منابع روی تراشه های FPGA به سه دسته تقسیم می شوند.
1️⃣ دسته اول منابعی هستند که توسط تمامی ابزارهای سنتز قابل استنتاج هستند. مثل شیفیت رجیسترها #SRLs ، مالتی پلکسرهای عریض #F7 و #F8 ، زنجیره بیت نقلی #Carry_Chain ، بلوک های ضرب کننده #DSP_Blocks ، بافرهای سرتاسری کلاک #BUFG ، بافرهای ورودی خروجی ساده #IOBUF و بافرهای ورودی DDR یا #IDDR .
2️⃣ دسته دوم منابعی هستند که تنها توسط برخی از ابزارهای سنتز قابل فراخوانی هستند. مهمترین عناصر در این دسته،
بلوک های حافظه #Block_RAMs ، بافرهای سرتاسری خاص منظوره کلاک
همچون #BUFGCE هستن. علاوه بر این برخی از فانکشنالیتی های خاص در بلوک های ضرب کننده نیز ممکن است توسط ابزارهای سنتز قابل استنتاج باشد.
3️⃣ دسته سوم منابعی هستند که به هیچ وجه به صورت اتوماتیک توسط ابزارهای سنتز قابل استنتاج نیستند و تنها راه استفاده از آن ها استفاده از primitive های آماده داخل کتابخانه های شرکت سازنده و یا استفاده از IP Core ها است. از آن جمله می توان به اینترفیس های تفاضلی روی IO ها ، بافرهای خروجی DDR یا #ODDR ، بلوک های مدیریت کلاک #DCM و #PLL و بافرهای محلی کلاک همچون #BUFR و #BUFIO اشاره کرد.
❗️استفاده از primitive ها در برنامه نویسی HDL یک تکنیک بسیار مناسب برای فراخوانی منابع است و به شدت توسط سازندگانی تراشه های قابل برنامه ریزی توصیه شده است. در واقع primitive ها به صورت قطعه کدهای آماده و در قالب یک کامپوننت توسط طراح بین سایر کدهای HDL قرار داده می شوند و یک بخش خاص از تراشه را فراخوانی می کنند. به طور کلی به عمل فراخوانی و قرار دادن کامپوننت ها درون کدها instantiation گفته می شود.
@Hexalinx
#Jitter
#Essentials
✅ به طور کلی سیگنال کلاک غالبا با دو پارامتر فرکانس یا پریود و دوره تناوب (Duty Cycle) معرفی می شود. اما این دو پارامتر تنها مشخصه های کلاسیک یک سیگنال کلاک هستند. مفهوم کلاک جیتر #jitter یکی دیگر از مشخصه هایی است که در توصیف میزان دقت یک سیگنال کلاک یا منبع تولید کننده کلاک ارائه می شود. کلاک جیتر بیانگر میزان انحراف لبه های کلاک از موقعیت ایده آل خودشان است، به عبارت ساده تر کم یا زیاد شدن یک پریود کلاک به دلیل جابجایی مثبت یا منفی لبه های بالا و پایین رونده کلاک.
❗️این پدیده غالبا به دلیل نویز موجود در منبع تولید کننده کلاک، نویز مدارات تغذیه و یا اختلالات ناشی از مدارهای جانبی در یک سیستم رخ می دهد. در طراحی FPGA جیتر غالبا به صورت یک پارامتر و تحت عنوان جیتر ورودی برای ابزار پیاده سازی تعریف می شود، و تعیین دقیق آن نقش مهمی در دستیابی به زمانبندی مناسب در یک طراحی ایفا می کند.
@Hexalinx
#Essentials
✅ به طور کلی سیگنال کلاک غالبا با دو پارامتر فرکانس یا پریود و دوره تناوب (Duty Cycle) معرفی می شود. اما این دو پارامتر تنها مشخصه های کلاسیک یک سیگنال کلاک هستند. مفهوم کلاک جیتر #jitter یکی دیگر از مشخصه هایی است که در توصیف میزان دقت یک سیگنال کلاک یا منبع تولید کننده کلاک ارائه می شود. کلاک جیتر بیانگر میزان انحراف لبه های کلاک از موقعیت ایده آل خودشان است، به عبارت ساده تر کم یا زیاد شدن یک پریود کلاک به دلیل جابجایی مثبت یا منفی لبه های بالا و پایین رونده کلاک.
❗️این پدیده غالبا به دلیل نویز موجود در منبع تولید کننده کلاک، نویز مدارات تغذیه و یا اختلالات ناشی از مدارهای جانبی در یک سیستم رخ می دهد. در طراحی FPGA جیتر غالبا به صورت یک پارامتر و تحت عنوان جیتر ورودی برای ابزار پیاده سازی تعریف می شود، و تعیین دقیق آن نقش مهمی در دستیابی به زمانبندی مناسب در یک طراحی ایفا می کند.
@Hexalinx
#Essentials
#Pipelining
✅ مفهوم پایپلاینینگ
✳️ پایپلاینینگ فرایندی است که اجرای موازی دستورات را در یک برنامه محاسباتی امکان پذیر میکند. این مفهوم اولین بار برای پردازندهها معرفی شد ولی جایگاه ویژهای در پیادهسازی الگوریتمهای پردازشی در FPGA دارد.
پایپلاینینگ در FPGA، با شکل دادن یک چیدمان خاص از بلوکهای ضرب کننده و پروسسهای محاسباتی در یک ماژول یا فانکشن انجام میشود. برای این کار ابتدا باید بخشی از مدار را که به دنبال پایپلاین کردن آن هستیم به بخشهای کوچکتر تقسیم کنیم. سپس این بخشها را با استفاده از رجیستر از هم جدا کنیم. تاخیر ایجاد شده در تمامی مسیرها باید باهم برابر باشد.
🔖 علاوه بر افزایش ظرفیت پردازشی پایپلاینینگ باعث بهبود سرعت سیستم نیز میشود.
@Hexalinx
#Pipelining
✅ مفهوم پایپلاینینگ
✳️ پایپلاینینگ فرایندی است که اجرای موازی دستورات را در یک برنامه محاسباتی امکان پذیر میکند. این مفهوم اولین بار برای پردازندهها معرفی شد ولی جایگاه ویژهای در پیادهسازی الگوریتمهای پردازشی در FPGA دارد.
پایپلاینینگ در FPGA، با شکل دادن یک چیدمان خاص از بلوکهای ضرب کننده و پروسسهای محاسباتی در یک ماژول یا فانکشن انجام میشود. برای این کار ابتدا باید بخشی از مدار را که به دنبال پایپلاین کردن آن هستیم به بخشهای کوچکتر تقسیم کنیم. سپس این بخشها را با استفاده از رجیستر از هم جدا کنیم. تاخیر ایجاد شده در تمامی مسیرها باید باهم برابر باشد.
🔖 علاوه بر افزایش ظرفیت پردازشی پایپلاینینگ باعث بهبود سرعت سیستم نیز میشود.
@Hexalinx