در قسمت اول این آموزش به معرفی بال ADC و روش های پیاده سازی آن روی FPGA پرداختیم. در این قسمت می خواهیم با استفاده از واسط SPI که خودمون طراحی کردیم با تراشه ADC128S102 ارتباط برقرار کنیم و نمونه داده های دیجیتال شده کانال های مختلف این تراشه را داخل FPGA خوانده و در این پروژه برای مثال این داده ها را روی سون سگمنت های برد مگاوینگ نشان دهیم.
در شکل زیر بلوک دیاگرام کلی این پروژه را مشاهده می کنید. طراحی انجام شده به صورت HDL کامل و به زبان Verilog نوشته شده است و سورس آن و پروژه قابل اجرا روی برد پازج به همراه برد مگاوینگ و بال ADC را می توانید در انتهای این آموزش دانلود کنید.
در ادامه به بررسی هریک از این واحد ها می پردازیم.
واحد کلاک و ریست
این بلوک وظیفه دارد کلاک ورودی برد پازج که برابر 24MHz هست را به 1MHz تبدیل کند تا سایر بخش های مدار از آن استفاده کنند. طبق دیاتشیت تراشه ADC128S102، می توان حداکثر کلاک پایه SCK واحد SPI برابر 16MHz باشد ولی در این طراحی ما کلاک سیستم را برابر 1MHz در نظر گرفته ایم و می توان آن را 32MHz نیز افزایش داد. در ادامه دلیل مقدار 32 را توضیح خواهیم داد.
واحد SPI
در این طراحی واحد SPI به طور پیوسته درحال خواندن ADC می باشد و کانال مورد نظر برای خواندن را از طریق ورودی ADC Channel می گیرد. در تنظیمات این بلوک پارامتری به اسم CLK_DIV وجود دارد که در واقع نشان می دهد کلاک SPI چه تقسیمی از کلاک سیستم باشد. حداکثر مقدار این پارامتر برابر 2 است و با توجه به کلاک 1MHz طراحی ما کلاک SPI برابر 512KHz خواهد شد و با توجه به طول 16 بیتی ارتباط SPI حداکثر نرخ نمونه برداری در این طراحی برابر 512KHz/16 = 32KHz خواهد بود.
اگر بخواهیم حداکثر نرخ نمونه برداری را داشته باشیم بنابراین کلاک SPI باید برابر 16MHz باشد و با توجه به این که حداقل کلاک سیستم باید 2 برابر کلاک SPI باشد بنابراین اگر کلاک سیستم برابر 32MHz باشد و مقسم کلاک برابر 2 باشد حداکثر نرخ نمونه برداری را خواهیم داشت که برابر 1MSPS خواهد بود.
خروجی واحد SPI به صورت یک داده 16 بیتی است که با توجه به اینکه تراشه ADC128S102 نمونه های آن 12 بیتی می باشد تنها 12 بیت از 16 بیت خورجی SPI قابل قبول است.
این واحد دارای سیگنال start است که در این طراحی به مقدار منطقی 1 وصل شده و بنابراین همیشه این واحد فعال می باشد.
سیگنال busy هم نشان می دهد که واحد SPI در حین ارسال می باشد و سیگنال new_data نشان می دهد که ارسال به انمام رسیده و داده ی جدیدی دریافت شده است.
ورودی data_in در واقع برای مشخص کردن داده ارسالی به بال ADC می باشد و با توجه به دیتاشیت تراشه ADC128S102 برای تعیین کانال تنها 3 بیت از 16 بیت ارسالی قابل استفاده است که این 3 بیت مشخص کننده کانال هست که قصد داریم از آن مقدار آنالوگ را بخوانیم. برای مشخص کردن کانال در کد برنامه به صورت زیر عمل می کنیم.
.data_in({2’b00, ~channel_address, 11’b00000000000})
واحد نمایش
برای نمایش مقدار خوانده شده از بال ADC می خواهیم از سون سگمنت های روی برد مگاوینگ استفاده کنیم. به دلیل اینکه فرکانس داده های دریافتی خیلی بیشتر از مقداری است که به چشم دیده شود لازم است داده های خوانده شده از SPI را با فرکانس خیلی کمتری به واحد نمایش بدهیم به خاطر همین از بلوک latch_data استفاده می کنیم. این واحد هر یک ثانیه یک نمونه از ADC را برای نمایش به واحد سون سگمنت میفرستد.
واحد سون سگمنت هم برای تبدیل داده های باینری قابل نمایش روی سون سگمنت ها و هم رفرش داده ها روی سگمنت ها بکار می رود.
برای خرید بال ADC به این لینک مراجعه کنید.
برای دانلود کد پروژه بال ADC از این لینک استفاده کنید.
ویدئوی اجرای عملی مثال فوق بر روی برد را از لینک زیر تماشا نمایید:
سلام
لطفا ارسال دادهADC از طریق پرت سریال رو هم قرار بدید.
با تشکر
این پروژه به عنوان رفرنس قرار داده شده. برای تغییرات دیگر خودتون باید دست به کار بشید.
اگر مشکلی داشتید در انجمن مطرح کنید تا دوستان کمک کنند.