#CLB, #LUT
#DISTRIBUTED_RAM
✅ آیا تا به حال به این فکر کرده اید که توابع منطقی مانند f = x1 and x2 در FPGA به چه صورت پیاده سازی می شوند؟ آیا به نظر شما در FPGA گیت AND ، OR یا هر نوع گیت دیگری برای اینکار وجود دارد؟ اگر وجود دارد این گیت ها کجا هستند؟
✳️ در پاسخ به این سوال باید گفت، خیر، در FPGA گیت های مجزا برای این نوع عملیات منطقی و حتی عملیات منطقی پیچیده تر وجود ندارد، و در عمل بلوک های منطقی قابل پیکره بندی یا همان #CLB ها وظیفه اصلی پیاده سازی توابع منطقی با هر نوع پیچیدگی را بر عهده دارند. در این مقاله می خواهم به شکلی دقیق تر به مرور ساختار داخلی #CLB ها بپردازم، و نحوه پیاده سازی توابع منطقی با استفاده از این بلوک ها و همچنین نحوه بکارگیری این بلوک ها برای جهت ساختن یک حافظه را بررسی کنم.
@Hexalinx
#DISTRIBUTED_RAM
✅ آیا تا به حال به این فکر کرده اید که توابع منطقی مانند f = x1 and x2 در FPGA به چه صورت پیاده سازی می شوند؟ آیا به نظر شما در FPGA گیت AND ، OR یا هر نوع گیت دیگری برای اینکار وجود دارد؟ اگر وجود دارد این گیت ها کجا هستند؟
✳️ در پاسخ به این سوال باید گفت، خیر، در FPGA گیت های مجزا برای این نوع عملیات منطقی و حتی عملیات منطقی پیچیده تر وجود ندارد، و در عمل بلوک های منطقی قابل پیکره بندی یا همان #CLB ها وظیفه اصلی پیاده سازی توابع منطقی با هر نوع پیچیدگی را بر عهده دارند. در این مقاله می خواهم به شکلی دقیق تر به مرور ساختار داخلی #CLB ها بپردازم، و نحوه پیاده سازی توابع منطقی با استفاده از این بلوک ها و همچنین نحوه بکارگیری این بلوک ها برای جهت ساختن یک حافظه را بررسی کنم.
@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
#CLB, #LUT
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@Hexalinx
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@Hexalinx
همراهان عزیز هگزالینکس:
برای جستجو در مطالب منتشر در کانال میتوانید از کلید واژهها یا هشتگ های زیر استفاده کنید. امیدوارم آموزشهای تخصصی هگزالینکس در این مدت انتظارات شما را برآورده کرده باشد.
دسته بندی بر اساس سطح و پیچیدگی مطالب:
#Basic
#Essentials
#Intermediate
#Advanced
دسته بندی براساس ابزارهای طراحی
#VIVADO_HLS
#SYSGEN
#VITIS
#VIVADO
#ISE
#ISIM
#SDSoC
دسته بندی موضوعی
#FIR
#FILTER
#PETALINUX
#LINUX
#AXI
#AXIVIP
#AXI_Lite
#CDC
#Clock_Domain_Crossing
#FIXED_POINT
#CHIPSCOPE
#TCL
#DDR
#ZYNQ
#IOB
#Barrel_Shifter
#wire_bonding
#Pipelining
#device_tree
#Clock_Gating
#Clock
#Reset
#Fanout
#Digital_Filter
#Static_Timing_Paths
#Clock_skew
#U_BOOT
#SSBL
#BUFGCE
#BUFHCE
#MUX
#DCM
#CMT
#QEMU
#BARE_METAL
#CLB
#LUT
#DISTRIBUTED_RAM
#PYNQ
#HLS
#ILA
#VIO
#STA
@Hexalinx
برای جستجو در مطالب منتشر در کانال میتوانید از کلید واژهها یا هشتگ های زیر استفاده کنید. امیدوارم آموزشهای تخصصی هگزالینکس در این مدت انتظارات شما را برآورده کرده باشد.
دسته بندی بر اساس سطح و پیچیدگی مطالب:
#Basic
#Essentials
#Intermediate
#Advanced
دسته بندی براساس ابزارهای طراحی
#VIVADO_HLS
#SYSGEN
#VITIS
#VIVADO
#ISE
#ISIM
#SDSoC
دسته بندی موضوعی
#FIR
#FILTER
#PETALINUX
#LINUX
#AXI
#AXIVIP
#AXI_Lite
#CDC
#Clock_Domain_Crossing
#FIXED_POINT
#CHIPSCOPE
#TCL
#DDR
#ZYNQ
#IOB
#Barrel_Shifter
#wire_bonding
#Pipelining
#device_tree
#Clock_Gating
#Clock
#Reset
#Fanout
#Digital_Filter
#Static_Timing_Paths
#Clock_skew
#U_BOOT
#SSBL
#BUFGCE
#BUFHCE
#MUX
#DCM
#CMT
#QEMU
#BARE_METAL
#CLB
#LUT
#DISTRIBUTED_RAM
#PYNQ
#HLS
#ILA
#VIO
#STA
@Hexalinx