آپدیت 96/05/30: پروژه به زبان وریلاگ خوانا اضافه شد.
رفقای پازجی، سلام!
در این نوشته به بررسی چگونگی ایجاد یک ارتباط سریال ساده از نوع UART بین FPGA و PC خواهیم پرداخت. البته قبلا طی یک آموزش تصویری با نحوهی ایجاد یک ارتباط UART ساده با استفاده از پردازندهی MicroBlaze آشنا شدیم، اما از آنجایی که در بسیاری از کاربردها نیاز داریم تا ارتباط سریال را بدون استفاده از میکروبلیز داشته باشیم در این پروژهی نمونه به پیادهسازی یک ارتباط سریال UART بدون استفاده از MicroBlaze و در قالب چند ماژول سختافزاری ساده خواهیم پرداخت.
از آنجایی که اصول اولیه ارتباط UART در اکثر مراجع آموزشی میکروکنترلرها ذکر شده و به احتمال زیاد اکثر شما با آن آشنا هستید از ذکر مقدمات و مبانی این ارتباط خودداری کرده و یک راست به سراغ اصل ماجرا میرویم! همچنین از آنجایی که هدف از ارائهی "طرحهای نمونه" (Sample Design) فراهم کردن یک الگوی آماده جهت بکارگیری در سایر پروژهها است، تنها به توضیح کلیات طرح و نحوهی استفاده از آن در پروژههای دیگر بسنده میکنیم و وارد جزئیات طراحی داخلی ماژولها نمیشویم.
توضیحات:
این طرح نمونه متشکل از یک ماژول گیرنده (uart_rx_fifo) و یک ماژول فرستنده (uart_tx_fifo) دادههای سریال است که توسط ماژول سومی به نام rx_to_tx تشکیل یک "حلقه برگردان" یا "loopback" را دادهاند؛ بدین معنی که دادههایی که از طرف PC ارسال شده و توسط ماژول گیرنده دریافت میشوند، بطور پیوسته توسط ماژول واسط rx_to_tx خوانده شده و به ماژول TX داده میشود تا به کامپیوتر برگردانده شود. تکنیک "حلقه برگردان" یک روش مرسوم جهت تست عملکرد لینکهای ارتباطی است که قبلا در طرح نمونهی "ارتباط USB با سرعت 8MB/s در حالت Asyncronous FIFO" نیز از آن استفاده کردیم.
ساختار سلسله مراتبی طرح ما در شکل زیر نمایش داده شده است:
- ماژول clk_gen شامل یک کور PLL است که توسط CORE Generator موجود در ISE تولید شده است و وظیفهی آن تولید کلاک 40MHz مورد نیاز سایر ماژولها از روی کلاک 24MHz تامین شده توسط کریستال روی بورد است.
- ماژول uart_rx_fifo وظیفهی دریافت دادههای ارسالی از جهان خارج (که در مثال ما یک PC است) و ذخیرهی آن درون یک FIFO با عمق 1K را دارد. برای خواندن اطلاعات ارسالی کافی است تا دیتای موجود در این FIFO را بخوانید. به همین سادگی، به همین خوشمزگی!
- ماژول uart_tx_fifo نیز مجهز به یک FIFO است که کاربر آن را با اطلاعات دلخواه خودش پر میکند و ماژول بطور پیوسته دادههای درون این FIFO را خوانده و به سمت کامپیوتر ارسال میکند. با این اوصاف کاربر عملا از درگیری با جزئیات ارتباط سریال معاف بوده و تنها کاری که بایستی انجام دهد خواندن و نوشتن اطلاعات از/به FIFO های RX و TX است.
- ماژول rx2tx نیز تنها به جهت تست عملکرد طرح است و قابلیت دیگری ندارد. بنابراین چنانچه قصد دارید تا این طرح نمونه را در پروژههای خود استفاده کنید، میتوانید این ماژول را حذف کنید.
توجه: بصورت پیشفرض ماژولهای فرستنده و گیرندهی UART موجود در این طرح همگی روی کلاک ورودی 40MHz و باود ریت 9600 تنظیم شدهاند. چنانچه بخواهید فرکانس پالس کلاک ورودی و یا baud rate را تغییر دهید، بایستی پارامترهای CLOCK_RATE و BAUD_RATE را در ماژولهای uart_rx_fifo و uart_tx_fifo تغییر دهید.
جهت تست این طرح نیز کافی است تا پس از اجرای پروژهی ISE ارائه شده در فایل پیوست و تولید فایل bit و پروگرام کردن آن روی بورد پازج-یک، از طریق نرمافزاری مانند putty یک ارتباط سریال با بورد برقرار کنید (چنانچه با نحوهی انجام این کار آشنایی ندارید به راهنمای کاربری بورد پازج-یک مراجعه نمایید). چنانچه همه چیز به خوبی پیش رفته باشد، بایستی پس از تایپ هر کاراکتر در کنسول سریال، بلافاصله همان کاراکتر به شما برگشت داده شود (شکل زیر).
توجه: لازم به ذکر است کنسول putty به صورت پیشفرض کاراکترهای ارسالی از سمت کاربر را چاپ نمیکند و تنها کاراکترهای برگشتی از پورت سریال را نمایش میدهد. لذا نباید انتظار داشته باشید که پست از تایپ هر کاراکتر آن را دو بار مشاهده کنید و یک بار نمایش آن به منزلهی صحت اجرای کار است.
امیدوارم این پروژه نمونه به کارتان آمده باشد.
always@posedge باشید!
فایلهای پیوست:
فایلهای سورس و پروژهی ISE (دانلود)