گام سوم:
گام سوم: ترسيم دياگرامهاي جرياني
پيش از نوشتن کدهاي توصيفسخت افزاري ٬ طراح ميبايست بخشي از وقت خود را صرف ترسيم دياگرامهاي جرياني جهت مشخص کردن جريان پردازش اطلاعات و عملکرد مدار کند. اين دياگرامهاي انواع متعددي دارند که بسته به سليقه و نياز طراح٬ بايد به خدمت گرفته شوند.
در طراحي شمارنده برنامه پذير نيز ما چندين دياگرام جرياني ترسيم کردهايم که کار نوشتن کدهاي Verilog از روي آنها بسيار سادهتر ميباشد. براي اين کار ابتدا فرض ميکنيم که معماري توصيف شده طراحي شده است و حالتهاي مختلف کاري آنرا بررسي ميکنيم. در ابتدا بايد شمارنده بارگزاري شده و مدکاري آن در CWR نوشته شود٬ لذا پيش از هر کاري به سراغ ترسيم نمودار جرياني که شرايط بارگزاري شمارنده را پوشش ميدهد ميرويم اين نمودار را ميتوانيد در شکل 4 مشاهده کنيد :

شکل 4: نمودار جرياني بارگزاري شمارنده و نوشتن روي CWR
با توجه به شکل 4 هريک از مسيرهاي اين نمودار به صورت زير تفسير ميشوند
مسير 1: زماني که سيگنالهاي ceb و load در منطق 0 هستند و سيگنال write در منطق 1 قرار دارد٬ دستور نوشتن داده روي CWR ميباشد٬ لذا دادههاي روي پين 2 تا 0 سيگنال data_in بايد در ثبات سه بيتي CWR نوشته شوند.
مسير 2: زماني که سيگنالهاي ceb و write در منطق 0 هستند و سيگنال load در منطق 1 قرار دارد٬ دستور بارگزاري داده روي شمارنده ميباشد٬ لذا دادههاي Data_in بايد در latch_counter ذخيره شوند٬ latch_counter ثباتي است که در مد کاري 01 و 10 جهت ذخيره سازي عدد بارگزاري شده در شمارنده به آن نياز داريم.
مسير 3: زماني که سيگنال ceb در منطق 1 باشد٬ شمارنده برنامهپذير غير فعال خواهد شد و بايد مقدار ذخيره شده در latch_counter و CWR پاک شود.
قبل از آنکه به سراغ طراحي دياگرامجرياني مدهاي کاري شمارنده برنامه پذير برويم٬ ابتدا دياگرام جرياني reset شدن مدار را ترسيم ميکنيم؛ سيگنال reset از آنجا در طراحي اين شمارنده به خدمت گرفته شد که پيش از انجام هر کاري٬ با فعال کردن آن بتوانيم حالت مدار ترتيبي شمارنده را به يک حالت شناخته شده اوليه برده و فرآيند شمارش را دنبال کنيم. همانطور که در گام دوم مشخص کرديم شمارنده با لبه بالا رونده سيگنال reset ٬ بايد مقادير ذخيره شده در داخل ثباتهاي خود را پاک کند ٬ با توجه به شکل 5 تنها يک مسير در اين دياگرام وجود دارد که در اين مسير در صورت مشاهده لبه مثبت سيگنال reset تمامي ثباتهاي داخلي شمارنده که flag_counter و flag_half_counter و counter نامگذاري شدهاند٬ پاک خواهند شد.

شکل 5: دياگرام جرياني reset
سرانجام به سراغ ترسيم دياگرامهاي جرياني اصلي شمارنده ميرويم٬ اين دياگرامها ريز عملکرد مدار را در مدهاي کاري مختلف بيان ميکنند. با توجه به اين که شمارنده برنامه پذير يک نوع مدار ترتيبي ساده به شمار ميرود٬ ما از ساختار ماشين Moore براي طراحي آن استفاده کردهايم٬ در اين ساختار همانطور که شکل زير نشان داده شده است٬ يک مدار مجزا براي محاسبه حالتهاي مدار ترتيبي و يک مدار جهت محاسبه خروجي در نظر گرفته ميشود.
بنابر اين در مرحله ترسيم دياگرامهاي جرياني مدهاي کاري شمارنده٬ تنها بر روي محاسبه حالتهاي داخلي مدار تمرکز کرده و ايجاد سيگنال خروجي را به يک مدار ترکيبي ديگر واگذار ميکنيم.
شکل 6 دياگرام جرياني شمارنده در مد 00 را نشان ميدهد٬ شبهکدهاي نوشته شده در داخل اين نمودار به طور کامل بيانگر ريز عملکرد شمارنده در مد 00 ميباشند٬ در واقع اين شماتيک توصيف مشخصاتي که در گام اول براي مد 00نوشته شده بودند٬ به صورت الگوريتميک درآورده طوري که نوشتن کدهاي توصيف سختافزاري از روي آن سادهتر ميباشد.
شکل 6: دياگرام جرياني مد 00
با توجه به شکل 6 در لبه بالا رونده کلاک٬ بيت سوم CWR با مقدار 1 مقايسه ميشود٬ اين بيت بيانگر فعال بودن يا غير فعال بودن شمارنده ميباشد٬ در صورتي که شمارنده فعال بود٬ دو بيت ديگر CWR با مقدار 00 مقايسه ميشوند تا مدکاري شمارنده مشخص شود٬ در صورتي که مقدار اين دو بيت 00 نبود٬ مد 01 فراخوني خواهد شد. در صورتي که مد کاري 00 بود٬ مقدار ثبات flag_counter ارزيابي ميشود٬ اين ثبات پرچم٬ به نشانه بارگزاري شدن counter از روي ثبات latch_counter ميباشد٬ در صورتي که اين عمليات صورت نگرفته باشد٬ مقدار flag_counter برابر 0 خواهد بود و لذا در گام بعدي counter توسط latch_counter بارگزاري شده و flag_counter برابر 1 ميشود.
در صورتي که flag_counter برابر 1 باشد٬ به اين معني خواهد بود که قبلا مقدار latch_counter داخل counter بارگزاري شده است لذا شمارنده وارد مرحله شمارش ميشود٬ در اين مرحله ابتدا مقدار counter با FF مقايسه ميشود تا مشخص شود که شمارش به انتها رسيده است يا نه٬ سپس در صورتي که شمارش به انتها نرسيده بود٬ مقدار counter يک واحد افزايش پيدا کرده و فرايند مجددا تکرار ميشود.
در صورتي که شمارش به انتها رسيده بود نيز شمارش با 0 کردن بيت سوم CWR متوقف شده و شمارنده غير فعال ميشود.
شکل 7 در ادامه شکل 6 مربوط به دياگرام جرياني عملکرد شمارنده برنامه پذير در مد 01 ميباشد.

شکل 7: دياگرام جرياني مد 01
دياگرام جرياني مد 01 از محل اتصال Mode1 در شکل 6 آغاز ميگردد٬ ابتدا دو بيت ابتدايي شمارنده با مقدار 01 مقايسه ميشوند تا مشخص شود که شمارنده در مد کاري 01 قرار دارد يا نه ٬ در صورتي که شمارنده در اين مد نيز نبود٬ مد 10 فراخواني خواهد شد.
سپس مقدار flag_counter که علامت پرچم بارگزاري counter به شمار ميرود بررسي ميشود و در صورتي که counter بارگزاري نشده بود يا نياز به بارگزاري مجدد داشت٬ اين کار صورت گرفته و دياگرام مجددا به حالت شروع ميرود.
پس از حصول اطمينان از بارگزاري counter٬ شمارنده وارد مرحله شمارش شده و ابتدا مقدار counter با FF مقايسه ميشود تا رسيدن به پايان عمليات شمارش بررسي شود٬ در صورت رسيدن به پايان عمليات شمارش ٬ مقدار flag_counter صفر ميشود تا در مرحله بعدي counter مجددا بارگزاري شود و عمليات شمارش دوباره از سر گرفته شود.
شکل 8 در ادامه شکل 7 مربوط به دياگرام جرياني عملکرد شمارنده در مد 10 ميباشد.
شکل 8: دياگرام جرياني مد 10
از محل اتصال mode2 در شکل 8 روال کاري دياگرام جرياني مد 10 آغاز ميشود٬ در ابتدا جهت حصول اطمينان از فعال بودن شمارنده در مد 10 ٬ دو بيت ابتدايي CWR با مقدار 10 مقايسه ميشود و درصورتي که مقدار آن برابر 10 نبود٬ مجددا به حالت شروع ميرود. در ادامه مقدار flag_counter که علامت پرچم بارگزاري counter به شمار ميرود بررسي ميشود و در صورتي که counter بارگزاري نشده بود يا نياز به بارگزاري مجدد داشت٬ اين کار صورت گرفته و دياگرام مجددا به حالت شروع ميرود.
پس از حصول اطمينان از بارگزاري counter٬ مقدار آن با نصف مقدار اوليه خود مقايسه ميشود٬ اين عمليات تقسيم بر 2 با يک شيفت به راست ساده latch_counter به کمک عملگر concatenate زبان Verilog صورت گرفته است. در صورتي که مقدار counter با نصف مقدار اوليه خود برابر نبود اينقدر شمارش کاهشي را ادامه ميدهد تا به آن برسد و زماني که مقدار counter با نصف مقدار اوليه خود برابر شود ٬ پرچم flag_half_counter فعال خواهد شد.
شکلهاي 6 ٬ 7 و 8 ٬ علمکرد داخلي شمارنده برنامهپذير را در سه مدکاري آن به صورت الگوريتميک بيان ميکنند٬ با اين حال براي توليد سيگنال خروجي نياز به يک decoder داريم که با توجه به حالتهاي فعلي مدار ترتيبي٬ خروجي مطلوب را ايجاد کند. شکل 9 دياگرام اين مدار ترکيبي را نشان ميدهد:

شکل 9 : مدار ترکيبي توليد کننده سيگنالخروجي
با توجه به شکل 9 سيگنال خروجي data_out زماني برابر 1 خواهد شد که در :
مد 00 : زماني که flag_counter برابر 1 باشد و مقدار CWR برابر 100 بوده و counter به FF رسيده باشد.
مد 01 : زماني که CWR برابر 101 بوده و مقدار counter به FF رسيده باشد.
مد 10 : زماني که CWR برابر 110 بوده و مقدار flag_half_counter برابر 1 باشد.
توجه داشته باشيد که توليد سيگنال خروجي بر اساس محتواي بيت پرچم flag_counter که بيانگر بارگزاري شدن counter از latch_counter ميباشد تنها در مد 00 صورت گرفته است٬ به اين خاطر که در اين مد ( One-Shot) خروجي تنها يک پالس بايد 1 شود و flag_counter نيز پس از رسيدن counter به مقدار FF تنها يک پالس ساعت 1 ميماند.