HEXALINX
534 subscribers
147 photos
4 files
74 links
این آغاز ماجراجویی شماست...
آموزش رایگان برنامه نویسی FPGA و ZYNQ و ابزارهای طراحی XILINX

پرسش و پاسخ:
@ask_linx

آدرس سایت:
hexalinx.com

آدرس کانال آپارات:
aparat.com/hexalinx

آدرس اینستاگرام:
insatagram.com/hexalinx_go
Download Telegram
#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
#BARE_METAL
#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
#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
#Routeing
#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
#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
#Jitter
#Essentials
به طور کلی سیگنال کلاک غالبا با دو پارامتر فرکانس یا پریود و دوره تناوب (Duty Cycle) معرفی می شود. اما این دو پارامتر تنها مشخصه های کلاسیک یک سیگنال کلاک هستند. مفهوم کلاک جیتر #jitter یکی دیگر از مشخصه هایی است که در توصیف میزان دقت یک سیگنال کلاک یا منبع تولید کننده کلاک ارائه می شود. کلاک جیتر بیانگر میزان انحراف لبه های کلاک از موقعیت ایده آل خودشان است، به عبارت ساده تر کم یا زیاد شدن یک پریود کلاک به دلیل جابجایی مثبت یا منفی لبه های بالا و پایین رونده کلاک.
❗️این پدیده غالبا به دلیل نویز موجود در منبع تولید کننده کلاک، نویز مدارات تغذیه و یا اختلالات ناشی از مدارهای جانبی در یک سیستم رخ می دهد. در طراحی FPGA جیتر غالبا به صورت یک پارامتر و تحت عنوان جیتر ورودی برای ابزار پیاده سازی تعریف می شود، و تعیین دقیق آن نقش مهمی در دستیابی به زمانبندی مناسب در یک طراحی ایفا می کند.

@Hexalinx
#Essentials
#Pipelining

مفهوم پایپلاینینگ

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

@Hexalinx
#Essentials
#wire_bonding

مفهوم wire bonding

✳️ تراشه‌های FPGA در پکیج‌های متفاوتی به بازار عرضه می‌شوند. این پکیج‌ها از نظر ابعاد و تعداد پایه‌های IO با هم متفاوت هستند. با این وجود ممکن است دارای منابع سخت‌افزاری مشابه هم باشند. بعنی فضای منطقی، حافظه و ضرب کننده‌های یکسانی را در اختیار طراح قرار می‌دهند.

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

🔖 به بیان ساده فرایندی که بر اساس آن اتصال بین پایه‌های فیزیکی یک تراشه همچون FPGA و مدارات پیاده‌سازی شده روی سیلیکون برقرار می‌شود، اصطلاحاً wire bonding نامیده می‌شود.

❗️پس همواره بیاد داشته باشیم تراشه‌هایی که با یک کد نام گذاری می‌شوند و تنها تعداد IO های آن‌ها با هم متفاوت در عمل هیچ فرقی با‌هم ندارند و فقط wire bonding آن ها با هم متفاوت است.

@Hexalinx
#Essentials, #IO

منابع ورودی / خروجی در FPGA

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

1️⃣ بخش الکتریکی: وظیفه این بخش کنترل ولتاژ و استاندارد کاری IO هاست. تک سیمه یا تفاضلی بودن یک IO‌ و همچنین فعال یا غیرفعال بودن امپدانس داخلی هر IO در این بخش تعیین می‌شود.
2️⃣ بخش منطقی: وظیفه این بخش که خود متشکل از چند بلوک است، اعمال کنترل‌های منطقی روی سیگنال‌های ورودی خروجی است. پیکره بندی پورت از لحاظ SDR و یا DDR بودن و همینطور ورودی، خروجی و یا ۳ حالته بودن پورت در این بخش تعیین می‌شود.

@Hexalinx
#Essentials

پارامترهای #slew_rate و #drive_strength به چه معنا هستند و به چه منظور مورد استفاده قرار می‌گیرند؟

✳️ وقتی یک IO در FPGA به صورت خروجی تعریف می‌شود به صورت پیش فرض دو پارامتر slew rate و drive strength برای آن مقدار دهی می‌شود. طراح می‌تواند مقدار پیش فرض این دو پارامترها را با استفاده از ابزارهای Xilinx تغییر دهد.
ساده ترین تعریف برای این دو پارامتر به این صورت است.
پارامتر slew rate کمک می‌کند تا سرعت تغییر وضعیت یک خروجی تنظیم شود. یعنی شیب لبه بالا رونده یا پایین رونده را برای دستیابی به سرعت مطلوب کنترل می‌کند.
پارامتر drive strength برای کمک به تامین جریان مورد نیاز مصرف کننده متصل به FPGA تنظیم می‌شود.

در حالت کلاسیک slew rate به صورت حداکثر نرخ تغییرات ولتاژ خروجی بر واحد زمان تعریف می‌شود و می‌تواند مقادیر SLOW و FAST به آن نسبت داده شود.

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

@Hexalinx
#Essentials
#IOB

آشنایی با بخش‌های مختلف بلوک‌های ورودی و خروجی در FPGA

✳️ دسته بندی IO ها درون FPGA در قالب بانک‌های IO انجام می‌شود. تعداد این بانک‌ها کاملا به نوع تراشه و پکیج آن وابسته است. در حالت کلی خواص الکتریکی IO با توجه به قیودی که برای هر بانک تعریف می‌شود محدود می‌شوند.

با توجه به متفاوت بودن تعداد بانک‌های بسادگی می‌توان حدس زد که تعداد IO های درون تراشه نیز با توجه به نوع پکیج و منابع درون تراشه متفاوت است. این IO‌ ها با استفاده از ابزارهای گرافیگی Xilinx به سادگی قابل پیکره‌بندی هستند و با بسیاری از استانداردهای الکتریکی سازگار هستند. توجه شود که تمامی پین‌های فیزیکی روی تراشه به صورت IO قابل استفاده نیستد. با این وجود تعداد قابل توجهی از آن‌ها به عنوان ورودی‌ خروجی‌های همه منظوره در دسترس هستند. در هر پکیج بجز تعداد محدودی از پایه‌ها که به تامین تغدیه مورد نیاز تراشه و پیکره‌بندی تراشه اختصاص دارند، سایر پایه‌ها تقریباً مشابه هم هستند و قابلیت‌های یکسانی دارند.

❗️مطالعه ادامه این مقاله

@Hexalinx
#Essentials
#Barrel_Shifter

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

❗️اگر به این موضوع علاقمند هستید ادامه این مطلب را در سایت هگزالینکس مطالعه بفرمایید.

ادامه مطلب ...

@Hexalinx
#Essentials
#FIXED_POINT

یک کلمه دودویی به طور ذاتی هیچ معنی و مفهومی ندارد. اما بیشتر افراد تمایل دارند که آن را (حداقل در نگاه اول) به عنوان اعداد صحیح مثبت یا اعداد طبیعی در نظر بگیرند. اما در واقع معنی و مفهوم یک عدد دودویی N بیتی کاملاً به تفسیری که می‌شود، بستگی دارد. حال با این نگاه و اینکه هر مجموعه‌ای را می‌توان با عدد N بیتی نمایش داد، ما قصد داریم یک زیر مجموعه از اعداد گویا را نمایش دهیم. اعداد گویا مجموعه‌ای از اعداد هستند که بصورت کسری (a/b) نشان داده می‌شوند. زیر مجموعه‌ای که ما به دنبال آن هستیم، زیر مجموعه‌ای است که در آن عدد b توانی از ۲ است.
علاوه بر این، محدودیت‌های دیگری نیز در نمایش این زیر مجموعه مورد نظرمان در نظر می‌گیریم. اول اینکه هر کدام از اعضای این زیر مجموعه باید تعداد بیت‌های دودویی یکسانی داشته باشند. دوم اینکه نقطه اعشار آن‌ها در موقعیت ثابتی قرار داشته باشد، یعنی نقطه ممیز در یک مکان ثابت باشد. دقیقاً به همین دلیل، به این نمایش از اعداد، اصطلاحاً ممیز ثابت گفته می‌شود.

ادامه مطلب >>

@Hexalinx
#Essentials
#FIXED_POINT

محاسبات ممیز ثابت در برخی از کتب آموزشی تحت عنوان محاسبات با دقت محدود مخاطب قرار داده می‌شود. یعنی تحت هیچ شرایطی دقت محاسبات از مقدار مشخصی که از ابتدا نیز قابل محاسبه است، بیشتر نخواهد بود.
فرایند ممیز ثابت کردن یک الگوریتم، فرایند پیجیده‌ای نیست اما قطعاً فرایند زمانبری است. زیرا باید به اندازه کافی وقت برای تنظیم پارامترها اختصاص داده شود. اما کدام پارامترها؟
مهمترین پارامترهایی که در محاسبات با دقت محدود وجود دارند، عبارتند از:
❗️دقت
❗️صحت
❗️دامنه
❗️تفکیک پذیری
❗️رنج دینامیکی
این پارامترها با توجه به فرمت ممیز ثابت انتخابی، تعیین می‌شوند. اگر علاقمند به آشنایی با این پارامترها هستید با ما همراه شوید.

ادامه مطلب >>

@Hexalinx
#Essentials
#FIXED_POINT

ما در زندگی خودمان همواره با اعداد حقیقی سر و کار داریم. اعدادی که بخش اعشاری دارند. اغلب سیستم‌های مدرن دیجیتال امروزی قادر به پیروی از اصول ما هستند. اصولی که ما آن را به عنوان نمایش ممیز شناور می‌شناسیم. اما نمایش ممیز شناور در کنار دقت بالا، دارای معایبی است که باعث می‌شود کمتر در طراحی‌ها مورد استفاده قرار بگیرد.
1️⃣ پیاده‌‌سازی این روش، مشکل است.
2️⃣ منابع سخت‌‌افزاری زیادی را مصرف می‌‌کند.
3️⃣ و سرعت مدار را کاهش دهد.
در نقطه مقابل نمایش ممیز ثابت قرار دارد که منابع سخت‌‌افزاری کمتری را نسبت به روش ممیز شناور اشغال می‌‌کند و سرعت بسیار بیشتری دارد.

❗️اعداد ممیز ثابت همان اعداد اعشاری ممیز شناور هستند که با استفاده از یک فاکتور معین مقیاس بندی می‌شوند. از این رو محاسبات ممیز ثابت از قوانین معمول پیروی نمی کنند و قوانین خاصی بر آن ها حاکم است. در سری آموزشی اعداد اعشاری ممیز ثابت سعی کردیم کلیه اصول و قوانین مورد نیاز یک طراح برای استفاده از اعداد ممیژ ثابت را در اختیار شما قرار دهیم. برای دسترسی به بخش‌های اول تا سوم این سری آموزشی از لینک‌های زیر استفاده کنید.

@Hexalinx
#Essentials
#TCL
معرفی زبان TCL

❗️زبان برنامه نویسی TCL یک زبان سطح بالا و دینامیک است که با هدف ساده سازی توصیف فرایند ساخته شده و به صورت گسترده در ISE‌ و به ویژه Vivado مورد استفاده قرار می‌گیرد. واژه TCL محفف Tool Command Language است.
❗️زبان TCL یک زبان استاندارد در صنعت نیمه هادی است و برای ساختن API ها و قیود پیاده سازی SDC مورد استفاده قرار می گیرد. استاندارد SDC توسط شرکت Synopsys معرفی و پشتیبانی می‌شود و برای توصیف قیود پیاده سازی در طراحی‌های FPGA استفاده می‌شود. ابزار Vivado نسخه سفارشی شده SDC را تحت عنوان XDC برای توصیف قیود مورد استفاده قرار می دهد. در واقع XDC جایگزین UCF در ISE شده است

@Hexalinx
#FILTER
#Essentials

✳️ به طور کلی فیلترها دارای چهار نوع اصلی هستند که در ادامه به شما معرفی می‌کنم:

1️⃣ فیلترهای پایین گذر یا low-pass filters
2️⃣ فیلترهای بالا گذر یا high-pass filters
3️⃣ فیلترهای میان گذر یا band-pass filters
4️⃣ فیلترهای میان نگذر باریک یا band-stop filter یا notch filters

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

مطالعه متن کامل مقاله >>

@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