نقطه شروع طراحی ماجول اینترفیس چیست؟
در طراحی ماجول اینترفیس، به چه نکاتی باید توجه کنیم؟
اگر در نقطهی شروع طراحی ماجولهای اینترفیسی، برایتان سوال پیش میآید که از کجا شروع کنم؟ و نیازمندیهای ماجول چیست؟ به ادامه این مقاله بسیار مهم و کاربردی توجه کنید.
More...
اگر به یاد داشته باشید، در مقالهای تحت عنوان اینترفیس پریفرالها با FPGA چگونه انجام میشود؟ یک نقشه راه برای پیادهسازی مدارات اینترفیس معرفی کردیم.
این نقشه راه شامل چندین مرحله بود، که هر کدام از این مراحل را به اختصار توضیح دادیم.
قول داده بودیم که در یک مقاله جداگانه، مرحله طراحی ماجول را که بسیار مهم است و اهمیت ویژه دارد بیشتر بررسی کرده و راهکارها و تکنیکهایی که بسیار کاربردی هستند را ارائه دهیم.
پس با این توضیحات، به سراغ بحث طراحی ماجول اینترفیس در FPGA میرویم.
البته در این مقاله، علاوه بر طراحی ماجول، پیادهسازی و تست ماجول را هم بررسی خواهیم کرد.
طراحی ماجول اینترفیس در FPGA
منظور از "ماجول اینترفیس"، مداری است که درون FPGA، برای برقرای ارتباط با پریفرال پیادهسازی میکنیم.
همانطور که از تصویر بالا هم مشخص است، ماجول اینترفیس همان مداری است که ما به کمک یک زبان توصیف سختافزار و نوشتن یک کد، درون FPGA پیادهسازی میکنیم.
مرحله طراحی ماجول یعنی اینکه مشخص کنیم برای پیادهسازی ماجول نیاز به چه قابلیتها و امکاناتی داریم و این قابلیتها باید به چه نحو پیادهسازی شوند.
موارد بالا، از جمله کارهایی هستند که باید بر روی کاغذ انجام شوند.
یعنی قبل از اینکه وارد محیط کدنویسی شویم، با استفاده از یک کاغذ و خودکار شروع به انجام طراحی میکنیم.
این مرحله، از جمله مراحلی است که معمولا بعضی افراد در آن مشکل و ابهام دارند و یا اصلا نمیدانند که باید از کجا و چگونه شروع کنند.
در ادامه، راهحلی به شما خواهیم گفت که بسیار کاربردی است و به شما کمک خواهد کرد که در کمترین زمان، یک طراحی خوب داشته باشید.
ایده اصلی این راهحل این است که یکی از روشهای مناسب برای شروع طراحی ماجول اینترفیس، یا هر ماجول دیگری، تعیین پورتهای آن است.
یک نقطه شروع عالی برای طراحی ماجول اینترفیس یا هر ماجول دیگری، تعیین پورتهای آن است.
اما اینکه چگونه پورتهای یک ماجول را تعیین کنید، خود یک موضوع مهم است و باید دارای معیارهایی باشد.
مثلا یکی از بهترین معیارها، برای تعیین پورتهای یک ماجول، درنظر گرفتن نیازمندیهای استفادهکننده از ماجول است.
بهترین معیار برای تعیین پورتها، درنظر گرفتن نیازمندیهای استفادهکننده از ماجول است.
فرض کنید قصد دارید ماجولی طراحی کنید که قرار است در یک تاپ ماجول دیگر یا یک پروژه بزرگتر، توسط فرد دیگری مورد استفاده قرار گیرد.
اکنون خودتان را به جای فرد موردنظر بگذارید. برای اینکه این فرد از ماجول شما، به بهترین نحو و سادهترین روش در ماجول و پروژه بزرگتر خود استفاده کند، نیاز به چه پورتهایی دارد؟
این کار میتواند به شما یک ایده بدهد تا با منطق بهتری پورتهای ماجول را تعیین کنید.
حال وقتی پورتها را تعیین کردید، خود این پورتها یک ایده اولیه در مورد طراحی میدهند.
اجازه دهید که یک مثال ساده را در ارتباط با طراحی پورتها، با روشی که در بالا گفتیم بررسی کنیم.
فرض کنید که میخواهیم یک ماجول فرستنده RS232 طراحی کنیم.
همانطور که میدانید، یک ماجول فرستنده RS232 قرار است دیتاهای هشت بیتی را تحویل گرفته و آنها را در قالب یک پکت RS232 و روی یک خط سریال ارسال کند.
قاعدتا ما یک پورت اجباری به اسم Tx خواهیم داشت. این پورت قرار است دیتاهایی که به صورت پکت RS232 در آمدهاند را به صورت سریال به سمت یک دیوایس دیگر ارسال کند.
برای اینکه ما بتوانیم از طریق این ماجول، یک بایت را ارسال کنیم، قاعدتا باید بتوانیم این بایت را به ماجول اعمال کنیم. پس در نتیجه ما نیاز به یک پورت هشت بیتی به اسم Data_In داریم.
سوال دیگری که پیش میآید این است که وقتی یک دیتای هشت بیتی را در ورودی Data_In قرار میدهیم، ماجول از کجا متوجه میشود که یک دیتای جدید در ورودیاش قرار گرفته است؟
این سوال، ما را به این نتیجه میرساند که نیاز به یک پورت دیگر به اسم Send داریم. اصولا اینگونه پورتها (پورتهای کنترلی تک بیتی ورودی) را حساس به لبه بالارونده میکنیم تا با اعمال هر لبه بالارونده به ماجول، ماجول متوجه دیتای جدید از سمت ما شود و آن را ارسال کند.
اما اگر کمی دقیقتر به استفاده عملی از این ماجول فکر کنیم، یک سوال دیگر ایجاد میشود؛ اینکه من به عنوان کسی که در حال استفاده از این ماجول هستم، یک دیتای هشت بیتی را در ورودی ماجول قرار داده و فرمان Send را ارسال میکنم.
اکنون میخواهم یک دیتای هشت بیتی دیگر را ارسال کنم، از کجا متوجه شوم میتوانم یک دیتای جدید را ارسال کنم، یا این ماجول هنوز در حال ارسال دیتای قبلی است؟
این سوال به ما کمک میکند که یک پورت دیگر به اسم پورت Busy تعریف کنیم.
وقتی من فرمان Send را ارسال میکنم، بلافاصله پورت Busy از 0 به 1 تعییر میکند که نشاندهنده این است که ماجول مشغول است و نمیتوان دیتای جدیدی را به آن اعمال کرد.
با استفاده از توضیحاتی که دادیم، ماجول فرستنده RS232 به صورت تصویر زیر طراحی میشود:
پس از طراحی ماجول اینترفیس در FPGA بر روی کاغذ، نوبت پیادهسازی آن است. در پیادهسازی هم ملاحظاتی وجود دارد که در ادامه این ملاحظات را بیان خواهیم کرد.
پیادهسازی ماجول
ما معمولا ماجولها را به کمک کدنویسی به زبان VHDL یا Verilog، و در صورت لزوم، IPهای آماده پیادهسازی میکنیم.
اختصاص پینها به پورتهای مدار، تعیین استاندارد IOها و اعمال قیدهای زمانی نیز در مرحله پیادهسازی ماجول انجام میشوند. در رابطه با هر کدام از این موارد در ادامه به صورت مفصلتر صحبت خواهیم کرد.
در رابطه با موارد ذکر شده در پاراگراف بالا، بهتر است که به مقاله "فایل قیود کاربر در نرمافزار ویوادو: تخصیص پینها و اعمال قید زمانی" مراجعه کنید.
استانداردهای IO با توجه به استاندارد IO مربوط به پریفرال مشخص میشوند.
منظور از استاندارد IOی دیجیتال، مشخصات الکتریکی سیگنالهای IO، مثل سطح ولتاژ آنها، مقدار جریاندهی آنها و... است.
مثلا برای نشان دادن سطح منطقی یک، به کدام یک از ولتاژهای 3.3V و 1.8V یا هر ولتاژ دیگری نیاز است.
فرض کنید از یک پریفرال بر روی برد خود استفاده کرده و IOهای آن را به صورت فیزیکی به IOهای FPGA متصل کردهاید.
حال این پریفرال، استاندارد مربوط به خود و FPGA هم استاندارد مربوط به خودش را دارد، اگر این استانداردها تطابق نداشته باشند، در بهترین حالت انتقال دیتا به درستی انجام نمیشود و در بدترین حالت نیز پریفرال یا FPGA میتواند به یکدیگر آسیب برسانند.
به همین دلیل، باید قبل از پیادهسازی، این استاندارها را از روی دیتاشیت پریفرال استخراج کرد.
تطبیق استاندارهای پریفرال و FPGA به کمک قید IOSTANDARD انجام میشود.
مورد بعدی که باید در پیادهسازی به آن دقت شود، قیدهای زمانی هستند. قیدهای زمانی در دو دسته کلی زیر اعمال میشوند:
قید زمانی کلاک اصلی، همان قیدی است که در نرمافزار ISE به کمک قید period و در نرمافزار ویوادو به کمک قید create_clock اعمال میشود.
قیدهای زمانی مربوط به ورودیها و خروجیها فقط زمانی کاربرد دارند که یک پریفرال را به صورت ورودی یا خروجی با FPGA اینترفیس کنید و دیتا توسط کلاک مشترکی بین FPGA و پریفرال جابجا میشود.
نام قیدهای زمانی که باید در نرمافزار ISE استفاده کنیم، offset in و offset out است. در نرمافزار ویوادو نیز این قیدها با نام input delay و output delay شناخته میشوند.
پس از اینکه طراحی ماجول اینترفیس و پیادهسازی آن را انجام دادیم، نوبت تست آن است. در ادامه، این مورد را نیز شرح خواهیم داد.
تست قدم به قدم ماجول اینترفیس
در مورد ماجولهای اینترفیس، چون با سیگنالهای پیچیده دنیای واقعی سر و کار داریم، در بسیاری از موارد استفاده از شبیهسازی کمی مشکل است و کمتر انجام میشود.
چون شما با قطعات جانبی سر و کار دارید و آن قطعات جانبی در عمل، برای شما سیگنالهایی را تولید میکنند، که ممکن است تولید و استفاده صحیح از این سیگنالها در یک تستبنچ کار راحتی نباشد.
به همین دلیل، بهترین تستها در حوزه پیادهسازی ماجولهای اینترفیس، به صورت عملی و به کمک ابزارهایی مثل چیپاسکوپ و Vivado Logic Analyzer انجام میشود.
همچنین، به عنوان یک راهکار بسیار مهم، ماجولها را به صورت قدم به قدم تست کنید.
ایده اصولی تست، بررسی قدم به قدم ماجولها است.
اشتباه رایجی که بسیاری از افراد مرتکب میشوند، این است که یک مدار متشکل از چندین ماجول را پیادهسازی و تجمیع میکنند و در آخرین مرحله، اقدام به تست آن میکنند.
این کار بسیار اشتباه است و ممکن است به روزها و هفتهها زمان نیاز داشته باشد. حتی در اکثر اوقات ممکن است به نتیجه نهایی نیز نرسد.
کار اصولی این است که شما مدار خودتان را تا جای ممکن به بخشهای کوچک تقسیم کنید و شروع کنید مرحله به مرحله تست را انجام دهید و کمکم ماجولهای دیگر را به پروژه اضافه کنید.
اگر در هنگام طراحی ماجول اینترفیس در FPGA و همچنین پیادهسازی و تست آن، از اصولی که در این مقاله گفته شد پیروی کنید، در نهایت، هم مدار بهتر و بهینهتری خواهید داشت و هم این مدار در مدت زمان بسیار کمتری توسط شما پیادهسازی خواهد شد.
سادگی، کلید پیادهسازی حرفهای است!
ماجولها و مدارهایی که قرار است شما طراحی کنید، اصولا به خودی خود دارای پیچیدگیهای بسیار زیادی هستند.
بنابراین، یک طراح حرفهای سعی میکند تا جای ممکن، سادهترین ایدهها را برای پیادهسازی انتخاب کند. یعنی خود طراح، چیز دیگری را به پیچیدگی ذاتی این طرح اضافه نکند.
یک عادت یا تصور غلط که ممکن است در فکر بعضی از افراد وجود داشته باشد، این است که برای اینکه نشان دهند پیادهسازیشان یک پیادهسازی حرفهای است، سعی میکنند پیچیدگیهایی را به سیستمشان اضافه کنند، یا مثلا کدشان را به نحوی بنویسند که به راحتی خوانده نشود.
اما واقعیت این است که اولا ماجولهایی که قرار است شما پیادهسازی کنید، خودشان به اندازه کافی پیچیدگی دارند و دوما هر چقدر شما سعی کنید که این ماژولها را سادهتر پیادهسازی کنید، در واقع نشاندهنده حرفهای بودن شما است.
به خاطر داشته باشید که معمولا، بررسی و تفسیر کدهای نوشته شده توسط افرادی حرفهای بسیار راحتتر از بررسی کدهای افراد آماتور است.
امیدوارم که راهکارها و تکنیکهای ارائه شده در این مقاله برای شما مفید باشند و بتوانید از آنها در طراحی ماجولهای اینترفیسی خودتان استفاده کنید.
خیلی ممنون از مقاله عالی شما.
ای کاش به جای کلمه ماجول از ماژول استفاده کرد.
عالی بود
سلام…امکانش هست هرچه سریعتر در مورد راه اندازی پروتکل I2C در FPGA توضیح بدید🙏
سلام،
در حال حاضر این موضوع جزء آموزشهای رایگان برنامهریزی شده نیست اما احتمالا در آینده مطلبی در مورد آن منتشر شود.
موفق باشید.