0% found this document useful (0 votes)
40 views

Verilog Hardware Description Language

Uploaded by

Yasiel RT
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
40 views

Verilog Hardware Description Language

Uploaded by

Yasiel RT
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 63

‫خود آموز زبان توصیف سخت افزار‬

‫‪Verilog‬‬

‫ابراهیم جهاندار‬

‫دانشگاه اصفهان – دانشکده فنی مهندسی‬

‫گروه برق الکترونیک‬

‫‪www.jahandar.ir‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪2‬‬

‫فهرست مطالب‬

‫مقدمه ‪3 .......................................................................................................................................................................................‬‬

‫‪ )1‬سبک طراحی ‪4 ...........................................................................................................................................................................‬‬

‫‪ )2‬سطوح طراحی در زبان ‪7 ................................................................................................................................................... Verilog‬‬

‫‪ )3‬متد طراحی از باال به پایین ‪8 ...........................................................................................................................................................‬‬

‫‪ )4‬تعاریف اولیه ‪12..........................................................................................................................................................................‬‬

‫‪ )5‬قواعد دستوری و پایه ای زبان ‪13......................................................................................................................................... Verilog‬‬

‫‪ )6‬مدل سازی در سطح گیت ‪26..........................................................................................................................................................‬‬

‫‪ )7‬مدل سازی سطح ثباتی ( جریان داده ها ) ‪32........................................................................................................................................‬‬

‫‪ )8‬عبارات ‪ ،‬عملگر ها و عملوند ها ‪34....................................................................................................................................................‬‬

‫‪ )9‬مدل سازی رفتاری در ‪44...................................................................................................................................................Verilog‬‬

‫‪ )14‬طراحی مدار در سطح رفتاری ‪45....................................................................................................................................................‬‬

‫‪ )11‬مثال ها ‪48...............................................................................................................................................................................‬‬

‫‪ )12‬تمارین‪63................................................................................................................................................................................‬‬
‫صفحه ‪3‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫مقدمه‬
‫‪ Verilog‬یکی از زبان های توصیف سخت افزار می باشد‪ .‬توسط یک زبان توصیف سخت افزار می توان رفتار یک سیستم دیجیتال مانند فلیپ فالپ ‪ ،‬حافظه و یا‬
‫پردازنده و ‪ ...‬را توصیف نمود‪ .‬با استفاده از این زبان توصیف سخت افزاری می توان یک سیستم دیجیتالی ساده مانند یک فلیپ فالپ و یا یک سیستم دیجیتالی‬
‫پیشرفته نظیر یک میکروکنترلر را در هر سطحی توصیف نمود‪ .‬توسط این زبان شما می توانید سخت افزار خود را در سطوح طراحی زیر توصیف نمایید ‪:‬‬

‫کتابچه ای که پیش رو دارید خود آموز زبان توصیف سخت افزار ‪ Verilog‬می باشد‪ .‬مخاطبان خاص این کتابچه دانشجویان رشته های برق‪ ،‬کامپیوتر – سخت افزار ‪،‬‬
‫مهندسی پزشکی – بیو الکتریک و دیگر افراد عالقه مند به مدارات دیجیتال می باشد‪ .‬خوانندگان این کتاب باید دقت بفرمایند که برای فهم کامل مطالب درون این‬
‫کتابچه می بایست آشنایی خوبی با مدارات دیجیتال داشته و یا درس مدارات منطقی را گذرانده باشند‪.‬‬

‫از ویژگی های این خود آموز می توان به مطرح شدن مثال ها و مسائل متنوع بعد از هر مطلب آموزشی اشاره کرد‪ .‬همچنین سعی بر آن شده از مطالبی که کاربرد‬
‫کمتری دارند صرف نظر شود‪ .‬خوانندگان در صورت تمایل می توان جهت فراگیری مسائل پیشرفته تر در ‪ Verilog‬به کتاب ‪Verilog HDL – A Guide to Digital‬‬
‫‪ Design‬مراجعه نمایند‪ .‬مطالب این کتابچه از کتاب های ‪ Verilog HDL – A Guide to Digital Design‬نوشته ‪ ، Samir Palnitkar‬جزوه آموزشی ‪ Verilog‬نوشته سعید‬
‫صفری ‪ ،‬جزوه آموزشی ‪ Verilog‬نوشته ‪ Deepak Kumar Tala‬و ‪ ...‬جمع آوری و تدوین شده است‪.‬‬

‫در پایان از تمامی خوانندگان عزیز تقاضا دارم که ایراد و پیشنهادات خود را به آدرس پست الکترونیک اینجانب به نشانی ‪ e {at} jahandar.ir‬ارسال نموده و به هرچه‬
‫بهتر شدن آن کمک نمایند‪ .‬همچنین نسخه های جدید این کتابچه را می توانید از ادرس زیر دریافت نمایید‪.‬‬

‫‪www.jahandar.ir/files/Verilog-Hardware-Description-Language.pdf‬‬

‫تمامی حقوق این کتابچه برای نویسنده آن محفوظ می باشد‪ .‬نسخه الکترونیکی کتابچه فوق بصورت مجانی در اینترنت قرار داده شده است ‪ ،‬فروش و یا هرگونه درآمد‬
‫زایی از طریق این کتابچه مجاز نمی باشد منوط به اجازه از موئلف می باشد‪.‬‬

‫ابراهیم جهاندار – آذر ‪0931‬‬


‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪4‬‬

‫‪ )1‬سبک طراحی‬
‫به پردازیم‪ ،‬ابتدا نیاز است تا کمی درباره سبک طراحی توسط زبان های توصیف سخت افزار صحبت کنیم‪ .‬زبان‬ ‫‪Verilog‬‬ ‫قبل از اینکه به جزئیات زبان‬
‫‪ Verilog‬مانند دیگر زبان های توصیف سخت افزار به طراحان امکان طراحی از باال به پایین و از پایین به باال را می دهد‪ ،‬هریک از این متد ها دارای مزایا و‬
‫معایبی می باشند که به آن اشاره می شود‪.‬‬

‫‪1‬‬
‫‪ ‬سبک طراحی از پایین به باال‬
‫متد طراحی پایین به باال یک متد سنتی در طراحی مدار های دیجیتال می باشد‪ .‬در این متد سخت افزار دیجیتال از پایین ترین سطح یعنی سطح گیت‬
‫طراحی می شود و در هر مرحله تا رسیدن به سخت افزار مورد نظر به پیچیدگی آن اضافه خواهد شد‪ .‬با افزایش پیچیدگی سخت افزار های جدید پیاده‬
‫سازی توسط این متد بسیار سخت و نا ممکن خواهد شد‪.‬‬

‫متد طراحی پایین به باال‬ ‫شکل ‪.1‬‬

‫‪Bottom to Up Design Methodology 1‬‬


‫صفحه ‪5‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪1‬‬
‫‪ ‬سبک طراحی از باال به پایین‬
‫متداول ترین متد در طراحی و توصیف یک سخت افزار متد طراحی از باال به پایین می باشد‪ ،‬در این متد طراح بخش های مختلف یک سخت افزار را‬
‫بصورت جداگانه و از باال به پایین طراحی می کند‪ .‬از مزیت های این متد می توان به قابلیت تست های اولیه‪ ،‬تغییر طراحی بخش های مختلف بدون ایجاد‬
‫تغییرات در دیگر بخش ها ‪ ،‬ط راحی روتین و ‪ ...‬اشاره کرد‪ .‬در عوض پیاده سازی کامل این متد نیازمند اطالعات و دید سیستمی می باشد که در مقایسه با‬
‫متد قبل مشکل تر می باشد‪ ،‬به همین دلیل بیشتر طراحان سخت افزار در طراحی های خود از ترکیب هر دو متد جهت طراحی سیستم های دیجیتال‬
‫استفاده می کنند‪.‬‬

‫متد طراحی باال به پایین‬ ‫شکل ‪.2‬‬

‫‪Top Down Design Methodology 1‬‬


‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪6‬‬

‫مشخص کردن ویژگی های‬


‫طراحی سطح باال‬ ‫طراحی سطح پایین‬
‫سخت افزار‬
‫‪High Level Design‬‬ ‫‪Low Level Design‬‬
‫‪Design Specification‬‬

‫برسی عملکرد‬
‫تفسیر منطقی‬ ‫طراحی ثباتی‬
‫‪Functional‬‬
‫‪Logic Synthesis‬‬ ‫‪RTL Design‬‬
‫‪Verfication‬‬

‫شبیه سازی سطح گیت‬


‫جای گزاری و سیم کشی‬ ‫پیاده سازی‬
‫‪Gate Level‬‬
‫‪Place & Route‬‬ ‫‪Implementation‬‬
‫‪Simulation‬‬

‫مراحل طراحی یک سخت افزار به روش باال به پایین‬ ‫شکل ‪.3‬‬


‫صفحه ‪7‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ )2‬سطوح طراحی در زبان ‪Verilog‬‬


‫این زبان از سطوح مختلفی جهت توصیف و طراحی سخت افزار پشتیبانی می کند‪ .‬سه سطح مهم عبارتند از سطح رفتاری‪ ،‬سطح انتقال ثباتی و سطح گیت‪.‬‬

‫‪1‬‬
‫‪ ‬سطح توصیف گیت‬
‫در این سطح طراحی‪ ،‬سخت افزار مستقیماً توسط گیت های منطقی و اتصاالت میان آنها توصیف می شود‪ .‬در این سطح بصورت مستقیم با سیگنال‪ 2‬های‬
‫ورودی‪ ،‬خروجی و داخلی سروکار داریم‪ .‬طراحی در این سطح برای مدار های بزرگ و پیچیده کار بسیار مشکلی است و معموال سخت افزار توسط سطوح‬
‫باالتر طراحی و توسط ابزار های سنتز‪ 3‬به سطح گیت تبدیل خواهد شد‪.‬‬

‫‪ ‬سطح توصیف انتقال ثباتی‪ ( 4‬جریان داده ها )‬


‫در این سطح مدار دیجیتالی با استفاده از ثبات ها و عملیات های ثباتی و انتقال داده ها بین یکدیگر طراحی می شود‪ .‬در این سطح جریانی از داده ها‬
‫همواره و بصورت مداوم میان تعدادی از ثبات های سیستم برقرار بوده و عمال این جریان داده ها رفتار مدار را بصورت ساختاری توصیف می کند‪.‬‬

‫‪5‬‬
‫‪ ‬سطح توصیف رفتاری‬
‫در این سطح سخت افزار برحسب بلوک های همزمان طراحی می شود‪ .‬در این روش نیازی به توصیف جزئیات سخت افزاری طرح نمی باشد‪ .‬هر‬
‫بلوک به تنهایی بصورت ترتیبی بیان می شود بطوری که دستورات یکی پس از دیگری اجرا می شوند و مجموعه این بلوک ها رفتار سخت افزار را‬
‫توصیف می کند‪ .‬توابع‪ ،‬تسک ها و ماجول ها از ابزار اصلی در این سطح طراحی می باشند‪.‬‬

‫‪Gate Level Modeling 1‬‬


‫‪Signal 2‬‬
‫‪Synthesis 3‬‬
‫‪Register Transfer Level 4‬‬
‫‪Behavioral Modeling 5‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪8‬‬

‫‪ )3‬متد طراحی از باال به پایین‬


‫مراحل طراحی یک سخت افزار توسط این متد در زیر شرح داده شده است ‪:‬‬

‫مشخص کردن ویژگی های سخت افزار ( ‪) Design Specification‬‬ ‫‪‬‬

‫در مرحله ویژگی های کلی یک سخت افزار از قبیل نوع ورودی ها و خروجی و عملیات پردازشی بصورت کلی برسی می شود‪.‬‬

‫طراحی سطح باال (‪) High Level Design‬‬ ‫‪‬‬

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

‫نمونه ای از یک طراحی سطح باال‬ ‫شکل ‪.4‬‬


‫صفحه ‪9‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫طراحی سطح پایین (‪) Low Level Design‬‬ ‫‪‬‬

‫در این مرحله طراح بر اساس ورودی و خروجی هر بلوک و نوع پردازشی که هر بلوک می بایست انجام دهد بلوک را پیاده سازی می کند‪.‬‬
‫پیاده سازی در این مرحله توسط ثبات ها‪ ،‬دیکودر ها‪ ،‬مالتی پلکسر ها‪ ،‬شمارنده ها و ‪ ...‬انجام می شود‪.‬‬

‫نمونه ای از یک طراحی سطح پایین‬ ‫شکل ‪.5‬‬

‫طراحی ثباتی ( ‪) RTL Design‬‬ ‫‪‬‬

‫در این مرحله طراحی مرحله قبل به کد های ‪ Verilog‬و یا دیگر زبان های توصیف سخت افزار تبدیل می شود‪ .‬تبدیل طرح های مرحله قبل‬
‫به کد های توصیف سخت افزار می بایست در چهارچوب و قوانین برنامه نویسی آن زبان صورت پذیرد‪.‬‬

‫برسی عملکرد ( ‪) Functional Verification‬‬ ‫‪‬‬

‫این مرحله شامل عملیاتی برای شبیه سازی سخت افزار طراحی شده می باشد‪ .‬شبیه سازی به منظور اطمینان از کارکرد صحیح سخت افزار‬
‫صورت می گیرد‪ .‬در این مرحله می بایست از نرم افزار های شبیه سازی زبان توصیف سخت افزاری استفاده نمود‪ .‬همچنین می بایست یک‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪10‬‬

‫سخت افزار جداگانه برای تست سخت افزار طراحی شده از قبل طراحی کرده باشیم ‪ .‬به این سخت افزار جدید ‪ Testbench‬گفته می شود‪ .‬این‬
‫سخت وظیفه تولید سیگنال های ورودی و سنجش سیگنال های خروجی سخت افزار طراحی شده را بر عهده دارد‪.‬‬

‫سخت افزار تست جهت تست یک شمارنده‬ ‫شکل ‪.6‬‬

‫تفسیر منطقی یا سنتز ( ‪) Logic Synthesis‬‬ ‫‪‬‬

‫سنتز عملیات مشابه کامپایل در زبان های برنامه نویسی نرم افزاری می باشد‪ .‬ابزار سنتز با استفاده از اطالعات ورودی از قبیل نوع تکنولوژی‬
‫می نماید و در انتها آنها را تبدیل به نقشه‬ ‫‪RTL‬‬ ‫سخت افزار مقصد‪ ،‬نقشه ورودی ها و خروجی ها و بانک اطالعاتی اقدام به پردازش کد های‬
‫سطح گیت خواهد کرد‪ .‬ابزار سنتز همچنین پس از انجام عملیات سنتز اقدام به آنالیز مدار سنتز شده جهت اطمینان از همزمانی بخش های‬
‫مختلف با یکدیگر و بوجود نیامدن مشکالت زمانی می نماید ( قابل ذکر است که در عملیات سنتز تاخیر های موجود در سخت افزار های واقعی‬
‫در نظر گرفته نمی شود ) ‪ .‬به خروجی ابزار سنتز نت لیست گفته می شود که بیانگر گیت های منطقی و اتصاالت میان آنهاست‪.‬‬
‫صفحه ‪11‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫شبیه سازی سطح گیت ( ‪) Gate Level Simulation‬‬ ‫‪‬‬

‫در این مرحله نت لیست تولید شده توسط ابزار سنتز شبیه سازی شده و عملکرد صحیح آن مورد برسی قرار خواهد گرفت ‪.‬‬

‫فرایند تبدیل کد های توصیف سخت افزار به کد های توصیف سطح گیت که به آن سنتز می گویند‬ ‫شکل ‪.7‬‬

‫جای گذاری و سیم کشی ( ‪) Place & Route‬‬ ‫‪‬‬

‫این مرحله درواقع مربوط به طراحی مدار مجتمع مطابق با نت لیست تولید شده در مراحل قبلی می باشد‪.‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪12‬‬

‫‪ )4‬تعاریف اولیه‬

‫‪1‬‬
‫‪ ‬ماجول‬
‫برای توصیف سخت افزار های نسبتا پیچیده چاره ای جز تجزیه سخت افزار به بخش های کوچک تر نداریم‪ ،‬این بخش های کوچک را یک ماجول می نامیم‪.‬‬
‫) ساختار سلسله مراتبی‪ 2‬را بوسیله نمونه سازی از ماجول ها‬ ‫… ‪Java , C++ , C#‬‬ ‫می توان مانند زبان های برنامه نویسی شی گرا (‬ ‫‪Verilog‬‬ ‫در زبان‬
‫پیاده سازی کرد‪.‬‬

‫یک ماجول عملکرد مورد نیاز ماجول های باالتر را فراهم می کند اما پیاده سازی درون آن را پنهان می کند‪.‬‬

‫‪3‬‬
‫‪ ‬نمونه‬
‫یک ماجول الگویی از یک عنصر واقعی را پیاده سازی میکند‪ ،‬هنگامی که از این ماجول استفاده می‬
‫شود ‪ Verilog‬یک نمونه از این الگو را بصورت خودکار خواهد ساخت و ورودی و خروجی های مورد نظر‬
‫شما را به آن متصل خواهد کرد‪ .‬این نمونه درواقع یک کپی از ماجول اصلی می باشد‪ .‬برای مثال شما‬
‫یک ماجول ثبات ‪ 8‬بیتی طراحی میکنید و با نمونه سازی از این ماجول در بخش های مختلف چندین‬
‫یا نمونه سازی و این‬ ‫‪Instantiation‬‬ ‫ثبات دیگر از همین نوع را پیاده سازی خواهید کرد‪ .‬به این کار‬
‫عنصر را ‪ Instance‬یا نمونه می نامند‪.‬‬

‫نمایی از یک ماجول و ماجول های درون آن‬ ‫شکل ‪.8‬‬

‫‪Module 1‬‬
‫‪Hierarchy Structure 2‬‬
‫‪Instance 3‬‬
‫صفحه ‪13‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ )5‬قواعد دستوری و پایه ای زبان ‪Verilog‬‬


‫قواعد و دستور زبان ‪ Verilog‬شباهت زیادی به زبان ‪ C‬دارد‪ .‬زبان ‪ Verilog‬نسبت به حروف کوچک و بزرگ حساس می باشد‪ .‬تمامی حروف اختصاصی در‬
‫این زبان مانند زبان ‪ C‬با حرف کوچک نوشته می شوند‪ .‬در ‪ Verilog‬هم مانند ‪ C‬پس از هر توکن (دستور و داده) می بایست از عالمت ; (‪)Semi colleen‬‬
‫استفاده نمود‪.‬‬

‫‪ ‬فاصله خالی‬
‫فاصله خالی در هنگام سنتز توسط ابزار سنتز در نظر گرفته نمی شود‪ .‬فقط در مواردی که فاصله درون یک رشته و یا به عنوان جدا کننده‬ ‫‪Verilog‬‬ ‫در زبان‬
‫توکن ها (دستورات و داده ها) استفاده شده باشد در در نظر گرفته خواهد شد‪ .‬کرکتر های زیر به عنوان فاصله خالی در نظر گرفته خواهند شد ‪:‬‬

‫)‪Blank Space ( \s ) , Tab ( \t ) , Carriage return ( \r ), New line (\n‬‬

‫‪ ‬توضیحات‬
‫نحوه توضیح نویسی در زبان ‪ Verilog‬کامال مشابه به زبان ‪ C‬می باشد ‪.‬‬

‫‪ :‬توضیح تک خطی‬ ‫‪// Comments‬‬

‫توضیحات تک خطی با عالمت ‪ //‬شروع می شوند و با یک شروع یک خط جدید ( کارکتر ‪ ) Carriage Return‬خاطمه می یابند‪.‬‬

‫‪ :‬توضیح چند خطی‬ ‫‪/* Multi Line Comments */‬‬

‫توضیحات چند خطی با *‪ /‬شروع و با ‪ */‬تمام می شوند‪ .‬در این حالت توضیحات می تواند دارای چندین خط باشد‪.‬‬
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 14 ‫صفحه‬

Verilog ‫ عبارتی که با پس زمینه زرد مشخص شده است از قواعد زبان‬،‫ در این مثال با نحوه توضیح گذاری صحیح و اشتباه آشنا می شود‬: 1 ‫مثال‬
.‫پیروی نمی کند‬

.‫در این مثال با نحوه توضیح گذاری چند خطی آشنا خواهید شد‬
/* 1-bit adder , Example of Multi Line
Comment In Verilog
The Comment Starts with /* And End With next Token You see */
module adder(
a, b,
ci, sum, // Verilog will Ignore White Spaces
co // So You Can Define All of Your Variables in One Or In Separated Lines
);
// The next line represent Wrong Single Line
Commenting, this line will generate Verilog Syntax Error During Synthesis.
// Input Ports
input a; input b;
input ci;
// Output Ports
output sum; output co;
// Data Types
wire a; // After a token like C you must put
wire b; wire ci; wire sum; wire co;

‫ از نظر زبان‬.‫ می توان تمامی متغیر ها را در یک خط و بصورت پشت هم و یا در خطوط جداگانه و بصورت ترکیبی تعریف نمود‬،‫همانطور که دیده می شود‬
‫ اما برای پیروی از یک الگوی واحد بهتر است متغیر هایی که در یک دسته بندی قرار می گیرند ( مثال تمام متغیر‬.‫ این دو هیچ فرقی با هم ندارند‬Verilog
.‫ ) را در یک خط تعریف نمود‬... ‫ ویا تمام متغیر های ثباتی و‬، ‫های ورودی‬
‫صفحه ‪15‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪1‬‬
‫‪ ‬کلید واژه ها در ‪Verilog‬‬

‫در ‪ Verilog‬تمامی کلید واژه ها ( ‪ ) Keywords‬بصورت حروف کوچک می باشند‪ ،‬از آنجایی که ‪ Verilog‬یک زبان حساس به حروف کوچک و بزرگ است‬
‫لذا می توان از کلید واژه ها بصورت حروف بزرگ برای بیان متغیر ها ‪ ،‬نام ها و ‪ ...‬استفاده نمود‪.‬‬

‫به نام های اختصاری در این زبان ‪ Unique Name‬گفته می شود‪.‬‬

‫نکته ‪ :‬توصیه می شود از کلید واژه ها حتی در صورت حروف بزرگ بودن به عنوان ‪ Unique Name‬استفاده نکنید ‪.‬‬

‫مثال ‪ : 2‬در این مثال کلماتی که به رنگ آبی نوشته شده اند کلید واژه های زبان ‪ Verilog‬می باشند‪ .‬اما کلمات مشکی رنگ ‪ Unique Name‬می‬
‫باشند‪.‬‬
‫‪Reg‬‬ ‫‪//‬‬ ‫‪a‬‬ ‫‪Verilog Keyword‬‬
‫‪Output‬‬ ‫‪//‬‬ ‫‪a‬‬ ‫‪Verilog Keyword‬‬
‫‪Reg‬‬ ‫‪//‬‬ ‫‪a‬‬ ‫) ‪Unique Name ( Not Keyword‬‬
‫‪REG‬‬ ‫‪//‬‬ ‫‪a‬‬ ‫) ‪Unique Name ( Not Keyword‬‬

‫‪2‬‬
‫‪ ‬معرف ها در ‪Verilog‬‬

‫به نام های اشیا در این زبان معرف ( ‪ ) Identifier‬گفته می شود‪ ،‬نام ثبات ها و ماجول ها همگی از این نوع هستند‪.‬‬

‫) شروع‬ ‫‪Underscore‬‬ ‫معرف ها می بایست با یکی از حروف الفبا ( توجه کنید فقط حروف الفبا و نه اعداد و نشانه ها ) و یا عالمت _ (‬ ‫‪‬‬

‫شوند‪.‬‬
‫معرف ها می توانند حاوی حروف الفبا ( کوچک و بزرگ ) ‪ ،‬اعداد ( ‪ 0‬تا ‪ ) 9‬و عالمت دالر ( ‪ ) $‬باشند‪.‬‬ ‫‪‬‬

‫‪Keyword 1‬‬
‫‪Identifier 2‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪16‬‬

‫مثال ‪ : 3‬در این مثال نحوه نام گذاری صحیح معرف ها را خواهیم دید ‪ ،‬معرف هایی که با پس زمینه زرد رنگ مشخص شده اند صحیح نمی باشند و‬
‫قواعد زبان ‪ Verilog‬را رعایت نمی کنند‪.‬‬

‫‪// Valid Identifiers‬‬


‫‪clock_input‬‬ ‫‪counterEnable‬‬ ‫‪Carray$Output‬‬
‫‪i683‬‬ ‫‪A‬‬ ‫‪_TempRegister‬‬
‫‪// Wrong Identifiers‬‬
‫‪$i683‬‬ ‫‪2ndClockSource‬‬ ‫‪Colck#2‬‬

‫تعریف نمود‪ ،‬در این حالت شما می توانید از همه کرکتر های قابل چاپ جهت نام‬ ‫‪Escaped‬‬ ‫هم چنین می توان معرف ها را بصورت‬ ‫‪Verilog‬‬ ‫در زبان‬
‫)‪.‬‬ ‫‪ 0x21‬تا ‪0x7E‬‬ ‫گذاری معرف استفاده کنید‪ .‬این کرکتر ها عبارتند از تمامی حروف الفبا انگلیسی‪ ،‬اعداد و نشانه ها ( کرکتر های اسکی از کد هگزدسیمال‬
‫در این روش نام گذاری معرف با کرکتر بک اسلش ( \ ) شروع شده و تا زمانی که اولین فاصله مشاهده شود ادامه دارد‪ .‬به عبارتی دیگر کرکتر شروع معرف‬
‫بک اسلش و کرکتر اتمام آن فاصله می باشد‪.‬‬

‫مثال ‪ : 4‬تمامی معرف های زیر صحیح می باشند‪.‬‬


‫‪// Valid Identifiers‬‬
‫‪\683_up‬‬ ‫!‪\Q‬‬ ‫‪\1,2,6‬‬ ‫*‪\reset‬‬ ‫‪\clock22‬‬ ‫‪\!Enable‬‬

‫‪ ‬اعداد صحیح در ‪Verilog‬‬

‫در زبان ‪ Verilog‬می توان اعداد را در مبنای های دسیمال ‪ ،‬هگز دسیمال ‪ ،‬اوکتال و یا باینری تعریف نمود‪ .‬اعداد منفی در ‪ Verilog‬بصورت متمم ‪ 2‬تعریف‬
‫خواهند شد‪ .‬در تعریف اعداد می توان از عالمت _ ( ‪ ) Under Score‬برای جدا سازی اعداد استفاده نمود‪ Verilog ،‬بصورت خودکار این عالمت را از اعداد‬
‫حذف می کند‪ ( .‬باید توجه داشت که از این عالمت نمی توان در ابتدای عدد استفاده کرد )‪.‬‬
‫صفحه ‪17‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ Verilog‬امکان تعریف اعداد به صورت های زیر را فراهم می کند ‪:‬‬

‫اعداد دارای اندازه و بی اندازه ( اعداد بی اندازه به صورت پیشفرض ‪ 32‬بیتی تعریف می شوند )‪.‬‬ ‫‪‬‬

‫اعداد در مبنا های مختلف نظیر باینری ‪ ،‬اوکتال ‪ ،‬دسیمال و هگز دسیمال‪( .‬نشانگر مبنا با حرف کوچک نمایش داده می شوند ‪ ،‬ارقام هگز‬ ‫‪‬‬

‫با حروف بزرگ و کوچک نمایش داده می شوند‪).‬‬

‫فرمت کلی اعداد در ‪ Verilog‬بصورت زیر می باشد ‪:‬‬

‫>‪<Size>'<Radix><Value‬‬

‫= ‪Value‬‬ ‫اندازه = ‪ ، Size‬مبنا = ‪ ، Radix‬مقدار‬

‫افزودن فاصله بین نشانگر های اندازه ‪ ،‬مبنا و مقدار اعداد مجاز بوده ‪ Verilog‬بطور خودکار این فاصله ها را حذف می کند‪.‬‬

‫مثال ‪ : 5‬در این مثال با انواع نمایش های مختلف آشنا خواهید شد‪.‬‬

‫توضیحات‬ ‫مقدار ذخیره شده واقعی‬ ‫نحوه نمایش‬


‫‪unsized 62 bits‬‬ ‫‪00000000000000000000000000000001‬‬ ‫‪1‬‬
‫‪sized hex‬‬ ‫‪10101010‬‬ ‫‪8'hAA‬‬
‫‪sized binary‬‬ ‫‪100011‬‬ ‫‪3'b10_0011‬‬
‫‪unsized 62 bit hex‬‬ ‫‪00000000000000000000000000001111‬‬ ‫‪'hF‬‬
‫‪8bit sized hex‬‬ ‫‪11110001‬‬ ‫‪8'F1‬‬
‫‪13bit with separated digits‬‬ ‫‪1111111111110000‬‬ ‫‪13'FF F0‬‬
‫‪13bit with separated digits‬‬ ‫‪1111111111110000‬‬ ‫‪13'FF_F0‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪18‬‬

‫در ‪ Verilog‬اعداد از سمت راست شروع و با توجه اندازه مشخص شده ادامه می یابد‪.‬‬

‫اگر اندازه کوچکتر از مقدار باشد ‪ ،‬مقادیر اضافه سمت چپ حذف می گردند‪.‬‬ ‫‪‬‬

‫اگر اندازه بزرگتر از مقدار باشد ‪ ،‬مقادیر باقی مانده سمت چپ با توجه به آخرین بیت سمت چپ خوانده شده پر خواهند شد‪ .‬اگر آخرین‬ ‫‪‬‬

‫بیت ‪ 0‬و یا ‪ 1‬باشد با ‪ ، 0‬اگر اخرین بیت ‪ Z‬و یا ‪ X‬باشد به ترتیب با ‪ Z‬و ‪ X‬پر خواهد شد‪.‬‬

‫مثال ‪: 6‬‬

‫توضیحات‬ ‫مقدار ذخیره شده واقعی‬ ‫نحوه نمایش‬


‫‪Truncated , not 11001010‬‬ ‫‪001010‬‬ ‫‪3'hCA‬‬
‫‪Filled with two 0 on left‬‬ ‫‪001010‬‬ ‫‪3'hA‬‬
‫‪Filed with 13 Z‬‬ ‫‪Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z‬‬ ‫‪13'bZ‬‬
‫‪Filled with 8 X‬‬ ‫‪X X X X X X X X‬‬ ‫‪8'bx‬‬

‫‪ ‬اعداد حقیقی در ‪Verilog‬‬

‫زبان ‪ Verilog‬قابلیت پشتیبانی از اعداد حقیقی بصورت متغیر و ثابت را دارا می باشد‪ Verilog .‬به طور خودکار این اعداد را روند کرده و به عدد صحیح قابل‬
‫ذخیره سازی در حافظه تبدیل می کند‪ .‬اعداد حقیقی نمی توانند شامل ‪ Z‬یا ‪ X‬باشند‪ .‬اعداد حقیقی می توانند با نمایش دسیمال و یا علمی تعریف شوند‪.‬‬

‫>‪<Value>.<Value‬‬
‫>‪<Mantissa>E<Exponent‬‬

‫= ‪Mantissa‬‬ ‫توان = ‪ ، Exponent‬رقم اعشاری‬


‫صفحه ‪19‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫مثال ‪ : 7‬عبارت های زیر همگی نحوه نمایش صحیح اعداد حقیقی می باشند‪.‬‬
‫‪// Valid Real Numbers‬‬
‫‪1.2‬‬ ‫‪0.3‬‬ ‫‪6.1623.6‬‬ ‫‪6.3E8‬‬ ‫‪2..631E3‬‬

‫‪ ‬اعداد عالمت دار و بی عالمت در ‪Verilog‬‬

‫مانند زبان های دیگر نمی توانیم عالمت دار بودن و یا نبودن اعداد را مشخص کنیم‪ .‬هر عددی که عالمت – قبل از آن آورده شود منفی و در‬ ‫‪Verilog‬‬ ‫در‬
‫غیر این صورت مثبت خواهد بود‪ Verilog .‬اعداد منفی را بصورت متمم دو ذخیره می کند‪.‬‬

‫‪1‬‬
‫‪ ‬پورت ها در ‪Verilog‬‬

‫پورت ها در واقع ابزار ارتباط ماجول ها با دنیای بیرون و یکدیگر می باشند‪ .‬هر ماجول می تواند دارای تعدادی ورودی و تعدادی خروجی باشد‬

‫پورت ها را می توان بصورت ورودی ‪ ،‬خروجی و یا ورودی‪/‬خروجی تعریف نمود‪ .‬قالب کلی تعریف پورت بصورت زیر می باشد ‪:‬‬
‫;‪input [range_vals:range_var] list_of_identifiers‬‬
‫;‪output [range_vals:range_var] list_of_identifiers‬‬
‫;‪inout [range_vals:range_var] list_of_identifiers‬‬

‫برای ارتباط پورت ها با دنیای بیرون دو روش در زبان ‪ Verilog‬وجود دارد ‪ :‬روش ترتیبی و روش نام گذاری‬

‫در روش ترتیبی به هنگام نمونه سازی ا ز ماجول می بایست متغیر های اتصال به پورت ها را دقیقا به همان ترتیبی که در تعریف پورت آورده شده است‬
‫بیاوریم‪ .‬در این روش اگر بخواهیم یک پورت خروجی به جایی متصل نباشد کافی است جای آن را خالی بگذاریم‪.‬‬

‫‪Port 1‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪20‬‬

‫در روش نام گذاری از اسامی پورت ها که در تعریف ماجول آورده شده است استفاده می نماییم ‪ .‬معموال زمانی که تعداد ماجول ها و پورت های آنها افزایش‬
‫می یابد و بخاطر سپردن ترتیب آنها دشوار می شود استفاده می شود‪ .‬در این روش اگر بخواهیم یک پورت خروجی به جایی متصل نباشد کافی است نام آن‬
‫را نیاوریم‪.‬‬

‫قالب استفاده از روش نام گذاری بصورت زیر می باشد ‪:‬‬

‫) ‪.port_name( external_signal_name‬‬

‫مثال ‪ : 8‬در بخش اول این مثال چند حالت تعریف پورت ها آورده شده است ‪ .‬در دو بخش دوم دو روش ارتباط دهی نمایش داده شده است‪ .‬جمع‬
‫کننده های ‪ 1‬تا ‪ adder1( 6‬تا ‪ )adder6‬همگی یک نمونه از ماجول ‪ adder‬که قبال تعریف کرده بودیم می باشند ( در صفحات قبل فقط پورت های‬
‫این ماجول تعریف شده اند نه اجزای داخلی آن )‪.‬‬

‫جمع کننده های ‪ 1‬و ‪ 2 ، 4‬و ‪ 3 ، 5‬و ‪ 6‬دارای ورودی و خروجی های یکسانی هستند‪ ،‬تنها فرق آنها در روش ارتباط آنهاست‪ .‬در جمع کننده های ‪ 1‬تا ‪ 3‬از‬
‫روش ترتیبی و در جمع کننده های ‪ 4‬تا ‪ 6‬از روش نام گذاری استفاده شده است‪.‬‬
‫‪input‬‬ ‫;‪clk‬‬ ‫‪//‬‬ ‫‪Clock input‬‬
‫;‪input [11:0] data_in‬‬ ‫‪//‬‬ ‫‪13bit Data input‬‬ ‫‪bus‬‬
‫;‪output [.:0] data_out‬‬ ‫‪//‬‬ ‫‪8bit Data output bus‬‬
‫‪inout [11:0] data_bus‬‬ ‫‪//‬‬ ‫‪13bit Bi-Directional data bus‬‬
‫‪adder1‬‬ ‫;)‪adder( data_a, data_b, carry_i, summation, carry_o‬‬
‫‪adder2‬‬ ‫;)‪adder( data_a, data_b, carry_i, summation‬‬
‫‪adder6‬‬ ‫;)‪adder( data_a, data_b, carry_i, , carry_o‬‬
‫‪adder6‬‬ ‫;))‪adder( .a(data_a), .b(data_b), .sum(summation), .ci(carry_i), .co(carry_o‬‬
‫‪adder1‬‬ ‫;))‪adder( .a(data_a), .b(data_b), .sum(summation), .ci(carry_i‬‬
‫‪adder3‬‬ ‫;))‪adder( .a(data_a), .b(data_b), .ci(carry_i), .co(carry_o‬‬
‫صفحه ‪21‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ ‬انواع داده ها در ‪Verilog‬‬

‫دو نوع داده مهم در ‪ Verilog‬عبارتند از ‪ Net‬و ‪ . Register‬داده ‪ Net‬نمایانگر ارتباط پایه ای میان قسمت های مختلف است‪ .‬داده ‪ Register‬نمایانگر یک‬
‫متغیر برای ذخیره سازی اطالعات است‪ .‬هر یک از داده های فوق می توانند بصورت تکی و یا برداری‪ 1‬تعریف شوند‪.‬‬

‫نت (‪ )Net‬ها در واقع اتصاالت واقعی میان مدارات هستند‪ .‬نت ها در ‪ Verilog‬توسط کلید واژه ‪ wire‬تعریف می شود و مقدار پیشفرض آن ‪ Z‬می باشد‪.‬‬

‫در ‪ Verilog‬مجموعا چهار مقدار برای هر نت وجود دارد ‪ ،‬این چهار مقدار عبارتند از ‪:‬‬

‫توضیح‬ ‫مقدار‬
‫سطح منطقی ‪ ، 0‬شرط نادرست‬ ‫‪0‬‬
‫سطح منطقی ‪ ، 1‬شرط درست‬ ‫‪1‬‬
‫مقدار نا مشخص‬ ‫‪X‬‬
‫حالت امپدانس باال ( شناور )‬ ‫‪Z‬‬

‫ثبات (‪ )Register‬ها نیز در ‪ Verilog‬توسط کلید واژه ‪ reg‬تعریف می شوند‪.‬‬

‫ثبات ها آخرین مقداری که به آنها داده شده است را تا زمانی که مقدار جدیدی به آنها داده شود در خود نگه داری می کنند‪.‬‬ ‫‪‬‬

‫می توان یک آرایه از ثبات ها را بوجود آورد که در این صورت به آن حافظه (‪ )Memory‬گفته می شود‪.‬‬ ‫‪‬‬

‫از ثبات ها به عنوان متغیر در بلوک های ساخت یافته(‪ )Procedural‬استفاده کرد‪.‬‬ ‫‪‬‬

‫‪Vector 1‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪22‬‬

‫اگر بخواهید یک سیگنال حاوی مقدار را به یک بلوک ساخت یافته انتقال دهید باید از ثبات استفاده کنید‪.‬‬ ‫‪‬‬

‫چهار نوع ثبات اصلی در ‪ Verilog‬عبارتند از ‪:‬‬

‫توضیح‬ ‫نوع ثبات‬


‫متغیر بدون عالمت‬ ‫‪reg‬‬
‫متغیر عالمت دار ‪ 32‬بیتی‬ ‫‪integer‬‬
‫عدد صحیح ‪ 64‬بیتی‬ ‫‪time‬‬
‫متغیر ممیز شناور با دقت مضاعف‬ ‫‪real‬‬

‫‪1‬‬
‫‪ ‬رشته ها در ‪Verilog‬‬

‫‪ )double‬قرار گرفته اند‪ .‬باید توجه داشت در ‪ Verilog‬رشته ها بصورت‬ ‫(‪quotation‬‬ ‫یک رشته مجموعه ای از کاراکتر ها می باشد که درون دو عالمت "‬
‫تک خطی می باشند و نمی توان آنها را بصورت چند خطی تعریف نمود‪ .‬در ‪ Verilog‬کرکتر ها بصورت ‪ 8‬بیت و بصورت اسکی (‪ )ASCII‬تعریف می شوند‪.‬‬
‫در یک ثبات‬ ‫‪Verilog‬‬ ‫‪ )Termination‬برای نمایش انتهای رشته نمی باشد‪ .‬رشته ها در‬ ‫(‪Character‬‬ ‫نیازی به کرکتر انتهایی‬ ‫‪C‬‬ ‫بر خالف‬ ‫‪Verilog‬‬ ‫در‬
‫‪Verilog‬‬ ‫بزرگتر مقدار داده شده با آن باشد‪،‬‬ ‫‪Verilog‬‬ ‫ذخیره می شوند و طول ثبات باید به اندازه رشته ورودی بزرگ باشد‪ .‬زمانی که یک ثبات رشته در‬
‫بطور خودکار بیت های سمت چپ اضافی را با صفر پر خواهد کرد‪ .‬کرکتر های خاص در ‪ Verilog‬را می توان با پیشوند بک اسلش ( \ ) تعریف نمود ‪ ،‬برخی از‬
‫این کرکتر ها عبارتند از ‪:‬‬

‫‪Strings 1‬‬
‫صفحه ‪23‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫توضیح‬ ‫نمایش کرکتر‬


‫کرکتر خط جدید‬ ‫‪\n‬‬
‫کرکتر تب‬ ‫‪\t‬‬
‫کرکتر بک اسلش‬ ‫\\‬
‫کرکتر دبل کوتیشن‬ ‫"\‬
‫کرکتر درصد‬ ‫‪\%‬‬
‫‪1‬‬
‫‪ ‬آرایه ها ‪Verilog‬‬

‫در ‪ Verilog‬می توان‪ ،‬آرایه ای از داده ها و یا بردار ها تعریف نمود‪.‬‬


‫فرمت کلی تعریف آرایه به صورت زیر می باشد ‪:‬‬
‫] ‪<array_type> <array_name> [ #first_element : #last_element‬‬

‫تفاوت آرایه و بردار در این است که یک آرایه می تواند مجموعه ای از عناصر با طول های مختلف را در خود نگه داری کند اما بردار تعداد مشخصی از یک‬
‫عنصر است‪.‬‬

‫‪2‬‬
‫‪ ‬حافظه ها در ‪Verilog‬‬

‫در ‪ Verilog‬حافظه ها بصورت آرایه ای از ثبات ها تعریف می شوند‪ .‬فرمت کلی تعریف یک حافظه در ‪ Verilog‬بصورت زیر می باشد ‪:‬‬
‫]‪reg [ #word_size : 0 ] array_name [0:array_size‬‬

‫مثال ‪ : 9‬در این مثال نحوه تعریف ثبات ها ‪ ،‬نت ها و ثبات های برداری ‪ ،‬متغیر های حقیقی و صحیح و حالت برداری آنها ‪ ،‬رشته و حافظه آشنا می‬
‫شوید ‪ .‬توجه داشته باشید که رشته پس از تعریف و درون یک بلوک ساخت یافته مقدار دهی می شود‪.‬‬

‫‪Array 1‬‬
‫‪Memory 2‬‬
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 24 ‫صفحه‬

reg register; // Declaring a one bit Register


wire [11:0] Databus; // a 13 nets Representing a 13bit bus
reg [61:0] AddressReg; // a 62 bit Register
integer Counter; // Integer Data Declaration
real Real_Data; // Real Data Declaration
integer Output_Data[11:0]; // Array of 13 integers
reg membit[0:1026]; // 1K x 1bit memory
reg [.:0] membyte[0:1026]; // 1K x 8bit memory
reg [8*1.:0] version ; // Declare a register variable that is 18 bytes
initial
version = " version 1.0"; // Filling String inside initial procedural block

Verilog ‫ ماجول ها در‬

‫ قالب کلی تعریف ماجول به صورت زیر می‬.‫ در این بخش به نحوه تعریف ماجول و ویژگی های آن می پردازیم‬، ‫قبال آشنا شدیم‬ Verilog ‫با ماجول ها در‬
: ‫باشد‬

module module_name ( port list );


port declarations (if ports present)
parameters (optional)
Declaration of wires, regs and other variables
Data flow statement (assign)
Instantiation of lower level module
always and initial blocks, all behavioral
statements go in these blocks
tasks and functions
end module
‫صفحه ‪25‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ ‬قوانین اتصال پورت ها در ‪Verilog‬‬

‫به هنگام اتصال پورت های یک ماجول به جهان خارج باید به نکاتی توجه داشت ‪:‬‬

‫پورت های ورودی ماجول باید از نوع ‪ net‬باشند و این پورت ها می توانند به متغیر هایی از نوع ‪ reg‬و یا ‪ net‬در جهان خارج متصل شوند‪.‬‬ ‫‪‬‬

‫پورت های خروجی ماجول می توانند از نوع ‪ reg‬و یا ‪ net‬باشند و این پورتها باید به متغیر هایی از نوع ‪ net‬در جهان خارج متصل شوند‪.‬‬ ‫‪‬‬

‫پورت های دو سویه ماجول باید از نوع ‪ net‬باشند ‪ ،‬و این پورتها می توانند به متغیر هایی از نوع ‪ reg‬و یا ‪ net‬در جهان خارج متصل شوند‪.‬‬ ‫‪‬‬

‫پورتهای ماجول و متغیر های خارجی متصل به آنها باید از نظر طول منطبق باشند‪.‬‬ ‫‪‬‬

‫‪1‬‬
‫‪ ‬پیش پردازش در ‪Verilog‬‬

‫نیز مانند تمامی زبان های برنامه نویسی دیگر می توان پارامتر های پیش پردازش را تعریف نمود و در صورت نیاز از آنها استفاده نمود‪ .‬یکی از‬ ‫‪Verilog‬‬ ‫در‬
‫می باشد‪ .‬توسط این دستور می توان یک مقدار ‪ ،‬دستور ‪ ،‬شرط ‪ ... ،‬را با یک نام تعریف‬ ‫‪ Verilog‬دستور‪define‬‬ ‫پرکاربر ترین دستورات پیش پردازشی در‬
‫نمود و از آن پس فقط از آن نام در کد ها استفاده کرد‪ .‬قالب کلی استفاده از دستور ‪ define‬به صورت زیر است‪:‬‬
‫>‪`define <Definition-Name> <Definition-Statement‬‬

‫برای استفاده از این تعریف در کد ها فقط کافی است نام آن را به همراه عالمت ` بیاورید‪ .‬به صورت زیر ‪:‬‬
‫>‪`<Definition-Name‬‬

‫از این دستور در مثال های آخر کتابچه به دفعات استفاده خواهیم کرد‪.‬‬

‫‪Preprocessing 1‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪26‬‬

‫‪ )6‬مدل سازی در سطح گیت‬


‫هم مانند دیگر زبان های‬ ‫‪Verilog‬‬ ‫در مدل سازی سطح گیت مدار را بصورت مجموعه ای از گیت های پایه که به یکدیگر متصل شده اند بیان می کنیم‪.‬‬
‫توصیف سخت افزار درون خود دارای گیت های منطقی‪ ، 1‬خطوط انتقال‪ 2‬و سوییچ‪ 3‬ها می باشد اما با توجه به وجود ابزار های سنتز از این اشیا به ندرت در‬
‫کنیم‪.‬‬ ‫طراحی ها استفاده می شود‪ .‬برای شروع ابتدا باید انواع گیت های پایه ای که در ‪ Verilog‬وجود دارند را معرفی‬

‫در ‪ Verilog‬شش گیت پایه ای اصلی وجود دارد ‪ ،‬این گیت ها عبارتند از گیت های ‪ XOR ، NOR ، OR ، NAND ، AND‬و ‪ . XNOR‬همگی این گیت ها‬
‫دارای چند ورودی و یک خروجی می باشند‪ .‬اولین پورت هر گیت خروجی آن و پورت های بعدی ورودی های گیت را تشکیل می دهند بدین ترتیب می‬
‫توان گیت هایی با تعداد ورودی های مختلف تعریف نمود‪.‬‬

‫‪ 6‬گیت انتقالی اصلی عبارتند از گیت های وارونگر‪ ، 4‬بافر‪ ، 5‬بافر سه‪ 6‬حالته فعال پایین‪ ،‬بافر سه حالته فعال باال ‪ ،‬وارونگر سه حالته فعال پایین و وارونگر سه‬
‫حالته فعال باال‪ .‬پورت آخر گیت های دو حالته ورودی و دیگر پورت ها خروجی هستند ‪ ،‬بدین ترتیب می توان گیت هایی با تعداد خروجی های دلخواه‬
‫تعریف نمود‪ .‬در گیت های سه حالته پورت اول خروجی ‪ ،‬پورت دوم ورودی و پورت سوم پورت کنترل می باشد‪.‬‬

‫‪Logic Gates 1‬‬


‫‪Transmission Gates 2‬‬
‫‪Switch 3‬‬
‫‪Inverter 4‬‬
‫‪Buffer 5‬‬
‫‪Tri State Buffer 6‬‬
‫صفحه ‪27‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫کلید واژه‬ ‫نماد‬ ‫نام گیت‬ ‫کلید واژه‬ ‫نماد‬ ‫نام گیت‬

‫‪nor‬‬ ‫گیت ‪ NOR‬با ‪ N‬ورودی‬ ‫‪and‬‬ ‫گیت ‪ AND‬با ‪ N‬ورودی‬

‫‪xor‬‬ ‫گیت ‪ XOR‬با ‪ N‬ورودی‬ ‫‪nand‬‬ ‫گیت ‪ NAND‬با ‪ N‬ورودی‬

‫‪xnor‬‬ ‫گیت ‪ XNOR‬با ‪ N‬ورودی‬ ‫‪or‬‬ ‫گیت ‪ OR‬با ‪ N‬ورودی‬

‫‪buf‬‬ ‫گیت بافر با ‪ N‬خروجی‬ ‫‪not‬‬ ‫گیت ‪ NOT‬با ‪ N‬خروجی‬

‫‪bufif0‬‬ ‫بافر سه حالته فعال پایین‬ ‫‪notif0‬‬ ‫وارونگر سه حالته فعال پایین‬

‫‪bufif1‬‬ ‫بافر سه حالته فعال باال‬ ‫‪notif1‬‬ ‫وارونگر سه حالته فعال باال‬

‫برای طراحی مدار در سطح گیت ابتدا باید آنرا بصورت مجموعه ای از گیت های پایه در آورد‪ ،‬سپس با تعریف ‪ net‬های مورد نیاز این گیتهای پایه را به‬
‫یکدیگر متصل نمود‪ .‬به این کار اصطالحا سیم بندی یا ‪ Wiring‬گفته می شود‪.‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪28‬‬

‫مثال ‪ : 10‬در این مثال با استفاده دو گیت ‪ NAND‬یک گیت ‪ AND‬می سازیم‪.‬‬
‫;)‪module and_from_nand(X, Y, F‬‬
‫;‪input X, Y‬‬
‫;‪output F‬‬
‫‪wire‬‬ ‫;‪W‬‬
‫;)‪nand U1(W, X, Y‬‬
‫;)‪nand U2(F, W, W‬‬

‫‪endmodule‬‬
‫در این ماجول ‪ X‬و ‪ Y‬ورودی و ‪ F‬خروجی می باشد‪.‬‬
‫مثال ‪ : 11‬در این مثال با ساخت یک فلیپ فالپ نوع دی آشنا می شویم‪.‬‬
‫;)‪module dff(Q, Q_BAR, D, CLK‬‬

‫;‪output Q,Q_BAR‬‬
‫;‪input D, CLK‬‬

‫‪nand‬‬ ‫;)‪U1(X, D, CLK‬‬


‫‪nand‬‬ ‫;)‪U2(Y, X, CLK‬‬
‫‪nand‬‬ ‫;)‪U3(Q, Q_BAR, X‬‬
‫‪nand‬‬ ‫;)‪U4(Q_BAR, Q, Y‬‬

‫‪endmodule‬‬

‫در این ماجول ‪ D‬و ‪ CLK‬ورودی ‪ Q ،‬و ‪ Q_BAR‬خروجی می باشند‪.‬‬


‫توجه کنید گیت ‪ nand‬می تواند دارای تعداد نا متناهی ورودی باشد‪ .‬در این صورت اولین آرگومان خروجی و دیگر آرگومان ها ورودی می باشند‪.‬‬
29 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

.‫ آشنا می شویم‬1‫ در این مثال با ساخت یک مالتی پلکسر‬: 12 ‫مثال‬


module mux6_to_1 ( out, i0, i1, i2, i6, s1, s0 );
output out;
input i0, i1, i2, i6, s1, s0;
// Internal wire declaration
wire s0n, s1n, y0, y1, y2;

// Gate instantiations
not ( s1n, s1 );
not ( s0n, s0 );
and ( y0, i0, s1n, s0n );
and ( y1, i1, s1n, s0 );
and ( y2, i2, s1 , s1n );
and ( y6, i6, s1 , s0 );
or ( out, y0, y1, y2, y6 );
endmodule

‫نموادر منطقی یک مالتی پلکسر چهار به یک‬ .9 ‫شکل‬

Multiplexer 1
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪30‬‬

‫مثال ‪ : 13‬در این مثال یک جمع کنند کامل ‪ 4‬بیت را برسی خواهیم کرد‪.‬‬

‫برای ساخت یک جمع کننده چهار بیت به چهار جمع کننده کامل ‪ 1‬بیتی با بیت نقلی ورودی و خروجی نیازمندیم که نمودار و کد ‪ Verilog‬آن را‬
‫در ادامه می بینید‪ .‬در این مثال از سطح توصیف گیت برای توصیف مدار داخلی جمع کننده استفاده شده است‪.‬‬

‫نمودار منطقی یک جمع کننده کامل‬ ‫شکل ‪.10‬‬


‫;)‪module fulladder(sum, c_out, a, b, c_in‬‬
‫;‪output sum, c_out‬‬
‫;‪input a, b, c_in‬‬
‫;‪wire s1, c1, s2‬‬

‫;)‪xor (s1, a, b‬‬


‫;)‪and (c1, a, b‬‬
‫;)‪xor(sum, s1, c_in‬‬
‫;)‪and(s2, s1, c_in‬‬
‫;)‪or(c_out, s2, c1‬‬
‫‪endmodule‬‬
‫صفحه ‪31‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫در مرحله بعد می بایست چهار عدد از این جمع کننده ها را به طریق زیر به هم متصل کنیم‪.‬‬

‫نمودار یک جمع کننده چهاربیتی با استفاده از چهار جمع کننده ‪ 1‬بیت‬ ‫شکل ‪.11‬‬

‫;)‪module fulladder6(sum, c_out, a, b, c_in‬‬

‫;‪output [6:0] sum‬‬


‫;‪output c_out‬‬

‫;‪input [6:0] a,b‬‬


‫;‪input c_in‬‬

‫;‪wire c1, c2, c6‬‬


‫‪// Making‬‬ ‫‪Four Instances of fulladder which defined before‬‬
‫‪fulladder‬‬ ‫‪fa0(sum[0], c1,‬‬ ‫;)‪a[0], b[0], c_in‬‬
‫‪fulladder‬‬ ‫‪fa1(sum[1], c2,‬‬ ‫;)‪a[1], b[1], c1‬‬
‫‪fulladder‬‬ ‫‪fa2(sum[2], c6,‬‬ ‫;)‪a[2], b[2], c2‬‬
‫‪fulladder‬‬ ‫;)‪fa6(sum[6], c_out, a[6], b[6], c6‬‬
‫‪endmodule‬‬
‫مشاهده می شود در این مثال چهار بار از جمع کننده تک بیت که در بخش قبل طراحی کرده بودیم نمونه سازی کردیم و‬ ‫‪Verilog‬‬ ‫همانطور که در کد‬
‫توسط آن یک جمع کننده چهار بیت را طراحی نمودیم‪.‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪32‬‬

‫‪ )7‬مدل سازی در سطح جریان داده ها‬


‫در مدل سازی جریان داده به نحوه انتقال اطالعات بین ثبات ها و پردازش اطالعات اهمیت می دهیم‪ .‬در این قسمت به چگونگی مدل سازی در سطح‬
‫جریان داده در زبان ‪ Verilog‬و مزایای آن می پردازیم‪.‬‬

‫‪1‬‬
‫‪ ‬مقداری دهی مداوم‬
‫‪Net‬‬ ‫توسط این دستور می توان یه مقدار را روی یک ‪ Net‬قرار داد‪ .‬این دستور همواره در حال اجرا بوده و هرگاه یکی از عملوند های آن تغییر کند مقدار‬
‫هم همراه با آن ( و یا با تاخیر ) تغییر خواهد کرد‪ .‬قالب کلی استفاده از این دستور به صورت زیر است ‪:‬‬
‫;‪assign <delay> Assignment-Lists‬‬

‫سمت چپ این دستور باید یک متغیر یا یک بردار از نوع ‪ net‬و یا الحاقی از این دو نوع باشد‪.‬‬

‫‪2‬‬
‫‪ ‬مقدار دهی مداوم ضمنی‬
‫در این روش به جای اینکه یک متغیر را از جنس ‪ Net‬تعریف کنیم و سپس توسط دستور ‪ assign‬یک مقدار را روی آن قرار دهیم‪ ،‬می توانیم این عمل را‬
‫در هنگام تعریف ‪ Net‬انجام دهیم‪.‬‬

‫‪Continuous Assignment 1‬‬


‫‪Implicit Continuous Assignment 2‬‬
‫صفحه ‪33‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫مثال ‪ : 14‬در این مثال نحوه مقدار دهی بصورت مداوم و مداوم ضمنی را مشاهده خواهید کرد‪.‬‬
‫;) ‪module mymodule_continuous_assignment( out, i1, i2‬‬
‫;‪output out‬‬
‫;‪input i1,i2‬‬
‫;‪assign out = i1 & i2‬‬ ‫‪// Continuous Assignment‬‬
‫‪endmodule‬‬
‫;) ‪module mymodule_implicit_continuous_assignment( out, i1, i2‬‬
‫;‪output out‬‬
‫;‪input i1,i2‬‬
‫;‪wire out = i1 & i2‬‬ ‫‪// Implicit Continuous Assignment‬‬
‫‪endmodule‬‬

‫‪1‬‬
‫‪ ‬تاخیر ها‬
‫به منظور واقعی تر شدن نتایج شبیه سازی می توان در ‪ Verilog‬تاخیر های که ناشی از تاخیر انتشار گیت های منطقی‪ 2‬می باشند را لحاظ کرد‪ .‬باید توجه‬
‫داشت این تاخیرات فقط در نتایج شبیه سازی تاثیر می گذارند و در سنتز و واقعیت اثری نخواهند داشت‪.‬‬

‫‪ ‬تاخیر با قاعده‬
‫در این حالت یک تاخیر را پس از دستور ‪ assign‬و قبل از ‪ net‬می آوریم‪ .‬هر تغییری که در یکی از سیگنال های سمت راست رخ دهد‪ ،‬باعث می شود پس‬
‫از گذشت زمان تاخیر ‪ ،‬عبارت سمت راست مجددا ارزیابی شود و سپس در متغیر سمت چپ قرار گیرد‪ .‬به این ترتیب تاخیری که در اینجا داریم از نوع‬
‫‪ inertial‬است و این امر باعث می شود که پالسهایی با عرض کمتر از مقدار تاخیر مشخص شده به خروجی منتشر نشود‪.‬‬

‫‪Delay 1‬‬
‫‪Logic Gates Propagation Delay 2‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪34‬‬

‫‪ ‬تاخیر به هنگام تعریف ‪net‬‬

‫در این حالت به هنگام تعریف ‪ net‬تاخیر مورد نظر را برای آن مشخص می کنیم‪ .‬از این پس هر تغییری که روی این ‪ net‬انجام شد‪ ،‬با تاخیر مشخص شده‬
‫اعمال می شود‪ .‬این عمل در مورد توصیف سطح گیت نیز قابل استفاده است‪.‬‬
‫مثال ‪ : 15‬در این مثال با نحوه ایجاد تاخیر های مورد بحث با قاعده و تاخیر به هنگام تعریف نت آشنا می شوید‪.‬‬
‫‪// ----- Inertial Delay Example -------‬‬
‫;)‪module and_with_delay( o1, i1, i2‬‬
‫;‪output o1‬‬
‫;‪input i1, i2‬‬
‫‪assign #1 o1 = i1 & i2; // Inertial Delay‬‬
‫‪endmodule‬‬

‫‪// ----- Implicit Delay Example ------‬‬


‫;‪wire #1 out‬‬
‫;‪assign out = i1 & i2‬‬ ‫‪// Implicit Delay during Assignment‬‬

‫‪ )8‬عبارات ‪ ،‬عملگر ها‪ 1‬و عملوند‪ 2‬ها‬


‫یک عبارت از ترکیب عملوند ها و عملگر ها ساخته می شود‬ ‫‪‬‬

‫یک عملوند می تواند یکی از انواع داده ای باشد که قبال به آن اشاره شد‪.‬‬ ‫‪‬‬

‫عملگر ها روی عملوند ها عملیاتی را انجام می دهند تا نتیجه مطلوب بدست آید‪ .‬لیست عملگر های موجود در ‪ Verilog‬در جدول صفحه‬ ‫‪‬‬

‫بعد آمده است‪.‬‬

‫‪Operator 1‬‬
‫‪Operand 2‬‬
‫صفحه ‪35‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫در مورد عملگر های حسابی‪ 1‬باید به موارد زیر توجه داشت ‪:‬‬

‫اگر هر دو عملوند صحیح باشد خارج قسمت را بر می گرداند‪.‬‬ ‫‪‬‬

‫اگر هریک از عملوند ها دارای بیت ‪ x‬باشند ‪ ،‬نتیجه عملیات ‪ x‬خواهد بود‪.‬‬ ‫‪‬‬

‫عملگر ‪ %‬باقی مانده تقسیم را بر می گرداند و عالمت حاصل برابر عالمت عملوند اول است‪.‬‬ ‫‪‬‬

‫بهتر است اعداد منفی را در عبارات بصورت اعداد صحیح بکار برد‪ ،‬زیرا در غیر این صورت به مکمل ‪ 2‬تبدیل می شوند که ممکن است‬ ‫‪‬‬

‫باعث نتایج غیر منتظره‪ 2‬شوند‪.‬‬

‫در مورد عملگر های منطقی‪ 3‬باید به موارد زیر توجه داشت ‪:‬‬
‫‪.‬‬ ‫نتیجه عملگر های منطقی یک بیت است ‪ 0 :‬نادرست ‪ 1 ،‬درست و ‪ X‬نا معلوم‬ ‫‪‬‬

‫اگر عملوند اول ‪ 0‬باشد معادل نادرست ‪ ،4‬اگر ‪ 1‬باشد معادل درست‪ 5‬و اگر ‪ X‬باشد نا معلوم ارزیابی خواهد شد‪.‬‬ ‫‪‬‬

‫‪Arithmetic Operators 1‬‬


‫‪Unexpected Result 2‬‬
‫‪Logic Operators 3‬‬
‫‪False Condition 4‬‬
‫‪True Condition 5‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪36‬‬

‫عملوند ها‬ ‫عملیات‬ ‫سمبل عملگر‬ ‫نوع عملگر‬ ‫عملوند ها‬ ‫عملیات‬ ‫سمبل عملگر‬ ‫نوع عملگر‬
‫‪2‬‬ ‫ضرب‬ ‫*‬ ‫‪2‬‬ ‫کوچکتر از‬ ‫<‬

‫‪2‬‬ ‫تقسیم‬ ‫‪/‬‬ ‫‪2‬‬ ‫بزرگتر از‬ ‫>‬


‫‪2‬‬ ‫کوچکتر و مساوی‬ ‫=<‬
‫‪2‬‬ ‫جمع‬ ‫‪+‬‬
‫عملگر های‬ ‫‪2‬‬ ‫بزرگتر و مساوی‬ ‫=>‬
‫‪2‬‬ ‫تفریق‬ ‫‪-‬‬
‫‪2‬‬ ‫باقی مانده‬ ‫‪%‬‬
‫‪2‬‬ ‫تساوی‬ ‫==‬ ‫عملگر های‬
‫حسابی و منطقی‬
‫‪2‬‬ ‫عدم تساوی‬ ‫=!‬
‫‪0‬‬ ‫معکوس منطقی‬ ‫!‬ ‫رابطه ای‪، 0‬‬
‫‪2‬‬ ‫تساوی نوع حروف‬ ‫===‬
‫‪2‬‬ ‫و منطقی‬ ‫&&‬ ‫تساوی ‪،‬‬
‫‪2‬‬ ‫عدم تساوی نوع حروف‬ ‫==!‬
‫‪2‬‬ ‫یا منطقی‬ ‫||‬ ‫‪0‬‬ ‫معکوس بیتی‬ ‫بیتی‬
‫~‬
‫نا محدود‬ ‫الحاق‬ ‫{}‬ ‫عملگر های الحاق‬ ‫‪2‬‬ ‫و بیتی‬ ‫&‬
‫نا محدود‬ ‫تکرار‬ ‫{{}}‬ ‫و تکرار‬ ‫‪2‬‬ ‫یا بیتی‬ ‫|‬
‫‪2‬‬ ‫یا اختصاصی بیتی‬ ‫^‬
‫‪2‬‬ ‫شیفت راست‬ ‫>>‬ ‫عملگر های‬
‫‪2‬‬ ‫معکوس یا اختصاصی بیتی‬ ‫^~ یا |~^‬
‫‪2‬‬ ‫شیفت چپ‬ ‫<<‬ ‫شیفت‬

‫در مورد عملگر های تساوی‪ 2‬باید به موارد زیر توجه داشت ‪:‬‬

‫نتیجه ‪ a==b‬برابر ‪ 0‬یا ‪ 1‬یا ‪ x‬است‪ .‬اگر یک بیت از یکی از عملوند ها ‪ x‬یا ‪ z‬باشند نتیجه ‪ x‬می شود‪.‬‬ ‫‪‬‬

‫نتیجه ‪ a!=b‬برابر ‪ 0‬یا ‪ 1‬یا ‪ x‬است‪ .‬اگر یک بیت از یکی از عملوند ها ها ‪ x‬یا ‪ z‬باشد نتیجه ‪ x‬می شود‪.‬‬ ‫‪‬‬

‫نتیجه ‪ a===b‬برابر ‪ 0‬یا ‪ 1‬است‪ a .‬و ‪ b‬بیت به بیت با هم مقایسه می شوند‪.‬‬ ‫‪‬‬

‫‪Relational 1‬‬
‫‪Equality 2‬‬
‫صفحه ‪37‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫نتیجه ‪ a!==b‬برابر ‪ 0‬یا ‪ 1‬است‪ a .‬و ‪ b‬بیت به بیت باهم مقایسه می شوند‪.‬‬ ‫‪‬‬

‫در مورد عملگر های الحاق‪ 1‬باید به موارد زیر توجه داشت ‪:‬‬

‫عملوند ها حتما باید اعداد اندازه دار باشند تا ‪ Verilog‬قادر به محاسبه اندازه نتیجه باشد‪.‬‬ ‫‪‬‬

‫عملوند ها می توانند ‪ reg ، net‬و یا برداری از آنها و یا اعداد اندازه دار باشند‪.‬‬ ‫‪‬‬

‫اپراتور تکرار‪ 2‬مشخص می کند که چندبار عدد داخل { } باید تکرار شود ‪.‬‬

‫در مورد عملگر های شرطی باید به موارد زیر توجه داشت ‪:‬‬
‫‪ ‬قالب استفاده از عملگر شرطی به صورت زیر است‬
‫>‪<Condition> ? <True-Statement‬‬ ‫;>‪: <False-Statement‬‬

‫عبارت شرط مورد ارزیابی قرار می گیرد ‪ ،‬اگر شرط برقرار باشد عبارت برقراری شرط و اگر شرط برقرار نباشد عبارت عدم برقراری شرط‬ ‫‪‬‬

‫اجرا می شود‪.‬‬

‫‪Concatenation 1‬‬
‫‪Replication 2‬‬
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 38 ‫صفحه‬

‫ ( الزم به ذکر است این کد ها فقط جهت آموزش نحوه عملکرد‬.‫ در این مثال نحوه استفاده از عملوند ها و عملگر ها را خواهید آموخت‬: 16 ‫مثال‬
) ‫عملگر ها می باشند‬
//------- Arithmetic Operations --------//
A = 6'b0011; B = 6'b0100; D = 3; E = 6;
A*B // Evaluated to 6’b1100
D/E // Evaluated to 1
A+B // Evaluated to 6’b0111
in1 = 6'b101x; in2 = 6'b1010;
sum = in1 + in2; // Evaluated to 6'x
//------- Logic Operations --------//
A = 6; B = 0;
A && B // Evaluated to 0 ( False )
A || B // Evaluated to 1 ( True )
!A // Evaluated to 0 ( False )
A = 2'bx0; B = 2'b10;
A && B // Evaluated to x ( Unknown )
//------- Concatenation & Replication --------//
A = 1'b1; B = 2'b00; C = 2'b10; D = 6'b110;
y = { B, C }; // Result y is 6’b0010
y = { A, B ,C, D, 6'b001 }; // Result y is 11’b1_00_10_110_001

//------- Conditional Operations --------//


// Models functionality of a tri state buffer
assign addr_bus = drive_enable ? addr_out : 62'bz;

//------- Equality Operations --------//


A = 6; B = 6; X = 6'b1010; Y = 6'b1101; Z = 6'b1xzz; M = 6'b1xzz; N = 6'b1xxx;
A == B // Result is logical 0
A != B // Result is logical 1
X == Z // Result is x
Z === M // Result is logical 1
Z === N // Result is logical 0
M !== M // Result is logical 1
39 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

.‫ جمع کننده چهار بیتی و یک مقایسه گر تک بیت قابل توسعه را مشاهده می کنید‬، 1 ‫ به‬4 ‫ در مثال زیر توصیف یک مالتی پلکسر‬: 17 ‫مثال‬
module mux6_to_1 ( out, i0, i1, i2, i6, s1, s0 );
output out;
input i0, i1, i2, i6, s1, s0;
assign out = s1 ? ( s0 ? i6 : i2 ) : ( s0 ? i1 : i0 );

endmodule

module fulladd6 ( sum, c_out, a, b, c_in );


output [6:0] sum;
output c_out;
input [6:0] a, b;
input c_in;
assign { c_out, sum } = a + b + c_in; // Concatenating assignment
endmodule
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪40‬‬

‫‪ )9‬مدل سازی رفتاری در ‪Verilog‬‬


‫در ‪ Verilog‬می توان سخت افزار را در سه سطح کلی توصیف کرد‪ ،‬این سطوح عبارتند از ‪:‬‬

‫سطح توصیف رفتاری ‪ :‬مدل سازی سطح باال که در آن رفتار منطقی سیستم مدل سازی می شود‪.‬‬ ‫‪‬‬

‫مدل سازی جریان داده ها ‪ :‬در این سطح سخت افزار به وسیله ثبات ها مدل می شود‪.‬‬ ‫‪‬‬

‫مدل سازی پایه ای ‪ :‬در این حالت سخت افزار در دو سطح گیت و ثباتی توصیف می شود‪.‬‬ ‫‪‬‬

‫‪1‬‬
‫‪ ‬بلوک های ساخت یافته‬
‫کد های توصیف رفتاری می بایست درون این بلوک ها قرار بگیرند ‪ ،‬البته استثناعاتی نیز وجود دارد که بعدا به آن اشاره می شود‪ .‬دو نوع بلوک ساخت یافته‬
‫و‬ ‫‪initial‬‬ ‫‪ .‬بلوک های ساخت یافته دارای ساختار ترتیبی می باشند‪ .‬درون یک ماجول می توان چندین بلوک‬ ‫‪Always‬‬ ‫و‬ ‫‪Initial‬‬ ‫عبارتند از بلوک های‬
‫‪ always‬تعریف نمود‪.‬‬

‫بلوک های‪ Initial‬فقط یک بار و در زمان صفر اجرا می گردند‪.‬‬ ‫‪‬‬

‫بلوک های ‪ Always‬همیشه و بطور مداوم در حال اجرا می گردند‪.‬‬ ‫‪‬‬

‫بلوک های ساخت یافته فقط توانایی تعیین کردن مقادیر ثبات ها را دارند و نمی توانند مقداری را به ‪ Net‬ها ( داده های ‪ ) wire‬نسبت دهند‪ .‬اما شما می‬
‫توانید درون بلوک های ساخت یافته‪ ،‬یک ثبات را با مقادیر یک ثبات‪ ،‬یک ‪ Net‬و یا یک مقدار ثابت مقدار دهی کنید‪.‬‬

‫‪Procedural Blocks 1‬‬


‫صفحه ‪41‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫داشته باشیم ‪ ،‬همه بلوک ها در زمان صفر با هم و بطور جداگانه اجرا می شوند و هر بلوک بطور مستقل و از سایر بلوک ها خاتمه‬ ‫‪initial‬‬ ‫اگر چندین بلوک‬
‫می بابد‪.‬‬

‫در صورتی که بخواهیم درون یک بلوک ساخت یافته چندین دستور داشته باشیم باید از دستورات ‪ begin‬و ‪ end‬و یا دستورات ‪ fork‬و ‪ join‬استفاده نماییم‪.‬‬
‫‪join‬‬ ‫استفاده کنیم دستورات درون بلوک یکی پس از دیگری اجرا می گردند‪ .‬در صورتی که از دستورات ‪ fork‬و‬ ‫‪end‬‬ ‫درصورتی که از دستورات ‪ begin‬و‬
‫استفاده نماییم تمام دستورات درون بلوک همزمان با یکدیگر اجرا می شوند‪.‬‬

‫مثال ‪ : 18‬در این مثال نحوه استفاده از بلوک های ساخت یافته را مشاهده خواهیم کرد‪ .‬در این مثال فرض کنید زمان صفر کردن ثبات های ‪، clk‬‬
‫‪ reset‬و ‪ 3 data‬واحد زمان و زمان صفر کردن ثبات ‪ 5 enable‬واحد زمان باشد‪ .‬جلوی هر دستور زمان اتمام انجام آن بر حسب واحد زمان نوشته‬
‫شده است تا تفاوت دستورات ‪ begin‬و ‪ fork‬نمایان شود‪.‬‬
‫‪initial‬‬
‫‪begin‬‬
‫;‪clk = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪26 clk‬‬
‫;‪reset = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪23 clk‬‬
‫;‪enable = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪211 clk‬‬
‫;‪data = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪216 clk‬‬
‫‪end‬‬

‫‪initial‬‬
‫‪fork‬‬
‫;‪clk = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪26‬‬ ‫‪clk‬‬
‫;‪reset = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪26‬‬ ‫‪clk‬‬
‫;‪enable = 0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪21‬‬ ‫‪clk‬‬
‫;‪data =0‬‬ ‫‪//‬‬ ‫‪Execute‬‬ ‫‪finish‬‬ ‫‪at‬‬ ‫‪26‬‬ ‫‪clk‬‬
‫‪join‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪42‬‬

‫‪ ‬بلوک های شرطی‬


‫‪ Verilog‬نیز مانند دیگر زبان های برنامه نویسی دارای بلوک های شرطی می باشد‪ .‬قالب کلی دستورات بلوک شرطی به صورت زیر می باشد ‪:‬‬
‫)‪if(Condition‬‬
‫‪Statement‬‬ ‫‪which executed when Condition is True‬‬
‫‪else if(Second‬‬ ‫)‪Condition‬‬
‫‪Statement‬‬ ‫‪Which executed when Second Condition is True‬‬
‫‪else‬‬
‫‪Statement‬‬ ‫‪Which executed when None of these Conditions are True‬‬

‫عبارات شرطی ‪ else‬و ‪ else if‬اختیاری می باشند‪ .‬در یک بلوک شرطی می توان به دفعات از عبارت ‪ else if‬استفاده نمود‪.‬‬

‫مثال ‪ : 19‬در این مثال یک شمارنده دو جهته بسیار ساده را برسی مدل می کنیم‪.‬‬
‫)‪if (reset == 1'b0‬‬
‫;‪counter = 6'b0000‬‬
‫)‪else if (enable == 1'b1 && up_en == 1'b1‬‬
‫;‪counter = counter + 1'b1‬‬
‫;)‪else if (enable == 1'b1 && down_en == 1'b1‬‬
‫;‪counter = counter - 1'b0‬‬
‫‪else‬‬
‫;‪counter = counter‬‬

‫‪ ‬دستور ‪Case‬‬

‫کارکرد این دستور دقیقا همانند دیگر زبان های برنامه نویسی می باشد‪ .‬نحوه استفاده از این دستور را در خالل مثال های بعدی نمایش می دهیم‪.‬‬
‫صفحه ‪43‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ ‬کنترل زمان در بلوک های ساخت یافته‬


‫در حالت کلی بلوک های ساخت یافته در زمان صفر شروع به کار می کنند‪ .‬بعضی وقت ها نیاز به فعال سازی بلوک در زمان های خاصی احساس می شود‪.‬‬
‫در ‪ Verilog‬می توان یک بلوک ساخت یافته را طوری تعریف نمود تا در لبه یک پالس یا ترکیبی از پالس های مختلف مشخص فعال شود‪.‬‬

‫‪1‬‬
‫‪ ‬کنترل زمان مبنی بر رویداد‬
‫یک رویداد به معنای تغییر یک ثبات یا یک ‪ Net‬است‪ .‬سه نوع کنترل زمان مبتنی بر رویداد را در ادامه برسی خواهیم کرد‪.‬‬

‫کنترل رویداد با قاعده ‪ :‬عالمت @ برای مشخص کردن کنترل رویداد استفاده می شود‪ .‬دستورات می توانند با تغییر مقدار یک سیگنال با لبه باالرونده‬
‫یا پایین رونده یک سیگنال اجرا شوند‪ .‬لبه باال رونده و پایین رونده در جدول زیر مشخص شده اند‪.‬‬

‫مقدار جدید‬ ‫مقدار قبلی‬ ‫لبه‬


‫‪1‬‬ ‫‪z‬‬
‫‪1‬‬ ‫‪x‬‬ ‫باالرونده‬
‫‪1,x,z‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪z‬‬
‫‪0‬‬ ‫‪x‬‬ ‫پایین رونده‬
‫‪0,x,z‬‬ ‫‪1‬‬

‫مثال ‪ : 20‬در این مثال با نحوه کنترل یک بلوک در یک رویداد با قاعده را برسی می کنیم‪ .‬عبارت اول در هر لبه ‪ ،‬عبارت دوم در بله باال رونده ‪ ،‬عبارت‬
‫سوم در لبه پایین رونده و عبارت چهارم در لبه باال رونده اجرا خواهند شد‪.‬‬

‫‪Event 1‬‬
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 44 ‫صفحه‬

@(clock) q = d; // Triggered with any change in clock


@(posedge clock) q = d; // Triggered positive edge of clock
@(negedge clock) q = d; // Triggered negative edge of clock
q = @(posedge clock) d; // d is evaluated immediately and assigned to q at positive edge of clock

‫ و‬event ‫ تعریف این رویداد با کلید واژه‬.‫ نماییم‬1‫می توان یک رویداد را تعریف نمود و در مواقع لزوم آن را تحریک‬ Verilog ‫ در‬: ‫کنترل رویداد با نام‬
.‫ انجام می شود‬-> ‫تحریک کردن آن با‬

‫ این امر توسط‬.‫ گاهی اوقات چند سیگنال داریم که تغییر در یکی از آنها سبب تریگر شدن اجرای یک مجموعه از دستورات می شود‬: ‫کنترل چند رویداد‬
.‫ مشهور است‬2‫ لیست این رویداد ها یا سیگنال ها به لیست حساسیت‬.‫ کردن رویداد ها یا سیگنال ها انجام می شود‬or

.‫ در این مثال با نحوه استفاده از رویداد ها با نام و کنترل با چند رویداد آشنا می شوید‬: 21 ‫مثال‬
// ----- Event Control by Name ------
event rec_data; // Defining Event
always @(posedge clock) // Triggering at Positive Edge
begin
if( last_data_packet ) ->rec_data; // Triggering defined event
end
always @(rec_data)
data_buf = { data[0] , data[1], data[2], data[6] };

// ----- Event Control by Multiply Signals ------


always @(posedge clock or reset)
begin
if( reset ) q = 0;
else q = d;
end

Trigger 1
Sensitivity List 2
‫صفحه ‪45‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ )11‬طراحی مدار در سطح رفتاری‬

‫‪ ‬طراحی مدار های ترکیبی در سطح رفتاری ‪:‬‬


‫برای طراحی مدار های ترکیبی در سطح رفتاری‪ ،‬باید تمام ورودی های مدار را در لیست حساس بدنه ‪ always‬ذکر کرد‪ .‬به هنگام توصیف مدار باید توجه‬
‫باشند تا از ایجاد مدار ترتیبی جلوگیری شود‪.‬‬ ‫‪else‬‬ ‫داشت که تمام شرط های ‪ if‬باید دارای‬

‫مثال ‪ : 22‬در مثال زیر توصیف یک مالتی پلکسر ‪ 4‬به ‪ 1‬را خواهید دید‪.‬‬
‫‪// Behavioral model of a 6-to-1 multiplexer‬‬
‫;) ‪module mux6_to_1 ( out, i0, i1, i2, i6, s1, s0‬‬
‫;‪output out‬‬
‫;‪reg out‬‬
‫;‪input i0, i1, i2, i6, s1, s0‬‬
‫) ‪always @( i0 or i1 or i2 or i6 or s1 or s0‬‬
‫‪begin‬‬
‫)} ‪case ({ s1, s0‬‬
‫;‪2'b00 : out = i0‬‬
‫;‪2'b01 : out = i1‬‬
‫;‪2'b10 : out = i2‬‬
‫;‪2'b11 : out = i6‬‬
‫‪endcase‬‬
‫‪end‬‬
‫‪endmodule‬‬

‫‪ ‬طراحی مدار های ترتیبی در سطح رفتاری‬


‫طراحی این مدار ها با ذکر چند مثال بیان می کنیم‪.‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪46‬‬

‫مثال ‪ : 23‬یک فلیپ فالپ نوع ‪ D‬حساس به لبه باال رونده با ‪ Reset‬سنکرون طراحی کنید‪.‬‬
‫;) ‪module d_ff ( d, clk, rst, q‬‬
‫;‪input d, clk, rst‬‬
‫;‪output q‬‬
‫;‪reg q‬‬
‫) ‪always @( posedge clk‬‬
‫‪begin‬‬
‫)‪if (rst‬‬
‫;‪q = 1'b0‬‬
‫‪else‬‬
‫;‪q = d‬‬
‫‪end‬‬
‫‪endmodule‬‬

‫‪always‬‬ ‫در این مثال ‪ d‬ورودی داده ‪ clk ،‬پالس ساعت و ‪ q‬خروجی فلیپ فالپ می باشد‪ .‬همانطور که مشاهده می شود پس یک پالس ساعت ‪ clk‬بلوک‬
‫اجرا می شود و اگر پالس ریست ‪ 1‬باشد خروجی برابر صفر خواهد شد و اگر ‪ 1‬نباشد خروجی برابر ورودی خواهد شد‪.‬‬

‫مثال ‪ : 24‬یک فلیپ فالپ نوع ‪ D‬حساس به لبه باال رونده با ‪ Reset‬آسکنرون طراحی کنید‪.‬‬
‫;) ‪module d_ff ( d, clk, rst, q‬‬
‫;‪input d, clk, rst‬‬
‫;‪output q‬‬
‫;‪reg q‬‬
‫)‪always @( posedge clk or posedge rst‬‬
‫‪begin‬‬
‫)‪if (rst‬‬
‫;‪q = 1'b0‬‬
‫‪else‬‬
‫;‪q = d‬‬
‫‪end‬‬
‫‪endmodule‬‬

‫همانطور که مشاهده می شود در شمارنده با ریست آسنکرون بلوک ‪ always‬در لبه باال رونده پالس ساعت و یا پالس ریست اجرا می شود که اگر ریست ‪1‬‬
‫باشد خروجی ‪ q‬صفر خواهد شد و اگر ریست ‪ 1‬نباشد به معنای پالس ساعت برای فلیپ فالپ می باشد که ‪ q‬را برابر ورودی یعنی ‪ d‬قرار می دهد‪.‬‬
47 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

.‫ کار کند‬clk ‫ بیتی دو جهته با ورودی بارگذاری سنکرون و ریست آسنکرون طراحی کنید که با لبه پایین رونده پالس‬4 ‫یک شمارنده‬
module counter ( clk, ld, rst, u_d, d_in, q );
input clk, ld, rst, u_d;
input [6:0] d_in;
output [6:0] q;
reg [6:0] q;
always @( negedge clk or posedge rst)
begin
if (rst)
q = 6'b0000;
else if( ld )
q = d_in;
else if( u_d )
q = q + 1;
else
q = q – 1;
end
endmodule
.‫ بیتی به روش توصیف رفتاری را طراحی کنید‬8 ‫ تفریق کننده‬/ ‫ یک جمع کننده‬: 25 ‫مثال‬
‫ توجه داشته باشید در این کد از سریز‬.‫خروجی می باشد‬ res ‫ عملیات جمع یا تفریق و‬oper ، ‫ بیتی‬8 ‫ ورودی های برداری‬b ‫ و‬a ‫در این جمع کننده‬
.‫صرف نظر شده است‬
module addsub(a, b, oper, res);
input oper;
input [.:0] a;
input [.:0] b;
output [.:0] res;
reg [.:0] res;
always @(a or b or oper)
begin
if (oper == 1'b0)
res = a + b;
else
res = a - b;
end
endmodule
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪48‬‬

‫‪ )11‬مثال ها‬
‫در این بخش چندین مثال را با توضیحات برسی خواهیم کرد‪.‬‬

‫‪ ‬دیکودر چهار بیتی‬


‫‪assign‬‬ ‫در این مثال سخت افزار یک دیکودر چهاربیتی را به دو صورت توصیف می کنیم ‪ .‬در ابتدا این دیکودر را با دستور ‪ case‬و در ادامه آن را با دستور‬
‫پیاده سازی خواهیم کرد‪.‬‬

‫بلوک دیاگرام یک دیکودر ‪ 4‬بیتی با پایه فعال ساز‬ ‫شکل ‪.12‬‬

‫توصیف سخت افزاری این دیکودر را به دو روش برسی می کنیم ‪:‬‬


49 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

module decoder_using_case ( binary_in, decoder_out, enable);


input [6:0] binary_in ;
input enable;
output [11:0] decoder_out;
reg [11:0] decoder_out;
always @ (enable or binary_in) // Will be Triggered if binary_in or enable changed
begin
decoder_out = 0;
if (enable) begin
case (binary_in)
6'h0 : decoder_out = 13'h0001;
6'h1 : decoder_out = 13'h0002;
6'h2 : decoder_out = 13'h0006;
6'h6 : decoder_out = 13'h0008;
6'h6 : decoder_out = 13'h0010;
6'h1 : decoder_out = 13'h0020;
6'h3 : decoder_out = 13'h0060;
6'h. : decoder_out = 13'h0080;
6'h8 : decoder_out = 13'h0100;
6'h9 : decoder_out = 13'h0200;
6'hA : decoder_out = 13'h0600;
6'hB : decoder_out = 13'h0800;
6'hC : decoder_out = 13'h1000;
6'hD : decoder_out = 13'h2000;
6'hE : decoder_out = 13'h6000;
6'hF : decoder_out = 13'h8000;
endcase
end
end
endmodule

module decoder_using_case ( binary_in, decoder_out, enable);


input [6:0] binary_in ;
input enable ;
output [11:0] decoder_out ;
wire [11:0] decoder_out ;
assign decoder_out = (enable) ? (1 << binary_in) : 13'b0 ;
endmodule
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪50‬‬

‫‪ ‬مقسم فرکانس‬
‫در این مثال یک مقسم فرکانس فرکانس ½ را برسی خواهیم کرد‪ .‬اساس کار یک مقسم فرکانس مانند یک شمارنده می باشد‪ .‬اما در این مثال برای تقسیم‬
‫فرکانس به دو فقط کافی است در هر لبه باالرونده پالس ساعت پالس خروجی را وارون نماییم‪.‬‬
‫;)‪module clk_div_by2 (clk_in, enable,reset, clk_out‬‬

‫;‪input clk_in, reset, enable‬‬


‫;‪output clk_out‬‬
‫;‪wire clk_in, enable‬‬
‫;‪reg clk_out‬‬
‫)‪always @ (posedge clk_in‬‬
‫‪begin‬‬
‫)‪if (reset‬‬
‫;‪clk_out <= 1'b0‬‬
‫)‪else if (enable‬‬
‫; ‪clk_out <= !clk_out‬‬
‫‪end‬‬
‫‪endmodule‬‬

‫‪ ‬انکودر اولویت چهار بیتی ‪:‬‬


‫یک دیکودر و انکودر معمولی را در مثال های قبل برسی کردیم‪ .‬حال نوبت به توصیف سخت افزار یک انکودر اولیت دار می رسد‪ .‬در این انکودر‬
‫ورودی برداری ‪ 16‬بیتی ‪ encoder_in‬مشخص کننده خروجی چهار بیتی ‪ binary_out‬خواهد بود‪.‬‬
51 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

module pri_encoder_using_if ( binary_out, encoder_in, enable); // Priority Encoder


output [6:0] binary_out;
input enable;
input [11:0] encoder_in;
reg [6:0] binary_out ;
always @ (enable or encoder_in)
begin
binary_out = 0;
if (enable) begin
if (encoder_in[0] == 1) begin
binary_out = 1;
end else if (encoder_in[1] == 1) begin
binary_out = 2;
end else if (encoder_in[2] == 1) begin
binary_out = 6;
end else if (encoder_in[6] == 1) begin
binary_out = 6;
end else if (encoder_in[6] == 1) begin
binary_out = 1;
end else if (encoder_in[1] == 1) begin
binary_out = 3;
end else if (encoder_in[3] == 1) begin
binary_out = .;
end else if (encoder_in[.] == 1) begin
binary_out = 8;
end else if (encoder_in[8] == 1) begin
binary_out = 9;
end else if (encoder_in[9] == 1) begin
binary_out = 10;
end else if (encoder_in[10] == 1) begin
binary_out = 11;
end else if (encoder_in[11] == 1) begin
binary_out = 12;
end else if (encoder_in[12] == 1) begin
binary_out = 16;
end else if (encoder_in[16] == 1) begin
binary_out = 16;
end else if (encoder_in[16] == 1) begin
binary_out = 11;
end
end
end
endmodule
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪52‬‬

‫‪ ‬شیفت رجیستر با ورودی و خروجی سریال‬


‫در این مثال یک شیفت رجیستر با شیفت چپ ‪ ،‬ورودی و خروجی سریال و حساس به لبه باال رونده ساعت را توصیف خواهیم کرد‪.‬‬
‫;)‪module shift (clk, si, so‬‬
‫‪input‬‬ ‫;‪clk,si‬‬
‫‪output‬‬ ‫;‪so‬‬
‫‪reg‬‬ ‫;‪[.:0] tmp‬‬
‫)‪always @(posedge clk‬‬
‫‪begin‬‬
‫‪tmp‬‬ ‫;‪<= tmp << 1‬‬
‫]‪tmp[0‬‬ ‫;‪<= si‬‬
‫‪end‬‬
‫;]‪assign so = tmp[.‬‬
‫‪endmodule‬‬

‫‪ ‬شیفت رجیستر چپ ‪ /‬راست ‪ ،‬ورودی سریال ‪ ،‬خروجی موازی‬


‫در این مثال یک شیفت رجیستر سنکرون با ورودی پالس ساعت ( ‪ ، ) clk‬ورودی سریال ( ‪ ، ) si‬انتخاب گر شیفت چپ‪/‬راست ( ‪ ) left_right‬و خروجی‬
‫موازی ( ‪ ) po‬را توصیف می کنیم‪.‬‬
‫;)‪module shift (clk, si, left_right, po‬‬
‫;‪input clk, si, left_right‬‬
‫;‪output po‬‬
‫‪reg‬‬ ‫;‪[.:0] tmp‬‬
‫)‪always @(posedge clk‬‬
‫‪begin‬‬
‫)‪if(left_right == 1'b0‬‬
‫;} ‪tmp <= { tmp[3:0], si‬‬
‫‪else‬‬
‫;} ]‪tmp <= { si, tmp[.:1‬‬
‫‪end‬‬
‫صفحه ‪53‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫;‪assign po = tmp‬‬
‫‪endmodule‬‬

‫‪ ‬شمارنده ‪ 4‬بیتی‬
‫در این قسمت یک شمارنده موجی با بیت نقلی را برسی خواهیم کرد‪ .‬در این طراحی ما از متد باال به پایین استفاده خواهیم کرد‪ .‬ابتدا با توصیف باالترین‬
‫بلوک شروع خواهیم کرد‪ .‬در این مثال باالترین بلوک شمارنده موجی می باشد‪ .‬یک شمارنده را می توان با روش های مختلفی مدل کرد‪ .‬در یک شمارنده از‬
‫تعدادی فلیپ فالپ نوع ‪ T‬استفاده شده است که پس از مدل سازی بلوک شمارنده باید آنها را مدل سازی کنیم‪.‬‬

‫طراحی باال به پایین یک شمارنده‬ ‫شکل ‪.13‬‬


‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪54‬‬

‫بلوک دیاگرام شمارنده چهار بیتی‬ ‫شکل ‪.14‬‬

‫;)‪module ripple_carry_counter(q, clk, reset‬‬


‫;‪output [6:0] q‬‬
‫;‪input clk, reset‬‬
‫‪T_FF‬‬ ‫;)‪tff0(q[0], clk, reset‬‬
‫‪T_FF‬‬ ‫;)‪tff1(q[1], q[0], reset‬‬
‫‪T_FF‬‬ ‫;)‪tff2(q[2], q[1], reset‬‬
‫‪T_FF‬‬ ‫;)‪tff6(q[6], q[2], reset‬‬
‫‪endmodule‬‬

‫در ماجول باال از چهار نمونه از ماجول ‪ T_FF‬که مدل یک فلیپ فالپ نوع ‪ T‬است استفاده شده است‪ .‬حال باید ماجول ‪ T_FF‬را توصیف کنیم‪.‬‬

‫‪T‬‬ ‫بلوک دیاگرام یک فلیپ فالپ نوع‬ ‫شکل ‪.15‬‬


‫صفحه ‪55‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫;)‪module T_FF(q, clk, reset‬‬


‫;‪output q‬‬
‫;‪input clk, reset‬‬
‫‪D_FF dff0(q, , ~q, clk, reset); // ~q mean’s Q-Bar ( Q Not ), qbar not needed leave it unconnected‬‬
‫‪endmodule‬‬

‫در روند توصیف فلیپ فالپ ‪ T‬از یک فلیپ فالپ نوع ‪ D‬استفاده شده است که نوبت به توصیف آن می رسد‪.‬‬

‫‪D‬‬ ‫نمودار منطقی یک فلیپ فالپ نوع‬ ‫شکل ‪.16‬‬


Verilog ‫خود آموز زبان توصیف سخت افزار‬ 56 ‫صفحه‬

module D_FF(q, q_bar, d, clk, reset);


output q;
input d, clk, reset;
wire s, sbar, r, rbar, cbar;
assign cbar = ~sbar;
assign sbar = ~ (rbar & s),
s = ~(sbar & cbar & ~clk),
r = ~(rbar & ~clk & s),
rbar = ~(r & cbar & d);
assign q = ~(s & qbar),
qbar = ~(q & r & cbar);
endmodule

‫در این مثال فلیپ فالپ در سطح جریان داده ها مدل سازی شده است که البته می توان این فلیپ فالپ را به روش ساده تری در سطج توصیف رفتاری‬
.‫مدل سازی کرد که کد آن را در ادامه مشاهده می کنید‬
module D_FF(q, q_bar, d, clk, reset);
output q;
input d, clk, reset;
reg q;
always @ ( posedge reset or negedge clk)
begin
if(reset)
q = 1'b0;
else
q = d;
qbar = ~q;

end
endmodule
‫صفحه ‪57‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ ‬کنترل کننده چراغ راهنما در یک بزرگراه‬


‫در این مثال جالب ‪ ،‬رفتار یک چراغ راهنما را در تقاطع یک بزرگراه و یک راه فرعی برسی خواهیم کرد‪ .‬ابتدا باید مدل رفتاری این چراغ را استخراج کنیم‪.‬‬

‫راه فرعی‬
‫بزرگراه‬ ‫بزرگراه‬

‫راه فرعی‬
‫برای راه فرعی سنسوری در نظر می گیریم تا وجود ماشین ها را در راه فرعی را مشخص کند‪ .‬این سنسور سیگنال ‪ X‬را به کنترلر ارسال می‬ ‫‪‬‬

‫کند‪ .‬زمانی که ‪ X‬یک باشد به معنای وجود ماشین در راه فرعی می باشد‪.‬‬
‫برای هر راه یک سیگنال ترافیک در نظر می گیریم که نمایانگر وضعیت چراغ در آن راه می باشد‬ ‫‪‬‬

‫بزرگراه در برابر راه فرعی دارای اولویت باالتری می باشد‪ .‬چراغ بزرگراه به صورت پیشرفض سبز می باشد‪.‬‬ ‫‪‬‬

‫زمانی که تعدادی ماشین در راه فرعی منتظر سبز شدن چراغ می مانند چراغ راه فرعی باید سبز شده تا به ماشین ها اجزاه عبور دهد ‪ .‬این‬ ‫‪‬‬

‫چراغ باید تا زمانی که همه ماشین ها از راه فرعی عبور نکردند سبز بماند‪.‬‬
‫زمانی که دیگر ماشینی از راه فرعی عبور نمی کند چراغ راه فرعی ابتدا زرد و سپس قرمز می شود‪.‬‬ ‫‪‬‬

‫در هر یک از مراحل می بایست تاخیر هایی در نظر گرفته شود که قابل تغییر باشند‪.‬‬ ‫‪‬‬
‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬ ‫صفحه ‪58‬‬

‫در مرحله بعد می بایست نمودار حالت را برای این کنترلر رسم نماییم‪.‬‬

‫نمودار حالت کنترلر چراغ راهنمایی‬ ‫شکل ‪.17‬‬

‫حالت ها به صورت زیر می باشند ‪:‬‬

‫چراغ راه فرعی‬ ‫چراغ راه اصلی‬ ‫حالت‬


‫قرمز‬ ‫سبز‬ ‫‪S0‬‬
‫قرمز‬ ‫زرد‬ ‫‪S1‬‬
‫قرمز‬ ‫قرمز‬ ‫‪S2‬‬
‫سبز‬ ‫قرمز‬ ‫‪S3‬‬
‫زرد‬ ‫قرمز‬ ‫‪S4‬‬
59 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

‫ در این مثال از عبارات پیش پردازنده جهت هرچه انعطاف پذیر و خوانا‬.‫بهترین راه برای مدل سازی سخت افزار این کنترلر استفاده توصیف رفتاری می باشد‬
.‫تر شدن کد ها استفاده می شود‬
`define TRUE 1'b1
`define FALSE 1'b0
`define RED 2'd0
`define YELLOW 2'd1
`define GREEN 2'd2
//State definition // Highway Secondary Road
`define S0 6'd0 // G R
`define S1 6'd1 // Y R
`define S2 6'd2 // R R
`define S6 6'd6 // R G
`define S6 6'd6 // R Y

// Delays
`define Y2RDELAY 6 // Yellow to Red delay
`define R2GDELAY 2 // Red to Green delay
module sig_control( hwy, secondary , X, clock, clear);
// I/O Ports
output [1:0] hwy, secondary ;
// 2-bit output for 6 states of signal
reg [1:0] hwy, secondary ;
input X; // if 1 indicate there is car on the secondary road
input clock, clear;

reg [2:0] state;


reg [2:0] next_state;
// Signal Controller Starts in S0 State
initial
begin
state = `S0;
next_state = `S0;
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 60 ‫صفحه‬

hwy = `GREEN;
secondary = `RED;
end
// state changes only at positive edge of clock
always @ (posedge clock)
state = next_state;
// Compute Values of Highway Signal & secondary Road Signal
always @(state) // only executed when state changes
begin
case(state)
`S0: begin
hwy = `GREEN;
secondary = `RED;
end
`S1: begin
hwy = `YELLOW;
secondary = `RED;
end
`S2: begin
hwy = `RED;
secondary = `RED;
end
`S6: begin
hwy = `RED;
secondary = `GREEN;
end
`S6: begin
hwy = `RED;
secondary = `YELLOW;
end
endcase
end
always @(state or clear or X)
begin
if(clear)
next_state = `S0;
else
case(state)
`S0: begin
if(x)
next_state = `S1;
61 ‫صفحه‬ Verilog ‫خود آموز زبان توصیف سخت افزار‬

else
next_state = `S0;
end
`S1: begin
repeat (`Y2RDELAY) @ (posedge clock);
next_state = `S2;
end
`S2: begin
repeat (`R2GDELAY) @ (posedge clock);
next_state = `S6;
end
`S6: begin
if(x)
next_state = `S6;
else
next_state = `S6;
end
`S6: begin
repeat (`Y2RDELAY) @ (posedge clock);
next_state = `S0;
end

default: next_state = `S0;


endcase;
end
endmodule

: ‫ قالب کلی استفاده از این دستور به صورت زیر است‬.‫ جهت ایجاد تاخیر استفاده شده است‬repeat ‫در این مثال از دستور‬
repeat (<number-of-repeats> @ (<at-specified-event>)

begin

<Statement>

end

‫ در این صورت این دستور فقط به تعداد پالس های ساعت مشخص‬.‫ مانند مثال باال‬.‫ اختیاری می باشد‬Statement ‫ و کد‬end ‫ و‬begin ‫استفاده از دستورات‬
.‫شده تاخیر ایجاد می کند‬
Verilog ‫خود آموز زبان توصیف سخت افزار‬ 62 ‫صفحه‬

1
‫ مولد بیت توازن‬
module parity_using_assign (
data_in , // 8 bit data in
parity_out // 1 bit parity out
);
output parity_out;
input [.:0] data_in;
wire parity_out;
assign parity_out = (data_in[0] ^ data_in[1]) ^
(data_in[2] ^ data_in[6]) ^
(data_in[6] ^ data_in[1]) ^
(data_in[3] ^ data_in[.]);

endmodule

Parity bit Generator 1


‫صفحه ‪63‬‬ ‫خود آموز زبان توصیف سخت افزار ‪Verilog‬‬

‫‪ )12‬تمارین‬
‫‪ )1‬یک مبدل کد ‪ BCD‬به ‪ EX3‬چهاربیت را با توصیف سطح گیت طراحی کنید‪.‬‬

‫‪ )2‬یک شمارنده ‪ BCD‬چهار بیت باال پایین شمار سنکرون ‪ ،‬با بازنشانی آسنکرون و پایه فعال ساز فعال باال طراحی کنید‪.‬‬

‫‪ )3‬یک کنترلر کننده تکی نمایشگر هفت قسمتی کاتد مشترک طراحی کنید‪.‬‬

‫‪ )4‬یک مالتی پلکسر ‪ 16‬به ‪ 1‬را با طراحی مالتی پلکسر ‪ 2‬به ‪ 1‬و ‪ 4‬به ‪ 1‬و گسترش آنها طراحی کنید‪.‬‬

‫‪ )5‬یک دیکودر ‪ 2‬به ‪ 4‬طراحی کنید‪.‬‬

‫‪ )6‬یک رجیستر سنکرون ‪ 32‬بیتی با ورودی و خروجی موازی و بصورت مجزا و پایه بازنشانی ( ریست ) طراحی کنید‪.‬‬

‫‪ )7‬یک حافظه ‪ RAM‬با عرض کلمه ‪ 8‬بیت و تعداد ‪ 1024‬کلمه به همراه پایه های فعال ساز ‪ ،‬خواندن ‪ /‬نوشتن و ورودی کالک طراحی کنید‪.‬‬

‫‪ )8‬مالتی پلکسر تمرین قبل را گسترش داده و آن را بصورت برداری پیاده سازی نمایید ‪ .‬عرض باس مالتی پلکسر ‪ 32‬بیت باشد‪.‬‬

‫‪ )9‬کنترلر نمایشگر هفت قسمتی تمرین قبل را گسترش داده و توسط آن کنترلر یک نمایشگر هفت قسمتی چهار رقمی مالتی پلکس شده کاتد‬
‫مشترک طراحی نمایید‪ ( .‬این نوع نمایشگر درواقع ‪ 4‬نمایشگر هفت قسمتی درون یک پکیج می باشد که پایه های مشترک هر نمایشگر بصورت مجزا و پایه های رقم‬
‫های همه نمایشگر ها بصورت متصل به یکدیگر از پکیج بیرون آمده اند‪ .‬برای راه اندازی این نمایشگر می بایست با سرعت باالیی سر های آند مشترک هریک از نمایشگر ها‬
‫را سوییچ کرد و عدد مورد نظر را توسط ‪ 7‬پایه رقم ها به نمایش در آورد‪ .‬برای فهم بهتر عملکرد این نمایشگر ها عبارت ‪ Multiplexed 7Segment Display‬را در اینترنت‬
‫جستجو نمایید )‬

You might also like