توسط احمد ثقفی 

13 تیر, 1396

کدنویسی برای FPGA

کدی را برای توصیف یک مدار در FPGA نوشتم، اما هر چه تلاش می‌کنم نمی‌توانم به فرکانس کلاک مورد نظرم برسم…

کدی که نوشتم بعد از سنتز، به طرز عجیبی فضای FPGA را اشغال کرده است…

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

نمی‌توانم مشکلات مدار را با بررسی منطقی کد پیدا کنم…

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

More...

الگوی استاندارد کدنویسی برای FPGA

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

برای آشنایی با زبان VHDL این برنامه ویدئویی را ببینید…

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

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

برای آشنایی با ماهیت و ساختار FPGA این برنامه ویدئویی را ببینید…

منابع سخت‌افزاری FPGA به دوسته عمومی و اختصاصی (dedicated) تقسیم می‌شوند. در کدنویسی حرفه‌ای برای FPGA، سعی بر این است که تا حد امکان، از منابع اختصاصی برای پیاده‌سازی استفاده شود.

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

ویدئو یا متن؟

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

برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:

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

در این مقاله قصد دارم در مورد الگوی استاندارد کدنویسی برای FPGA صحبت کنم و ایده اصلی کدنویسی حرفه‌‌ای را برای شما توضیح دهم.

اهداف اصلی الگوی استاندارد کدنویسی چیست؟

با پیروی از الگوی استاندارد کدنویسی به دنبال اهداف زیر هستیم:

  • ما دوست داریم تا حد امکان سرعت مدارمان افزایش پیدا کند و عملکرد بهتری داشته باشد؛
  • هم‌‌چنین دوست داریم مدارمان تا حد امکان حجم کمتری را در FPGA اشغال کند؛
  • در بسیاری از موارد دوست داریم تا جای ممکن توان کمتری مصرف شود؛
  • هم‌‌چنین مدار ما عملکرد صحیح و پایداری داشته باشد.

نحوه‌‌ی پیاده‌‌سازی مدار دیجیتال در FPGA

قبل از بحث اصلی اجازه دهید یک یادآوری از نحوه‌‌ی پیاده‌‌سازی مدار دیجیتال در FPGA داشته باشیم.

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

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

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

شما به کمک یک زبان HDL، رفتار یک مدار را توصیف می‌‌کنید. سپس نرم‌‌افزار سنتز بر مبنای رفتاری که شما توصیف کرده‌‌اید و به کمک منابع دیجیتالی که در FPGA مورد نظر شما وجود دارند، مدار جدیدی را پیاده‌‌سازی می‌‌‌‌کند؛ مداری که دقیقاً بتواند مطابق با همان رفتاری که شما در زبان VHDL یا Verilog توصیف کرده‌‌اید، عمل کند.

منابع سخت‌‌افزاری موجود در FPGA

نمایش منابع سخت‌‌افزاری موجود در FPGA

​شمایی از منابع سخت‌‌افزاری موجود در  FPGA

مهم‌‌ترین و بیشترین منابع سخت‌‌افزاری موجود در FPGAها، مجموعه‌‌ی LUTها و فلیپ‌‌فلاپ‌‌ها هستند. LUTها یا Look-Up Tableها در واقع حافظه‌‌های کوچکی هستند که می‌‌توانند یک تابع کوچک دیجیتالی را پیاده‌‌سازی کنند.

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

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

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

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

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

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

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

در FPGAهای شرکت XILINX، به بلوک‌‌های ضرب کننده، DSP48 می‌‌گوییم.

این بلوک‌‌ها، کارهایی بیش از یک عمل ضرب انجام می‌‌دهند؛ DSP48‌‌ها می‌‌توانند یک عمل ضرب، یک عمل جمع، یک عمل ضرب و جمع و هم‌‌چنین یک عمل جمع و ضرب را انجام دهند.

شما به کمک آن‌‌ها می‌‌توانید Accumulator، ضرب کننده، شمارنده و خیلی از محاسبات ریاضی دیگر را پیاده‌‌سازی کنید.

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

منابع کلاک به منظور تولید فرکانس‌‌های جدید برای کلاک و همچنین برای کلاک‌‌رسانی به مدار استفاده می‌‌شوند.

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

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

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

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

گروه اول منابع عمومی هستند؛ این منابع در واقع همان LUTها و فلیپ‌‌فلاپ‌‌ها هستند. همان‌‌طور که در شکل زیر می‌‌بینید، در FPGAهای شرکت XILINX، مجموعه‌‌ای شامل LUT و فلیپ‌‌فلاپ و یک مالتی‌‌پلکسر، درون بخشی به نام Logic Block یا Logic Cell قرار دارند.

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

نمایش یک Logic Block در FPGA

​شمایی از یک Logic Block در FPGA

اما دسته دوم، منابع اختصاصی یا Dedicated هستند. منابع Dedicated، مواردی چون DSP48ها برای پیاده‌‌سازی عملیات اصلی ریاضی، Blok RAMها برای حافظه‌‌های رم، SRL برای شیفت‌‌رجیسترها و بلوک DCM برای ساختن کلاک‌‌هایی با فرکانس جدید از روی یک کلاک، هستند.

منابع اختصاصی یا عمومی؟ برای پیاده‌‌سازی کدامیک الویت دارند؟

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

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

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

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

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

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

دو روش برای استفاده از منابع اختصاصی در کدنویسی وجود دارد:

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

به عبارت دیگر، در روش ضمنی شما به صورت مستقیم به آن منبع اختصاصی، برای مثال یک SRL به عنوان یک شیفت‌‌رجیستر، اشاره نمی‌‌کنید. بلکه نحوه‌‌ی کدنویسی شما باعث می‌‌شود که نرم‌‌افزار پیاده‌‌ساز متوجه شود که باید از منبع اختصاصی SRL (به جای استفاده از فلیپ فلاپ‌‌ها) برای پیاده‌‌سازی شیفت‌‌رجیستر استفاده کند.

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

برای اینکه بتوانید آن منبع سخت‌‌افزاری اختصاصی را به روش Instant در مدارتان استفاده کنید، باید به بخش Core IPها در نرم‌‌افزار ISE مراجعه کنید. تمام منابع اختصاصی را می‌‌توانید در این بخش پیدا کنید و به صورت یک IP در مدار خودتان Instant کنید.

ملزومات الگوی استاندارد کدنویسی برای FPGA

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

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

شما باید مدارتان را به صورت کاملاً سنکرون پیاده‌‌سازی کنید. این یکی از مهم‌‌ترین مواردی است که در الگوی استاندارد کدنویسی باید از آن پیروی کرد.

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

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

همان‌‌طور که حتما می‌‌دانید، در FPGAها دو نوع حافظه داخلی وجود دارد:

حافظه بلوکی یا Blok RAMها و حافظه توزیع‌‌شده یا Distributed RAMها

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

مورد بعدی، بحث استفاده از ساختارهای شرطی if و case است.

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

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

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

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

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

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

در FPGAهای شرکت XILINX، تعدادی LUT وجود دارد که در صورت نیاز می‌‌توانند به صورت شیفت‌‌رجیستر عمل کنند.

نام این منبع سخت‌‌افزاری، Shift Register LUT یا SRL است. بنابراین شما به‌‌جای استفاده از فلیپ فلاپ‌‌ها می‌‌توانید از SRLها استفاده کنید؛ در این صورت، شیفت‌‌رجیستری که پیاده‌‌سازی می‌‌کنید دارای سرعت بسیار بیشتری است و طبیعتاً از منابع کمتری نیز استفاده می‌‌‌‌کند.

پیاده‌سازی شیفت‌رجیستر به صورت ضمنی

اگر بخواهیم یک بلوک اختصاصی را به صورت ضمنی پیاده‌‌سازی کنیم، باید دقیقاً با آن بلوک اختصاصی آشنا شویم و بدانیم آن بلوک چه امکاناتی در FPGA دارد.

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

بلوک SRL یا Shift Register LUT که در FPGAهای شرکت XILINX وجود دارد، مطابق شکل زیر، دارای پورت‌‌های ورودی و خروجی به شرح زیر است:

یک پورت کلاک؛

یک پورت سریال ورودی یا Serial Input(SI؛

یک پورت سریال خروجی یا Serial Output(SO؛

و در نهایت یک پورت Clock Enable(CE).

نمایش بلوک SRL یا Shift Register LUT که در FPGAهای شرکت XILINX وجود دارد

​بلوک SRL در FPGA

نکته‌‌ی دیگری که در مورد این شیفت‌‌رجیستر باید بدانیم این است که SRLها فقط شیفت به چپ انجام می‌‌دهند؛ یعنی شما به کمک این شیفت‌‌رجیسترها نمی‌‌توانید شیفت به راست را پیاده‌‌سازی کنید.

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

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

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

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

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

همان‌‌طور که در کد زیر می‌‌بینید، در Entityی این ماجول، ورودی کلاک و Serial Input و خروجی Serial Output را تعریف کرده‌‌ام.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity SRL_Top is
    Port ( 
				Clock : in   STD_LOGIC;
				SI 	: in   STD_LOGIC;
				SO 	: out  STD_LOGIC
			);
end SRL_Top;

architecture Behavioral of SRL_Top is

signal Sh: unsigned (7 downto 0) := (others => '0');

begin

	SO <= Sh(7);

	process (Clock)
	begin

	if rising_edge(Clock) then

		Sh <= 	Sh(6 downto 0) & SI;
		
	end if;
	
	end process;
end Behavioral;

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

در Process و درون شرط لبه بالارونده کلاک (یعنی به صورت کاملاً سنکرون با کلاک)، به کمک عملگر Concatenation، عمل شیفت به چپ را پیاده سازی کرده‌‌ام (خط 26.) همان‌‌طور که می‌‌بینید، ورودی در بیت سبک شیفت‌‌رجیستر قرار می‌‌گیرد و بنابراین عمل شیفت را خواهیم داشت.

در خط 19ام کد، سنگین‌‌ترین بیت شیفت‌‌رجیستر را به خروجی ارجاع داده‌ام.

بدین ترتیب، تمام خصوصیات مورد نیاز برای پیاده‌سازی این کد به کمک یک SRL، درآن وجود دارد؛ زیرا:

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

همین‌‌طور که می‌‌بینید، در این کد، صحبت و اشاره مستقیمی به SRL نشده است ولی اگر آن را سنتز کنیم، نرم‌‌افزار پیاده‌ساز حتما آن را با بلوک Dedicated SRL پیاده‌سازی می‌‌‌‌کند. چون تمام مشخصات بلوک SRL در این کد به کار رفته است.

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

برای این کار، مطابق شکل زیر، روی تاپ ماجول SRL_Top کلیک کنید. سپس از منوی پایین و در بخش سنتز (Synthesize - XST)، روی گزینه‌‌ی View Technology Schematic کلیک کنید.

نمایش نحوه‌ی اجرای View Technology Schematic در نرم‌افزار ISE

​نحوه‌ی اجرای View Technology Schematic در نرم‌افزار ISE

در پنجره‌‌ی باز شده، دکمه‌‌ی OK را انتخاب کنید.

نمایش پنجره‌ی Set RTL Tech Viewer Startup Mode

​پنجره‌ی Set RTL Tech Viewer Startup Mode

​سپس در پنجره‌ی زیر، دکمه‌‌ی Add و سپس Create Schematic را انتخاب کنید.

نمایش نحوه‌ی ساخت شماتیک بلوک SRL_Top

نحوه‌ی ​ساخت شماتیک مدار پیاده‌سازی شده با زبان VHDL به کمک نرم‌افزار ISE

بدین ترتیب می‌‌توانید Top Level Module را مطابق شکل زیر ببینید.

شماتیک بلوک SRL_Top

​شماتیک کلی بلوک شیفت رجیستر

اگر روی آن دبل‌‌کلیک کنید، وارد بلوک می‌‌شود.

سپس گزینه zoom to full view را از آیکون بالای صفحه انتخاب کنید تا یک دید کلی نسبت به بلوک‌‌های به کار رفته در پیاده‌‌سازی داشته باشید.

نمایش شماتیک داخلی بلوک شیفت رجیستر

​شماتیک داخلی بلوک شیفت رجیستر

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

اما اصل مدار ما، بلوک SRL16 و بلوک فلیپ‌فلاپ است.

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

خروجی این شیفت‌‌رجیستر وارد فیلپ‌‌فلاپ می‌‌شود. سپس از این فلیپ‌‌فلاپ و از طریق بافر Output به خروجی ارسال می‌‌شود.

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

اما اگر ما به مشخصات SRLهای موجود در FPGA‌‌های شرکت XILINX توجه نمی‌‌کردیم چه اتفاقی می‌‌افتاد؟

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

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

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

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

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity SRL_Top is
    Port ( 
				Clock : in   STD_LOGIC;
				Reset : in   STD_LOGIC;
				SI 	: in   STD_LOGIC;
				SO 	: out  STD_LOGIC
			);
end SRL_Top;

architecture Behavioral of SRL_Top is

signal Sh: unsigned (7 downto 0) := (others => '0');

begin

	SO <= Sh(7);

	process (Clock)
	begin

	if rising_edge(Clock) then

		Sh <= 	Sh(6 downto 0) & SI;
		
		if (Reset= '1') then
		
				Sh <= (others => '0');
				
		end if;		
	end if;
	
	end process;
end Behavioral;

اکنون دوباره به بخش View Technology Schematic مراجعه می‌‌کنیم تا ببینیم در پیاده‌‌سازی چه تفاوتی ایجاد شده است و از چه منابعی استفاده شده است.

نمایش شماتیک داخلی بلوک شیفت رجیستر با Reset

​شماتیک داخلی بلوک شیفت رجیستر با Reset

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

این پیاده‌‌سازی، پیاده‌‌سازی خوبی نیست؛ زیرا:

اولاً استفاده از فلیپ‌‌فلاپ‌‌ها منابع عمومی را کاهش می‌دهد؛

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

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

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

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

آیا برنامه ویدئویی الگوی استاندارد کدنویسی برای FPGA برای شما مفید بود؟

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

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

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

درباره نویسنده:

احمد ثقفی

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

  • سلام. وقت بخیر.
    در اواخر برنامه ویدئویی “الگوی استاندارد کدنویسی برای FPGA” مثالی را تویح داده اید که یک شیفت رجیستر به چپ را تویف میکند. در قسمت Concurrent نوشته شده: SO <= Sh(7) . با توجه به اینکه در این محیط بایستی ارجاعات با وقوع هر event در سیگنال سمت راست انجام شوند، چرا در نمایش بردار شماتیک حاصل از سنتز این مدار (View Technology Schematic) شاهد حور فلیپ فلاپ در بین خروجی SRL و SO هستیم؟ خواهشمندم توضیح کافی دهید. ممنون و سپاس از شما

    • سلام،

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

      موفق باشید.

  • سلام جناب ثقفی
    من یه کد برای fpga اسپارتان 3 نوشتم که با یک تغییر و تبدیل چند سیگنال به اعداد ثابت پروژه overmap میشه(در بخش occupied slice) و قابل پیاده سازی نیست ولی با حذف اون چند سیگنال پروژه پیاده سازی میشه ولی باز occupied slice نزدیک به 99 درصده می خواستم بدونم روشی برای کاهش هست یا خیر و مشکل از کد نویسی هست یا برای پیاده سازی باید fpga را قویتر کنم ممنون میشم پاسخ بدین

    • سلام،

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

      موفق باشید.

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

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

    >