Fpga 148

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

نحوه ی طراحی ماژول های کنترل و کلاک را در جلسات قبل دیدیم. در این جلسه ماژول دیتا را طراحی می کنیم. ابتدا لازم است با نحوه ی ارتباط fpga با AK و محیط پیرامونش آشنا شویم تا بفهمیم ماژول دیتا چه وظیفه ای را قرار است برعهده بگیرد.

همانطور که قبلا گفتیم AK داده های خود را به صورت سریال ارسال یا دریافت می کند.این کار را از طریق پورت های SDTI و SDTO انجام می دهد. اما محیط پیرامون AK مانند پورت پارالل کامپیوتر که ممکن است به برد متصل شده و بخواهد داده ای را با AK تبادل کند، داده ها را به صورت موازی(پارالل) دریافت یا ارسال می کند. بنابراین اینجا احتیاج به واسطه ای هست که داده را از AK گرفته پارالل کرده و به المانی که قرار است داده را بگیرد ارسال کند و همچنین داده را از آن المان به صورت پارالل دریافت کرده و به صورت سریال روی پورت SDTI از AK قرار دهد. نحوه ی انجام این کار توسط ماژول دیتا به Fpga اعلام می شود.

بنابراین fpga دارای چندین پورت یک بیتی و باس (چندبیتی) برای انجام این کار می باشد. باس های DataOut و DataIn 16 بیتی هستند و هر کدام یک بیت اضافی به نامهای DataInValid و DataOutValid برای چک کردن صحت داده ی پارالل شده می باشند. پورت دیگری به نام DataInReady نیز وجود دارد که  fpga به وسیله ی آن اعلام می کند آماده ی دریافت داده ی جدید می باشد.

به طور کلی نحوه ی کار به این صورت است که 16بیت داده از DataIn گرفته شده  و در هرپالس از bclk یک بیت آن روی SDTI قرار می گیرد. همچنین داده ها یک بیت یک بیت با هرپالس bclk به fpga منتقل شده و پس از 16پالس یکباره 16بیت بر روی Dataout قرار می گیرد. برای انجام این کار از دو رجیستر واسطه به نامهای SendR و RecvR استفاده می کنیم.

SendR داده ای که قرار است به AK برود(SampleToAK) را از DataIn گرفته و با عمل شیفت به راست در هرپالس به SDTI منتقل می کند.

RecvR داده ای که از AK می آید (SampleFromAK) را دریافت کرده و با عمل شیفت به چپ یکی یکی در خود ذخیره می کند و پس از تکمیل 16بیت به DataOut می دهد.

برنامه ی مورد نظر را تا این مرحله نوشتیم:

ابتدا ResetL را به صورت آسنکرون تعریف کردیم. یعنی لبه ی پایین رونده ی آن را داخل always نوشتیم. بعد از آن یک شمارنده تعریف کردیم که 15پالس می شمرد و سپس SendR را پرکرده و RecvR را خالی می کرد. سپس با هر پالس شیفت های لازم را انجام می داد و طی یک حلقه دوباره وقتی کانتر 15 می شد SendR را با داده ی جدید پر کرده و RecvR را به Dataout منتقل می کرد.(کانتر را سه بیتی تعریف کردیم تا پس از شمردن 15 پالس صفر شود.)

برنامه را شبیه سازی کردیم، درست کار می کرد اما مشکل اینجاست که ما lrck را در برنامه درنظر نگرفتیم. Lrck کلاکی است که ابتدا و انتهای هر سمپل(یک سری داده) را مشخص می کند. ما باید در یک نیم پالس از lrck داده های مربوط به بلندگوی راست و در نیم پالس بعدی داده های مربوط به بلندگوی چپ را بفرستیم. اما ما قصد داریم فقط به بلندگوی راست سیگنال صوتی را ارسال کنیم.

فرکانس lrck طبق دیتاشیت باید بیشتر از 32 برابر فرکانس سمپلینگ باشد. فرکانس سمپلینگ را در ماژول کنترل مشخص کرده ایم که ما 48کیلوهرتز را انتخاب کردیم. ما فرکانس lrck را به نحوی در نظر گرفتیم که در هرپالس از lrck 66پالس از bclk داشته باشیم. یعنی در هر نیم پالس 33پالس از bclk داریم. بنابراین هرسمپل(یک داده ی 16بیتی) 33پالس فرصت دارد که ارسال یا دریافت شود و سپس باید 33پالس را تلف کند(که مربوط به بلندگوی چپ است) و دوباره ادامه دهد. طبق قانون AK که از روی دیتاشیت دیدیم SDTO از تعداد پالسی که در اختیار دارد 16پالس ابتدا را جهت ارسال داده انتخاب می کند. و SDTI برعکس 16پالس انتهایی را جهت دریافت داده استفاده می کند. بنابراین باید برنامه ی خود را به نحوی تغییر دهیم که 16پالس ابتداSDTO بر روی RecvR قرار گیرد و 16+33 پالس بعدی هیچ کاری انجام ندهد. هم زمان با آن در17پالس ابتدایی SDTI کاری انجام نمی دهد و سپس 16پالس داده را از SendR دریافت می کند و 33پالس باقیمانده هیچ کاری انجام نمی دهد.

اینجا از یک بلوک always دیگر استفاده می کنیم که به صورت موازی با always اصلی انجام می شود. این بلوک هرزمان که lrck یک لبه داشته باشد کارهای لازم را انجام می دهد. نحوه ی کار آن به این صورت است : lrckr<=lrck و lrckrr<=lrckr بعد بررسی می کند اگر در posedge bclk ، lrckr مخالف lrckrr باشد یعنی یک لبه داشته ایم:

/ 2 نظر / 6 بازدید
hesam

salam man az site elc85.blogfa.com hastam babate bazdideton mamnon say mikonam niyazetono baravarde konam

فرشته

ممنون