12 شهریور, 1399

تعیین استراتژی طراحی

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

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

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

More...

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

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

در مقاله افزایش سرعت مدار با تنظیم قیدها در ISE، مشاهده کردید که می‌توان به‌کمک قید period، به نرم‌افزار پیاده‌ساز اعلام کرد که قصد دارید سیگنال کلاک با چه فرکانسی به مدار اعمال کنید.

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

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

در این صورت باید راه‌های دیگری را در پیش گیرید.

اولین راهکار، ایجاد تغییراتی در معماری مدار است.

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

همچنین، باید مطمئن شوید که تمامی نکات الگوی استاندارد کدنویسی را به‌کار گرفته‌اید.

برای آشنایی با الگوی استاندارد کدنویسی، این مقاله را مطالعه کنید...

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

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

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

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

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

در ادامه این مقاله، با این دو قابلیت نرم‌افزار ISE آشنا می‌شوید.

تعیین هدف طراحی پیاده‌سازی برای نرم‌افزار ISE؛ روش Design Goals & Strategies

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

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

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

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

مطابق شکل زیر، از منوی Project، گزینه Design Goals & Strategies را انتخاب کنید:

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش Design Goals & Strategies

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش Design Goals & Strategies

پنجره‌ای مطابق شکل زیر ظاهر می‌شود؛ در قسمت Design Goal، می‌توانید از بین گزینه‌های موجود، هدف پیاده‌سازی را مشخص کنید:

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش Design Goals & Strategies

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش Design Goals & Strategies

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

بررسی اهداف پیاده‌سازی

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

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

به‌صورت پیش‌فرض، هدف پیاده‌سازی روی گزینه Balanced تنظیم شده است؛ گزینه Balanced شامل ترکیب سایر اهداف است.

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

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

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

یا ممکن است در پروژه‌های خاصی، نیاز باشد کمترین ابعاد ممکن را برای بُرد داشته باشید. در این صورت نیز باید هدف Area Reduction را انتخاب کنید تا بتوانید مدار را در FPGA کوچکتری جانمایی و پیاده‌سازی کنید.

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

برای مثال، ممکن است قرار باشد مدار شما یک شبکه سنسوری زیر آب را مدیریت کند. در چنین سناریویی نیاز دارید که مدار کمترین مصرف توان ممکن را داشته باشد تا باتری تامین کننده تغذیه مدار، برای مدت بیشتری کار کند.

با انتخاب گزینه Minimum Runtime، عملیات پیاده‌سازی در سریع‌ترین زمان انجام می‌شود.

در مراحلی از پروژه، هدف، بررسی عملکرد کلی مدار است. می‌توانید برای صرفه‌جویی در زمان، Minimum Runtime را انتخاب کنید تا مدار سریع‌تر پیاده‌سازی شود و نتیجه کار قابل مشاهده باشد.

اما هیچ‌گاه برای پیاده‌سازی نهایی پروژه، این گزینه را انتخاب نمی‌کنیم.

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

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

نرم‌افزار برای هر هدف، چند استراتژی از قبل آماده شده دارد.

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

پس از انتخاب گزینه Timing Performance، در بخش Strategy (شکل بالا)، سه انتخاب برای استراتژی ظاهر می‌شود.

آشنا نبودن با این استراتژی‌ها اهمیتی ندارد؛ یکی از آن‌ها را انتخاب کنید.

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

سپس، این قیدها در هنگام پیاده‌سازی به مدار شما اعمال می‌شوند.

بررسی چند قید پیاده‌سازی

اگر از قسمت شماره 3 در شکل بالا، گزینه View Strategy Details را انتخاب کنید، می‌توانید تغییرات قیدهای گلوبال، نسبت به هدف و استراتژی قبلی را ملاحظه کنید:

بررسی تغییرات قیدهای پیاده‌سازیرات قیدهای گلوبال

بررسی تغییرات قیدهای پیاده‌سازی

همان‌طور که مشاهده می‌کنید، قیدهای هر مرحله از پیاده‌سازی به‌صورت جداگانه نمایش داده شده‌اند؛ قیدهای مرحله سنتز، Map، جانمایی و مسیریابی.

در ستون Current Value مقادیر فعلی قید‌ها و در ستون Strategy Value مقادیر قید‌ها با توجه به استراتژی جدید انتخابی نوشته شده‌اند.

برای مثال، در قسمت قیود مربوط به مرحله سنتز، حالت فعلی و قبلی قید Optimization Goal یکسان و برابر با Speed است.

قید Optimization Goal می‌تواند دو مقدار Speed و Area را داشته باشد؛ اگر این قید روی حالت Speed تنظیم شده باشد، نرم‌افزار در مرحله سنتز، تمام تلاشش را می‌کند تا به حداکثر فرکانس ممکن برای سیگنال کلاک سیستم برسد.

البته، موضوع حداکثر کردن فرکانس، صرفاً مربوط به این قید نیست؛ بلکه قید‌های دیگری نیز در این مسئله تاثیرگذارند.

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

دومین قید مرحله سنتز، Optimization Effort است که می‌تواند سه مقدار Normal ،High، و Fast را داشته باشد.

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

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

همچنین، انتخاب گزینه Fast برای قید Optimization Effort باعث می‌شود که الگوریتم، کمترین تلاش ممکن را برای پیاده‌سازی و سنتز انجام دهد و در واقع، عملیات سنتز در سریع‌ترین زمان انجام می‌شود.

استفاده از گزینه Fast زمانی که در حال develop کردن پروژه و در مراحل میانی کار هستید خوب است.

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

اما به‌طور معمول، این قید روی گزینه Normal تنظیم می‌شود و اگر به نتیجه دلخواهتان نرسیدید، احتمال دارد بخواهید گزینه High را امتحان کنید تا ببینید آیا به نتیجه بهتری از نظر سنتز می‌رسید یا خیر.

در هدف Balance، قید Optimization Effort روی حالت Normal قرار دارد. با انتخاب هدف Timing Performance، این قید به حالت High تغییر پیدا کرده است.

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

یکی از گزینه‌های پایین پنجره Design Goals & Strategies، گزینه Edit Strategy است. با انتخاب این گزینه می‌توان در تنظیمات قید‌ها (که با توجه به استراتژی تعیین شده‌اند) تغییراتی ایجاد کرد.

برای مثال، می‌توان مطابق شکل زیر، قید Optimization Effort را از حالت High به حالت Normal تغییر وضعیت داد:

ویرایش قیدهای پیاده‌سازی

ویرایش قیدهای پیاده‌سازی

به این ترتیب، امکان اعمال هر تغییری در قیدهای گلوبال وجود دارد.

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

همچنین، مورد ششم، قید Keep Hierarchy است. این قید به‌صورت پیش‌فرض روی No تنظیم شده است.

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

سپس، به‌کمک Instant و Port Map کردن، بخش‌های کوچک را به یکدیگر متصل می‌کنیم تا یک پروژه کامل ایجاد شود.

وقتی قید Keep Hierarchy را روی No تنظیم کنید، به این معنی است که هنگام عملیات سنتز، ابتدا، تمامی ماجول‌های پروژه به‌صورت یک مجموعه درآیند؛ در واقع، انگار هیچ مرزی بین آن‌ها نیست و همگی تبدیل به یک گروه از معادلات منطقی شده‌اند.

در این حالت، نرم‌افزار، مجموعه آن‌ها را سنتز می‌کند.

اما اگر Keep Hierarchy را روی Yes قرار دهید، به این معنی است که هر کدام از ماجول‌های تشکیل‌دهنده‌ پروژه، به‌صورت جداگانه سنتز شود و نتیجه این سنتز‌ها در کنار هم قرار گیرد.

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

به پنجره تعیین هدف و استراتژی بازگردیم.

پس از انتخاب هدف و استراتژی موردنظر، با فشردن دکمه Apply آن را به پروژه اعمال کنید:

انتخاب و اعمال هدف پیاده‌سازی در پنجره Design Goals and Strategies

انتخاب و اعمال هدف پیاده‌سازی در پنجره Design Goals and Strategies

اکنون دوباره عملیات پیاده‌سازی را انجام دهید و با مشاهده حداکثر فرکانس سیگنال کلاک از گزارش Post-Place and Route Static Timing Report نتیجه تغییرات را بررسی کنید.

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

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

تعیین هدف طراحی برای نرم‌افزار ISE؛ روش SmartXplorer

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

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

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

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

مراحل استفاده از قابلیت SmartXplorer به‌صورت زیر است:

مطابق شکل زیر، از منوی Tools، ابتدا گزینه SmartXplorer و سپس گزینه Launch SmartXplorer را انتخاب کنید:

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش SmartXplorer

تعیین هدف پیاده‌سازی برای نرم‌افزار ISE؛ روش SmartXplorer

پنجره‌ای مطابق شکل زیر باز می‌شود؛ تنظیمات این پنجره بسیار ساده است اما می‌تواند کار بسیار بزرگی برای شما انجام دهد:

انجام تنظیمات مربوط به روش SmartXplorer

انجام تنظیمات مربوط به روش SmartXplorer

در اولین سطر، هدفی برای پیاده‌سازی انتخاب می‌کنیم. به‌صورت پیش‌فرض گزینه Timing Performance انتخاب شده است.

همان‌طور که در شکل مشاهده می‌کنید، در قسمت Maximum number of runs به‌طور پیش‌فرض عدد 7 نوشته شده است.

مربع کنار گزینه Run all strategies/iterations را تیک زده و گزینه OK را فشار دهید.

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

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

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

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

بررسی جدول نتایج روش SmartXplorer

برای دیدن جدول نتایج، مطابق شکل زیر، گزینه Show SmartXplorer Results را انتخاب کنید:

روش دسترسی به جدول نتایج روش SmartXplorer

روش دسترسی به جدول نتایج روش SmartXplorer

جدول نتایج را در شکل زیر ملاحظه می‌کنید:

جدول نتایج روش SmartXplorer

جدول نتایج روش SmartXplorer

به‌صورت پیش‌فرض، یکی از سطرها با پس‌زمینه سبز نشان داده شده است؛ این سطر، سطر winner یا برنده است.

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

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

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

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

برای مثال، در سطر برنده، گزینه Done را انتخاب می‌کنم. سپس، به گزارش Post-Place and Route Static Timing Report مراجعه می‌کنم.

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

بررسی حداکثر فرکانس برای سیگنال کلاک مدار در گزارش Post-Place and Route Static Timing Report

بررسی حداکثر فرکانس برای سیگنال کلاک مدار در گزارش Post-Place and Route Static Timing Report

نحوه اعمال استراتژی برنده به مدار

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

شاید به دلیلی تشخیص دهید که تنظیمات سطر دیگری برای پروژه شما مناسب‌تر است و بخواهید آن را به پروژه‌ اعمال کنید.

برای این کار، مربع کنار نام استراتژی موردنظرتان را تیک بزنید و سپس، گزینه Copy Results را انتخاب کنید.

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

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

دسترسی به قیدهای بخش Implementation نرم‌افزار ISE

دسترسی به قیدهای بخش Implementation نرم‌افزار ISE

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

لیست قیدهای بخش Implementation نرم‌افزار ISE

لیست قیدهای بخش Implementation نرم‌افزار ISE

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

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

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

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

این مقاله، برگرفته از دوره طراحی دیجیتال با FPGA بود.

برای اطلاع از جزئیات این دوره، روی دکمه زیر کلیک کنید:

لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمه‌های اشتراک گذاری ابتدای این مطلب و به اشتراک‌گذاری آن در شبکه‌های اجتماعی می‌توانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.

کانال تلگرام آموزش FPGA از صفر

برای عضویت در کانال تلگرام و دسترسی به آموزش‌های بیشتر و اطلاع سریع از زمان انتشار آموزش‌ها و تخفیف‌های ویژه، روی دکمه زیر کلیک کنید:

نویسنده: فاطمه مشاک

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

شاید به این موضوعات نیز علاقه داشته باشید:

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

    ۷ تکنیک پیشرفته کدنویسی برای FPGA

    >