نوشته های من

:)
نوشته های من

Do you dream about being interlinked?

interlinked

بایگانی
آخرین مطالب
محبوب ترین مطالب
مطالب پربحث‌تر

۷۹ مطلب با موضوع «مهندسی طور» ثبت شده است

سوییچ غمگین

پنجشنبه, ۲۸ اسفند ۱۳۹۹، ۱۰:۰۵ ب.ظ

سلام

 

داشتم رو یه مدار کار میکردم تو شرکت که دو تا سوییچ داشت که یکیشون Hardswitching بود یکیشون Softswitching. 

کلا دما تو هارد بیشتر میشه تا تو سافت. ولی نکته ای که میخواستم راجع بهش بنویسم این بود که پیچی که رو سوییچ گرم تر بود، تو دوربین حرارتی شبیه :( شده بود و خیلی خنده دار بود. گفتم براتون بزارم.

 

 

  • مهسایه

بقیه امپلیفایر های ایزوله

جمعه, ۱۶ آبان ۱۳۹۹، ۰۶:۳۲ ب.ظ

سلام

 

امروز یدونه نمونه بدون درپوش ازون امپلیفایری که دیروز داشتم راجع بهش حرف میزدم پیدا کردم که دیگه این یکی رو تو دکون هیچ عطاری پیدا نمیکنید!

 

  • مهسایه

امپلیفایر های ایزوله

پنجشنبه, ۱۵ آبان ۱۳۹۹، ۰۸:۴۰ ب.ظ

سلام

 

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

مثلا این مدار رو نگاه کنید:

 

 

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

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

2- مدل اینداکتیو: که از یه ترانس توی چیپ برای این کار استفاده میکنه

3- مدل کپسیتیو: که از یه تعداد خازن برای این کار استفاده میکنه. مثلا کاری که شرکت ما داره انجام میده اینجوریه که تو بخش ورودی یه اسیلاتور 500-900 مگاهرتز داره و وقتی ولتاژ ببینه یه چیزایی شروع میکنه فرستادن اونور. تو سمت گیرنده یه مدار طراحی کردن که این رو دریافت کنه و چون خازن های خیلی کوچیکی هستن و ولتاژ بالا، یه جورایی ایزوله هست.

 

حالا همه ای این مدل ها خوبن منتها یه مشکلی هست و اونم رفتار این امپلیفایر تو ترنزینت ولتاژ هست. وقتی که مثلا تو شکل ماسفت ها شروع کنن سوییچ زدن و ولتاژ common mode امپلیفایر بالایی از 0 تا 600 بالا پایین بره. اتفاقی که میفته اینه که چون بالاخره این دوسمت ایزوله توی چیپ نزدیک به هم هستن، یه خازن پارازیتی بینشون تشکیل میشه و این ترنزینت ولتاژ تو خروجی یه ولتاژی القا میکنه.

 

اگه این موجود یه گیت درایور بود، transient voltage immunity به معنی عدم دریافت پالس های اشتباه بود که تو دیتاشیت گزارش میکنن و واحدشم V/us هست. که طراح باید حواسش باشه.

الان که یه امپلیفایر آنالوگه، قضیه فرق داره و یه ولتاژ آنالوگ ترنزینت تو خروجی میاد.

 

 

این تست رو میشه برای چند حالت انجام داد مثلا

1- ولتاژ تقاضلی و ولتاژ کامان مود تو ورودی 0 باشه. 

2- ورودی single ended باشه و 200 میلیولت

3- مدل های دیگه تفاضلی و ...

 

تنها چیزی که اینجا مهمه اینه که باید بشه شیب ولتاژ رو کنترل کرد و هرچی خازن پارازیتی اضافه هست هم از ورودی جدا بشه. مثلا اینجا از سه تا باتری برای تغذیه ورودی استفاده کردیم تا دردسر خازن های عجیب غریب یه منبع تغذیه رو نخوایم تحمل کنیم.

 

و تو پایین سمت راست هم میشه دید که چجوری ولتاژی خونده شده خراب میشه. 

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

برای این که این اثر رو از بین ببرن، حواسشون هست که مثلا 2 میکروثانیه بعد از سوییچ زدن خروجی رو بخونن که این اثر damp شده باشه.

 

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

 

  • مهسایه

چیپ!

جمعه, ۲ آبان ۱۳۹۹، ۰۹:۲۹ ب.ظ

سلام!

 

بعد مدت های زیاد دوباره یه پست برقی!

حتما براتون سوال شده که تو این چیز سیاه هزار پایه هایی که روی برد های الکترونیکی هست چی میزارن و چی توشونه؟

شایدم نشده باشه.

ولی میخوام براتون بگم!

 

تو شرکتمون که محصولش ازین جور چیزاست داشتن یه تعداد از IC که مخفف Integrated Circuit هست که یعنی مدارمجتمع رو میریختن دور و من چند تاش که درشون باز بود رو برداشتم عکس بگیرم براتون.

 

اینم عکس:

 

 

همونطور که میبینید داشتم برای پست قبل تمرین میکردم یه سری حاصل ضرب رو.

اصولا چیپ هایی که روی برد ها میبینید درشون بسته است که چند تاشون تو عکس هستن. روشون سیاهه.

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

 

این عکس دوتاشون از نزدیکه:

 

 

 

 

 

همونطور که میبینید معمولا یدونه مدار (die) اون وسط وجود داره و به Pin های اطراف یا پایه ها سیم کشی میشه. شکل خود آی سی هم انتخابی هست و همینطور که میبینید چند مدلش تو عکس دیده میشه. بستگی به نوع کارش و انتخاب هایی که سازنده بهشون میده از بین پکیج های (Package های) مختلف انتخاب میکنن. مثلا اسم اون مربعیه TQFP-64 اگه اشتباه نکنم میشه و اون مستطیلیه SOIC-28 میشه. شایدم اشتباه بگم.

 

کار ما طراحی مدار اون وسط هست. البته من که بخش خیلی خیلی کوچیکیش رو انجام میدم و یه مدار کوچیک رو طراحی میکنم. بعد اینو میدیم به یه تیم دیگه که تیم طراحی IC مون هست و اونا میان اون مدار من رو به یه مدار در سطح ترانزیستور تبدیل میکنن و این صفحه ای که وسط آی سی میبینید رو با تمام جزییاتش طراحی میکنن. که میشه یه مدار گنده شبیه این:

 

 

 

حالا این که این عظمت رو چجوری به اون کوچیکی درست میکنن رو خدا میدونه و خیلی کار سختیه و یه شرکتای خیلی محدود و خاصی هستن که تجهیزاتش رو دارن. همچنین فناوری های مختلف وجود داره که توش سایز های مختلف ترانزیستور و چیزای دیگه در اختیارمون میزارن. مثلا طرف میگه من ترانزیستورام انقدریه، دیود هام انقدری و این مشخصاته ، ترانزیستورای ولتاژ بالا انقدری میتونم بسازم و ... و حالا برید مدارتون رو طراحی کنید با این المان ها و منم براتون میسازم. 

 

امیدوارم لذت برده باشید ازین همه فناوری!

 

شرکت ما چون کارش قدرتیه، از فناوری های خیلی قدیمی در حد 20 سال پیش استفاده میکنه. چون خیلی چیزای زیادی لازم نیست بچپونن توش. ولی این کارایی که شرکتایی مثل اینتل انجام میدن روی خود تیزی لبه ی تکنولوژیه و بسیار بسیار پیچیده و پر هزینه است.

  • مهسایه

خاموش کردن IGBT

دوشنبه, ۲ تیر ۱۳۹۹، ۰۸:۲۶ ب.ظ

 

سلام

 

در ادامه پست روشن کردن IGBT دوست داشتم که راجع به خاموش شدنش هم بنویسم که خیلی مهمه. البته خاموش شدن نرمالش خیلی شبیه روشن شدنشه و زیاد نمیخوام روش مانور بدم ولی یه نوع خاموش شدن هست که بنظرم براتون میتونه جالب باشه.

تو درایور های خفن که برای IGBT های خیلی جریان بالا هستن، روشن خاموش شدن سوییچ با یکم داستان انجام میشه و برای خطا هم یه کارایی کردن.

مثلا وقتی که اتصال کوتاه اتفاق میفته، باید سوییچ سریع خاموش بشه چون جریان های اتصال کوتاه دیگه چند صد آمپر میشه. برای این که مجبور نباشن مقاومت شنت و سنسور جریان بزارن و عددش رو مقایسه کنن، میان و ولتاژ کلکتور امیتر قطعه رو اندازه میگیرن. وقتی قطعه روشنه کلکتور امیترش اشباع میشه تا کمترین ولتاژ روش بیفته و بیشترین جریان رو بده و کمترین تلف رو داشته باشه. مثلا تو 10 آمپر تو یه سوییچ ممکنه این ولتاژ بشه 1.5 ولت. ولی وقتی این 10 آمپر میشه 50 آمپر، ولتاژ اشباع هم میره بالا و بالاتر. مثلا میشه 4-5 ولت. پس، از خوندن ولتاژ روی کلکتور امیتر سوییچ میشه یه تخمینی از جریانی که ازش میگذره داشت. حداقل برای تشخیص خطا.

 

حالا سوال اینه که وقتی خطا رو تشخیص دادیم آیا میشه زرتی IGBT رو خاموش کرد تو 100 نانو ثانیه؟ جواب نه هست. چون که تو مدارای الکترونیک قدرتی معمولا سوییچ داره یه سلف رو درایو میکنه و سلف هم شوخی نداره که تو شرایط خطا که جریان شده 250 آمپر، راحت بزاره که جریانشم قطع بشه. سریع خاموش کردن سوییچه میتونه ولتاژ خیلی زیادی روی سلف ایجاد کنه و به خود سوییچ آسیب بزنه. مثلا سوییچ میتون 1200 ولت رو نگه داره دو سرش و یه دفعه 2000 ولت فقط از روی سلف میاد روش و دیود سوییچ میشکنه و توان خیلی زیادی (مثلا 2000*250) روش تلف میشه تا زمانی که انرژی سلف خالی بشه. خلاصه سوییچ اذیت میشه.

برای همین میان و سوییچ رو تو 2-3 میکروثانیه خاموش میکنن که کند خاموش بشه و این اتفاق نیفته.

 

به گرافا نگاه کنید تقریبا شبیه برعکس همون قبلیه که زمانش کش اومده. چون خاموش شدن به صورت soft turn off بوده.

تو گراف اول miller plateu که تو پست قبلی خیلی کوتاه بود دیده میشه که کلی کش اومده و واقعا plateau شده.

گراف دومی یکی از سیگنالای درون درایوره که با گذشت ولتاژ کلکتور امیتر از سطح آستانه، فرآیند soft turn off رو شروع میکنه. این درایور یه پایه Desat داره که روش ولتاژ کلکتور امیتر با یه روش خاصی سنس میشه و مقایسه میشه.

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

اون بغل هم مدار داخلی رو کشیدم که معلومه سوییچ کلمپ کجاست.

توی جریان گیت هم مشخصه که گیت رو با یه منبع نسبتا جریان ثابت خالی میکنه که جریانش شاید 0.1 جریانی باشه که باهاش سوییچ رو روشن میکردیم! تو اون بغل تو مدار داخلی هم به شکل یه منبع جریان کنترل شده کشیدمش.( کشیدنش )

به زمان بندی ها هم دقت کنید که از زمان شروع فرایند همچنان جریان کلکتور رو داریم و بعد از گذشتن از اون میلر پلتو هست که تازه یه فرجی میشه و جریان پایین میاد.

 

اون بغل soft turn on رو هم کشیدم ولی انقدر کم کاربرده که اصلا تو این درایوری که دستمونه پیاده نشده. 

  • مهسایه

روشن شدن IGBT

پنجشنبه, ۲۹ خرداد ۱۳۹۹، ۰۶:۵۹ ب.ظ

سلام!

اصلاح: این داکیومنت تگزاس اینسترومنت همیناس و عالیه SLUA618A

شاید باورتون نشه ولی بعد مدتی زیادی، بالاخره دوباره یه موضوع برقی که ارزش نوشتن داشت پیدا کردم.

آخ چه حالی میده وقتی یه موضوع باحال پیدا میشه. به یاد قدیما.

 

 

میخوام راجع به روشن شدن IGBT بنویسم و بگم که قضیه چیه. شکل شماره 1 منحنی مشخصه یه IGBT رو مثلا داره نشون میده.

میخوایم این قطعه رو از نقطه A که خاموشی قطعه رو نشون میده ببریم به D که روشن روشنه. این قطعه الان داره یه سلف رو که به 500 ولت وصل شده رو درایو میکنه.

تو نقطه A قطعه خاموشه. پس ولتاژ دو سر کلکتور امیترش به اندازه ولتاژ لینکه و جریانش صفره.

بعد که شروع به روشن شدن میکنه به نقطه B میره که ولتاژ آستانه یا همون Threshold قطعه است. 

البته الان که بیشتر دقت کردم محور عمودی هم باید مثل افقی یه شکستگی داشته باشه. چون اون جایی که نقطه B هست جریان همچنان خیلی کمه. نزدیک 0. چون دوبار کشیدم نمودارو دیگه حال ندارم بکشم و خودتون در نظر بگیریدش.

حالا این تا اینجاش که بریم ببینیم توی IGBT چه خبره

 

 

توی مدل داخل IGBT که تو این شکل کشیدم سه تا خازن وجود داره. خازن گیت به امیتر، گیت به درین و سومیش هم کلکتور به امیتر. عددای مثال رو هم از یه آی جی بی تی که همینجوری سرچ کردم گذاشتم که اردر عددا دستتون باشه.

من همیشه فکر میکردم خازن گیت امیتر خیلی مهمه که شارژش کنیم و روشن کنیم قطعه رو و در قدم دوم هم خازن کلکتور امیتر که مثلا رزونانسی چیزی کنه با بقیه مدار یا تلفات سوییچینگ درست کنه. خازن کلکتور گیت رو کاملا ignore میکردمش. عددشم خیلی کوچیکه. 

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

 

حالا سناریو روشن شدن یه آی جی بی تی رو از نمودار پایین ببینید:

 

 

توی t0 فرمان از طرف میکروکنترلر میاد که آقا ولتاژ گیت رو ببر بالا تا سوییچ روشن بشه.

با کمی اغراق، بخاطر تاخیر داخلی مدارای توی درایور، توی tx درایور شروع میکنه به جریان دادن. 

توی قدم اول، ولتاژ کلکتور 500 ولته و بنابراین انتظار داریم تنها اتفاقی که میفته این باشه که خازن گیت امیتر شارژ بشه. که بخاطر بزرگ بودنش میبینیم که جریان بالایی رو کشیده. این جریان با مقاومت گیت محدود شده. یه نقطه شکستگی توی بالا رفتن ولتاژ گیت امیتر بین tx و t1 هست که اونجا کم کم خازن گیت کلکتور وارد بازی میشه. 

وارد بازی شدن این خازن به معنی اینه که الان که کلکتور 500 ولته و گیت ولتاژش داره میره بالا، این خازن باید دیسشارژ بشه. توی t1 این خازن تا حدی دیسشارژ شده و ولتاژ کلکتور هم شروع میکنه افتادن. چون که کانال گیت امیتر شکل گرفته و سوییچ روشن شده عملا. 

روشن شدن سوییچ به معنی اینه که حالا دیگه ولتاژ کلکتور خیلی سریع باید بیاد پایین و به این معنیه که قبلا

کلکتور 500 ولت بود ولتاژ گیت 0 ولت

الان

ولتاژ کلکتور 2-3 ولت میخواد بشه و ولتاژ گیت 15 ولت

یعنی مثلا از -500 ولت به مثبت 12 ولت باید بره.

برای همین اختلاف ولتاژ زیاد این خازنه که این خازن در حالی که اندازه اش خیلی کوچیکه ولی بار بسیار زیادی میخواد که سوییچ درست کار کنه.

وقتی کلکتور میرسه نزدیکی های زمین و ولتاژ گیت کم کم ازش شروع میکنه بیشتر شدن، درایور حالا باید خازن گیت امیتر و خازن گیت کلکتور رو همزمان شارژ کنه. این کار تا t3 طول میکشه. 

اون صاف شدگی نمودار ولتاژ گیت رو بهش میگن miller plateau و به خازن گیت کلکتور میگن خازن میلر. 

خازنای این سوییچا بخاطر این داستانایی که تعریف کردم و ساختار خود سوییچ غیر خطی هستن. 

 

حالا برگردیم به شکل اول، وقتی که به B رسیدیم، سوییچ میخواد روشن بشه و به C برسه. وقتی به C برسه در واقع ولتاژ گیت به اون چیزی که میخواد میرسه و سوییچ کاملا روشن میشه. روشن شدن کامل سوییچ یعنی سلف بین 500 ولت و زمین قرار میگیره و جریانش شروع میکنه کم کم زیاد شدن تا به جریان نهاییش برسه که D باشه. چون ولتاژ گیت از C به D ثابته، روی منحنی حرکت میکنه و میره بالا.

 

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

  • مهسایه

Lagrange Point

چهارشنبه, ۱۴ فروردين ۱۳۹۸، ۰۴:۲۹ ق.ظ

 

 

سلام

 

نمیدونستم چرا سیاره مشتری این دوتا مجموعه سیارک رو دور و برش داره که باهاش همراهند و تو مدارشند. یعنی فکر میکردم که بخاطر جاذبه اش منحرف شدن بقیه سیارک ها و جاذبه اش رو اون دوتا گروه زیاد نرسیده. ولی خب استدلال چرتیه چون نقاط دور تری هستن که توش خبری نیست.

ولی دیشب داشتم میدیدم تو یه ویدئو گویا اون جا دو تا نقطه لاگرانژ پایدار هست. یعنی مجموع گرانش خورشید و مشتری و حرکتشون باعث میشه چیزایی که تو اون نقاط هستن بمونن همونجا. 

 

 

گویا L1,L2,L3 خیلی زیاد پایدار نیستن ولی L4,L5 پایدارن

  • مهسایه

مهاجرت به VHDL قسمت دوم البته ناقص

سه شنبه, ۶ فروردين ۱۳۹۸، ۱۱:۳۵ ب.ظ

 

سلام 

**

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

**

 

http://www.klabs.org/mapld05/presento/189_lewis_p.pdf

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

برای شروع، اگه میخواستیم که عدد اعشاری رو به صورت فیکسد پوینت بنویسیم تو باینری اینجوری میشد دیگه:

(12.375)_10=(110.011)_2

درسته؟

یعنی اعداد سمت راست ممیز 0.5 و 0.25 و 0.125 و ... میشن

حالا دو تا عدد رو میخوایم دو هم ضرب کنیم، میشه خیلی ساده مثل دو تا وکتور باینری باهاشون برخورد کرد و مثلا اگه جفتشون 3 تا ممیز دارن، برای این که نتیجه هم سه تا ممیز داشته باشه، وکتور نهایی که 6 تا ممیز داره رو 3 تاش رو ترانکیت میکنیم که خروجی عدد با مفهومی بشه.

ولی خب همه ی این کارا و بررسی این که این وسط overflow شده و این که حواسمون به ممیز ها باشه، خیلی کار اذیت کننده ایه. چیز نشدنی ای نیست ولی آزار دهندس.

مثال:

12.5x23.7 = 1100.100 x 10111.101

اول این که با سه تا ممیز نمیشه 23.7 رو نشون داد و نتیجه دقیق نیستش. 

برای این که این ضرب رو بتونیم بکنیم میایم عددا رو تو 2^3 ضرب میکنیم، که ممیزشون بپره

= 1100100 x 10111101 = 100 1001 1101 0100

بعدش میایم 3 تا بیت رو از سمت راست حذف میکنیم چون محاسباتمون fixed point هست و باید تعداد ممیز ها ثابت باشه

= 1001 0011 1010

که چون میدونیم 3 تا ممیز داریم عدد واقعی هست :

= 1 0010 0111.010 = 295.25

عدد درست 296.25 هست. حالا چون تعداد ممیز ها کم بود یکم دقت پایین بود ولی بالاخره تو FPGA چیزی که خدا زیاد گذاشته بیته. 

 

حالا یه شخصی به اسم آقای David Bishop اومدش یه لایبرری برای VHDL درست کرد که توش این کارای ضرب و جمع و ترانکیت کردن و ریسایز کردن و تبدیل فیکس به فلوت و ... رو قرار دادش.

من راجع به fixed point ها مینویسم. float قطعا دقت بیشتر داره و بهتره ولی خب سنتزش فکر میکنم خیلی سنگین میشه. شایدم نمیشه. نمیدونم.

 

این لایبرری اسمش fixed_pkg هست. 

توی مدل سیم میشه راحت سیمولیت کرد ولی تو کوآرتس سر سنتز گیر میده که نمیشناسه. چون که آقایون توی ورژن prime 15+ فقط گذاشتنش. ولی شما میتونید دستی ادش کنید از همین گیتهاب آقای بیشاپ https://github.com/FPHDL/fphdl

 

همچنین تو کوآرتس نمیتونید توی بلوک دیاگرام باس های fixed point و ... رو نمیتونید داشته باشید فقط تو کد میتونید. پس باید مثلا به وکتور تبدیلش کنید اگه تو شماتیک میاریدش. 

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

use IEEE.fixed_float_types.all;
use ieee.fixed_pkg.all;

ببخشید رنگ نداره!

بعد سیگنالاتون رو اینجوری تعریف میکنید:

 

signal a1 : sfixed(10 downto -20);

 

اول این که sfixed میگه که عدد سایند هست و ufixed هم داریم. دوم این که 10 یعنی 10 تا سمت چپ ممیز و منفی 20 یعنی 20 تا راست ممیز داره. که اگه با تایپ های نرمالی که قبلا دیده بودیم مقایسه بکنیم یکم جالبه.

حالا مثلا دو تا عدد sfixed اینجوری با هم جمع میشن

 

signal a,b : sfixed(5 downto -6);

signal c : sfixed(6 downto -6);

 

a<= sfixed(2.32,a); -- Size of the sfixed number must be determined here

b<= sfixed(1.55,5,-6); -- either this way or you can just do it like the previous line

c <= a+b;

 

دقت کنید عدد قبل ممیز نتیجه رو 6 بیتی گرفتم. اگه چیز دیگه ای بزارید اررور میده و کار نمیکنه چون جمع اینا که 5 بیتی هستن باید 6 بیتی باشه. من خودم 2 روز فکر کنم گیر این بودم چرا کار نمیکنه.

 

 حالا فرض کنید میدونید که میخواید نتیجه رو تو یه چیز 5 بیتی بریزید. از دیزاین خودتون آگاهید به قولی

signal c : sfixed(5,-6);

c <= resize(arg => a+b, size_res => c, overflow_style => fixed_saturate, round_style => fixed_round);

 

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

 

 

 
  • مهسایه

Perfection

يكشنبه, ۴ فروردين ۱۳۹۸، ۰۷:۰۶ ق.ظ

سلام

یه جایی بودم یه مهندس قدیمی و با تجربه داشت برای دو نفر مهندس جدید pcb شون رو نگاه میکرد که ببینه خوبه که بفرستن برای چاپ یا نه. بعد یکی ازین مهندس جوون تر ها داشت هی میگفت فلان جاش رو اینجوری کنی بهتر میشه (اون یکی دیزاین کرده بود)

بعد چند دقیقه این مهندس قدیمیه گفت بابا ولش کن بفرست بره دیگه 

Perfection is a long road to nowhere

 

  • مهسایه

مهاجرت به VHDL

شنبه, ۱۱ اسفند ۱۳۹۷، ۰۹:۴۹ ب.ظ

سلام

برای این کاری که دارم انجام میدم لازم شد که VHDL یاد بگیرم.

شنیده بودم که VHDL خیلی زبون نچسب و بدیه ولی فکر نمیکردم تا این حد بد باشه.

البته در حال بسیار نچسب بودن بسیار قوی و پر از امکاناته.

تو این پست یه نکته هایی که شاید بتونه مهاجرت از Verilog به VHDL رو آسون تر کنه رو مینویسم که خودم زیاد بهش برخورد کردم.

این پست هم خیلی سادس و چیزایی که خودم بلد بودم از درس مدار منطقی رو دارم میگم. خیلی امکانات دیباگ زیادی داره که اصلا نمیدونم که چیا رو نمیدونم. ولی بنظرم یه jump start خیلی خوبه برای کسی که میخواد از وریلاگ کوچ کنه VHDL.

1- ساختار یه ماژول: 

توی وریلاگ همه چیز رو توی یه ماژول مینوشتیم. مثلا از ساییت asic-world:

 1 //-----------------------------------------------------
  2 // Design Name : up_counter
  3 // File Name   : up_counter.v
  4 // Function    : Up counter
  5 // Coder�     : Deepak
  6 //-----------------------------------------------------
  7 module up_counter    (
  8 out     ,  // Output of the counter
  9 enable  ,  // enable for counter
 10 clk     ,  // clock Input
 11 reset      // reset Input
 12 );
 13 //----------Output Ports--------------
 14     output [7:0] out;
 15 //------------Input Ports--------------
 16      input enable, clk, reset;
 17 //------------Internal Variables--------
 18     reg [7:0] out;
 19 //-------------Code Starts Here-------
 20 always @(posedge clk)
 21 if (reset) begin
 22   out <= 8'b0 ;
 23 end else if (enable) begin
 24   out <= out + 1;
 25 end
 26 
 27 
 28 endmodule 

ورودی خروجی ها توی خط اول تعریف شدن و بعدش اومده گفته که چی هستن و چند بیتی هستن و بعدش reg تعریف کرده و بعدشم یه مدار sequential درست کرده که حساس به لبه ی بالا رونده کلاک هست و enable داره.

 

حالا همین مدار تو VHDL 

1 -------------------------------------------------------
  2 -- Design Name : up_counter
  3 -- File Name   : up_counter.vhd
  4 -- Function    : Up counter
  5 -- Coder       : Deepak Kumar Tala (Verilog)
  6 -- Translator  : Alexander H Pham (VHDL)
  7 -------------------------------------------------------
  8 library ieee;
  9     use ieee.std_logic_1164.all;
 10     use ieee.std_logic_unsigned.all;
 11 
 12 entity up_counter is
 13     port (
 14         cout   :out std_logic_vector (7 downto 0); -- Output of the counter
 15         enable :in  std_logic;                     -- Enable counting
 16         clk    :in  std_logic;                     -- Input clock
 17         reset  :in  std_logic                      -- Input reset
 18     );
 19 end entity;
 20 
 21 architecture rtl of up_counter is
 22     signal count :std_logic_vector (7 downto 0);
 23 begin
 24     process (clk, reset) begin
 25         if (reset = '1') then
 26             count <= (others=>'0');
 27         elsif (rising_edge(clk)) then
 28             if (enable = '1') then
 29                 count <= count + 1;
 30             end if;
 31         end if;
 32     end process;
 33     cout <= count;
 34 end architecture;

همون طور که دیده میشه تو نگاه اول 2-3 برابر بیشتر کد تایپ کردیم. گویا دکتر نوابی که خودش از اونایی بوده که استانداردای VHDL رو در اوردن، به این زبون میگن Verbose یعنی وراج. چون خیلی باید کد زده بشه.

اول کد یه سری لایبرری Add شده. 

این یکی از ویژگی های جالب VHDL هست که باید برای چیزایی که میخواید استفاده کنید حتما لایبرری هاشون رو اضافه کنید. تو یه پست بعدی مثلا یه لایبرری میگم که محاسبات fixed و floating پوینت رو انجام میده. بدون درد سر!

مثلا اینجا چون لازم بوده یه add انجام بشه، لایبرری unsigned logic اضافه شده.

 

تو نگاه دوم! میبینیم که ماژول در واقع یه تیکه نیست، دو تیکه هست. تو بخش اول entity تعریف میشه و تو بخش دوم architecture. 

entity از دو بخش(تا جایی که میدونم) تشکیل میشه. اولیش Generic ها هست و دومیش Port ها هست. Generic ها پارامتر هایی هستن که دیزاینتون با اونا تعریف میشه. مثلا میتونید تعداد بیت های یک رجیستر رو تو اون بگید. موقعی که دارید instance میگیرید از این ماژولتون، میتونید Generic ها رو ست کنید یا اگه کاری نداشته باشید میتونه default value داشته باشه.

بخش دوم Port ها هست که همون ورودی خروجی ها هست. این جا حتما باید سایزشون و تایپشون رو مشخص کنید. چندین روش برای تعریف کردن سایز وجود داره مثلا میتونید تعداد بیت ها رو بگید مثلا 

7 downto 0

یا میتونید range تعریف کنید که از فلان عدد تا فلان عدد باشه. بسته به نوع تایپ چیزی که تعریف میکنید داره. مثلا تو کتابخونه fixed point که میگم بعدا میتونید بگید

7 downto -24

یعنی 7 بیت برای بخش integer و 24 بیت برای بخش fractional.

آها راستی دقت کنید تو لیست ورودی ها، خط آخر ; نداره ! که بسیار آزار دهندس.

 

بریم پایین تر Architecture شروع میشه. آرکیتکچر در واقع نحوه ی کار کرد entity رو میگه. فکر میکنم میتونید چند تا Architecture مختلف تعریف کنید برای شرایط مختلف مثل اون چیزه تو C++

بعد از خط تعریف، باید signal ها رو تعریف کنید.

مفهوم سیگنال برای من خیلی ناراحت کننده بود در قدم اول. بخاطر این که وریلاگ، reg و wire داشت که کاملا کارکردشون مشخص بود ولی VHDL فقط همین signal رو داره که بسته به شرایطی که استفاده میشه، اگه مدار combinational باشه بدون رجیستر و اگه مدار sequential باشه با رجیستر میشه.

 

بعد ازون process رو میبینیم، این یه چیزی تو مایه های always هست تو وریلاگ ولی فکر میکنم مستقیم نمیتونید به posedege مثلا حساسش کنید. به یه سری سیگنال حساسش میکنید و بعد تو شرط ها posedge بودن یه چیزای دیگه رو چک میکنید.

 

بقیش خیلی شبیه وریلاگ هست. فقط باید حواستون باشه مثلا if ها then دارن و elsif درسته نه elseif یا else if(کار دیگه میکنه). و endif; هم داریم. که دقت کنید ; داره.

 

2- تایپ ها

یکی از چیزای بسیار آزار دهنده ولی در عین حال کمکی VHDL اینه که وقتی یه چیزی یه تایپی داره مثلا std_logic_vector که وکتوری از چند بیته، همینجوری نمیتونید توش یه عدد بریزید. باید Cast کنید.

 مثلا 

signal x : std_logic_vector(7 downto 0);

..

x <= 4;

کار نمیکنه چون 4 دسیمال هست.

باید بنویسید

x <= "00000100";

یا مثلا همچین چیزی هم با معنی هست.

x <= (2 => '1', 7 downto 4 => '1', others => '0');

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

این که keyword های زیادی داره خیلی گیج کنندس ولی کم کم عادت میکنید.

دقت کنید چون بیت بودن اونا توی ' ' قرار گرفتن. اون یکی چون وکتور بود توی " "  بود. اولیه چون عدد بود توی هیچی نبود. 

اگرم میخواید عدد بریزید باید کست کنید دیگه

x <= to_slv(4);

x <= std_logic_vector(4);

فکر کنم جفتشون کار میکنن.

 

3- وصل کردن چیزا.

چیزای مختلف وصل کردنشون به راحتی وریلاگ نیست که چیزای غیر همسایز رو بشه راحت وصل کرد. اگه تعداد بیت ها یکی نباشه باید یه کاریش بکنید مثلا ریسایز کنید

 

4- مدارای combinational و sequential

باید توجه کنید که سینتکس هایی که برای این دوتا استفاده میشه فرق میکنه مثلا 

http://insights.sigasi.com/tech/signal-assignments-vhdl-withselect-whenelse-and-case.html

with a select b <=
    "1000" when "00",
    "0100" when "01",
    "0010" when "10",
    "0001" when "11";
b <= "1000" when a = "00" else 
     "0100" when a = "01" else 
     "0010" when a = "10" else 
     "0001" when a = "11";

 

 

این دوتا برای مدارای combinational هستن و دستور if رو هم که دیدیم تو اولین مثال.

تقریبا شبیه وریلاگه اونجا هم switch داشتیم و استیتمنت های a?b:c که بیشتر شبیه C بود.

 

  • مهسایه