حرف های پراکنده GitHub
حرف های پراکنده Rss

DD F***ing R

نوشته شده توسط بیژن | در دسته الکترونیک | نوشته شده در ۲۷-۰۵-۱۳۹۷

۰

دو هفتس که می خوام این مطلب کوفتی رو بنویسم ولی وقت نمی شه. خب خدا رو شکر یکی دو تا از کارفرما ها دارن حال خراب ازآب در میان و می خوام باهاشون بهم بزنم. ایشاا… از شر اونا خلاص شم وقتم قشنگ آزاد می شه که هم زبان رو تکمیل کنم هم پروژه دور و دراز VNA ام رو. یه مقدار سر روتینگ DDR دیوونه شدم که دو دلیل داشت. یکی اینکه مثل قاشق نشسته از DDR3 وارد ماجرای DDR ها شدم و دوم اینکه غیر یکی دو برد از Texas و Xilinx، یه نفر هم PCB ایش رو محض رضای خدا نگذاشته بود که بقیه ازش ایده بگیرن. بر همین اساس بود که گفتم پیش قدم شم در این قدم خیر و حداقل من یکی بعد کلی دهن سرویسی کشیدن یه داک تر تمیز با توضیح و مثال از ماجراهام با DDR آماده کنم.

■ هدف گذاری

هدف روت کردن دو چیپ DDR با ظرفیت 1GB چهارده خط آدرس و ۳۲ خط دیتا هست. فضایی که رو برد دارم در حدود ۲.۵ در ۲.۵ سانته که کاملا خالی از سکنه اس و می شه از تمام فضا برای روت استفاده کرد. به دلیل اینکه آلفا مدار حداکثر ۸ لایه می تونه برد بزنه (چقدر افتضاح) stack up ام رو به ۸ لایه محدود کردم. برد TOP و Bottom اش مسیرهای RF داره به همین دلیل دو تا GND زیر هر کدوم هست. یه لایه power داریم و خلاصه حداکثر ۳ لایه signal اینترنال روی برد می تونه موجود باشه. خیلی خوب هست اگه یکی از این ۳ لایه هم به کلی GND بشه تا خیلی نگران cross talk سیگنال های داخلی هم نبود. پس شرایط من می شه روت کردن حداکثر در ۳ لایه (۱ لایه GND و لایه top برای power) در فضای ذکر شده. گام Ball های BGA نیم میلی متر در نظر گرفته شده و بخاطر محدودیت حداقل عرض 4mils برای ترک ها و شعاع ۰.۴ میلی متر تمام شده برای حلقه های VIA حداکثر تعداد ترک قابل عبور بین دو ball یدونه هست. پین های FPGA و DDR هر دو dedicated هستن و امکان pin swap هم به طور کلی وجود ندارد مگر در موارد خاص.

■ درک ما تحت DDR

سیگنالینگ DDR به دو دسته تقسیم می شن. اونایی که termination می خوان و اونایی که ODT دارن. ODT مخفف on die termination هست و مخصوص سیگنال های data و strobe ها هست که به هر چیپ ddr یکی می ره. دسته دوم که termination می خوان سیگنال هایی مثل address و bank address و اینجور کوفتیا هستن که بین چیپ ها share استفاده می شن. به طور خلاصه سیگنال های data خیلی اذیتی تو روت کردن ایجاد نمی کنن ولی کل بدبختی ها سر روت کردن address bus ها هست که اولا باید از PS بیان بیرون. بعد برن تو چیپ ۱ و بعد چیپ ۲ و آخرش هم termination که روند به شدت دیوانه کننده ای هست.

برای سیگنال های data که روند مشخصه ولی برای اونهایی که termination می خوان دو توپولوژی معرفی شده. fly-by و T-Branch. تا یادمم نرفته به این شیوه از روت کردن که چیپ ddr و phy درایو کننده هر دو روی یک PCB قرار دارن می گن point to point. میکرون یه داک خوب رو روتینگ p2p داره که تکمیل کننده چرندیات اینجاس.

همونطور که شکل زیر هم نشون داده شده توپولوژی T می گه آدرس ها رو بکشین بیرون. یجا بشکونینش و ببرین به DDRها. Flyby می گه اول ببرین به چیپ ۱ بعد چیپ ۲ و بعد termination. نکته اول اینکه برا دو تا چیپ حتی شاید termination هم لازم نباشه و این توپولوژی ها بیشتر روی DIMM ها معنا دار می شن اما طبق recomm ها T-Branch برای DDR2 هست و FlyBy برای DDR3 و باز طبق راهنمایی های مجیب و doc هایی که خوندم FlyBy از لحاظ SI بهتر از T-Branch هست.

■ تجربیات

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

نکته ۱: اگه بشه از بین دو تا پایه BGA یا fan out متناظر بجای یک trace دو تا trace رد کرد کار خیلی راحته و می تونید با تعداد لایه کمتری (تقریبا نصف) روت کنید

نکته ۲: اینکه T-Branch ببرید یا flyby خیلی دست شما نیست. باید ببینید کسی که چیپ driver رو طراحی کرده چی مد نظرش بوده. مثلا در case من پس از ۴ بار روت کردن و پاک کردن مطمین شدم که طراح ZYNQ تو ذهنش flyby بوده.

نکته ۳: نحوه قرار دادن چیپ، top یا bottom و چرخش هم باز دست شما نیس. ولی خدارو شکر این یکی رو می شه با دیدن برد های مختلف فهمید. rule of thumb می گه سر نقطه دار دو چیپ DDR باید به سر نقطه دار ZYNQ نزدیک باشه. شکل زیر موضوع رو می رسونه

نکته ۴: سعی کنید بین دو تا چیپ یه فاصله ای در نظر بگیرید (به اندازه ای که بشه lenght match بعدش رو انجام داد)

نکته ۵:‌ روت کردن data و command راحته. پس اول address bus ها رو روت کنید و اگه همه چی اوکی بود برید سراغ data

■ نمونه

خب زیاد حرف نزنم. تو شکل زیر rat هایی که termination می خوان روشن شدن. یه فلش ناشیانه هم کشیدم که نحوه route کردن flyby رو نشون می ده. نکته اول اینکه من termination ها رو از نوع array چهارصد و دو گذاشتم. اولین نگرانیم این بود که پد های به نسبت بزرگ کناری mismatch ایجاد کنه اما چک کردم دیدم بقیه برد ها هم بیشتر مقاومت های array استفاده کردن و اینکه خود package هم جوری هست که metal پد های کناری عمق ندارن پس چشمی هم اوکی بودن.

یک قانون کلی می گه در DDR یک net باید از نقطه شروع fanout تا رسیدن به fan out بعدی در یک لایه باقی بمونه و هیچ via ای تو مسیر نباشه. همونطور که گفتم من ۳ لایه برای روتینگ در نظر گرفته بودم. با توجه به خط خطی های بالا دو لایه رو دادم به address و یک لایه به data. و در نهایت بعد کلی عقب جلو نتیجه شد شکل زیر

توجه کنید برای وضوع بیشتر هم طولی ها اعمال نشدن. خطوط هم ترجیحا باید ۴۰ اهم رسم شن و تمام. نکته ای که تو روتینگ بالا خیلی کمکم کرد تغییر دادن fanout ها بود. بطور default استایل quad in bga استفاده می شه اما با کمی فکر می شه روی بعضی pin ها مثل شکل زیر این rule رو شکست و به روتینگ بهتری رسید. نمونه این حرکت رو می تونید در زیر ببین که fanout سمت چپ NW هست و چپی. نکته دیگه که از reference design تگزاس یاد گرفتم می شه با برداشتن fanout های dc و روت کردن از روی top از طریق plane های کم امپدانس via ها جاگیر رو از سر راه برداشت. این حرکت رو می شه برای pin های gnd و vtt ها تا حدی انجام داد.

 

■ نسخه نهایی (بدون هم طولی)

بعد می رسیم به روت کردن data. خوشبختانه توی هر byte می شه data ها رو swap کرد و با ایستفاده از این ناجی الهی کل روتینگ تو سه لایه به خوبی و خوشی تموم می شه. نتیجه نهایی رو می تونید در زیر ببینید. نکته خاص دیگه ای فعلا به ذهنم نمی رسه اما یادمه مسایل دیگه ای هم وجود داشت که شاید به مرور زمان اضافه کردم. خوش باشید…

پ.ن: برای جلوگیری از تغییر سایز از جدول wp-option فیلد medium_large_size_w رو باید صفر کرد.