#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
#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
🔖 سیستم عامل bare-metal
واژه سیستم های bare-metal به سیستم هایی اطلاق می گردد که فاقد سیستم عامل هستند، در این سیستم ها بخش نرم افزاری سیستم نیاز به تعداد زیادی ویژگی ندارد ( مثلا ویژگی های شبکه سازی یا networking که تقریبا به صورت پیش فرض در تمام سیستم عامل ها وجود دارد). به طور کلی سیستم عامل مقدار محدودی از ظرفیت پردازشی پردازنده را مصرف می کند و عدم قطعیت بیشتری نسبت به سایر برنامه های نرم افزاری ساده دارد. اما برخی از سیستم ها مجاز به تحمل این سربار هر چند کوچک ناشی از سیستم عامل نیز، نیستند. این درحالیست که همگام با افزایش پردازش در سیستم های نهفته سربار سیستم عامل ها نیز روز به روز به کاهش می یابد. اما با این وجود بازهم برخی از طراحان به منظور کاهش پیچیدگی های سیستمی در طراحی خود از سیستم عامل استفاده نمی کنند و تمامی ظرفیت پردازشی را صرف هدف اصلی سیستم می کنند، این کاری است که ما تقریبا به صورت معمول برای تمام طراحی های مبتنی بر FPGA استفاده می کینم. پس می توان نتیجه گرفت، طراحی روی FPGA ذاتا bare-metal است مگر اینکه از یک Microblaze و سیستم عامل در آن بهره گرفته شود.
@Hexalinx
واژه سیستم های bare-metal به سیستم هایی اطلاق می گردد که فاقد سیستم عامل هستند، در این سیستم ها بخش نرم افزاری سیستم نیاز به تعداد زیادی ویژگی ندارد ( مثلا ویژگی های شبکه سازی یا networking که تقریبا به صورت پیش فرض در تمام سیستم عامل ها وجود دارد). به طور کلی سیستم عامل مقدار محدودی از ظرفیت پردازشی پردازنده را مصرف می کند و عدم قطعیت بیشتری نسبت به سایر برنامه های نرم افزاری ساده دارد. اما برخی از سیستم ها مجاز به تحمل این سربار هر چند کوچک ناشی از سیستم عامل نیز، نیستند. این درحالیست که همگام با افزایش پردازش در سیستم های نهفته سربار سیستم عامل ها نیز روز به روز به کاهش می یابد. اما با این وجود بازهم برخی از طراحان به منظور کاهش پیچیدگی های سیستمی در طراحی خود از سیستم عامل استفاده نمی کنند و تمامی ظرفیت پردازشی را صرف هدف اصلی سیستم می کنند، این کاری است که ما تقریبا به صورت معمول برای تمام طراحی های مبتنی بر FPGA استفاده می کینم. پس می توان نتیجه گرفت، طراحی روی FPGA ذاتا bare-metal است مگر اینکه از یک Microblaze و سیستم عامل در آن بهره گرفته شود.
@Hexalinx
#Basic
✅ معرفی اجمالی جریان طراحی روی FPGA
معمولا یکی از اولین دروسی که در دوره های مقدماتی FPGA ارائه می شود، آشنا کردن دانشجویان با گام های پیاده سازی است. در مقاله کوتاهی که در ادامه خدمتتان اراده می شود، فهرستی از گام های مورد نیاز برای اجرای صفر تا صد یک پروژه روی FPGA به صورت خلاصه توضیح داده می شود.
@Hexalinx
✅ معرفی اجمالی جریان طراحی روی FPGA
معمولا یکی از اولین دروسی که در دوره های مقدماتی FPGA ارائه می شود، آشنا کردن دانشجویان با گام های پیاده سازی است. در مقاله کوتاهی که در ادامه خدمتتان اراده می شود، فهرستی از گام های مورد نیاز برای اجرای صفر تا صد یک پروژه روی FPGA به صورت خلاصه توضیح داده می شود.
@Hexalinx
#FPGA_FLOW
🔖 بخش اول
❗️ گام اول، طراحی دیجیتال عملکرد مورد انتظار سیستم توسط مهندس طراح است، برای طراحی مناسب دو دسته اطلاعات نیاز داریم، 1- دانش های آکادمیک طراحی دیجیتال و 2- شناخت کافی از معماری و قابلیت های تراشه هدف. علاوه بر این الزامات پروژه و محدودیت های آن نیز باید در نظر گرفته شود، در عمل این گام مهمترین گام طراحی است در حالی کمتر به آن توجه می شود.
❗️ گام دوم کد نویسی به زبان VHDL و یا Verilog است، در این گام طراح علاوه بر تسلط به زبان توصیف سخت افزاری باید با اصول استفاده از IP Core ها، نحوه به اشتراک گذاری منابع، نحوه فراخوانی عناصر پایه موجود در تراشه نظیر بلوک های ضرب کننده و بافرهای کلاک و غیره آشنا باشد، وجه تمایز یک برنامه نویس خوب با برنامه نویس معمولی دقیقا در این گام نمایان می شود. این گام عملا دومین گام مهم در طراحی است.
❗️ گام سوم به کدنویسی و طراحی testbench اختصاص دارد. در طراحی های دیجیتال پیچیده، طراحی testbench به اندازه طراحی خود سیستم پرچالش و حائز اهمیت است، به صورت پیش فرض به محض اینکه حرف از تست مدار به میان می آید، فکر می کنیم وظیفه ما اثبات عملکرد صحیح مدار است، در حالی که این باور کاملا اشتباه است، در حقیقت ما با نوشتن testbench و انجام شبیه سازی های سخت گیرانه به دنبال پیدا کردن خطاهای احتمالی سیستم هستیم و تنها زمانی می توانیم از صحت کارکرد سیستم اطمینان حاصل کنیم که هیچ خطایی پیدا نکنیم. فراموش نکنیم توانمندی در نوشتن testbench خوب یک هنر است. این قضیه به حدی مهم است که زبان هایی همچون System Verilog و System C به طور اختصاصی برای این منظور توسعه داده شده اند.
❗️ گام چهار کامپایل یا سنتز کدها توسط ابزار سنتز است. خروجی این مرحله نت لیست سنتز نام دارد و توصیفی از منابع مورد نیاز برای پیاده سازی سیستم روی تراشه را تولید می کند. به صورت پیش فرض طراح هیچ نقشی در این گام ایفا نمی کند، مگر اینکه نیاز باشد با اعمال یکسری تنظیمات روی ابزار سنتز عملکرد آن را سفارشی کند، اعمال این تنظیمات غالبا نیاز به تسلط مهندس طراح به ابزار سنتز مورد استفاده دارد. طراح برای مسلط شدن به این تنظیمات نیازمند اجرای پروژه های عملی متعدد و صرف زمان کافی است.
❗️ گام پنجم بازهم به شبیه سازی کارکرد مدار اختصاص دارد ولی تقریبا هیچ گاه توسط مهندسان طراح در یک پروژه عملی اجرا نمی شود، این گام تنها در پروژه های آکادمیک و دانشگاهی جهت شبیه سازی عملکرد سیستم بعد از سنتز اجرا می شود. به صورت کلی بعد از سنتز با اعمال تاخیر ذاتی گیت ها و ریست اولیه به سیستم رفتار طرح تا حدودی دستخوش تغییر می شود.
در بخش دوم مقاله که فردا منتشر می شود گام های بعدی توضیح داده می شود، از همراهی شما سپاسگزاریم
@Hexalinx
🔖 بخش اول
❗️ گام اول، طراحی دیجیتال عملکرد مورد انتظار سیستم توسط مهندس طراح است، برای طراحی مناسب دو دسته اطلاعات نیاز داریم، 1- دانش های آکادمیک طراحی دیجیتال و 2- شناخت کافی از معماری و قابلیت های تراشه هدف. علاوه بر این الزامات پروژه و محدودیت های آن نیز باید در نظر گرفته شود، در عمل این گام مهمترین گام طراحی است در حالی کمتر به آن توجه می شود.
❗️ گام دوم کد نویسی به زبان VHDL و یا Verilog است، در این گام طراح علاوه بر تسلط به زبان توصیف سخت افزاری باید با اصول استفاده از IP Core ها، نحوه به اشتراک گذاری منابع، نحوه فراخوانی عناصر پایه موجود در تراشه نظیر بلوک های ضرب کننده و بافرهای کلاک و غیره آشنا باشد، وجه تمایز یک برنامه نویس خوب با برنامه نویس معمولی دقیقا در این گام نمایان می شود. این گام عملا دومین گام مهم در طراحی است.
❗️ گام سوم به کدنویسی و طراحی testbench اختصاص دارد. در طراحی های دیجیتال پیچیده، طراحی testbench به اندازه طراحی خود سیستم پرچالش و حائز اهمیت است، به صورت پیش فرض به محض اینکه حرف از تست مدار به میان می آید، فکر می کنیم وظیفه ما اثبات عملکرد صحیح مدار است، در حالی که این باور کاملا اشتباه است، در حقیقت ما با نوشتن testbench و انجام شبیه سازی های سخت گیرانه به دنبال پیدا کردن خطاهای احتمالی سیستم هستیم و تنها زمانی می توانیم از صحت کارکرد سیستم اطمینان حاصل کنیم که هیچ خطایی پیدا نکنیم. فراموش نکنیم توانمندی در نوشتن testbench خوب یک هنر است. این قضیه به حدی مهم است که زبان هایی همچون System Verilog و System C به طور اختصاصی برای این منظور توسعه داده شده اند.
❗️ گام چهار کامپایل یا سنتز کدها توسط ابزار سنتز است. خروجی این مرحله نت لیست سنتز نام دارد و توصیفی از منابع مورد نیاز برای پیاده سازی سیستم روی تراشه را تولید می کند. به صورت پیش فرض طراح هیچ نقشی در این گام ایفا نمی کند، مگر اینکه نیاز باشد با اعمال یکسری تنظیمات روی ابزار سنتز عملکرد آن را سفارشی کند، اعمال این تنظیمات غالبا نیاز به تسلط مهندس طراح به ابزار سنتز مورد استفاده دارد. طراح برای مسلط شدن به این تنظیمات نیازمند اجرای پروژه های عملی متعدد و صرف زمان کافی است.
❗️ گام پنجم بازهم به شبیه سازی کارکرد مدار اختصاص دارد ولی تقریبا هیچ گاه توسط مهندسان طراح در یک پروژه عملی اجرا نمی شود، این گام تنها در پروژه های آکادمیک و دانشگاهی جهت شبیه سازی عملکرد سیستم بعد از سنتز اجرا می شود. به صورت کلی بعد از سنتز با اعمال تاخیر ذاتی گیت ها و ریست اولیه به سیستم رفتار طرح تا حدودی دستخوش تغییر می شود.
در بخش دوم مقاله که فردا منتشر می شود گام های بعدی توضیح داده می شود، از همراهی شما سپاسگزاریم
@Hexalinx
#FPGA_FLOW
🔖 بخش دوم
❗️گام ششم، پیاده سازی طرح توسط ابزارهای پیاده سازی است، ابزارهای پیاده سازی منحصرا توسط شرکت های سازنده تراشه های FPGA تولید می شوند. این ابزارها با توجه به تکنولوژی ساخت تراشه و یکسری الگوریتم هوشمند اقدام به پیاده سازی مدارات دیجتال روی تراشه هدف می کنند. فرایند پیاده سازی در سه فاز انجام می شود، در فاز اول نت لیست های تولید شده در گام چهارم در غالب یک نت لیست واحد با هم ترکیب می شوند، سپس در فاز دوم عمل نگاشت این نت لیست به منابع داخل تراشه انجام می شود و در فاز سوم جانمایی مناسب منابع روی تراشه و مسیریابی بین آن ها انجام می شود. تعیین موقعیت پورت های سیستم روی پین های تراشه نیز در همین گام انجام می شود. همچون مرحله سنتز هر سه فاز پیاده سازی به صورت اتوماتیک توسط ابزار پیاده سازی اجرا می شود، اما یک تفاوت بسیار مهم وجود دارد. پیاده سازی مدارات روی تراشه با توجه به یکسری استراتژی صورت می پذیرد، که جزئیات این استراتژی ها توسط طراح قابل کنترل است. در اکثر موارد پیاده سازی با تنظیمات پیش فرض با موفقیت همراه است، اما در صورتی که نتایج مطلوب حاصل نشود، کار کمی سخت می شود. طراحان حرفه ای در گام پیاده سازی با تعریف یکسری قیود ابزار پیاده سازی را به صورت سفارشی راهنمایی می کنند، تا در نهایت بهترین جانمایی و مسیریابی ممکن حاصل شود. دو پارامتر مهم برای سنجش موفقیت یا عدم موفقیت در گام پیاده سازی وجود دارد، که اولی دستیابی به فرکانس کاری مطلوب و دومی به حداقل رساندن منابع مصرفی روی تراشه است. به طور کلی گستره وسیعی از تنطیمات باید در این گام انجام شود، و طراح باید با دقت عملکرد و کارایی مورد نظرش را برای ابزار توصیف کند تا خروجی کار مطلوب باشد، این گام سومین گام مهم در طراحی است.
❗️در گام هفتم طراح برای سنجش صحت عملکرد سیستم بعد از اتمام فاز جانمایی و مسیریابی، اقدام به شبیه سازی زمانی سیستم می کند، در این شبیه سازی رفتار واقعی سیستم روی تراشه در محیط نرم افزاری بررسی می شود، مثال های متعددی وجود دارد که در آن با وجود عملکرد صحیح مدار در گام سوم، در این گام پاسخ مطلوب حاصل نمی شود، دلیل آن نیز غالبا زیاد بودن تاخیرهای موجود در سیستم است. بخش قابل ملاحظه ای از این تاخیرها به دلیل جانمایی نامناسب و طولانی بودن مسیرهای ارتباطی بین عناصر است. در صورت بروز چنین مشکلی عملا کل طرح زیر سوال می رود و لازم است یک بازنگری کامل روی مسیرهای بحرانی و گلوگاه های طراحی صورت بپذیرد. البته لازم به ذکر است که این مرحله اغلب توسط طراحان با تجربه که تا حدود زیادی به صحت عملکرد سیستم اطمینان دارند، اجرا نمی شود، دلیل اصلی آن نیز کند بودن بیش از حد پروسه شبیه سازی زمانی است، برای مدارهای با پیچیدگی متوسط ممکن است این شبیه سازی یک روز کامل زمان نیاز داشته باشد.
❗️گام هشتم به تولید بیت فایل خروجی و پیکره بندی تراشه FPGA اختصاص دارد، تنظیماتی که طراح در این بخش انجام می دهد نسبتا محدود است و غالبا در ارتباط با فرمت فایل پیکره بندی خروجی است، در این گام کاربر با توجه به تراشه FPGA خود فرمت فایل خروجی را انتخاب و به صورت اتوماتیک با چند کلیک فایل را روی تراشه پیکره بندی یا در اصطلاح دانلود می کند، از آنجایی که تراشه های FPGA دارای حافطه دائمی نیستند معمولا از یک حافظه جانبی برای ذخیزه سازی فایل پیکره بندی و انتقال آن به FPGA استفاده می شود، از این رو انتظار می رود مهندس طراح فایل مناسب برای حافظه های فلش جانبی را نیز تولید کند.
❗️اگر خوش شانس باشیم و همه فرضیات طراحی را درست اجرا کرده باشیم، نیازی به اجرای گام نهم نداریم، در پروژه های کوچک که تعداد فانکشن های سیستم محدود است و یک عملکرد نه چندان پیچیده مورد نیاز است، می توانیم به خوش شانسی خودمان امیدورام باشیم، اما اگر فقط کمی تعداد ورودی خروجی ها و سیگنال های کنترلی سیستم افزایش پیدا کند، بروز خطا کاملا اجتناب ناپذیر می شود، به این ترتیب برای پیدا کردن منشا خطا چاره ای به جز اجرای گام نهم نداریم، در گام نهم طراح با توجه به شناخت خودش از سیستم اقدام به خطایابی سخت افزاری می کند، یعنی با بررسی و مانیتور کردن مدارات پیاده سازی شده روی FPGA به دنبال دلیل بروز خطا می گردد، موفقیت در این مرحله به معنای اتمام کامل کار طراحی و پیاده سازی یک پروژه است. دو IP Core معروف ILA و VIO به عنوان مهمترین ابزارهای خطایابی Xilinx به شکل گسترده ای در این گام مورد استفاده قرار می گیرند.
@Hexalinx
🔖 بخش دوم
❗️گام ششم، پیاده سازی طرح توسط ابزارهای پیاده سازی است، ابزارهای پیاده سازی منحصرا توسط شرکت های سازنده تراشه های FPGA تولید می شوند. این ابزارها با توجه به تکنولوژی ساخت تراشه و یکسری الگوریتم هوشمند اقدام به پیاده سازی مدارات دیجتال روی تراشه هدف می کنند. فرایند پیاده سازی در سه فاز انجام می شود، در فاز اول نت لیست های تولید شده در گام چهارم در غالب یک نت لیست واحد با هم ترکیب می شوند، سپس در فاز دوم عمل نگاشت این نت لیست به منابع داخل تراشه انجام می شود و در فاز سوم جانمایی مناسب منابع روی تراشه و مسیریابی بین آن ها انجام می شود. تعیین موقعیت پورت های سیستم روی پین های تراشه نیز در همین گام انجام می شود. همچون مرحله سنتز هر سه فاز پیاده سازی به صورت اتوماتیک توسط ابزار پیاده سازی اجرا می شود، اما یک تفاوت بسیار مهم وجود دارد. پیاده سازی مدارات روی تراشه با توجه به یکسری استراتژی صورت می پذیرد، که جزئیات این استراتژی ها توسط طراح قابل کنترل است. در اکثر موارد پیاده سازی با تنظیمات پیش فرض با موفقیت همراه است، اما در صورتی که نتایج مطلوب حاصل نشود، کار کمی سخت می شود. طراحان حرفه ای در گام پیاده سازی با تعریف یکسری قیود ابزار پیاده سازی را به صورت سفارشی راهنمایی می کنند، تا در نهایت بهترین جانمایی و مسیریابی ممکن حاصل شود. دو پارامتر مهم برای سنجش موفقیت یا عدم موفقیت در گام پیاده سازی وجود دارد، که اولی دستیابی به فرکانس کاری مطلوب و دومی به حداقل رساندن منابع مصرفی روی تراشه است. به طور کلی گستره وسیعی از تنطیمات باید در این گام انجام شود، و طراح باید با دقت عملکرد و کارایی مورد نظرش را برای ابزار توصیف کند تا خروجی کار مطلوب باشد، این گام سومین گام مهم در طراحی است.
❗️در گام هفتم طراح برای سنجش صحت عملکرد سیستم بعد از اتمام فاز جانمایی و مسیریابی، اقدام به شبیه سازی زمانی سیستم می کند، در این شبیه سازی رفتار واقعی سیستم روی تراشه در محیط نرم افزاری بررسی می شود، مثال های متعددی وجود دارد که در آن با وجود عملکرد صحیح مدار در گام سوم، در این گام پاسخ مطلوب حاصل نمی شود، دلیل آن نیز غالبا زیاد بودن تاخیرهای موجود در سیستم است. بخش قابل ملاحظه ای از این تاخیرها به دلیل جانمایی نامناسب و طولانی بودن مسیرهای ارتباطی بین عناصر است. در صورت بروز چنین مشکلی عملا کل طرح زیر سوال می رود و لازم است یک بازنگری کامل روی مسیرهای بحرانی و گلوگاه های طراحی صورت بپذیرد. البته لازم به ذکر است که این مرحله اغلب توسط طراحان با تجربه که تا حدود زیادی به صحت عملکرد سیستم اطمینان دارند، اجرا نمی شود، دلیل اصلی آن نیز کند بودن بیش از حد پروسه شبیه سازی زمانی است، برای مدارهای با پیچیدگی متوسط ممکن است این شبیه سازی یک روز کامل زمان نیاز داشته باشد.
❗️گام هشتم به تولید بیت فایل خروجی و پیکره بندی تراشه FPGA اختصاص دارد، تنظیماتی که طراح در این بخش انجام می دهد نسبتا محدود است و غالبا در ارتباط با فرمت فایل پیکره بندی خروجی است، در این گام کاربر با توجه به تراشه FPGA خود فرمت فایل خروجی را انتخاب و به صورت اتوماتیک با چند کلیک فایل را روی تراشه پیکره بندی یا در اصطلاح دانلود می کند، از آنجایی که تراشه های FPGA دارای حافطه دائمی نیستند معمولا از یک حافظه جانبی برای ذخیزه سازی فایل پیکره بندی و انتقال آن به FPGA استفاده می شود، از این رو انتظار می رود مهندس طراح فایل مناسب برای حافظه های فلش جانبی را نیز تولید کند.
❗️اگر خوش شانس باشیم و همه فرضیات طراحی را درست اجرا کرده باشیم، نیازی به اجرای گام نهم نداریم، در پروژه های کوچک که تعداد فانکشن های سیستم محدود است و یک عملکرد نه چندان پیچیده مورد نیاز است، می توانیم به خوش شانسی خودمان امیدورام باشیم، اما اگر فقط کمی تعداد ورودی خروجی ها و سیگنال های کنترلی سیستم افزایش پیدا کند، بروز خطا کاملا اجتناب ناپذیر می شود، به این ترتیب برای پیدا کردن منشا خطا چاره ای به جز اجرای گام نهم نداریم، در گام نهم طراح با توجه به شناخت خودش از سیستم اقدام به خطایابی سخت افزاری می کند، یعنی با بررسی و مانیتور کردن مدارات پیاده سازی شده روی FPGA به دنبال دلیل بروز خطا می گردد، موفقیت در این مرحله به معنای اتمام کامل کار طراحی و پیاده سازی یک پروژه است. دو IP Core معروف ILA و VIO به عنوان مهمترین ابزارهای خطایابی Xilinx به شکل گسترده ای در این گام مورد استفاده قرار می گیرند.
@Hexalinx
#CLB, #LUT
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@Hexalinx
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@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
#Configuration
#JTAG
✅ تراشه های FPGA قبل از اینکه مورد استفاده قرار بگیرند، باید پیکره بندی شوند. این کار می تواند به صورت اتوماتیک و یا توسط کاربر انجام شود. 👇
@Hexalinx
#JTAG
✅ تراشه های FPGA قبل از اینکه مورد استفاده قرار بگیرند، باید پیکره بندی شوند. این کار می تواند به صورت اتوماتیک و یا توسط کاربر انجام شود. 👇
@Hexalinx
#Basic
✳️ در حالت اول کاربر با اتصال یک پروگرامر بین کامپیوتر و تراشه FPGA با استفاده از پورت JTAG ، تراشه FPGA را پیکره بندی می کند. برای این کار تنها نیاز است طراح فایل bit خروجی را توسط ابزارهای طراحی تولید کند و باقی کارها تنها با چند کلیک انجام می شود. این روش پیرکره بندی در پروسه طراحی و زمانی که هنوز پروژه نهایی نشده است انجام می شود.
✳️ در حالت دوم نیاز به استفاده از پروگرامر برای پیکره بندی FPGA نیست و از پروگرامر برای پیکره بندی حافظه فلش استفاده می شود و ممکن است یکی از دو اتفاق زیر بیافتد.
1️⃣ در روش اول، تراشه FPGA با توجه به قابلیت هایی که شرکت سازنده آن فراهم می کند، به صورت اتوماتیک برنامه مورد نیاز برای پیکره بندی را از یک حافظه فلش non-volatile می خواند، و خودش را پیکره بندی می کند.
2️⃣ در روش دوم یک پردازنده دیگر همچون میکروکنترلر با خواندن اطلاعات از روی حافظه فلش non-volatile تراشه FPGA را پیکره بندی می کند.
در روش اول تراشه FPGA در اصطلاح master است و مسئولیت صفر تا صد کار را برعهده می گیرد. در این روش طراح نیاز دارد علاوه بر ساخت فایل bit خروجی، فایل مناسب برای پیکره بندی حافظه فلش را نیز تولید کند. با توجه به نوع حافظه این فایل ممکن است پسوند mcs یا bin یا داشته باشد. در روش دوم که در آن FPGA در اصطلاح slave است. طراح علاوه بر ساخت فایل مورد نیاز حافظه فلش باید پروتکل مورد نیاز برای برنامه ریزی تراشه FPGA را نیز برای پردازنده کمکی پیاده سازی کند.
@Hexalinx
✳️ در حالت اول کاربر با اتصال یک پروگرامر بین کامپیوتر و تراشه FPGA با استفاده از پورت JTAG ، تراشه FPGA را پیکره بندی می کند. برای این کار تنها نیاز است طراح فایل bit خروجی را توسط ابزارهای طراحی تولید کند و باقی کارها تنها با چند کلیک انجام می شود. این روش پیرکره بندی در پروسه طراحی و زمانی که هنوز پروژه نهایی نشده است انجام می شود.
✳️ در حالت دوم نیاز به استفاده از پروگرامر برای پیکره بندی FPGA نیست و از پروگرامر برای پیکره بندی حافظه فلش استفاده می شود و ممکن است یکی از دو اتفاق زیر بیافتد.
1️⃣ در روش اول، تراشه FPGA با توجه به قابلیت هایی که شرکت سازنده آن فراهم می کند، به صورت اتوماتیک برنامه مورد نیاز برای پیکره بندی را از یک حافظه فلش non-volatile می خواند، و خودش را پیکره بندی می کند.
2️⃣ در روش دوم یک پردازنده دیگر همچون میکروکنترلر با خواندن اطلاعات از روی حافظه فلش non-volatile تراشه FPGA را پیکره بندی می کند.
در روش اول تراشه FPGA در اصطلاح master است و مسئولیت صفر تا صد کار را برعهده می گیرد. در این روش طراح نیاز دارد علاوه بر ساخت فایل bit خروجی، فایل مناسب برای پیکره بندی حافظه فلش را نیز تولید کند. با توجه به نوع حافظه این فایل ممکن است پسوند mcs یا bin یا داشته باشد. در روش دوم که در آن FPGA در اصطلاح slave است. طراح علاوه بر ساخت فایل مورد نیاز حافظه فلش باید پروتکل مورد نیاز برای برنامه ریزی تراشه FPGA را نیز برای پردازنده کمکی پیاده سازی کند.
@Hexalinx
#BLOCK_RAM
#DISTRIBUTED_RAM
✅ در مورد مفهوم حافظه ها در FPGA قبلا مقاله ای خدمتتان ارائه شده که در آن یک مقایسه کوچک بین قابلیت ها و محدودیت های انواع حافظه های قابل استفاده درون تراشه مورد بررسی قرار گرفت. اگر هنوز موفق به مطالعه این مقاله نشدید، پیشنهاد می کنم وقت را از دست ندهید و همین الان شروع کنید.
✅ امروز دومین قسمت از این مقاله برای علاقه مندان به یادگیری مفاهیم بنیادی پیاده سازی در FPGA ارائه می شود. بدون شک بیان تمام جزئیات در این مجال کوتاه امکان پذیر نیست، از این رو درصورتی که نیاز به اطلاعات تکمیلی داشتید، حتما سوال خود را با @aks_linx در میان بگذارید.
@Hexalinx
#DISTRIBUTED_RAM
✅ در مورد مفهوم حافظه ها در FPGA قبلا مقاله ای خدمتتان ارائه شده که در آن یک مقایسه کوچک بین قابلیت ها و محدودیت های انواع حافظه های قابل استفاده درون تراشه مورد بررسی قرار گرفت. اگر هنوز موفق به مطالعه این مقاله نشدید، پیشنهاد می کنم وقت را از دست ندهید و همین الان شروع کنید.
✅ امروز دومین قسمت از این مقاله برای علاقه مندان به یادگیری مفاهیم بنیادی پیاده سازی در FPGA ارائه می شود. بدون شک بیان تمام جزئیات در این مجال کوتاه امکان پذیر نیست، از این رو درصورتی که نیاز به اطلاعات تکمیلی داشتید، حتما سوال خود را با @aks_linx در میان بگذارید.
@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
#QEMU
#Advanced
✅ معرفی Xilinx QEMU
✳️ واژه #QEMU مخفف عبارت Quick Emulator است و یک امولاتور قدرتمند و متن باز برای مدل سازی رفتار یک ماشین و به طور خاص یک پردازنده است.
✳️ شرکت Xilinx با توجه به منبع باز بودن QEMU یک نسخه سفارشی از آن را به نام Xilinx QEMU توسعه داده است و به همراه پتالینوکس عرضه می کند. مهندسانی که از پلت فرم های هدف مبتنی بر Zynq 7000 و Zynq UltraScalePlus و یا MicroBlaze برای طراحی های خود استفاده می کنند، به راحتی می توانند از مزایای آن بهره مند شوند. این امولاتور قادر است با مدل سازی رفتار سیستم جایگزین سخت افزار شود و مدلی نرم افزاری از آن را برای طراح ایجاد کند. توجه شود که برای استفاده از این امولاتور طراح باید با مفاهیم زیر آشنایی کامل داشته باشد.
1️⃣ معماری پردازنده مورد نظر
2️⃣ گنو دیباگر برای دیباگ ریموت سیستم GDB
3️⃣ تولید اپلیکیشن نرم افزاری با استفاده از پتالینوکس و SDK
4️⃣ و دیوایس تیری Device Trees
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842060/QEMU
@Hexalinx
#Advanced
✅ معرفی Xilinx QEMU
✳️ واژه #QEMU مخفف عبارت Quick Emulator است و یک امولاتور قدرتمند و متن باز برای مدل سازی رفتار یک ماشین و به طور خاص یک پردازنده است.
✳️ شرکت Xilinx با توجه به منبع باز بودن QEMU یک نسخه سفارشی از آن را به نام Xilinx QEMU توسعه داده است و به همراه پتالینوکس عرضه می کند. مهندسانی که از پلت فرم های هدف مبتنی بر Zynq 7000 و Zynq UltraScalePlus و یا MicroBlaze برای طراحی های خود استفاده می کنند، به راحتی می توانند از مزایای آن بهره مند شوند. این امولاتور قادر است با مدل سازی رفتار سیستم جایگزین سخت افزار شود و مدلی نرم افزاری از آن را برای طراح ایجاد کند. توجه شود که برای استفاده از این امولاتور طراح باید با مفاهیم زیر آشنایی کامل داشته باشد.
1️⃣ معماری پردازنده مورد نظر
2️⃣ گنو دیباگر برای دیباگ ریموت سیستم GDB
3️⃣ تولید اپلیکیشن نرم افزاری با استفاده از پتالینوکس و SDK
4️⃣ و دیوایس تیری Device Trees
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842060/QEMU
@Hexalinx
#SDSoC
#Advanced
✅ معرفی محیط توسعه SDSoC
✳️ یکی از بزرگترین چالش های پیشروی مهندسان در زمان طراحی شتاب دهنده روی بخش PL در تراشه های Zynq نحوه تبادل ارتباط بین PS و PL است، انتخاب نوع اینترفیس و تنظیمات آن اغلب کابوس طراحان است. از سوی دیگر انتخاب گلوگاه های پردازشی و انتقال توابع نرم افزاری در PS به PL نیازمند صرف زمان و تجربه کافی از سوی مهندس طراح است. شرکت Xilinx برای پاسخ به این دو مشکل در سال 2015 محیط توسعه SDSoC را برای طراحان سیستم و مهندسان نرم افزار معرفی کرد. مجموعه نرم افزاریSDSoC چارچوبی برای توسعه و ساخت برنامه های سخت افزاری شتاب دهی شده با استفاده از زبانهای برنامه نویسی استاندارد C , C++ در محیط بسیار کاربرپسند و محبوب eclipse است.
کامپایلر SDSoC بسیاری از جزئیات طراحی را به صورت اتوماتیک آنالیز می کند و به طراح اجازه می دهد با چند کلیک توابع نرم افزاری PS را به ماژول ها سخت افزاری برای پیاده سازی در PL تبدیل کنند و ارتباطات مورد نیاز برای تبادل داده بین این دو بخش را برقرار کنند.
@Hexalinx
#Advanced
✅ معرفی محیط توسعه SDSoC
✳️ یکی از بزرگترین چالش های پیشروی مهندسان در زمان طراحی شتاب دهنده روی بخش PL در تراشه های Zynq نحوه تبادل ارتباط بین PS و PL است، انتخاب نوع اینترفیس و تنظیمات آن اغلب کابوس طراحان است. از سوی دیگر انتخاب گلوگاه های پردازشی و انتقال توابع نرم افزاری در PS به PL نیازمند صرف زمان و تجربه کافی از سوی مهندس طراح است. شرکت Xilinx برای پاسخ به این دو مشکل در سال 2015 محیط توسعه SDSoC را برای طراحان سیستم و مهندسان نرم افزار معرفی کرد. مجموعه نرم افزاریSDSoC چارچوبی برای توسعه و ساخت برنامه های سخت افزاری شتاب دهی شده با استفاده از زبانهای برنامه نویسی استاندارد C , C++ در محیط بسیار کاربرپسند و محبوب eclipse است.
کامپایلر SDSoC بسیاری از جزئیات طراحی را به صورت اتوماتیک آنالیز می کند و به طراح اجازه می دهد با چند کلیک توابع نرم افزاری PS را به ماژول ها سخت افزاری برای پیاده سازی در PL تبدیل کنند و ارتباطات مورد نیاز برای تبادل داده بین این دو بخش را برقرار کنند.
@Hexalinx
#SDSoC
✳️ آموزش مقدماتی مجموعه نرم افزاری SDSoC
1️⃣ قسمت اول - نصب SDSoC
🔖این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
https://www.aparat.com/v/8vSdJ
@Hexalinx
✳️ آموزش مقدماتی مجموعه نرم افزاری SDSoC
1️⃣ قسمت اول - نصب SDSoC
🔖این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
https://www.aparat.com/v/8vSdJ
@Hexalinx
آپارات - سرویس اشتراک ویدیو
1- نصب مجموعه نرم افزاری SDSoC
آموزش مقدماتی مجموعه نرم افزاری SDSoC .
قسمت اول - نصب SDSoC .
این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
قسمت اول - نصب SDSoC .
این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
#SDSoC
✳️ آموزش مقدماتی مجموعه نرم افزاری SDSoC
2️⃣ قسمت دوم - معرفی ابزار طراحی SDSoC
🔖این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
https://www.aparat.com/v/Pb0Yi
@Hexalinx
✳️ آموزش مقدماتی مجموعه نرم افزاری SDSoC
2️⃣ قسمت دوم - معرفی ابزار طراحی SDSoC
🔖این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
https://www.aparat.com/v/Pb0Yi
@Hexalinx
آپارات - سرویس اشتراک ویدیو
2- معرفی ابزار طراحی SDSoC
آموزش مقدماتی مجموعه نرم افزاری SDSoC.
قسمت دوم - معرفی ابزار طراحی SDSoC.
این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.
قسمت دوم - معرفی ابزار طراحی SDSoC.
این مجموعه به صورت رایگان در Udemy تحت عنوان Zynq Development with Xilinx SDSoC ارائه شده است.