آموزش اِف‌پی‌جی‌اِی از صفر
3.37K subscribers
520 photos
14 videos
10 files
517 links
آموزش قدم به قدم طراحی دیجیتال به کمک FPGA

🌎 آموزشگاه فراد اندیش
www.FaradAndish.com
☎️ ۴۲۴۳۹۹۰۰
ایمیل سایت:
help@faradandish.com

📌 لینک اولین پست کانال:
https://t.me/fpga0/22
Download Telegram
♨️ برای اطلاعات بیشتر درباره قابلیت Generic در زبان VHDL به پست زیر مراجعه کنید👇👇👇

https://t.me/fpga0/914

🆔 @FPGA0
⚡️ چگونه در FPGA یک مولد موج سینوسی بسازیم؟ (قسمت دوم)

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

🔷 در این پست، به روش دوم می‌پردازم.

❇️ روش CORDIC

🔷 روش دوم، روش CORDIC است.

🔷 احتمالاً با نام الگوریتم CORDIC آشنا هستید.

🔷 روش CORDIC، یک روش بسیار کارامد برای پیاده‌سازی انواع توابع خاص مانند سینوس، کسینوس، سینوس معکوس یا رادیکال است.

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

🔷 احتمالاً می‌توانید حدس بزنید که پیاده‌سازی یک تابع، فقط با عملیات جمع و شیفت چقدر می‌تواند ساده باشد.

🔷 به همین دلیل، روش CORDIC یک روش محبوب در پیاده‌سازی توابع خاص است.

ادامه دارد...

🆔 @FPGA0
⚡️ چگونه در FPGA یک مولد موج سینوسی بسازیم؟ (قسمت سوم)

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

🌎 در سایت فراداندیش، در مقاله "چطور یک مولد موج سینوسی در FPGA پیاده‌سازی کنیم؟"، به‌کمک این روش، یک موج سینوسی در FPGA پیاده‌سازی کرده‌ام:

🌎 https://bit.ly/FPGASineWave

🔷 و اما روش سوم پیاده‌سازی موج سینوسی درون FPGA، روش DDS است.

❇️ روش DDS

🔷 عبارت DDS، مخفف Direct Digital Sensitizer است.

🔷 مفهوم روش DDS، مفهوم نسبتاً ساده‌ای است؛ برای اینکه یک موج سینوسی را به‌صورت دیجیتالی درون FPGA پیاده‌سازی کنید، روش DDS ایده‌ای به‌صورت زیر ارائه می‌دهد:

🔷 ابتدا باید یک دوره تناوب از موج سینوسی را به روشی تولید کنید؛ مثلاً می‌توانید این موج را در نرم‌افزار متلب تولید کنید.

🔷 سپس، از یک دوره تناوب این موج سینوسی، تعدادی نمونه را جدا می‌کنید و به یک حافظه که درون FPGA قرار دارد منتقل می‌کنید.

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

🔷 اگر این نمونه‌ها را تا انتها بخوانم و دوباره به ابتدای RAM بازگردم، یک موج سینوسی را درون FPGA تولید کرده‌ام.

🔷 اما اگر بخواهیم روش DDS را پیاده‌سازی کنیم، دو راه پیش رو داریم:

روش اول این است که از یک IP Core به همین نام استفاده کنیم.

روش دوم، کدنویسی به یکی از زبان‌های VHDL یا Verilog است.

🔷 اگر از IP استفاده کنید، دیگر نیازی نیست که از ابتدا الگوریتم DDS را کدنویسی کنید و در وقت شما صرفه‌جویی می‌شود.

🔷 به‌کمک آی‌پی DDS می‌توانید انواع موج‌های سینوسی و کسینوسی با فرکانس‌های مختلف را در مدار درون FPGA پیاده‌سازی کنید.

اکنون سوالی که مطرح می‌شود این است که فرکانس موج سینوسی که به این روش تولید می‌کنیم، به چه عواملی بستگی دارد؟

🌎 در مقاله "چطور یک مولد موج سینوسی در FPGA پیاده‌سازی کنیم؟"، در مورد این موضوع به طور کامل توضیح داده‌ام؛ همچنین، یک مولد موج سینوسی به‌کمک آی‌پی DDS در FPGA پیاده‌سازی شده است:

🌎 https://bit.ly/FPGASineWave

🆔 @FPGA0
⚡️ موقعیت شغلی جدید در غرب تهران...

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

1️⃣ متخصص الکترونیک مسلط به سخت‌افزار به منظور تست و رفع عیب
2️⃣ متخصص کدنویسی VHDL و پیاده‌سازی بر روی تراشه‌های FPGA
3️⃣ متخصص کدنویسی ++C بر روی Windows و Linus
4️⃣ متخصص طراحی schematic و PCB بردهای دیجیتال شامل FPGA و پردازنده‌های DSP (بردهای چند لایه)
5️⃣ متخصص مونتاژ و تست بردهای دیجیتال و آنالوگ

❇️ اگر فکر می‌کنید مهارت و علاقه شما حداقل با یکی از موارد بالا تطبیق دارد، لطفا رزومه‌تان را به ایمیل زیر ارسال کنید:

📭 help@faradandish.com

☎️ رزومه شما به شرکت مورد نظر ارسال خواهد شد و آنها پس از بررسی، در صورت نیاز با شما تماس خواهند گرفت.

🆔 @FPGA0
⚡️ تعیین اهداف و استراتژی‌های طراحی در نرم‌افزار ISE (قسمت اول)

شما برای انجام عملیات پیاده‌سازی یک مدار بر روی FPGA، ممکن است اهداف متفاوتی داشته باشید:

🔷 گاهی هدف شما استفاده حداقلی از منابع سخت‌افزاری درون FPGA است.

🔷 ممکن است بهینه کردن توان مصرفی مدار پیاده‌سازی شده در FPGA، هدف شما باشد.

🔷 گاهی برای شما مهم است که زمان پیاده‌سازی حداقل مقدار ممکن باشد.

🔷 در بعضی مواقع رسیدن به حداکثر فرکانس کلاک قابل اعمال به مدار هدف اصلی شما است.

🔷 و گاهی نیز از نرم‌افزار پیاده‌سازی می‌خواهید ترکیبی از اهداف بالا را در نظر بگیرد.

در این مجموعه پست، نحوه تعیین این اهداف و استراتژی‌ها را برای پیاده‌سازی در نرم‌افزار ISE بیان می‌کنم.

ادامه دارد...

🆔 @FPGA0
⚡️ تعیین اهداف و استراتژی‌های طراحی در نرم‌افزار ISE (قسمت دوم)

🔷 قیدهای پیاده‌سازی ابزاری هستند که به‌کمک آن‌ها می‌توانید نتیجه پیاده‌سازی را بر مبنای نیاز خودتان تغییر دهید.

🔷 برای مراحل مختلف پیاده‌سازی، از جمله سنتز، جانمایی و مسیریابی، قیدهای مخصوصی وجود دارد که با تغییر مناسب آن‌ها می‌توانید نتیجه پیاده‌سازی را با توجه به هدف پیاده‌سازی تغییر دهید.

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

🔷 خوشبختانه، نرم‌افزار ISE دو قابلیت فوق‌العاده برای تنظیم خودکار و هوشمند قیود پیاده‌سازی دارد که به ما کمک می‌کند بدون تسلط به ماهیت و نحوه عملکرد این قیدها بتوانیم با تغییر آن‌ها نتایج پیاده‌سازی را به نحوی که مطلوب ما است تغییر دهیم:

1️⃣ قابلیت Design Goals & Strategies

2️⃣ قابلیت Smart Xplorer

در قسمت‌های بعد، این دو قابلیت را به شما معرفی خواهم کرد.

ادامه دارد...

🆔 @FPGA0
⚡️ تعیین اهداف و استراتژی‌های طراحی در نرم‌افزار ISE (قسمت سوم)

🔷 همان‌طور که در پست قبل گفته شد، قیدهای پیاده‌سازی ابزاری هستند که به‌کمک آن‌ها می‌توانید نتیجه پیاده‌سازی را بر مبنای نیاز خودتان تغییر دهید.

🔷 برای تعیین اهداف پیاه‌سازی در نرم‌افزار ISE به دو روش می‌توانیم عمل کنیم:

1️⃣ روش Design Goals & Strategies

2️⃣ روش SmartXplorer

🔷 ابتدا روش Design Goals & Strategies را بررسی می‌کنم.

🔷 به‌کمک قابلیت Design Goals & Strategies از نرم‌افزار ISE می‌توانید هدفی برای پیاده‌سازی‌تان تعیین کنید.

اهداف پیاده‌سازی در نرم‌افزار ISE شامل موارد زیر است:

🟣 Balanced
🟣 Area Reduction
🟣 Power Optimization
🟣 Minimum Runtime
🟣 Timing Performance

🔷 مثلا گزینه Area Reduction به این معنی است که می‌خواهید مدار شما کمترین فضا را از FPGA اشغال کند.

🔷 برای رسیدن مدار به حداکثر سرعت، باید گزینه Timing Performance را انتخاب کنید.

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

✳️ نرم‌افزار برای هر هدف، چند استراتژی از قبل آماده شده دارد؛ هر استراتژی، قیدهای پیاده‌سازی گلوبال را به‌گونه‌ای تنظیم می‌کنند که هدف پیاده‌سازی محقق شود.

✳️ می‌توانید استراتژی‌های مختلف را امتحان کنید تا ببینید کدامیک شما را به هدفتان می‌رساند.

برای مشاهده مراحل گام به گام استفاده از قابلیت Design Goals & Strategies در نرم‌افزار ISE، به مقاله "۲ روش برای تعیین استراتژی طراحی در نرم‌افزار ISE" از سایت فراد اندیش مراجعه کنید:

🌎 https://bit.ly/DesignStrategyGoals

ادامه دارد...

🆔 @FPGA0
⚡️ تعیین اهداف و استراتژی‌های طراحی در نرم‌افزار ISE (قسمت چهارم)

🔷 در قسمت قبل، تعیین اهداف و استراتژی‌های طراحی را از طریق قابلیت Design Goals & Strategies در نرم‌افزار ISE بیان کردم.

🔷 در این پست، به‌سراغ قابلیت دوم می‌رویم.

🔷 دومین قابلیت نرم‌افزار ISE برای تعیین هدف و استراتژی برای پیاده‌سازی، SmartXplorer است.

🔷 در این روش نیز ابتدا یک هدف برای استراتژی تعیین می‌کنید.

🔷 سپس، برای نرم‌افزار تعیین می‌کنید که علاقه‌مندید چه تعداد استراتژی مختلف برای پیاده‌سازی مدار شما (بر اساس هدفی که انتخاب کرده‌اید) استفاده شود.

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

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

🔷 سپس، نتایج پیاده‌سازی‌ها را به‌صورت جداگانه در جدولی به شما ارائه می‌دهد.

🔷 نتایج این پیاده‌سازی‌ها بر اساس مواردی چون حداکثر فرکانس قابل اعمال به مدار، مقدار Area مصرف شده و مدت زمان عملیات پیاده‌سازی ارائه می‌شوند.

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

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

برای مشاهده مراحل گام به گام به‌کارگیری SmartXplorer، به مقاله "۲ روش برای تعیین استراتژی طراحی در نرم‌افزار ISE" از سایت فراد اندیش مراجعه کنید:

🌎 https://bit.ly/DesignStrategyGoals

🆔 @FPGA0
⚡️ شمارنده چگونه می‌تواند مشکلات شما در پیاده‌سازی را حل کند؟ (قسمت اول)

🔷 هر مدار دیجیتالی از مجموعه‌ای از مدارات کوچک و پایه تشکیل شده است.

🔷 در میان این مدارات پایه، احتمالاً پرکاربردترین آن‌ها، شمارنده‌ها هستند.

🔷 شمارنده‌ها آنقدر پرکاربرد هستند که بعید می‌دانم یک طرح دیجیتالی را بتوان بدون آن‌ها ساخت.

🔷 اما کاربردهای اصلی شمارنده‌ها در مدارات دیجیتال چیست و چطور می‌توان از آن‌ها برای پیاده‌سازی در FPGA استفاده کرد؟

❇️ کاربردهای شمارنده

🔷 به طور کلی، شمارنده‌ها دو کاربرد اصلی دارند؛ زمان‌سنجی و شمارش رخدادها.

در قسمت‌های بعد به تشریح این دو کاربرد می‌پردازم.

ادامه دارد...

🆔 @FPGA0
⚡️ شمارنده چگونه می‌تواند مشکلات شما در پیاده‌سازی را حل کند؟ (قسمت دوم)

🔷 همان‌طور که در پست قبل گفته شد، شمارنده‌ها در طراحی دیجیتال بسیار پرکاربرد هستند.

🔷 اولین کاربرد شمارنده، زمان‌سنجی یا timing است.

🌀 شما به کمک شمارنده می‌توانید زمان را در یک مدار دیجیتال بسنجید و محاسبه کنید.

🌀 برای مثال، فرض کنید می‌خواهید در مدارتان، دو ثانیه بعد از رسیدن یک رجیستر خاص به مقدار ۱۰۰، عملیات دیگری انجام شود؛ مثلاً، موتوری حرکت کند یا یک چراغ روشن شود.

چگونه باید این دو ثانیه را در مدار دیجیتال محاسبه کنید؟

این کار را به کمک شمارنده انجام می‌دهیم.

🌀 و یا فرض کنید می‌خواهید پروتکل RS232 را پیاده‌سازی کنید؛ پروتکل RS232، بیت‌ها را به‌صورت سریال در خروجی ارسال می‌کند؛ هر کدام از این بیت‌ها، عرض بیتی دارد که با توجه به baud rate یا سرعت پروتکل سریال مشخص می‌شود.

🌀 مثلاً فرض کنید هر بیت باید به مدت ۱۰۰ میکرو‌ثانیه در خروجی باشد. برای ایجاد این عرض بیت‌های ۱۰۰ میکروثانیه‌ای، نیاز به محاسبه زمان دارید؛ این ۱۰۰ میکروثانیه را چگونه می‌توانید حساب کنید؟ این کار هم به‎کمک شمارنده انجام می‌شود.

ادامه دارد...

🆔 @FPGA0
⚡️ شمارنده چگونه می‌تواند مشکلات شما در پیاده‌سازی را حل کند؟ (قسمت سوم)

🔷 در پست قبل، یکی از کاربردهای شمارنده‌ها در طراحی دیجیتال که زمان‌سنجی است را بررسی کردم.

🔷 در این پست، به کاربرد دیگر شمارنده‌ها که شمارش رخدادها است می‌پردازم.

🌀 فرض کنید نیاز است که در صورت تکرار یک رویداد به تعداد مشخص (مثلاً ۱۰ بار)، عملیات دیگری انجام شود؛ مثلاً، چراغی روشن شود.

شما چگونه می‌توانید تعداد رخ دادن آن رویداد را بشمارید؟

بله، در این مورد هم می‌توانید از یک شمارنده استفاده کنید.

اما روند به کارگیری شمارنده در این مثال به چه صورت است؟

🔷 ابتدا یک شمارنده تعریف می‌کنید. سپس شرطی تعریف می‌کنید که اگر آن رویداد اتفاق افتاد، یک واحد به شمارنده شما اضافه شود.

🔷 آنگاه، در محل دیگری از مدار، یک شرط دیگر تعریف می‌کنید که اگر شمارنده برابر با ۱۰ شد، عملیات مورد نظر شما انجام شود.

برای اطلاع از نحوه پیاده‌سازی شمارنده در زبان VHDL و مشاهده چند مثال، به مقاله "شمارنده چگونه می‌تواند مشکلات شما در پیاده‌سازی را حل کند؟" از سایت فراد اندیش مراجعه کنید.

🆔 @FPGA0
⚡️ موقعیت شغلی جدید در غرب تهران...

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

1️⃣ پیاده‌ساز مدارات اینترفیسی مبتنی بر FPGA
2️⃣ پیاده‌ساز الگوریتم‌های پردازش سیگنال در FPGA

❇️ اگر فکر می‌کنید مهارت و علاقه شما حداقل با یکی از موارد بالا تطبیق دارد، لطفا رزومه‌تان را به ایمیل زیر ارسال کنید:

📭 help@faradandish.com

☎️ رزومه شما به شرکت مورد نظر ارسال خواهد شد و آنها پس از بررسی، در صورت نیاز با شما تماس خواهند گرفت.

🆔 @FPGA0
⚡️ نحوه عملکرد حلقه for در زبان VHDL (قسمت اول)

🔷 حتماً تاکنون به دفعات از حلقه for در برنامه‌نویسی استفاده کرده‌اید.

🔷 احتمالاً، کمتر برنامه‌ای را سراغ دارید که آن را بدون استفاده از حلقه for نوشته باشید.

اما حلقه for در زبان‌های توصیف سخت‌افزاری، همچون زبان VHDL، به چه صورت عمل می‌کند؟

آیا نحوه عملکرد حلقه for در زبان VHDL همانند زبان‌های برنامه‌نویسی است؟

❇️ نحوه عملکرد حلقه for در زبان‌های برنامه‌نویسی:

🔷 نمونه‌ای از ساختار حلقه for در زبان‌های برنامه‌نویسی را در زیر مشاهده می‌کنید؛ این کد به زبان C نوشته شده است:

for (i = 0; i < 10; i++) {
A = A + B*i;
}

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

🔷 در واقع، ما در این فرمول، یک Accumulator به نام A تولید کرده‌ایم که در هر تکرار حلقه for، مقدار قبلی A را با حاصل‌ضرب رجیستر B در مقدار i جمع می‌کند و دوباره به رجیستر A منتقل می‌کند؛ در هر تکرار حلقه، مقدار A مدام بزرگ و بزرگ‌تر می‌شود.

❇️ نحوه عملکرد حلقه for در زبان توصیف سخت‌افزاری VHDL

🔷 در زبان VHDL نیز ساختاری به‌نام حلقه for وجود دارد؛ اما کاربرد آن با آنچه در کد بالا دیدیم کاملاً متفاوت است.

🔷 حلقه for در زبان VHDL، یک قابلیت برای کاهش حجم کد است.

در پست بعد، با ذکر مثال این مفهوم را تشریح می‌کنم.

ادامه دارد...

🆔 @FPGA0
⚡️ نحوه عملکرد حلقه for در زبان VHDL (قسمت دوم)

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

🔷 فرض کنید در بخشی از کدتان ارجاع‌هایی مانند ارجاع‌های کد زیر داشته باشید:

B(2) <= A(0);
B(3) <= A(1);
B(4) <= A(2);
B(5) <= A(3);

آیا می‌توانید در کد بالا، یک الگوی تکراری مشخص پیدا کنید؟

🔷 در تمامی خطوط کد بالا و در سمت چپ هر ارجاع، سیگنال B قرار دارد و در سمت راست هر ارجاع نیز سیگنال A دیده می‌شود.

🔷 اندیس‌ها نیز با یک الگوی مشخص تغییر می‌کنند؛ در هر خط، اندیس سیگنال B، دو واحد کوچکتر از اندیس سیگنال A است.

بنابراین، توانستیم یک الگوی تکراری در این کد پیدا کنیم.
پس، می‌توانیم این کد را به‌صورت ساده شده زیر و به‌کمک حلقه for بازنویسی کنیم:

for I in 0 to 3 loop
B(I+2) <= A(I);
end loop;

🔷 اکنون اگر مقادیر I را از صفر تا سه جاگذاری کنیم، دقیقاً کدی معادل با کد قبلی خواهیم داشت.

🌀 فرض کنید به‌جای داشتن چهار ارجاع، چهل ارجاع‌ در کد داشتیم. در این صورت، حتماً می‌توانید حدس بزنید که استفاده از حلقه for چقدر کد ما را کوتاه‌تر و خواناتر می‌‌کرد.

بنابراین، استفاده از ساختار حلقه for در زبان VHDL معادل با این است که محتوای درون حلقه را به تعداد اندیس حلقه، کپی و در کد جاگذاری‌ کنیم؛ به این ترتیب، استفاده از آن به کوتاه شدن، ساده‌سازی و شفافیت کد کمک می‌کند و تاثیری بر کاهش میزان سخت‌افزار استفاده شده از FPGA ندارد.

در مقاله "نحوه عملکرد حلقه for در زبان VHDL به همراه ۲ مثال کاربردی" در سایت فراداندیش، به‌کمک حلقه for، یک شیفت‌رجیستر و یک خط تاخیر (delay line) که هر دو از پرکاربردترین بلوک‌ها در مدارات دیجیتال هستند را پیاده‌سازی کرده‌ام.

🆔 @FPGA0
⚡️ بهتر است در پیاده‌سازی‌ها از منابع عمومی FPGA استفاده کنیم یا منابع اختصاصی؟ (قسمت اول)

🔷 همان‌طور که می‌دانید تراشه FPGA از مجموعه‌ای از منابع سخت‌افزاری تشکیل شده است که به خودی خود مدار خاصی را ارائه نمی‌دهند.

🔹 بلکه شما به‌کمک کدنویسی به یک زبان توصیف سخت‌افزاری (مانند VHDL) مشخص می‌کنید که چگونه با کنار هم قرار گرفتن این منابع سخت‌افزاری، مدار دیجیتالتان در FPGA ساخته شود.

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

https://t.me/fpga0/977

https://t.me/fpga0/978

https://t.me/fpga0/980

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

1️⃣ منابع سخت‌‌افزاری عمومی
2️⃣ منابع سخت‌‌افزاری اختصاصی

🔷 منابع عمومی، شامل Look-Up Tableها (LUTها) و فلیپ‌فلاپ‌‌‌ها هستند؛ در واقع، اکثر منابع سخت‌‌افزاری درون FPGA را این دو منبع تشکیل داده‌اند.

🔹 در عمل، شما به‌کمک Look-Up Table و فلیپ‌فلاپ می‌‌توانید هر نوع سخت‌‌افزاری را پیاده‌‌سازی کنید.

🔷 اما منابع سخت‌‌افزاری اختصاصی یا Dedicated، شامل منابعی است که برای یک کاربرد خاص از قبل ساخته شده‌اند.

🔹 برای مثال، ضرب‌کننده (بلوک DSP48)، حافظه‌های بلوکی، شیفت‌رجیسترها (SRLها) و بلوک DCM (مربوط به کلاک) از منابع اختصاصی FPGA هستند.

ادامه دارد...

🆔 @FPGA0
⚡️ بهتر است در پیاده‌سازی‌ها از منابع عمومی FPGA استفاده کنیم یا منابع اختصاصی؟ (قسمت دوم)

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

اما به سوال اصلی‌مان بازگردیم؛ برای پیاده‌سازی یک مدار دیجیتال در FPGA، بهتر است از منابع عمومی FPGA استفاده کنیم یا منابع اختصاصی؟

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

اما دلیل این موضوع چیست؟

🔷 با به‌کارگیری حداکثری منابع اختصاصی، می‌توانید از مزایای زیر بهره‌مند شوید:

🌀 سرعت بیشتر مدار
🌀 اشغال حجم سخت‌افزاری کمتر
🌀 توان مصرفی کمتر

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

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

از طرف دیگر، توان مصرفی بلوک‌‌ها و منابع اختصاصی نسبت به منابع عمومی بسیار کمتر است.

✳️ بنابراین، اگر در قسمتی از مدار امکان استفاده از منابع اختصاصی وجود دارد حتما از آن استفاده کنید.

🔷 در پست بعد، نحوه به‌کارگیری منابع اختصاصی FPGA را آموزش خواهم داد.

🆔 @FPGA0
⚡️ چگونه می‌توان از منابع اختصاصی FPGA در پیاده‌سازی‌ها استفاده کرد؟

🔷 به‌طور کلی، منابع سخت‌‌افزاری موجود در FPGA به دو گروه تقسیم می‌‌شوند:

🌀 منابع سخت‌‌افزاری عمومی
🌀 منابع سخت‌‌افزاری اختصاصی

منابع عمومی، شامل Look-Up Tableها و فلیپ‌فلاپ‌‌‌ها هستند که به‌کمک آن‌ها می‌توان هر نوع مداری را در FPGA پیاده‌سازی کرد.

منابع اختصاصی، شامل ضرب‌کننده، حافظه‌های بلوکی، شیفت‌رجیسترها و بلوک‌های DCM هستند که هر کدام برای کاربردی خاص ساخته شده‌اند.

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

🔷 به دو روش می‌توانید منابع اختصاصی را در مداری که در FPGA پیاده‌سازی می‌کنید به‌کار بگیرید:

1️⃣ روش ضمنی
2️⃣ روش مستقیم

🔷 در روش ضمنی یا inference، نحوه کدنویسی شما به نرم‌‌افزار سنتز نشان می‌‌دهد که برای پیاده‌سازی مدار باید از منابع اختصاصی استفاده کند.

🔷 در روش مستقیم یا instant کردن، شما منبع سخت‌افزاری اختصاصی مورد نظرتان را مستقیماً در کد instant می‌‌کنید.

اما روش ضمنی بهتر است یا روش مستقیم؟

در پست بعد، به این سوال پاسخ خواهم داد.

ادامه دارد...

🆔 @FPGA0
⚡️ برای استفاده از منابع اختصاصی FPGA، روش مستقیم بهتر است یا روش ضمنی؟

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

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

اما استفاده از کدام روش بهتر است؟

استفاده از روش ضمنی بهتر است؛ زیرا با استفاده از این روش، اصطلاحاً کد شما portable می‌شود.

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

🔷 وقتی که شما یک منبع اختصاصی را به‌صورت مستقیم به‌کار می‌برید، فقط آن نرم‌‌افزار سنتز خاص، آن instant را خواهد شناخت.

🔷 از طرف دیگر، اگر از ورژن دیگری از همان نرم‌افزار سنتز استفاده کنید، ممکن است instant شما برای نرم‌افزار قابل شناسایی نباشد.

بنابراین، تا جای ممکن از روش ضمنی استفاده کنید تا یک کد portable داشته باشید و بر روی هر نرم‌افزار سنتز و هر ورژنی، به درستی شناسایی شود.

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

⚡️ البته توجه داشته باشید که امکان استفاده از برخی منابع به روش ضمنی وجود ندارد.

در پست بعد، این منابع را معرفی خواهم کرد.

🆔 @FPGA0
⚡️ کدام منابع سخت‌افزاری درون FPGA را نمی‌توان به‌صورت ضمنی پیاده‌سازی کرد؟

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

🔷 برای مثال، استفاد از بلوک DCM، به روش ضمنی امکان پذیر نیست.

🌀 به‌منظور یادآوری، بلوک DCM بلوکی است که یک سیگنال کلاک را به‌عنوان ورودی دریافت می‌کند و می‌تواند در خروجی، سیگنال یا سیگنال‌های کلاکی با فرکانس‌های متفاوت تولید کند.

🔷 ما نمی‌توانیم از طریق نحوه کدنویسی به نرم‌افزار پیاده‌ساز نشان دهیم که قصد داریم در پیاده‌سازی مدار ما از این بلوک استفاده شود.

🔷 به‌عنوان مثالی دیگر، پایه‌‌های IO دیفرانسیلی نیز از جمله بلوک‌‌هایی هستند که نمی‌توان از آن‌ها به روش ضمنی استفاده کرد.

همچنین، توصیه شرکت Xilinx این است که برخی از منابع را حتماً instant کنید.

🔷 حافظه‌های بلوکی (Block RAM) بزرگ از این نوع منابع سخت‌افزاری هستند.

🔷 البته می‌توان حافظه‌های بلوکی را به روش ضمنی نیز به‌کار گرفت؛ اما توصیه شرکت Xilinx این است که برای استفاده از آن‌ها، به‌خصوص وقتی سایز حافظه بزرگ است، حتماً از روش مستقیم استفاده کنید.

🔷 بافرهای کلاک نیز از جمله منابعی هستند که توصیه می‌شود آن‌ها را به‌صورت مستقیم به‌کار ببرید.

🌀 بافرهای کلاک، بافرهای سخت‌‌افزاری هستند که در مسیر سیگنال‌های کلاک‌ قرار می‌‌گیرند؛ در واقع، سیگنال‌های کلاک حتماً باید از این بافرها عبور کنند.

🆔 @FPGA0
⚡️ آیا برای پیاده‌سازی الگوریتم‌های پردازش سیگنال نیاز به آشنایی با این الگوریتم‌ها دارید؟

🔷 خوشبختانه شما برای پیاده‌سازی الگوریتم‌های پردازش سیگنال نیاز به آشنایی با ماهیت این الگوریتم‌ها ندارید.

🔷 بلکه شما به‌عنوان پیاده‌ساز الگوریتم‌ها بر روی FPGA، آن‌ها را به‌صورت مجموعه‌ای از محاسبات ریاضی در نظر می‌گیرید.

به‌طور کلی، یک الگوریتم پردازش سیگنال، مجموعه‌ای از محاسبات ریاضی است که این محاسبات، از سه نوع بلوک تشکیل شده‌اند:

1️⃣ بلوک‌های محاسبات اصلی؛ شامل عملگرهای اصلی مانند جمع، ضرب، تقسیم و تفریق

2️⃣ بلوک‌های توابع خاص؛ مانند sin ،cos و رادیکال

3️⃣ بلوک‌های پردازشی پایه؛ مثل فیلتر و FFT

🔷 در پست‌های کانال درباره پیاده‌سازی عملگرهای اصلی به‌طور مفصل قبل صحبت کرده‌ام.

🔷 برای پیاده‌سازی توابع خاص می‌توانید از IPهایی که در نرم‌افزار ISE وجود دارد استفاده کنید.

🔷 می‌توانید تنظیمات این IPها را انجام داده و آن‌ها را در کدتان instant کنید.

در ارتباط با پیاده‌سازی بلوک‌های پردازشی پایه (فیلتر و FFT) بهتر است یک دید سیستمی نسبت به آن‌ها داشته باشید.

🔷 در پست‌های بعد، به بلوک‌های پردازشی پایه می‌پردازم.

🆔 @FPGA0