در این آموزش از سری آموزشهای گام به گام نرم افزار Hspice ابتدا در مورد شمارنده ها وانواع مختلف آنها و کاربردهای آن در مدارات دیجیتالی با توجه به نوع شمارنده بحث خواهیم کرد و در بخش دوم شمارنده آسنکرون موجی را که ساده ترین نوع شمارنده بوده و در جاهایی که سرعت مد نظر نیست مورد استفاده قرار می گیرد ، مورد بررسی قرار داده و با نحوه کار فلیپ فلاپ ها که پایه و اساس مدارات دیجیتالی حافظه دار می باشند آشنا خواهیم شد و در بخش انتهایی مقاله یک شمارنده آسنکرون موجی را که از هشت سلول تشکیل یافته و توانایی شمارش هشت بیت را دارد شبیه سازی خواهیم نمود.

انواع شمارنده ها و کاربردهای آن

کار اصلی یک شمارنده شمارش تعداد دفعات وقوع یک پدیده است که می تواند به صورت منظم یا نامنظم باشد. شمارنده ها بسته به کاربرد آنها انواع مختلفی دارند از جمله شمارنده حلقوی (Ring Counter) و جانسون (Johnson) که برای شمارش تکرار وقایع با تعداد دفعات مشخصی به کار می رود و معمولاً یکی از بیت ها 1 و بقیه 0 هستند که با شمارش هر پدیده (که می تواند یک پالس ساعت باشد) بیتی که مقدارش یک است یک بیت به جلو خواهد رفت و این عمل تا انتهای زنجیره تکرار خواهد شد.

شمارنده دیگری که بسیارکاربردی است شمارنده باینری می باشد که در دو نوع همزمان (سنکرون) و غیر همزمان (آسنکرون) استفاده می شود. که نوع سنکرون آن می تواند به صورت بالا شمار (UP COUNTER) و پایین شمار (DOWN COUNTER) مورد استفاده قرارگیرد و در آن معمولاً از جمع کننده های سرعت بالا استفاده می شود. شمارنده های باینری از جمله شمارنده آسنکرون موجی علاوه بر شمارش وقایع می توانند به عنوان تایمر هم به کار روند.

مدارات داخلی شمارنده آسنکرون موجی

ساده ترین نوع شمارنده ها شمارنده آسنکرون موجی است که شکل آن را در زیر مشاهده می کنید. این شمارنده شامل N رجیستر است که ورودی هر رجیستر (فلیپ فلاپ) به خروجی متمم خود متصل است و پالس ساعت طبقۀ بعدی را تامین می کند و هر طبقه باید منتظر دریافت پالس ساعت طبقه قبلی باشد بنابراین تاخیر این شمارنده می تواند بسیار بالا باشد به خصوص که تعداد بیت های شمارنده افزایش یابد. پس در جاهایی که به سرعت بالایی نیاز داشته باشیم این شمارنده مناسب نبوده و باید از روشهای سنکرون استفاده کرد.

شمارنده آسنکرون
شمارنده باینری

همانطور که دیدیم سلول اصلی تشکیل دهنده یک شمارنده آسنکرون موجی رجیسترها هستند که بسته به کاربرد انواع مختلفی دارند ، در اینجا ما رجیستر استاتیک پایه پیرو (Master Slave Flip Flop) را که در سرعت های پایین استفاده می شود و توان مصرفی پایینی نسبت به بقیه رجیستر ها دارد استفاده می کنیم. شکل زیر شماتیک یک فلیپ فلاپ D استاتیک پایه پیرو را نشان می دهد.

D فلیپ فلاپ استاتیک
فلیپ فلاپ نوع D استاتیک

این فلیپ فلاپ از دو بخش پایه (Master) و پیرو (Slave) تشکیل شده و شیوه کار آن بدین صورت می باشد که در هنگامیکه کلاک (CLK) در سطح پایین قرار دارد ورودی D از طریق ترانسمیشن گیت (Transmission Gate) ورودی و اینورتر طبقه Master دریافت می شود و مسیر فیدبک توسط ترانسمیشن گیت مربوطه مسدود است. در این هنگام طبقه Slave در حالت حافظه قرار دارد و خروجی Q از طریق حلقه فیدبک برگشت داده می شود. به محض تغییر سطح CLK و درست در لبه بالارونده آن مسیر جریان طبقه Slave باز شده و سیگنال D که تا ورودی طبقه Slave آمده بود به خروجی Q منتقل خواهد شد. هنگامی که  CLK در سطح بالا قرار دارد مسیر ورود سیگنال D بسته شده و طبقه Master در حالت حافظه قرار خواهد گرفت.

نکته1: اگر بخواهیم فلیپ فلاپ D حساس به لبه پایین رونده شود کافیست جای clk , clkbar را عوض کنیم.

برای اضافه کردن قابلیت set , reset به فلیپ فلاپ استاتیک کافیست جای گیت های not را با گیت NOR عوض کنیم. زیرا گیت NOR این خاصیت را دارد که وقتی که یکی از ورودی هایش صفر باشد مانند گیت not عمل خواهد کرد. پس وقتی سیگنالهای set , reset خاموش باشند عملکرد دو مدار هیچ تفاوتی نخواهد کرد اما به محض اینکه یکی از این سیگنالها بالا رود مثلاً reset=1 شود خروجی Q بدون توجه به سیگنال ورودی D و سطح CLK بلافاصله ریست خواهد شد. برای حالت set هم این قضیه صدق می کند و خروجی به محض دریافت سیگنال set یک خواهد شد.

نکته2: هیچگاه نباید دو سیگنال set , reset به طور همزمان با هم یک شوند.

ِD فلیپ فلاپ استاتیک با پایه set , reset
فلیپ فلاپ نوع D استاتیک با پایه set , reset

کد نویسی و شبیه سازی یک شمارنده 8 بیتی آسنکرون موجی در نرم افزار Hspice

برای نوشتن نت لیست شمارنده آسنکرون موجی مانند جلسه گذشته ابتدا زیر مدارات را به طور کامل تعریف می کنیم و بعد شروع به نوشتن برنامه اصلی خواهیم کرد و این روال استاندارد برای مثال های آینده نیز تکرار خواهد شد. قبلا با گیت not و OR آشنا شدیم و گیت NOR هم دقیقاً همان گیت OR است که بخش اینورتر از خروجی آن حذف شده پس نیازی به تکرار آنها نیست. برای تعریف transmission gate هم به صورت زیر عمل می کنیم.

subckt             T.G      in         clk       clkb     out.

m1       in         clkb     out       vdd      mp18   w=3u   l=0.18u

m2       in         clk       out       0          mn18   w=1u   l=0.18u

ends T.G.

حال باید سلول اصلی شمارنده سنکرون موجی یعنی فلیپ فلاپ را تعریف کنیم و آن را به صورت زیر مدار در بیاوریم. فلیپ فلاپی که اینجا استفاده می کنیم همان D-ff فلیپ فلاپ ساده بدون set , reset است که از گیت های not و transmission gate تشکیل شده پس به سادگی می توانیم آن را به صورت زیر مدار تعریف کنیم.

subckt ff         D         clk       clkb     Q.

X1       D         clkb     clk       01        T.G

X2       01        clk       clkb     02        T.G

X3       Qm      clk       clkb     Qn       T.G

X4       03        clkb     clk       Qn       T.G

X5       01        Qm      INV

X6       Qm      02        INV

X7       Qn       Q         INV

X8       Q         03        INV

ends    ff.

می بینیم که با استفاده از زیر مدارات کار چه قدر ساده می شود و یک D-ff فلیپ فلاپ ساده که از 16 ترانزیستور تشکیل شده و قرار است به کررات در مدار استفاده شود را می توانیم در با خط کد نویسی فراخوانی کنیم. تعریف D-ff استاتیک با قابلیت set , reset را به عنوان تمرین به خواننده واگذار خواهیم کرد.

حال برنامه اصلی یک شکارنده آسنکرون موجی 8 بیتی را به صورت زیر می نویسیم.

نت لیست شمارنده
نت لیست شمارنده باینری

خطوط 38 تا 54 نت لیست تعریف شمارنده آسنکرون موجی است که شکل 4 بیتی آن را در ابتدای مقاله مشاهده می کنید و شامل فلیپ فلاپ ها و اینورترها است فقط در اینجا تعداد سلولهای شمارنده از 4 بیت به 8 بیت رسیده است و می توانیم همین روال تکراری را برای شمارنده با تعداد بیت های بیشتر هم انجام دهیم. بعد از فراخوانی زیر مدارات اکنون باید CLK , CLKb را تعریف کنیم. پالس ساعت یک شمارنده آسنکرون موجی به اولین فلیپ فلاپ اعمال می شود و بقیه فلیپ فلاپ ها همانطور که دیدیم از فلیپ فلاپ های طبقات ما قبل خود کلاک ورودی شان را دریافت می کنند. فرکانس CLK ورودی را به مقدار دلخواه تعریف خواهیم کرد در اینجا ما فرکانس کلاک را برابر بر روی 50khz تنظیم نموده ایم که با تنظیم دوره تناوب به این عدد می رسیم. 1/20u=50khz

بد نیست که در طول کار کد نویسی با یک دستور مفید دیگر نیز آشنا شویم. دستور IC. که مخفف Initialize Condition به معنای شرایط اولیه می باشد برای اختصاص دادن یک مقدار اولیه به ولتاژ یک گره یا جریان یک شاخه به کار می رود. در اینجا ما ولتاژ اولیه گره های خروجی شمارنده را که با q0-q7 نشان می دهیم برابر صفر قرار خواهیم داد تا ولتاژ گره های مذکور کاملاً تخلیه شوند. البته این کار بیشتر در مدارات ترتیبی یا حافظه دار معنی پیدا می کند و برای مدارات ترکیبی نیازی به این کار نیست. بقیه نت لیست تکراری بوده و نیاز به توضیح خاصی ندارد فقط یک مورد که اهمیت دارد زمان تحلیل transieant می باشد که در ادامه همین مطلب درباره آن توضیح خواهیم داد.

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

نتیجه شبیه سازی شمارنده
نتیجه شبیه سازی شمارنده باینری

می بینیم که عمل شمارش کاملاً به درستی انجام می شود و هر بار که خروجی ها به سمت بالاتر می روند دوره تناوب شان دو برابر و فرکانس آنها نصف خواهد شد (Freq Qn=2Freq Qn+1).  یک شمارنده با n بیت قادر به شمارش دو به توان n پدیده می باشد. اینجا دوره تناوب را برابر 20usec در نظر گرفتیم پس با این حساب حداکثر زمانی که می توان از خروجی گرفت برابر 20u*2^8=5.12ms می باشد به همین دلیل بازه زمانی برای تحلیل transieant را 6ms در نظر گرفتیم که بتوانیم یک دوره کامل را مشاهده کنیم. اگر بخواهیم تایمر با زمان قابل شمارش بالاتری بسازیم دو راه داریم یکی اینکه دوره تناوب پالس ساعت CLK را افزایش دهیم که با این کار دقت شمارنده کاهش پیدا می کند و یا اینکه تعداد سلولهای شمارنده را بیشتر کنیم که در این صورت پیچیدگی سخت افزاری افزایش خواهد یافت. برای شمارش یک زمان خاص مثلاً 3ms به راحتی می توانیم ترکیب بیت های یک خروجی را که به ازای آن زمان 3ms سپری می شود پیدا کنیم و با AND کردن آنها با هم مدارمان را از لحظه رسیدن به زمان مورد نظر آگاه کنیم.

 

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

 

Telegram
WhatsApp
Facebook
Twitter
LinkedIn

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.