راه اندازی USB3.0 با استفاده از تراشه FX3 شرکت Cypress

تست USB3.0 برد PX6SH01

اینترفیس USB به دلیل انعطاف پذیری بالا و سرعت بالا، به همراه امکان انتقال توان و  در دسترس بودن، همواره به عنوان یک گزینه برای برقراری ارتباط بین سخت افزار و کامپیوتر بوده است. استاندارد USB3.0 با افزودن دو جفت سیم اضافه به استاندارد USB2.0 معرفی شده است. سرعت انتقال دو طرفه (بر خلاف USB2.0 که یکطرفه بود) تا 5GB/s را از این طریق فراهم می کند. انتقال توان نیز از 2.5W به 7W افزایش یافته است. شرکت Cypress که در گذشته تراشه FX2 را برای ارتباط تراشه های مختلف با کامپیوتر را فراهم کرده بود، اکنون تراشه FX3 را برای USB3.0 معرفی کرده است.

در این مستند راه اندازی ارتباط USB3.0 بین FPGA و کامپیوتر با استفاده از تراشه FX3 از دید کاربر شرح داده خواهد شد.

اتصال تراشه FX3 و FPGA با استاندارد FIFO انجام شده است.

در این ارتباط FPGA به عنوان Master و FX3 به عنوان Slave می باشد.

داده از طریق یک باس 32 یا 16 بیتی به همراه تعدادی خطوط کنترلی و کلاک است.

راه اندازی این تراشه از دو بخش برنامه نویسی Firmware در FX3 و راه اندازی اینترفیس ارتباطی با FX3 در یک سو و کاربر از سوی دیگر، در FPGA است.

برای راه اندازی برنامه USB روی هر برد شامل تراشه FX3 لازم است:

ابتدا تراشه FX3 با استفاده از نرم افزار USB Controller برنامه ریزی شده و سپس برنامه FPGA به کار گرفته شود.

  • تراشه FX3

این تراشه توسط شرکت Cypress به منظور پیاده سازی پروتکل USB3.0 یا USB SuperSpeed طراحی شده است.

این شرکت در زمینه تراشه های USB سابقه ی چندین ساله دارد و قبلا سری های FX2 و FX1 را برای USB2.0 و USB1.0 نیز ارائه کرده است.

مزیت اصلی این تراشه که آن را برای کاربردهای با نرخ انتقال بالا مناسب کرده، I/O های سرعت بالایی است، که امکان تبادل داده با تراشه های جانبی را فراهم می کند.

این I/O ها که توانایی پیاده سازی پروتکل های مختلف را دارند، توسط نرم افزار مستقلی طراحی و اطلاعات آن در قالب یک فایل هدر به پروژه Firmware افزوده می شود.

نرم افزار طراحی I/O در FX3 با نام GPIFII ارائه شده است.

این نرم افزار علاوه بر طراحی ساختار I/O امکان شبیه سازی شکل موج را بر اساس انتخاب های مختلف، داراست.

ساختار این تراشه به صورت زیر است:

راه اندازی USB3.0

USB Interface امکان برقراری ارتباط SuperSpeed و high Speed را با کامپیوتر فراهم می کند. این ارتباط تا 32End-Point در آن قابل راه اندازی است.

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

می توان در صورت نیاز endpoint های داده یا کنترلی بیشتری نیز راه اندازی کرد.

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

مثلا اگر از Hub استفاده شود، به تعداد دستگاه های متصل به Hub Endpoint های کنترلی و داده راه اندازی و هر دستگاه به صورت جداگانه شناسایی و راه اندازی می شود.

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

در یک دستگاه میتوان چند Endpoint راه اندازی کرد که هر کدام خط داده مخصوص به خود را دارا هستند.

پردازنده ARM9 هم به همراه حافظه SRAM داخلی و DMA های متعدد، ابزار قدرتمندی در دست طراح Firmware است.

برای تبادل داده سرعت بالا که عموما بین USB و GPIF است، می توان از آنها استفاده کرد.

GPIF که مخفف General Purpose Interface است.

همانطور که قبل اشاره شد، این اینترفیس سرعت بالا امکان تبادل داده تا سقف 400MB/s به صورت دو طرفه (Half-duplex) را با دستگاه خارجی مانند FPGA فراهم می کند.

ارتباطات سریال هم برای تبادل داده با دستگاه های خارجی مانند حافظه، Sensor، یا ارتباط با پردازنده، FPGA و … استفاده می شود.

برای این بخش یک محیط طراحی مختص FX3  بر پایه Eclipse، توسط Cypress ارائه شده است. از آنجایی که این شرکت میکروکنترلر مخصوص به خود را تولید میکند، محیط های طراحی و کتابخانه های آن بسیار کامل بوده و کار طراح را به مراتب آسان تر می کند.

برای شروع کار ابتدا باید نرم افزار طراحی FX3 با نام EZ-USB FX3 Software Development Kit را از DVD همراه برد یا از سایت cypress دانلود کرده و آنرا روی کامپیوتر خود نصب کنید.

  • بخش اول طراحی GPIF

برای طراحی GPIO از نرم افزار GPIF II Designer استفاده می شود.

شرکت Cypress به جهت انعطاف پذیر بودن اینترفیس ارتباطی برای اتصال انواع مختلف تراشه ها به FX3، ساختار General Purpose Interface را ابداع کرده است.

برخی از ویژگی های آن عبارتند از:

Functions as master or slave

Provides 256 firmware programmable states

Supports 8-bit, 16-bit, and 32-bit parallel data bus

Enables interface frequencies up to 100 MHz

Supports 14 configurable control pins when a 32- bit data bus

Supports 16 configurable control pins when a 16/8 data bus is All control pins can be either input/output or bi-directional

پارامتر های مختلف GPIF II Designer به صورت گرافیکی انتخاب شده اند.

در نهایت به صورت یک فایل هدر با نام cyfxgpif2config.h تنظیم می شود.

با انتقال این فایل به پروژه اصلی که در نرم افزار EZ USB Suite ایجاد می شود.

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

ابزار GPIF II Designer در پوشه Firmware به همراه بقیه فایلهای FX3 در دسترس است.

  • Firmware

نرم افزار طراحی Firmware معرفی شده توسط شرکت Cypress برای برنامه نویسی با استفاده از پردازنده ARM9 موجود در تراشه FX3، EZ USB Suite است.

البته می توان از سایر نرم افزار طراحی ARM نیز مانند KEIL یا IAR نیز استفاده کرد.

در پروژه ارائه شده در پوشه Firmware، دو فایل اصلی وجود دارد که علاوه بر فایل خروجی GPIF II Designer، جزء فایل های اصلی پروژه هستند.

فایل cyfxslfifosync.c فایل اصلی پروژه است که تابع Main در آن قرار دارد و فایل cyfxslfifosync.h که فایل تنظیمات پروژه است.

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

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

در ادامه یک Thread ایجاد میشود که توسط این سیستم عامل اجرا می شود.

کارهایی که  thread انجام می دهد عبارتند از:

  1. ایجاد دو Endpoint . یکی برای ارسال داده به کامپیوتر با نام Endpoint In و دیگری برای دریافت داده از کامپیوتر که Endpoint out نامیده می شود.
  2. ایجاد دو Auto DMA برای انتقال داده های ارسال و دریافتی از FPGA به کامپیوتر و بالعکس
  3. سایر بخش های کنترلی برای FIFO ها، Descriptor ها و …

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

متغیرهایی که در فایل cyfxslfifosync.h برای کاربر در نظر گرفته شده است، چند مورد را شامل می شود.

  1. CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT

برای انتخاب باس 16 یا 32 بیتی در نظر گرفته شده است.

البته برنامه سمت FPGA با مد 32 بیتی نوشته شده است و در صورت تغییر این پارامتر، برنامه FPGA هم باید تغییر کند.

  1. STREAM_IN_OUT

مد ارسال و دریافت داده با سرعت بالا است که اکنون در آن کار می کنیم.

  1. MANUAL

پارامتری برای تعیین مد DMA.

اگر در حالت Manual تنظیم شود، CPU داده های دریافتی از USB را می گیرد و دوباره به FPGA تحویل می دهد.

CPU می تواند روی داده تغییر هم اعمال کند.

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

  1. LOOPBACK_SHRT_ZLP

مدی است که در برای تست و ارسال و دریافت و داده بصورت Loopback یا بسته با طول صفر استفاده می شود.

  1. BURST_LEN،DMA_BUF_SIZE_P_2_U،DMA_BUF_SIZE_U_2_P،   

و

CY_FX_SLFIFO_DMA_BUF_COUNT_P_2_U

CY_FX_SLFIFO_DMA_BUF_COUNT_U_2_P

پارامترهایی که برای تنظیم اندازه بافرهای DMA و بسته های داده بکار گرفته شده اند.

  • اتصال FX3 به کامپیوتر

تغذیه برد از طریق پورت USB2.0 یا آداپتور خارجی قابل تامین است.

برای انجام این تست کابل USB3.0 را به برد متصل کنید و جامپر J2 را متصل کنید.

این جامپر برای انتخاب حالت boot تراشه FX3 در نظر گرفته شده است.

اگر جامپر متصل باشد از EEPROM روی برد Boot می شود و اگر جامپر قطع باشد، USB boot خواهد بود.

بعد از تنظیم پارامتر های لازم، برنامه را کامپایل می کنیم که خروجی آن فایل SlaveFifoSync.img است.

برای پروگرام کردن این فایل ابتدا برد را به کامپیوتر متصل کنید. در صورت نیاز به درایور آنرا از پوشه زیر انتخاب کنید:

DVD/Driver/Cypress

C:\Program Files\Cypress\EZ-USB FX3 SDK\1.3\driver

سپس ابزار USB Control Center را از مجموعه برنامه های Cypress یعنی از مسیر زیر باز کنید:

DVD\App\USB3.0\bin\CyControlC#

All Program -> Cypress -> EZ-USB FX3 SDK -> Cypress USBSuite -> Control Center

طراحی firmware برای FX3 - راه اندازی USB3.0

برای برنامه ریزی تراشه، ابتدا آنرا از لیست سمت چپ انتخاب کنید.

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

امکان برنامه ریزی حافظه RAM، I2C EEPROM و SPI Flash توسط این نرم افزار وجود دارد.

حافظه  RAM حافظه داخلی تراشه FX3 است.

اما حافظه های EEPROM یا FLASH باید با توجه به حافظه متصل روی برد، برای کاربرد دائمی برنامه ریزی شوند.

اتصال FPGA به FX3 از طریق باس زیر انجام شده است:

اتصال fpga به fx3 - راه اندازی USB3.0

اینترفیس Slave FIFO در FX3 انتخاب شده است.

سیگنال های SLOE، SLRD، SLWR، SLCS، PKTEND و DQ نیاز به توضیح ندارند، زیرا سیگنال های کنترلی خواندن و نوشتن و باس داده در پروتکل FIFO هستند.

باس A به عنوان آدرس در نظر گرفته شده است که آدرس FIFO مربوطه در FX3 را انتخاب می کند.

این آدرس در برنامه Firmware مشخص شده است.

در برنامه اصلی آدرس FIFO دریافت 0 و آدرس FIFO ارسال 3 است.

PCLK یک کلاک 100MHz است که از FPGA به FX3 ارسال می شود. در پروتکل سنکرون PCLK، مبنای دریافت و ارسال داده است.

FLAG ها سیگنالهای قابل برنامه ریزی Empty، Full، almost Empty و Almost Full است که می تواند به صورت مالتیپلکس برای تمام FIFO ها متناسب با آدرس A، و با به صورت اختصاصی برای هر کدام FIFO ها برنامه ریزی شود.

در برنامه تک پورت USB این سیگنالها به صورت اختصاصی و در برنامه چند پورت به صورت مالتیپلکس استفاده شده است.

  • ساختار برنامه FPGA

ساختار داخلی برنامه FPGA به صورت زیر است:

یک FIFO برای ارسال داده کاربر به USB و یک FIFO دیگر برای ارسال داده USB به کاربر در نظر گرفته شده است.

برنامه HDL - راه اندازی USB3.0

این اینترفیس باس های 32 بیتی مجزا برای دریافت و ارسال داده دارد.

امکان ارسال داده به صورت بایتی وجود ندارد و حداقل داده دریافتی و ارسالی 4 بایت است.

برنامه USB_Super_Speed با برنامه کاربر به شکل زیر است:

ارتباط بین fpga وfx3 - راه اندازی USB3.0

سیگنال CLK کلاک ورودی 100MHz است که برای ارتباط با کاربر استفاده می شود.

همینطور به عنوان کلاک نوشتن در RX_FIFO و خواندن از TX_FIFO استفاده می شود.

سیگنالهای بخش User شامل موارد زیر است:

  1. Usr_clk: کلاک کاربر است که برای خواندن از RX_FIFO و نوشتن در TX_FIFO استفاده می شود. این کلاک میتواند هر فرکانسی مستقل از فرکانس مقدار CLK داشته باشد
  2. TX_FF_*: سیگنالهای کنترلی و داده جهت نوشتن در TX_FIFO می باشد. سیگنال Full در این بخش نشان دهنده پر بودن TX_FIFO است. در واقع almost-Full است و حدود 12 کلمه قبل از پر شدن FIFO یک می شود. اما چون داده های ارسالی کلمه ای ارسال می شوند نیاز به شمارش برای پر شدن FIFO نیست. تمام فرآیند مدیریت داده جهت افزایش اندازه بسته ها و استفاده بهینه از باس جهت افزایش نرخ داده، در برنامه کنترلر مدیریت می شود.
  3. RX_FF_*: سیگنال های RX_FIFO هستند که داده دریافتی از USB را به کاربر تحویل می دهند. برای اطمینان از معتبر بودن داده دریافتی از FIFO، بعد از یک شدن سیگنال RX_FF_RD، سیگنال RX_FF_Valid در نظر گرفته شده است که در یک لبه کلاک با داده معتبر روی باس قرار می گیرد.

سیگنال های بخش FX3 برای ارتباط با تراشه FX3 هستند و باید مستقیما به پورتهای خروجی متصل شوند.

کاربر کنترلی بر آن ندارد.

  •  برنامه نمونه USB_TOP

جهت ارائه نمونه کار با برنامه USB_Super_Speed و انجام تست های عملی، برنامه USB_TOP نوشته شده است.

USB_TOP، شامل:

یک DCM جهت تامین کلاک های مورد نیاز بخش های مختلف برنامه

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

دو سناریوی تست برای این بخش در نظر گرفته شده است.

تست اول Loopback است. به این معنا که هر داده ای که به FPGA ارسال شود در حالت عادی بازگردانده می شود.

برای انجام این تست ابتدا FX3 و FPGA با برنامه های Firmware و Bit File پروگرام کنید.

سپس با استفاده از نرم افزار USB Control center به صورت زیر داده نمونه ای را ارسال کنید.

سپس با انتخاب Buck in endpoint در منوی سمت چپ بصورت شکل زیر اقدام به خواندن داده از USB کنید.

تست loop back - راه اندازی USB3.0

همینطور می توان با استفاده از نرم افزار LoopBack  از مجموعه ابزار های Cypress تست زیر را انجام داد.

در این تست امکان ارسال داده های مختلف و دریافت آنها بصورت LoopBack وجود دارد.

امکان ارسال داده ثابت، شمارنده 8 بیتی و 32 بیتی یا داده Random وجود دارد.

در این تست باید تعداد بسته های ارسالی و دریافتی برابر باشد.

این موضوع نشان دهنده این است که داده ارسال شده به صورت برگشتی، دوباره دریافت شده است.

تست loop back - راه اندازی USB3.0

در این تست، با ارسال یک دستور به برنامه آن را مجبور به ارسال یک شمارنده 32 بیتی به کامپیوتر می کنیم.

دستور ارسالی 00123456 به کد Hex است و داده دریافتی نیز به صورت Hex نمایش داده می شود.

تست stream - راه اندازی USB3.0

همینطور میتوان با نرم افزار streamer از ابزارهای Cypress نیز تست مشابه و همینطور تست سرعت انجام داد.

به این صورت که ابتدا با استفاده از برنامه Control Center دستور 00123456 به FPGA ارسال می شود.

سپس با استفاده از برنامه Streamer داده دریافتی با سرعت بالا خوانده می شود.

تست stream - راه اندازی USB3.0