جزوه مباحث ويژه در الكترونيك

Download Report

Transcript جزوه مباحث ويژه در الكترونيك

‫مباحث ویژه در‬
‫الکترونیک‬
‫آرایه های دروازه ای قابل‬
‫برنامه ریزی میدانی‬
‫)‪Field Programmable Gate Arrays (FPGAs‬‬
‫مدرس‪:‬‬
‫مسلمی‬
‫دکتر محمدرضا‬
‫‪[email protected]‬‬
‫مقدمه‬
‫‪ ASIC‬چیست؟‬
‫‪ ‬مخفف کلمات ‪ Application Specific Integrated IC‬است‪.‬‬
‫‪ ‬این واژه معموال به مدارهای مجتمعی که صرفا برای کاربردهای خاص ساخته می ش‬
‫‪ ‬از این نوع مدارهای مجتمع در ساخت انواع میکروپروسسورها‪ ،‬انواع‬
‫حافظه های خواندنی‪-‬نوشتنی (‪ )RAM‬و فقط خواندنی (‪ )ROM‬استفاده می‬
‫مزا‬
‫شود‪.‬‬
‫یا ‪ ‬در صورتی که مدارهای با کاربرد خاص به صورت مدار مجتمع در آیند‪ ،‬کاهش‬
‫اندازه مدار خواهیم داشت‪.‬‬
‫توجهی در‬
‫قابل‬
‫اندازه مدار‬
‫کاهش‬
‫‪ ‬با‬
‫‪ (1‬یکپارچگی سیگنال ها در مدار افزایش می یابد‪.‬‬
‫‪ (2‬سرعت مدار افزایش می یابد‪.‬‬
‫معایب‬
‫‪ ‬معموال از زمان طراحی‬
‫این مدار تا تولید آن توسط کارخانجات سازنده آی‬
‫سی زمان نسبتا طوالنی نیاز است‪.‬‬
‫‪ ‬به دلیل آن که تولید توسط کارخانجات تولید آی سی و در یک فرآیند خارج‬
‫از روال آن انجام می شود‪ ،‬هزینه تمام شده باالیی دارند‪.‬‬
‫معموال برای تولید انبوه استفاده می شوند و برای تعداد کم مقرون به صرفه‬
‫نمی باشند‪.‬‬
‫‪ FPGA‬چیست؟‬
‫‪ ‬مخفف کلمات ‪ Field Programmable Gate Array‬است‪.‬‬
‫‪ ‬این واژه معموال به مدارهای مجتمعی که برای پیاده سازی مدارهای دیجیتال قا‬
‫‪ ‬از این نوع مدارهای مجتمع در ساخت انواع میکروپروسسورها‪ ،‬انواع‬
‫حافظه ها‪ ،‬مدارات ورودی‪-‬خروجی و پردازش تصویر استفاده می شود‪.‬‬
‫مزا‬
‫یا ‪ ‬در صورتی که مدارهای دیجیتال در یک ‪ FPGA‬قرار گیرد‪ ،‬کاهش قابل توجهی‬
‫خواهیم داشت‪.‬‬
‫اندازه‬
‫مدار مدار‬
‫اندازه‬
‫در کاهش‬
‫‪ ‬با‬
‫‪ (1‬یکپارچگی سیگنال ها در مدار افزایش می یابد‪.‬‬
‫‪ (2‬سرعت مدار افزایش می یابد‪.‬‬
‫‪ ‬ظرفیت باالی فشرده سازی دارند‪.‬‬
‫‪ ‬قیمت تمام شده آنها بسیار پایین می باشد‬
‫‪ ‬زمان عرضه این آی سی ها به بازار بسیار کم می باشد‪.‬‬
‫‪ ‬امنیت مدار باال رفته و امکان کپی کردن آن از بین می رود‪.‬‬
‫معایب‬
‫‪ ‬سطح سیلیکون ‪ FPGA‬به صورت بهینه مورد استفاده قرار نمی گیرد‪.‬‬
‫‪ ‬تاخیر و توان مصرفی آنها نسبت به مدارات ‪ ASIC‬بیشتر است‪.‬‬
‫کاربر‬
‫دها اگرچه نمی توان محدوده خاصی برای کاربرد این مدارها تعیین کرد با این‬
‫وجود برخی از کاربردهای آنها عبارتند از‪:‬‬
‫کارتهای ورودی‪-‬خروجی‪ ،‬فیلترهای دیجیتال‪ ،‬میکروکنترلر و میکروپروسسورهای‬
‫خاص‪ ،‬پردازش سیگنال و تصویر‪ ،‬سیستم های مخابراتی و ابزار دقیق و سیستم‬
‫شرکت های‬
‫سازندهترین شرکت های سازنده‬
‫مهم‬
‫‪Xilinx, Altera, Lattice, Actel‬‬
‫‪ FPGA‬عباتند از‪:‬‬
‫مهم ترین سهم شرکت های‬
‫تاریخچه آی سی های دو شرکت‬
‫سازنده از بازار ‪FPGA‬‬
‫درباره زایلینکس‬
‫‪)Xilinx‬شرکت در سال ‪ 1984‬تاسیس گردید‪.‬‬
‫( این‬
‫بیش از ‪ 2600‬کارمند دارد‪.‬‬
‫بیش از نیمی از محصوالت ‪ FPGA‬مورد نیاز را‬
‫در دنیا تامین می کند‪.‬‬
‫با سازندگان مهمی چون ‪ UMC ،IBM‬و ‪Seiko‬‬
‫مشارکت دارد‪.‬‬
‫درباره آلترا‬
‫مهمترین نرم افزارهای شبیه سازی‪:‬‬
‫‪)Altera‬‬
‫شرکت در سال ‪ 1983‬تاسیس گردید‪.‬‬
‫( این‬
‫‪ISI, Fandation‬‬
‫در سال ‪ 1992‬ساختار جدول جستجو ( ‪Look Up‬‬
‫‪ )Table‬را معرفی نمود‪.‬‬
‫دومین شرکت تولید کننده آی سی های ‪ FPGA‬در‬
‫دنیا است‪.‬‬
‫با شرکت ‪ TSMC‬مشارکت دارد‪.‬‬
‫ساختار داخلی ‪FPGA‬‬
‫چگونه می توان مدارهای دیجیتالی مختلف را درون یک‬
‫‪ FPGA‬پیاده سازی کرد؟‬
‫همانطور که می دانیم برای هر مدار دیجیتال با هر تعداد ورودی و خروجی می‬
‫توان یک جدول درستی (‪ )Truth table‬رسم نمود‪.‬‬
‫در جدول درستی تمامی حالت های ممکن ورودی به تصویر درآمده و به ازای هر‬
‫یک از این حاالت خروجی تعیین می گردد‪.‬‬
‫فرض کنید مدار مورد نظر ‪ 4‬ورودی و ‪ 1‬خروجی دارد‪.‬‬
‫در این حالت می توان این مدار را با یک ‪ RAM‬با ‪ 4‬بیت ورودی آدرس و ‪ 1‬بیت خروج‬
‫‪ RAM‬مورد نظر دارای ‪ 16‬آدرس مختلف‪ ،‬معادل ‪ 16‬حالت ورودی جدول درستی است که در هر‬
‫آدرس خروجی تابع مورد نظر نوشته می شود‪.‬‬
‫بسته به این که ورود مدار چه باشد داده ذخیره شده در یکی از خانه های ‪ RAM‬در‬
‫خروجی ذخیره می شود‪.‬‬
‫برای پیاده سازی مدارهای بزرگتر می توان از مجموعه ای از این بلوک های حافظه‬
‫استفاده نمود‪.‬‬
‫در این مدارها به دلیل استفاده از ‪ ،RAM‬مدار ذخیره شده در ‪ FPGA‬فرار بوده و‬
‫پس از قطع برق از بین می رود‪.‬‬
‫الزم است‬
‫‪PROM‬مجدد‬
‫پیکربندی‬
‫برق‪،‬‬
‫پس از‬
‫کنند‪ .‬تا پس از وصل برق‪ ،‬مجددا‬
‫کپی می‬
‫درون یک‬
‫قطع را‬
‫برنامه‬
‫بنابراین کل‬
‫معموال‬
‫بارگذاری شود‪.‬‬
‫درون ‪FPGA‬‬
‫گردد‪ .‬یعنی هر زمان که‬
‫انعطاف پذیری می‬
‫استفاده از ‪ RAM‬باعث افزایش‬
‫بخواهیم می توانیم با پیکر بندی مجدد‪ ،‬مدار داخلی را عوض کنیم‪.‬‬
‫چهار بلوک زیر می تواند در ساختار داخلی ‪ FPGA‬به عنوان بلوک های پایه مورد‬
‫استفاده قرار گیرد‪.‬‬
‫سازندگان دنیای ‪ ،FPGA‬به کوچکترین واحد تشکیل دهنده‬
‫(یعنی هر یک از حافظه های مورد استفاده) اصطالحا‬
‫)‪LUT (Look Up Table‬‬
‫می گویند‪.‬‬
‫)‪ PROM (Anti fuse‬‬
‫‪ EEPROM‬‬
‫‪ FLASH‬‬
‫‪ RAM‬‬
‫یک مدار منطقی‬
‫ثابت‬
‫مثالی از روش پیاده سازی یک‬
‫منطق برنامه پذیر با ‪ 3‬ورودی‬
‫و یک خروجی با استفاده از‬
‫آنتی فیوز‬
‫چگونه می توان مدارهای ترتیبی را درون یک ‪FPGA‬‬
‫کرد؟(‪ )Sequential‬نیز می توانند درون یک ‪ FPGA‬پیاده سازی‬
‫ترتیبی‬
‫مدارهای‬
‫سازی‬
‫پیاده‬
‫شوند‪.‬‬
‫‪ ،FPGA‬خروجی هر ‪ LUT‬به صورت مستقیم و همچنین از طریق یک فلیپ فالپ‬
‫در‬
‫به یک مالتی پلکسر وارد می شود‪.‬‬
‫بسته به ورودی کنترل ‪ ،MUX‬مدار ترکیبی یا ترتیبی خواهد بود‪.‬‬
‫از ترکیب دو سلول منطقی (‪ )Logic Cell‬یک‬
‫‪ Slice‬به وجود می آید‬
‫واحد پایه در ‪FPGA‬‬
‫‪LC – Logic Cell‬‬
‫‪LE – Logic Element‬‬
‫‪Xilinx:‬‬
‫‪Altera:‬‬
‫در ‪ Slice‬مداری برای انتقال رقم‬
‫از ترکیب ‪ 2‬عدد ‪ Slice‬یک‬
‫نقلی نیز وجود دارد‪.‬‬
‫‪Slice 0‬‬
‫)‪Configurable Logic Block (CLB‬‬
‫تشکیل می گردد‪.‬‬
‫‪PRE‬‬
‫‪D‬‬
‫‪CE‬‬
‫‪Q‬‬
‫‪Carry‬‬
‫‪LUT‬‬
‫‪CLR‬‬
‫‪ CLB‬در واقع اصلی ترین بخش‬
‫از هر ‪ FPGA‬است که توابع‬
‫منطقی را پیاده سازی می‬
‫کند‪.‬‬
‫در سری ‪ Stratix II‬خانواده ‪Altera‬‬
‫‪D PRE‬‬
‫‪Q‬‬
‫‪CE‬‬
‫‪Carry‬‬
‫‪LUT‬‬
‫‪CLR‬‬
‫اصطالحا‬
‫)‪ALM (Adaptive Logic Module‬‬
‫نامیده می شود‪.‬‬
‫یک ‪ Slice‬که از ترکیب دو ‪LC‬‬
‫شده است‪.‬‬
‫دارای ‪ 4‬خروجی می‬
‫تشکیل ‪Slice‬‬
‫هر‬
‫باشد‪.‬‬
‫جمع بندی‬
‫‪• Look Up Table‬‬
‫• شامل یک ‪ RAM‬با ‪ 4‬ورودی و یک خروجی می باشد‪.‬‬
‫‪LUT‬‬
‫‪• Logic Cell‬‬
‫• شامل ‪ 2‬عدد ‪ LUT‬به همراه ‪ 2‬عدد ‪ F.F.‬می باشد‪.‬‬
‫‪LC‬‬
‫• از ترکیب ‪ 2‬عدد ‪ LC‬تشکیل می شود‪.‬‬
‫‪Slice‬‬
‫‪• Configurable Logic Block‬‬
‫• از ترکیب ‪ 2‬عدد ‪ Slice‬تشکیل می گردد‪.‬‬
‫‪CLB‬‬
‫‪• Field Programmable Gate Array‬‬
‫• از کنار هم قرار گرفتن ‪ CLB‬ها تشکیل می شود‪.‬‬
‫‪FPGA‬‬
‫ساختار داخلی یک ‪ FPGA‬معمول‬
‫در اغلب ‪ FPGA‬های جدید عالوه بر تعداد زیاد ‪ ،CLB‬برخی امکانات دیگر‬
‫نیز برای تسهیل در پیاده سازی مدارهای دیجیتال پیچیده تر وجود دارد‪.‬‬
‫یکی از مهم ترین این امکانات ‪ RAM‬داخلی غیر از نمونه های کوچک موجود‬
‫در ‪ LUT‬ها‬
‫است‪ .‬بخواهیم مداری با تعداد زیاد ورودی را پیاده سازی‬
‫صورتی که‬
‫در‬
‫نماییم‪ ،‬به جای استفاده از تعداد زیاد ‪ CLB‬از بخشی از همین حافظه‬
‫کنیم‪.‬‬
‫مثال‪،‬می‬
‫استفاده‬
‫داخلی‬
‫اسپارتان ‪ 2‬از شرکت زایلینکس‪ ،‬دارای بلوک های هر‬
‫مدل‬
‫عنوان‬
‫به‬
‫کدام با ظرفیت ‪ 4096‬بیت است‪.‬‬
‫جدول‬
‫نحوه‬
‫استفاده‬
‫داخلی اسپارتان ‪2‬‬
‫از‬
‫حافظه‬
‫ضرب کننده‬
‫در بعضی محصوالت جدید شرکت های ‪ Xilix, Altera‬بلوک های ضرب کننده وجود‬
‫دارد‪.‬‬
‫عمل ضرب در این محصوالت را می توان توسط ضرب کننده های داخلی ‪ 18‬بیتی‬
‫داخلیانجام داد‪.‬‬
‫میکروپروسسورباالتر‬
‫نیز با سرعت‬
‫این ضرب کننده ها معموال در کارهای پردازش سیگنال کاربرد دارند‪.‬‬
‫در بعضی محصوالت جدید شرکت های ‪ Xilix, Altera‬مثل ‪Virtex-II Pro‬‬
‫یک‬
‫میکروپروسسور داخلی وجود دارد‪.‬‬
‫این ‪ FPGA‬کامال تخصصی است و برای کاربردهای تخصصی استفاده می شود‪.‬‬
‫‪ PowerPC‬در واقع یک میکروپروسسور داخلی است که توسط شرکت ‪ IBM‬داخل‬
‫‪ FPGA‬قرار داده شده است‪.‬‬
‫مراحل‬
‫‪FPGA‬‬
‫طراحی ابتدایی‬
‫طراحی ابتدایی‬
‫•‬
‫در این مرحله باید مدار مورد نظر خود‬
‫را طراحی نماییم‪.‬‬
‫•‬
‫مختلف‬
‫ساخت‬
‫یک‬
‫روش‬
‫معمول‬
‫پیاده‬
‫برای‬
‫سازی‬
‫مدار‬
‫شبیه سازی‬
‫استفاده از برنامه های سطح باال برای‬
‫سنتز و بهینه سازی مدار‬
‫برنامه ریزی مدار است‪.‬‬
‫•‬
‫البته‬
‫در‬
‫بسیاری‬
‫از‬
‫نرم‬
‫افزارهای‬
‫شبیه ساز‪ ،‬امکان این که شماتیک مدار‬
‫را رسم کرد نیز وجود دارد‪.‬‬
‫•‬
‫این نرم افزارها قادرند خروجی متنی‬
‫برنامه‬
‫را‬
‫تولید کنند‪.‬‬
‫نیز‬
‫به‬
‫زبان‬
‫های‬
‫مرسوم‬
‫پیاده سازی مدار بر روی تراشه‬
‫دو زبان اصلی برنامه نویسی ‪ FPGA‬عبارتند از‪:‬‬
‫‪VHDL, Verilog‬‬
‫برخالف برنامه های مرسوم که معموال به صورت خط به خط اجرا می شوند‪،‬‬
‫این برنامه ها بر اساس رخدادها (‪ )Cuncurrent‬اجرا می شوند‪ .‬به همین‬
‫دلیل معموال از کلمه ((کد)) به جای ((برنامه)) استفاده می شود‪.‬‬
‫‪VHDL: Very High Speed Description Language‬‬
‫زبان توصیفی با سرعت خیلی باال‬
‫در این مرحله‪ ،‬معموال کد ‪ VHDL‬را در یک فایل با پسوند ‪ .vhd‬ذخیره می‬
‫کنند‪.‬‬
‫از آنجای که هر طرح پیاده شده با کد ‪ VHDL‬را بعدا می توان به صورت‬
‫پکیج آماده در سایر طرح ها نیز استفاده کرد‪ ،‬معموال نام فایل را همان‬
‫موجودیت (‪ )entity‬مورد استفاده در کد قرار می دهیم‪.‬‬
‫شبیه سازی‬
‫برنامه هایی وجود دارند که کد مورد نظر ما را گرفته و عملکرد مدار‬
‫را برای ما شبیه سازی می کنند‪.‬‬
‫به این ترتیب که ما شکل ورودی های مدار را برای آنها تعیین کرده و‬
‫این نرم افزارها‪ ،‬خروجی های مختلف را به ما می دهند‪.‬‬
‫به وسیله این نرم افزارها می توانیم از عملکرد مدار خود به ازای‬
‫حالت های مختلف ورودی‪ ،‬قبل از پیاده سازی آن بر روی ‪ FPGA‬مطمئن شویم‪.‬‬
‫دو نرم افزار معروف برای شبیه سازی عملکرد کدهای ‪ VHDL‬و ‪Verilog‬‬
‫عبارتند از‪:‬‬
‫• ‪ ModelSim‬از شرکت ‪Model Technology‬‬
‫• ‪ LDV‬از شرکت ‪Cadence‬‬
‫برای شبیه سازی عملکرد مدار‪ ،‬معموال الزم است که غیر از برنامه اصلی‬
‫یک برنامه دیگر نوشته شود‪.‬‬
‫این برنامه که صرفا برای تست مدار می باشد‪( test fixture ،‬برای برنامه‬
‫‪ )Verilog‬و ‪( test bench‬برای برنامه ‪ )VHDL‬نامیده می شود‪.‬‬
‫معموال برنامه تست به این صورت است که شکل موج های مختلف که حاوی‬
‫تمام حاالت ممکن ورودی می باشد تولید می شود‪.‬‬
‫معموال در نوشتن برنامه ‪ ،test bench‬طراح به بسیاری از نکات منفی و حالت‬
‫هایی که در طراحی مدار اصلی از آن غافل شده است پی می برد‪.‬‬
‫سنتز‬
‫مهم ترین مرحله در ساخت آی سی منطقی که از زبان توصیف سخت افزار‬
‫برای طراحی آن استفاده شده است‪ ،‬مر حله سنتز (‪ )Synthesis‬است‪.‬‬
‫در این مرحله کد ‪ HDL‬تبدیل به مجموعه ای از گیت های مناسب می شود‪.‬‬
‫نرم افزارهای ‪FPGA Express, FPGA Compiler II, Leonardo Spectrum,‬‬
‫‪ Simplify‬از جمله نرم افزارهای تخصصی سنتز می باشند‪.‬‬
‫پیاده سازی‬
‫آخرین مرحله انجام یک پروژه مرحله ای است که فایل سنتز شده دریافت و‬
‫مدار مربوط به آن بر روی ‪ FPGA‬پیاده می شود‪.‬‬
‫در مرحله پیاده سازی ‪ 4‬گام اصلی وجود دارد‪.‬‬
‫‪ :Translation‬تمام اطالعاتی که برای مراحل بعد الزم است در این مرحله‬
‫ساخته می شود‪.‬‬
‫‪ :Mapping‬این که مدار منطقی مورد نظر ما باید چه ترکیبی از کوچکترین‬
‫عناصر سازنده ‪ FPGA‬یعنی ‪LUT‬ها بافرها‪ ،‬بلوک های رم و ‪ ...‬باشد در این‬
‫مرحله تعیین می گردد‪.‬‬
‫‪ :Placement‬در این مرحله برای هر کدام از عناصر موجود در فایل تولید‬
‫شده در مرحله قبل‪ ،‬یک محل مخصوص در نظر گرفته می شود‪.‬‬
‫‪ :Routing‬آخرین مرحله می باشد‪ .‬در این مرحله‪ ،‬عناصر روی ‪ FPGA‬با سیم‬
‫شوند‪.‬معروف قادرند تمامی مراحل‬
‫افزارهای‬
‫برخیبهازهمنرم‬
‫‪routing‬که‬
‫ذکر است‬
‫الزمو به‬
‫وصل می‬
‫موجود‬
‫منابع‬
‫ها‬
‫از ورود کد های مورد نظر تا مرحله پیاده سازی را انجام دهند‪.‬‬
‫از مهم ترین این نرم افزارها می توان به ‪ Quartus II‬و ‪Xilinx ISE Design‬‬
‫اشاره نمود‪.‬‬
‫ساختار یک برنامه ‪VHDL‬‬
‫هر کد ‪ VHDL‬دارای سه بخش اصلی زیر می باشد‪.‬‬
‫‪ -1‬معرفی کتابخانه ها (‪ :)Library Decleration‬در این بخش تمامی کتابخانه‬
‫های استفاده شده در کد معرفی می گردند‪.‬‬
‫‪ -2‬موجودیت (‪ :)Entity‬پین ها (پورتهای) ورودی و خروجی مدار را مشخص می‬
‫کند‪.‬‬
‫‪ -3‬معماری (‪ :)Architectue‬نحوه عملکرد مدار را مشخص می کند‪.‬‬
‫کتابخانه‬
‫معموال قطعات پر استفاده و معمول را در کتابخانه قرار می دهند تا‬
‫بتوان از قابلیت های استفاده مجدد و اشتراک گذاری آنها در سایر‬
‫استفاده‬
‫نمود‪.‬حداقل ‪ 3‬بسته (‪ )Package‬متعلق به ‪ 3‬کتابخانه‬
‫‪ VHDL‬به‬
‫نیزهر کد‬
‫برنامه در‬
‫معموال‬
‫نیاز داریم‪.‬‬
ieee ‫ مربوط به کتابخانه‬std_logic_1164 ‫بسته‬
•
std ‫ مربوط به کتابخانه‬standard ‫بسته‬
•
work ‫ متعلق به کتابخانه‬work ‫بسته‬
•
:‫برای اعالن کتابخانه به دو خط کد نیاز داریم‬
LIBRARY library_name;
Use library_name.package_name.package_parts;
‫مثال‬
LIBRARY ieee;
Use ieee.std_logic_1164.all;
‫ به حروف بزرگ و کوچک حساس‬VHDL
.‫نمی باشد‬
LIBRARY std;
Use std.standard.all;
‫موجودیت (‪)Entity‬‬
‫•‬
‫موجودیت در کد به صورت زیر تعریف می شود‪.‬‬
‫‪ENTITY entity_name IS‬‬
‫( ‪PORT‬‬
‫;‪port_name: signal_mode signal_type‬‬
‫;‪port_name: signal_mode signal_type‬‬
‫;)…‬
‫;‪END entity_name‬‬
‫پارامتر ‪ mode‬شامل یکی از مقادیر زیر است‪.‬‬
‫‪In, out, inout, buffer‬‬
‫نوع بافر زمانی استفاده می شود که بخواهیم از یک‬
‫سیگنال خروجی به صورت داخلی استفاده نماییم‪.‬‬
‫پارامتر ‪ type‬شامل یکی از مقادیر زیر است‪.‬‬
‫‪Bit, integer, std_logic‬‬
‫معماری (‪)Architecture‬‬
‫•‬
‫معماری دو بخش دارد‪.‬‬
‫‪ -1‬بخش اعالن (اختیاری و در صورت لزوم)‪ :‬سیگنال ها و متغیرها و ثوابت‬
‫تعریف می شوند‪.‬‬
‫‪ -2‬بخش کد که عملکرد مدار را توصیف می کند‪.‬‬
‫‪ARCHITECTURE architecture_name of entity_name IS‬‬
‫]‪[Decleration‬‬
‫‪BEGIN‬‬
‫)‪(code‬‬
‫;‪END architecture_name‬‬
‫ ساده‬NAND ‫ طراحی یک گیت‬:‫مثال‬
ENTITY nand_gate IS
ENTITY nand_gate IS
PORT (a, b: IN BIT;
-- inputs
x: OUT BIT);
PORT (a, b: IN BIT;
-- outputs
x: OUT BIT);
END nand_gate;
END nand_gate;
ARCHITECTURE my_arch of nand_gate IS
ARCHITECTURE my_arch of nand_gate IS
Signal
int: std_logic;
-- internal
signal‫سیگنال‬
decleration ‫تعریف‬
‫توان از‬
‫ می‬int
‫داخلی‬
BEGIN
‫به جای‬
BEGIN
x <= a NAND b;
.‫ استفاده کرد‬NAND ‫عملگر‬
int <= a and b;
END my_arch ;
x <= NOT int;
END my_arch ;
‫استاندارد‬
‫در‬
‫زیر‬
‫منطقی‬
‫عملگرهای‬
.‫اند‬
‫ تعریف شده‬VHDL
NOT, AND, NAND, OR, NOR, XOR,
XNOR
‫ طراحی یک نیم جمع کننده‬:‫مثال‬
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Half_adder_mine is
Port ( X : in STD_LOGIC;
Y : in STD_LOGIC;
S : out STD_LOGIC;
C : out STD_LOGIC);
end Half_adder_mine;
architecture Behavioral of Half_adder_mine is
begin
S <= X xor Y;
C <= X and Y;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Three_input_gates is
Port ( IN0, IN1, IN2 : in STD_LOGIC;
OUT0, OUT1, OUT2, OUT3, OUT4, OUT5 : out STD_LOGIC);
end Three_input_gates;
architecture Behavioral of Three_input_gates is
begin
OUT0 <= IN0 and IN1 and IN2;
OUT1 <= IN0 or IN1 or IN2;
OUT2 <= not (IN0 and IN1 and IN2);
OUT3 <= not (IN0 or IN1 or IN2);
OUT4 <= IN0 xor IN1 xor IN2;
OUT5 <= IN0 xnor IN1 xnor IN2;
end Behavioral;
‫انواع داده‬
‫داده های از قبل تعریف‬
•
‫شده‬
‫شده‬
‫تعریف‬
‫های‬
‫داده‬
‫داده های از قبل تعریف شده‬
‫توسط کاربر‬
BIT, BIT_VERCTOR
STD_LOGIC, STD_LOGIC_VECTOR
STD_ULOGIC, STD_ULOGIC_VECTRO
BOOLEAN
INTEGER
NATURAL
REAL
SIGNED, UNSIGNED
‫داده های تعریف شده توسط کاربر‬
INTEGER
ENUMERATED
•
‫داده های از قبل تعریف شده‬
‫ و در کتابخانه ها و بسته های زیر تعریف‬IEEE1164 ‫ و‬IEEE1076 ‫این داده ها در استانداردهای‬
‫انواع داده‬
‫نام بسته‬
‫نام‬
‫کتابخانه‬
BIT, BOOLEAN, INTEGRE, REAL
STANDARD
STD
STD_LOGIC, STD_ULOGIC
STD_LOGIC_1164
IEEE
SIGNRD, UNSIGNED
STD_LOGIC_ARITH
IEEE
STD_LOGIC_VECTOR
STD_LOGIC_SIGNED
IEEE
STD_LOGIC_VECTOR
STD_LOGIC_UNSIGNED
IEEE
‫نوع ‪ BIT‬و ‪BIT_VECTOR‬‬
‫(دو سطح منطقی ’‪ ‘0‬و ’‪ ‘1‬را دارند)‬
‫انواع ‪ STD_LOGIC‬و ‪STD_LOGIC_VECTOR‬‬
‫• یک سیستم منطقی ‪ 8‬مقداره متعلق به استاندارد ‪ ieee1164‬است که بیشتر این مقادیر‬
‫فقط برای شبیه سازی استفاده می شوند‪.‬‬
‫• فقط مقادیر ’‪ ‘0’, ‘1’, ‘Z‬قابل سنتز هستند‪.‬‬
‫• حالت های «ضعیف» و «قوی» به این دلیل استفاده شده اند که اگر دو سیگنال از‬
‫این نوع به یک گره متصل باشند مقادیر نوع قوی تعیین کننده نهایی خواهند بود‪.‬‬
‫انواع ‪ STD_ULOGIC‬و ‪STD_ULOGIC_VECTOR‬‬
‫• یک سیستم منطقی ‪ 9‬مقداره است‪.‬‬
‫• عالوه بر مقادیر قبلی مقدار ’‪ )Unresolved( ‘U‬نیز اضافه شده است‪.‬‬
‫• در این حالت بر خالف حالت قبلی نمی توان سیم های با مقادیر مختلف را به هم‬
‫متصل نمود‪ .‬برای نشان دادن خطای مربوطه از این مقدار استفاده می شود‪.‬‬
‫حداکثر مقدار‬
‫حداقل مقدار‬
‫نوع داده‬
‫‪TRUE‬‬
‫‪FALSE‬‬
‫‪Boolean‬‬
‫‪2147483647‬‬
‫‪-2147483647‬‬
‫‪INTEGER‬‬
‫‪2147483647‬‬
‫‪0‬‬
‫‪NATURAL‬‬
‫‪1.0E38‬‬
‫‪-1.0E38‬‬
‫‪REAL‬‬
‫‪SIGNED‬‬
‫نوع ‪ :Boolean‬شامل مقادیر ‪ TRUE‬و ‪ FALSE‬است‪.‬‬
‫نوع ‪ :INTEGER‬شامل اعداد صحیح از ‪ -2147483647‬تا ‪ 2147483647‬است‪.‬‬
‫نوع ‪ :NATURAL‬شامل اعداد صحیح نامنفی از ‪ 0‬تا ‪ 2147483647‬است‪.‬‬
‫نوع ‪ :REAL‬شامل اعداد حقیقی از ‪ -1.0E38‬تا ‪ 1.0E38‬است‪( .‬این نوع داده قابل سنتز‬
‫نیست‪.‬‬
‫داده های تعریف شده توسط کاربر‪ :‬کاربر امکان تعریف دو نوع داده را دارد‪.‬‬
‫نوع ‪INTEGER‬‬
‫نوع ‪ENUMERATED‬‬
‫نحوه تعریف نوع جدید داده‬
TYPE type_name IS ARRAY (specification) OF data_type;
SIGNAL signal_name: type_name [:=initial_value];
TYPE row IS ARRAY (7 downto 0) OF std_logic;
-- 1D Array
TYPE matrix IS ARRAY (0 to 3) OF row; -- 1D * 1D
SIGNAL x: matrix;
‫نحوه استفاده‬
1D*1D ‫ نحوه تعریف یک آرایه‬:‫مثال‬
‫ نحوه تعریف یک آرایه‬:‫مثال‬
TYPE matrix2D IS ARRAY (0 to 3, 7 downto 0) of std_logic; -- 2D2D
Array
.‫ عالمت & به معنی پیوند دهی بین داده ها است‬:‫پیوند دهی داده ها‬
ARCHITECTURE rtl OF exIS
SIGNAL a:std_logic_vetor (5 DOWNTO 0);
SIGNAL b, c, d : std_logic_vector(2 DOWNTO 0);
BEGIN
If
c = “011”,
d = “101” ===> B = “011”
B <= ‘0’ & c(1) & d(2);
END generic_decoder;
IF c & d = “001100” THEN
‫یک نمونه دیگر از کاربرد این دستور‬
‫کتابخانه ها‬
‫وقتی یک عنصر در ‪ VHDL‬تعریف می شود به صورت اتوماتیک در کتابخانه ‪ WORK‬ذخیره می شود‪.‬‬
‫کابخانه نام یک فولدر در کامپیوتر نیست‪ .‬بلکه نام اشاره گری است که در هنگام راه اندا‬
‫کتابخانه های ‪ std, work‬همیشه در دسترس هستند و نیازی به تعریف مجدد آنها نیست‪.‬‬
‫در صورت استفاده از کتابخانه دیگر باید در ابتدای برنامه تعریف شوند‪.‬‬
‫در مورد طرح های بزرگ‪ ،‬امکان استفاده از توابع‪ ،‬مقادیر ثابت‪ ،‬انواع داده و ‪ ...‬در بلو‬
‫مقدار ثابت به عنوان مثال می تواند پهنای باس داده باشد‪.‬‬
‫هر موقع درون بسته این عدد ثابت تغییر کند در کلیه زیر بخش های پروژه به صورت همزمان‬
‫بسته (‪)Package‬‬
‫یک بسته (‪ )Package‬می تواند شامل ‪ function‬ها‪ procedure ،‬ها‪ ،‬انواع داده‪ ،‬ثابت ها و نشانگر‬
‫یک بسته از دو بخش زیر تشکیل شده است‪.‬‬
‫• اعالم بسته‬
‫• بدنه بسته‬
‫ آن‬،‫ باید قبل از تعریف موجودیت‬،‫ از یک داده جدید استفاده کنیم‬،‫اگر بخواهیم درون موجودیت‬
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------------------------------------------PACKAGE my_data_types IS
TYPE vector_array IS ARRAY (natural range <>) of
std_logic_vector (7 downto 0);
END my_data_types;
---------------------------------------------------------------------------‫ به صورت زیر از آن در برنامه اصلی استفاده می‬،‫بعد از ذخیره کردن این بسته در مسیر جاری‬
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.my_data_types.all;
-- User-defined package
---------------------------------------------------------------------------entity MUX is
port(I:in vector_array (3 downto 0); S vector_array (1 downto 0); Y: out bit);
end MUX;
‫ ثابت های مورد‬،‫ ها‬procedure ،‫ها‬function
‫ شامل‬،‫بخش اعالم بسته شامل عالوه بر معرفی داده ها‬
.‫بخش بدنه بسته بیان کننده رفتار زیر برنامه هایی است که در بخش اعالم معرفی شده اند‬
PACKAGE my_pack IS
FUNCTION minimum (a, b: IN std_logic_vector)
RETURN std_logic_vector;
CONSTANT max_int: integer := 16#FFFF#;
TYPE arithmetic_mode_type IS (signed, unsigned)
END my_pack;
-------------------------------------------------------------------------------PACKAGE BODY my_pack IS
FUNCTION minimum (a, b: IN std_logic_vector)
RETURN std_logic_vector;
BEGIN
IF a < b THEN
RETURN a;
ELSE
RETURN b;
END IF;
END minimum;
END my_pack;
‫عملگرها‬
‫• تخصیص‬
‫برای تخصیص مقادیر به سیگنال ها‪ ،‬متغیرها و توابع استفاده می شود‪.‬‬
‫• منطقی‬
‫‪ -1‬عملگر => برای تخصیص مقدار به سیگنال به کار می رود‪.‬‬
‫• ریاضی‬
‫‪ -2‬عملگر =‪ :‬برای دادن مقدار اولیه به یک ثابت یا متغیر به کار می رود‪.‬‬
‫• رابطه ای‪ -3‬عملگر <= برای تخصیص مقدار به تک تک المان های یک بردار و همراه ‪OTHERS‬‬
‫• شیفت‬
‫• تجمیع‬
‫• عملگرهای منطقی‬
‫برای انجام عملیات منطقی روی داده های از نوع ‪ STD_LOGIC ،BIT‬و ‪TD_ULOGIC‬‬
‫عملگرهای منطقی‪:‬‬
‫‪NOT, AND, OR, NAND, NOR, XOR, XNOR‬‬
‫مثال‪:‬‬
‫)‪-- (a’.b‬‬
‫;‪Y <= NOT a AND b‬‬
‫’)‪-- (a.b‬‬
‫;)‪Y <= NOT(a AND b‬‬
‫’)‪-- (a.b‬‬
‫;‪Y <= a NAND b‬‬
‫• عملگرهای ریاضی‬
‫برای انجام عملیات ریاضی روی داده های از نوع ‪UNSIGNED ،SIGNED ،INTEGER‬‬
‫عملگرهای منطقی‪:‬‬
‫‪),‬توان( ** ‪),‬تقسیم( ‪), /‬ضرب( * ‪),‬تفریق( ‪), -‬جمع( ‪+‬‬
‫)قدرمطلق( ‪), ABS‬باقیمانده( ‪), REM‬خارج قسمت( ‪MOD‬‬
‫• عملگرهای رابطه ای یا مقایسه ای‬
‫برای انجام مقایسه بین دو مقدار داده استفاده می شود‪.‬‬
‫عملگرهای منطقی‪:‬‬
‫)بزرگتر یا مساوی( => ‪),‬کوچکتر یا مساوی( =< ‪),‬بزرگتر( > ‪),‬کوچکتر( < ‪),‬مخالف( =‪), /‬مساوی( =‬
‫• عملگرهای شیفت‬
‫برای انجام شیفت استفاده می شود‪.‬‬
‫‪ :sll‬مکانهای سمت راست با صفر پر می شوند‪.‬‬
‫‪ :srl‬مکانهای سمت چپ با صفر پر می شوند‪.‬‬
‫مقدار دهی چند گانه‬
‫‪ARCHITECTURE rtl2 OF ex3 IS‬‬
‫‪BEGIN‬‬
‫‪BEGIN‬‬
‫;”‪q1 <= “001‬‬
‫;”‪q2 <= “010‬‬
‫;”‪q3 <= “111‬‬
‫;‪END rtl‬‬
‫‪ARCHITECTURE rtl OF ex3 IS‬‬
‫‪BEGIN‬‬
‫‪BEGIN‬‬
‫;’‪q1 <= ‘0‬‬
‫;’‪q2 <= ‘0‬‬
‫;’‪q3 <= ‘0‬‬
‫;‪END rtl‬‬
VHDL ‫انواع ساختارها در‬
‫ساختارهای متوالی‬
•
•
•
•
•
•
•
If then else
Case statement
Variable declaration
Loop statement
Return statement
Null statement
Wait statement
‫ساختارهای موازی‬
•
•
•
•
•
Process
When else
With select
Signal declaration
Block statement
IF ‫عبارت‬
‫ یکی از‬،‫ شامل یک یا چند عبارت داخلی است که بسته به برقراری شروط‬IF ‫یک دستور‬
.‫عبارت ها اجرا می شود‬
IF SEL = ‘0’ THEN
C <= A;
ELSE
C <= B;
END IF;
ENTITY ex_if IS
PORT (a, b : IN INTEGER;
c : OUT BOOLEAN);
END;
ARCHITECTURE rtl OF ex_if IS
BEGIN
PROCESS (a,b)
BEGIN
IF a > b THEN
c <= TRUE;
ELSE
c <= FALSE;
END IF;
END PROCESS;
END rtl;
‫ نیز به صورت موازی‬VHDL ‫ کد‬،‫مجددا تاکید می گردد که همانند یک سخت افزار که ذاتا موازی است‬
.‫اجرا می شود‬
ARCHITECTURE example of ex IS
BEGIN
a <= b;
b <= c;
END my_arch ;
‫ معنی‬VHDL ‫در نتیجه ترتیب خطوط در‬
ARCHITECTURE example of ex.‫ندارد‬
IS
BEGIN
b <= c;
a <= b;
END my_arch ;
‫ در سمت راست قرار‬C ‫ تمام خطوطی که‬،‫ تغییر می کند‬c ‫مثال فوق به این معنا است که وقتی که‬
ENTITY ex IS
PORT (a, b, c: IN std_logic;
data: IN std_logic_vector (1 downto 0);
q:
OUT std_logic);
END ex;
----------------------------------ARCHITECTURE rtl OF ex IS
BEGIN
q <=
a WHEN data = "00" else
b WHEN data = "11" else
c;
END rtl;
.‫دارد به طور همزمان اجرا می شوند‬
‫عبارت‬
WHEN
a
b
c
Data [1 0]
ex
q
‫طراحی یک مدار مقایسه کننده‬
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Compare_mine is
Port ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
Y0 : out STD_LOGIC;
Y1 : out STD_LOGIC;
Y2 : out STD_LOGIC;
Y3 : out STD_LOGIC;
Y4 : out STD_LOGIC;
Y5 : out STD_LOGIC);
end Compare_mine;
architecture Behavioral of Compare_mine is
begin
Y0 <= '1' when A = B else '0';
Y1 <= '1' when A /= B else '0';
Y2 <= '1' when A < B else '0';
Y3 <= '1' when A <= B else '0';
Y4 <= '1' when A > B else '0';
Y5 <= '1' when A >= B else '0';
end Behavioral;
3*8 ‫طراحی یک دیکودر‬
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Decoder3_8_mine is
Port ( D : in STD_LOGIC_VECTOR (2 downto 0);
Y : out STD_LOGIC_VECTOR (7 downto 0));
end Decoder3_8_mine;
architecture Behavioral of Decoder3_8_mine is
begin
Y <= "00000001" when D = "000" else
"00000010" when D = "001" else
"00000100" when D = "010" else
"00001000" when D = "011" else
"00010000" when D = "100" else
"00100000" when D = "101" else
"01000000" when D = "110" else
"10000000" when D = "111" else
"00000000" ;
end Behavioral;
8*1 ‫طراحی یک مالتی پلکسر‬
architecture Behavioral of MUX81_mine is
begin
Y <=
D(0) when A = "000" else
D(1) when A = "001" else
D(2) when A = "010" else
D(3) when A = "011" else
D(4) when A = "100" else
D(5) when A = "101" else
library IEEE;
D(6) when A = "110" else
use IEEE.STD_LOGIC_1164.ALL;
D(7) when A = "111" else
entity MUX81_mine is
'Z' ;
Port ( D : in STD_LOGIC_VECTOR (7 downto 0); end Behavioral;
A : in STD_LOGIC_VECTOR (2 downto 0);
Y : out STD_LOGIC);
end MUX81_mine;
WITH ‫عبارت‬
‫ پیاداه سازی‬WHEN
ELSE ‫در صورتی که در برنامه مجبور باشیم حالتهای زیادی را با استفاده از‬
.‫ استفاده کنیم‬WITH ‫نماییم می توانیم برای راحتی از‬
ENTITY ex IS
PORT (a, b, c: IN std_logic; .‫ می نویسیم‬WITH ‫همان مثال قبل را این بار با استفاده از دستور‬
data: IN std_logic;
q:
OUT std_logic);
END ex;
----------------------------------ARCHITECTURE rtl OF ex IS
BEGIN
WITH data SELECT
q <= a WHEN "00“,
b WHEN "11“,
c WHEN OTHERS;
END rtl;
CASE ‫عبارت‬
ENTITY case_mux IS
PORT (a, b, sel : IN BIT;
‫ می‬BIT);
‫استفاده از این دستور در اغلب موارد به درک بهتر برنامه کمک‬
c .‫کند‬
: OUT
END;
ARCHITECTURE rtl OF case_mux IS
BEGIN
ENTITY case_ex2 IS
case sel IS
PORT (a : IN
INTEGER RANGE 0 to 30;
WHEN ‘0’ => c <= a;
c : OUT INTEGER RANGE 0 to 6);
WHEN ‘1’ => c <= b;
END;
END case;
ARCHITECTURE rtl OF ex_case2 IS
END rtl;
BEGIN
case a IS
WHEN 0
=>
b <= 3;
WHEN 1 | 2
=>
b <= 2;
‫ دارای مقادیر و حالت‬case ‫اگر متغیر‬
WHEN OTHERS’ =>
b <= 0;
END case;
‫ معین کردن هر‬،‫های بسیاری باشد‬
END rtl;
‫ در این‬.‫حالت کار دشواری خواهد بود‬
‫“ استفاده می‬OTHERS” ‫حالت از کلمه‬
.‫کنیم‬
FOR LOOP (WHILE LOOP) ‫حلقه‬
ENTITY ex IS
PORT (a, b, c:
IN std_logic_vector (4 downto 0);
q
:
OUT std_logic_vector (4 downto 0));
END ex;
ARCHITECTURE rtl OF ex IS
BEGIN
for I in 0 to 4 LOOP
-- (WHILE I <= 4 LOOP)
IF a(i) = ‘1’ THEN
q(i) <= b(i);
ELSE
q(i) <= c(i);
END IF;
END LOOP;
END;
.‫ بوده و برای تکرار استفاده می شود‬For ‫ معادل دستور ترتیبی‬Generate
‫دستور همزمان‬
OK: For I In Range 0 to 7 GENERATE
.‫باشد‬
output(i) <= ‘1’ WHEN (a(i) AND b(i))=‘1’ ELSE
‘0’; ‫خط شامل این دستور باید برچسب داشته‬
END GENERATE;
‫خاصیت های داده ها‪ :‬جهت آگاهی از خواص داده ها می توان به صورت زیر عمل نمود‬
‫‪ :d‘LOW‬مقدار پایینی اندیس ارایه را بر می گرداند‪.‬‬
‫‪ :d‘HIGH‬مقدار باالیی اندیس ارایه را بر می گرداند‪.‬‬
‫‪ :d‘LEFT‬سمت چپ ترین اندیس ارایه را بر می گرداند‪.‬‬
‫‪ :d‘RIGHT‬سمت راست ترین اندیس ارایه را بر می گرداند‪.‬‬
‫‪ :d‘LENGTH‬اندازه یا طول بردار را بر می گرداند‪.‬‬
‫‪ :d‘RANGE‬محدوده بردار را برمی گرداند‪.‬‬
‫‪ :d‘REVERSE_RANGE‬محدوده بردار را به صورت معکوس برمی گرداند‪.‬‬
‫خاصیت های سیگنال ها‪ :‬جهت آگاهی از خواص سیگنال ها می توان به صورت زیر عمل نمود‪( .‬فقط د‬
‫‪ :s‘EVENT‬هرگاه سیگنال ‪ s‬تغییر کند (رویدادی داشته باشد) این خاصیت ’‪ ‘1‬می شود‪.‬‬
‫‪ :s‘STABLE‬هرگاه سیگنال ‪ s‬تغییر نکند (رویدادی نداشته باشد) این خاصیت ’‪ ‘1‬می شود‪.‬‬
‫‪ :s‘ACTIVE‬هرگاه ’‪ s = ‘1‬باشد مقدار درست را بر می گرداند‪.‬‬
‫‪ :s‘LAST_EVENT‬مقدار زمان سپری شده از آخرین تغییر سیگنال ‪ s‬را بر می گرداند‪.‬‬
‫‪ :s‘LAST_ACTIVE‬مقدار زمان سپری شده از آخرین دفعه ای که ’‪ s = ‘1‬بوده را بر می گرداند‪.‬‬
‫‪ :s‘LAST_VALUE‬آخرین مقدار ‪ s‬قبل از آخرین تغییر را برمی گرداند‪.‬‬
‫‪C <= ‘1’,‬‬
‫‪‘0’ AFTER 10 ns,‬‬
‫;‪b AFTER 20 ns‬‬
‫این امکان نیز وجود دارد که چندین مقدار را به‬
‫یک سیگنال بدهیم‪.‬‬
‫(تاخیرها باید به ترتیب صعودی باشند)‬
‫انواع تاخیرها در ‪VHDL‬‬
‫‪ .1‬تاخیر درونی‬
‫‪ .2‬تاخیر انتقالی‬
‫مقدار‬
‫زمان‬
‫’‪‘1‬‬
‫‪0‬‬
‫’‪‘0‬‬
‫‪10‬‬
‫مقدار ‪-- b‬‬
‫سیگنال‬
‫‪b‬‬
‫‪20‬‬
‫در تاخیر درونی اگر پس از زمان تعیین شده‪ ،‬هنوز سیگنال وجود داشت آن سیگنال در خروجی ظاهر‬
‫می شود‪( .‬برای حذف جهش های نویزی کاربرد دارد)‬
‫در تاخیر انتقالی‪ ،‬سیگنال مورد نظر پس از تاخیر تعیین شده به خروجی منتقل می شود‪.‬‬
‫‪B‬‬
‫‪A‬‬
‫;‪b1 <= a AFTER 10 ns‬‬
‫‪A‬‬
‫‪ns‬‬
‫‪60‬‬
‫‪50‬‬
‫‪40‬‬
‫‪30‬‬
‫‪20‬‬
‫‪10‬‬
‫‪B1‬‬
‫‪B2‬‬
‫;‪b2 < a TRANSPORT AFTER 10 ns‬‬
‫عبارت فرآیند (‪)Process‬‬
‫فرآیند‪ ،‬یک مجموعه دستور با قالب مشخصی است که دارای یک لیست حساسیت بوده و‬
‫دستورات مذکور فقط زمانی اجرا می شود که یکی از سیگنال های موجود در لیست حساسیت‬
‫تغییر کند‪.‬‬
‫در صورتی که در فرآیند از دستور ‪ WAIT‬استفاده شود نیازی به لیست حساسیت نبوده و در‬
‫اجرا می شود‪.‬‬
‫مثال‪:‬‬
‫’‪wait until clk = ‘1‬‬
‫اگر در بدنه یک کد‪ ،‬چندین پروسس تعریف شود همه آنها به صورت همزمان اجرا می شوند‪.‬‬
‫یک پروسس می تواند در حالت اجرا یا انتظار باشد‪.‬‬
‫‪Waiting‬‬
‫پروسس بعد از هر بار اجرا مجددا به حالت انتظار می رود‪.‬‬
‫‪Sync_process: PROCESS‬‬
‫‪BEGIN‬‬
‫;’‪WAIT UNTIL clk = ‘0‬‬
‫;)‪c_out <= NOT (a_in AND b_in‬‬
‫;‪d_out <= NOT b_in AFTER 10 ns‬‬
‫;‪END PROCESS sync_process‬‬
‫در ‪ VHDL‬دو نوع پروسس وجود دارد‪.‬‬
‫‪ -1‬پروسس ترکیبی‬
‫‪ -2‬پروسس ترتیبی (پالسی)‬
‫پروسس ترکیبی‬
‫در یک پروسس ترکیبی تمام سیگنال های ورودی (یعنی آنهایی که در سمت راست عالمت‬
‫((‬
‫=<‬
‫))‬
‫یا‬
‫سیگنال‬
‫هایی‬
‫که‬
‫داخل‬
‫عالمت ‪ if/case‬قرار دارند) باید در لیست حساسیت پروسس وارد شوند‪.‬‬
‫در داخل پرانتز‪ ،‬لیست سیگنال هایی که پروسس‬
‫با آنها شروع می شود قرار دارد‪.‬‬
‫اگر مثال ‪ a_in‬از لیست حذف شود‪ c_out ،‬مقدار‬
‫قبلی خودش را حفظ می کند و تا زمانی که ‪b_in‬‬
‫تغییر نکند‪ ،‬مقدار جدید به خودش نمی گیرد‪.‬‬
‫)‪Sync_process: PROCESS (a_in, b_in‬‬
‫‪BEGIN‬‬
‫;)‪c_out <= NOT (a_in AND b_in‬‬
‫;‪d_out <= NOT b_in AFTER 10 ns‬‬
‫;‪END PROCESS sync_process‬‬
‫پروسس ترتیبی (پالسی)‬
‫پروسس های پالسی همزمان هستند و می توان چند تا از این پروسس ها را با یک‬
‫پالس ساعت یکسان به هم متصل کرد‪.‬‬
‫‪example: PROCESS‬‬
‫‪BEGIN‬‬
‫;’‪WAIT UNTIL clk = ‘1‬‬
‫;‪d_out <= d_in‬‬
‫;‪END PROCESS example‬‬
‫چنانچه در یک پروسس پالسی مقدار دهی به سیگنال انجام نشود مقدار قبلی خود را‬
‫حفظ می کند‪.‬‬
‫‪PROCESS‬‬
‫‪BEGIN‬‬
‫;’‪WAIT UNTIL clk = ‘1‬‬
‫‪IF en = ‘1’ THEN‬‬
‫;‪q <= d‬‬
‫;‪END IF‬‬
‫;‪END PROCESS‬‬
wait ‫عبارت‬
.‫چهار روش گوناگون برای بیان لیست حساسیت ها در یک فرآیند وجود دارد‬
1. Process (a,b)
2. Wait until a=1;
3. Wait on a,b;
4. Wait for 10 ns;
‫ موارد اول و سوم یکی‬،‫ در انتهای پروسس آورده شود‬wait on a,b ‫در صورتی که عبارت‬
PROCESS (a)
BEGIN
c1 <= NOT a;
END PROCESS;
.‫می شوند‬
PROCESS
BEGIN
c2 <= NOT a;
WAIT ON a;
END PROCESS;
PROCESS
BEGIN
WAIT UNTIL a = ‘1’; PROCESS
BEGIN
c4 <= NOT a;
c5 <= NOT a;
END PROCESS;
WAIT UNTIL a = ‘1’ FOR 10 ns;
END PROCESS;
-------------------------------------------LIBRARY ieee;
USE ieee.std_logic_1164.all;
-------------------------------------------ENTITY dff IS
port(d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END dff;
-------------------------------------------ARCHITECTURE behavior OF dff IS
BEGIN
sve: PROCESS(rst,clk)
BEGIN
IF (rst='1') THEN
q <= '0';
ELSIF (clk'EVENT AND clk='1') THEN
q <= d;
END IF;
END PROCESS sve;
END behavior;
--------------------------------------------
‫ با ورودی ریست سنکرون‬DFF ‫ یک‬:‫مثال‬
ENTITY example IS
PORT (a, b, clk : IN BIT;
q: OUT BIT);
END example ;
ARCHITECTURE example of example IS
SIGNAL temp : BIT;
BEGIN
temp <= a nand b;
PROCESS (clk)
BEGIN
IF (clk ‘EVENT and clk = ‘1’) then q <= temp;
END IF;
END PROCESS;
END example ;
‫همراه‬
‫به‬
DFF
‫یک‬
‫طراحی‬
:‫مثال‬
NAND ‫گیت‬
‫ هیچ گونه تاخیری برای‬،‫در مثال های قبل‬
.‫اجزای مدار وجود ندارد‬
ARCHITECTURE my_arch of nand_gate IS
‫ برای ایجاد‬AFTER ‫حال می خواهیم از دستور‬
.‫تاخیر استفاده کنیم‬
BEGIN
x <= a NAND b AFTER 10 ns;
END my_arch ;
-- Component Delay = 10 ns
‫مثالی‬
‫از‬
‫مدل‬
‫رفتاری‬
‫یک‬
‫‪ Multiplexer‬که در برنامه مجبور باشیم حالتهای زیادی را با استفاده از ‪ELSE‬‬
‫در صورتی‬
‫‪ WHEN‬پیاداه سازی‬
‫نماییم می توانیم برای راحتی از ‪ WITH‬استفاده کنیم‪.‬‬
‫‪ENTITY mux2 IS‬‬
‫همان مثال قبل را این بار با استفاده از دستور ‪ WITH‬می نویسیم‪.‬‬
‫;‪PORT (sel_0, a, b: IN std_logic‬‬
‫‪q:‬‬
‫;)‪OUT std_logic‬‬
‫;‪END mux2‬‬
‫‪----------------------------------‬‬‫‪ARCHITECTURE mux2_with OF mux2 IS‬‬
‫‪BEGIN‬‬
‫‪WITH sel_0 SELECT‬‬
‫‪c <= a AFTER 10 ns WHEN ‘0’,‬‬
‫;‪b AFTER 10 ns WHEN OTHERS‬‬
‫;‪END mux2_with‬‬
‫پارامترهای عمومی (‪)generic‬‬
‫این پارامترها معموال برای تعریف پارامترهایی که در‬
‫بخش‬
‫های‬
‫مختلف‬
‫برنامه‬
‫استفاده‬
‫می‬
‫شود‬
‫کاربرد‬
‫دارند‪.‬‬
‫در بخش موجودیت و قبل از تعریف پورت ها تعریف می‬
‫شوند‪.‬‬
‫‪ENTITY nand_gate IS‬‬
‫;)‪GENERIC (delay: time:=10ns‬‬
‫;‪PORT (a, b: IN BIT‬‬
‫;)‪x: OUT BIT‬‬
‫;‪END nand_gate‬‬
‫‪ARCHITECTURE my_arch of nand_gate IS‬‬
‫‪BEGIN‬‬
‫;‪x <= a NAND b AFTER delay‬‬
‫; ‪END my_arch‬‬
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-------------------------------------------------------‫ طراحی یک دیکودر‬:‫مثال‬
ENTITY decoder IS
PORT( ena : IN std_logic;
sel : IN std_logic_vector (2 downto 0);
x : OUT std_logic_vector (7 downto 0));
END decoder;
-------------------------------------------------------ARCHITECTURE generic_decoder OF decoder IS
BEGIN
PROCESS (ena, sel)
VARIABLE temp1: std_logic_vector (x'HIGH downto 0);
VARIABLE temp2: integer RANGE 0 to x'HIGH;
BEGIN
temp1 := (OTHERS => '1');
temp2 := 0;
IF (ena='1') then
FOR i in sel'RANGE LOOP -- sel range is 2 downto 0
IF (sel(i)='1') THEN -- bin to integer conversion
temp2 := 2*temp2+1;
ELSE
ena
Sel
temp2 := 2*temp2;
0
00
END IF;
END LOOP;
1
00
temp1(temp2) := '0';
01
END IF;
x <= temp1;
10
END Process;
11
END generic_decoder;
x
1111
1110
1101
1011
0111
LIBRARY ieee;
USE ieee.std_logic_1164.all;
RAM ‫ پیاده سازی یک‬:‫مثال‬
-------------------------------------------------------GENERIC ( bits
: INTEGER := 8;
words : INTEGER := 16);
ENTITY ram IS
PORT( wr_ena, clk: IN std_logic;
addr:
IN INTEGER RANGE 0 to words-1;
data_in: IN std_logic_vector (bits-1 downto 0));
data_out: OUT std_logic_vector (bits-1 downto 0));
END ram;
-------------------------------------------------------ARCHITECTURE ram OF ram IS
TYPE vector_array IS ARRAY (0 TO words-1) OF std_logic_vector (bits-1 downto 0);
SIGNAL memory: vector_array;
BEGIN
PROCESS (clk, wr_ena)
BEGIN
IF (wr_ena='1') then
IF (clk’EVENT AND clk = ‘1’) THEN
memory(addr) <= data_in;
END IF;
ELSEIF (wr_ena=‘0') then
IF (clk’EVENT AND clk = ‘1’) THEN
data_out<= memory(addr);
END IF;
END IF;
END Process;
END ram;
‫توصیف ساختاری یک سخت افزار‬
‫در روش توصیف ساختاری‪ ،‬ابتدا اجزای آن سیستم لیست شده و سپس اتصاالت بین آنها مشخص می ش‬
‫این روش معرفی چون به سخت افزار واقعی نزدیک تر است‪ ،‬فهم آن راحت تر می باشد‪.‬‬
‫برای توصیف این روش از یک مثال استفاده می کنیم‪.‬‬
‫می خواهیم یک مقایسه کننده یک بیتی بسازیم‪ .‬این مقایسه کننده دو بیت ورودی را‬
‫با هم مقایسه کرده و بسته به پایه های کنترل یکی از ‪ 3‬پایه خروجی را یک می کند‪.‬‬
‫‪A Comparator‬‬
‫‪B‬‬
‫‪A>B‬‬
‫‪A=B‬‬
‫‪A<B‬‬
‫>‬
‫=‬
‫<‬
‫ابتدا می خواهیم گیت های ‪ NAND‬ی که در این طرح به کار رفته است را تعریف کنیم‪.‬‬
‫البته این گیتها می توانند داخل طرح ما تعریف شده و یا یکی از قطعات موجود در کتابخانه‬
‫بعد از تعریف گیتهای مورد نیاز به شیوه ای مشابه همان که ترانزیستورها را در‬
‫مدارات به هم وصل می کنیم اتصاالت این گیتها را در برنامه برقرار می کنیم‪.‬‬
‫مدل معکوس‬
‫کننده‬
‫عناصر مورد استفاده‬
‫در این مدل‬
‫‪Entity name‬‬
‫‪o1‬‬
‫‪Bidirectional‬‬
‫‪Buffer port‬‬
‫‪port‬‬
‫‪Input port Output port‬‬
‫‪inv‬‬
‫‪i1‬‬
‫ برای این‬VHDL ‫کد‬
ENTITY inv IS
PORT ( I1 : IN BIT; O1 : OUT BIT);
‫معکوس کننده‬
‫ یک نوع داده از پیش تعریف شده است‬TIME
END inv;
ARCHTECTURE single_delay OF inv IS
)‫ ثانیه‬10-15( ‫ فمتو ثانیه‬1 ‫و حداقل آن‬
BEGIN
.‫می باشد‬
o1 <= NOT I1 AFTER 4 ns;
END single_delay;
‫ دو‬NAND ‫مدل گیت‬
‫ورودی‬
‫ برای این‬VHDL ‫کد‬
ENTITY nand2 IS
PORT ( I1, I2 : IN BIT; O1 : OUT BIT);
END inv;
ARCHTECTURE single_delay OF nand2 IS
i1
i2
BEGIN
nand2
o1
o1 <= I1 nand I2 AFTER 5 ns;
END single_delay;
‫معکوس کننده‬
‫مدل گیت ‪ NAND‬سه‬
‫ورودی‬
‫کد ‪ VHDL‬برای این‬
‫معکوس کننده‬
‫‪ENTITY nand3 IS‬‬
‫;)‪PORT ( I1, I2 : IN BIT; O1 : OUT BIT‬‬
‫;‪END inv‬‬
‫‪ARCHTECTURE single_delay OF nand3 IS‬‬
‫‪BEGIN‬‬
‫‪nand3‬‬
‫;‪o1 <= NOT (I1 and I2 and I3) AFTER 5 ns‬‬
‫;‪END single_delay‬‬
‫‪o1‬‬
‫‪i1‬‬
‫‪i2‬‬
‫‪i3‬‬
‫برقراری اتصال میان‬
‫گیت ها‬
‫در ‪ VHDL‬می توان عملکرد یک مدار را به وسیله اتصال اجزای کوچکتر آن توصیف‬
‫کرد‪.‬‬
‫ابتدا به معرفی مجدد منطق مداری که می خواهیم طراحی کنیم می پردازیم‪.‬‬
‫این مدار دو ورودی اصلی و سه ورودی کنترل دارد‪.‬‬
‫خروجی ‪ A>B‬زمانی یک است که یا ‪ A‬بزرگتر از ‪ B‬باشد یا ‪ A‬مساوی ‪ B‬بوده و ورودی‬
‫کنترل > یک باشد‪.‬‬
‫خروجی ‪ A=B‬زمانی یک است که ‪ A‬مساوی ‪ B‬بوده و ورودی = یک باشد‪.‬‬
‫مداراست‬
‫این اول‬
‫برایحالت‬
‫جبری عکس‬
‫خروجی ‪A<B‬‬
‫به‪ .‬صورت زیر است‪.‬‬
‫تابع‬
‫‘‪a_gt_b = a.gt + b’.gt + a.b‬‬
‫‪a_eq_b = a.b.eq + a’.b’.eq‬‬
‫‪a_lt_b = a’.lt + b.lt + a’.b‬‬
a
i1
i2
nand
2 o1
nand
i1
2 o1
i2
b
i1
inv
o1
i1
i2
gt
i1
i2
i3
eq
i1
i2
i3
lt
a_gt_b
i1
i2
i3
i1
o1
‫اجزای کوچکتر خود ساخته‬
o1
.‫می شود‬
nand
2 o1
‫برای‬
‫تکراری‬
‫• اسامی‬
‫ورودی و خروجی های این‬
nand3
a_eq_b
o1
i1
i2
nand3
nand
2 o1
.‫مدار به کار رفته است‬
Bit_comparator
o1
a
nand
i1
2 o1
i2
inv
nand3
‫• این مدار با استفاده از‬
i1
i2
nand
2 o1
i1
i2
nand
2 o1
a_lt_b
i1
i2
i3
nand3
o1
b
gt
eq
lt
a_gt_b
a_eq_b
a_lt_b
ENTITY bit_comparator IS
PORt ( a, b,
ARCHITECTURE gate_level OF bit_comparator IS
COMPONENT n1 PORT (i1 : IN BIT; o1 : OUT BIT); END COMPONENT;
gt,
COMPONENT n2 PORT (i1 , i2 : IN BIT; o1 : OUT BIT); END COMPONENT;
eq,
COMPONENT n3 PORT (i1 , i2 , i3 : IN BIT; o1 : OUT BIT); END COMPONENT;
lt : IN BIT;
FOR ALL: n1 USE ENTITY WORK.inv (single_delay);
a_gt_b,
FOR ALL: n2 USE ENTITY WORK.nand2 (single_delay);
a_eq_b,
FOR ALL: n3 USE ENTITY WORK.nand3 (single_delay);
a_lt_b : OUT BIT);
-- Intermediate signals
END bit_comparator
SIGNAL im1, im2, im3, im4, im5, im6, im7, im8, im9, im10: BIT;
BEGIN
-- a_gt_b output
G0: n1 PORT Map (a, im1);
G1: n1 PORT Map (b, im2);
G2: n2 PORT Map (a, im2, im3);
G3: n2 PORT Map (a, gt, im4);
G4: n2 PORT Map (im2, gt, im5);
G5: n3 PORT Map (im3, im4, im5, a_gt_b);
‫ادامه از صفحه قبل‬
‫‪-- a_eq_b output‬‬
‫;)‪G6: n3 PORT Map (im1, im2, eq, im6‬‬
‫;)‪G7: n3 PORT Map (a, b, eq, im7‬‬
‫;)‪G8: n2 PORT Map (im6, im7, a_eq_b‬‬
‫‪-- a_lt_b‬‬
‫;)‪G9: n2 PORT Map (im1, b, im8‬‬
‫;)‪G10: n2 PORT Map (im1, lt, im9‬‬
‫;)‪G11: n2 PORT Map (b, lt, im10‬‬
‫;)‪G12: n3 PORT Map (im8, im9, im10, a_lt_b‬‬
‫;‪END gate_level‬‬
‫این روش برای طرح های بزرگ و هنگامی که طراحان مختلف بر روی یک طرح کار‬
‫می کنند مناسب تر است‪.‬‬
‫در این روش (معماری ساختاری قطعه)‪ ،‬ابتدا اجزای مورد استفاده را معرفی‬
‫می کنیم‪.‬‬
‫سپس با مشخص کردن مرجع‪ ،‬در واقع محل تعریف این جزء را برای ‪ VHDL‬مشخص می‬
‫‪Test Bench‬‬
‫بعد از نوشتن یک کد ‪ VHDL‬و قبل از پیاده سازی آن بر روی ‪ FPGA‬معموال الزم است تا‬
‫از صحت عملکرد آن در شرایط مختلف ورودی اطمینان حاصل کنیم‪.‬‬
‫یکی از روش های تایید درستی طرح‪ ،‬نوشتن برنامه یک مدل آزمایشی برای تست و بررسی‬
‫خروجی های ناشی از کد مورد نظر است‪.‬‬
‫این کار به معنای طراحی یک محیط آزمایشی است که هم سیگنال های ورودی را در‬
‫اختیار می گذارد و هم سیگنال های خروجی طرح را مورد آزمایش قرار می دهد‪.‬‬
‫بررسی وضعیت ورودی و خروجی ها در یک نرم افزار شبیه ساز انجام می شود‪ .‬یکی از‬
‫معروفترین نرم افزار های شبیه سازی ‪ ModelSim‬می باشد‪.‬‬
‫مزایای شبیه سازی‪:‬‬
‫‪ .1‬محرک های اجزای ترکیبی توسط مدل هایی که بیانگر سیگنال های‬
‫حقیقی هستند تولید می شوند‪.‬‬
‫‪ .2‬نیازی به تکنولوژی و اجزای جانبی دیگری ندارد‪.‬‬
‫‪ .3‬سرعت شبیه سازی باالست‬
‫معایب شبیه سازی‪:‬‬
‫‪ .1‬به هر حال کار اضافی است و زمانبر است‪.‬‬
‫‪ .2‬چون خود نوشتن این برنامه تست هم توسط خود طراح نوشته می شود ممکن است‬
‫مشابهی تکرار‬
‫اشتباهات‬
‫شود‪.‬دو بخش تشکیل می شود‪.‬‬
‫آزمایش از‬
‫کلی‪ ،‬محیط‬
‫در حالت‬
‫‪ .1‬بخش تولید سیگنال های ورودی و ارتباط آن به مدار مورد نظر‪‘1’ AFTER 5 ns,‬‬
‫‪ .2‬چک کردن سیگنال های خارج شده از سیستم‬
‫بخش ‪ :1‬چگونگی تولید سیگنال های ورودی‬
‫=< ‪In_model‬‬
‫‪‘0’ AFTER 100 ns,‬‬
‫‪‘1’ AFTER 200 ns,‬‬
‫;‪‘0’ AFTER 300 ns + 4 ns‬‬
‫در این مثال‪ ،‬سیگنال ‪ clk‬بعد از هر ‪ 50‬نانو ثانیه عکس می شود‪.‬‬
‫;‪Clk <= NOT clk AFTER 50 ns‬‬
‫اگر در تعریف این سیگنال از نوع ‪ std_logic‬استفاده شود ممکن است مشکلی به صورت‬
‫کلیه آید‪.‬‬
‫‪ VHDL‬وجود‬
‫زیر به‬
‫سیگنال ها دارای مقدار اولیه پیش فرضی معادل سمت چپ ترین ارزش‬
‫در‬
‫در تعریف نوع داده اند‪.‬‬
‫در حالت ‪ Bit‬مقدار اولیه صفر و لی در حالت ‪ std_logic‬مقدار اولیه ’‪ ‘U‬خواهد بود‪.‬‬
‫’‪SIGNAL clk: STD_LOGIC := ‘0‬‬
‫برای حل این مشکل باید در تعریف سیگنال مقدار اولیه مورد نظر را نیز اعمال‬
‫کنیم‪.‬‬
‫‪“00” AFTER 5 ns,‬‬
‫=< ‪In_vect‬‬
‫‪“01” AFTER 100 ns,‬‬
‫‪“10” AFTER 200 ns,‬‬
‫‪PROCESS‬‬
‫;‪“11” AFTER 300 ns + 4 ns‬‬
‫‪BEGIN‬‬
‫;’‪in_s1 <= ‘1‬‬
‫چنانچه المان تست شونده ترتیبی باشد‪ ،‬از دستور‬
‫‪ wait‬برای نسبت دادن سیگنال ها به ورودی استفاده‬
‫می شود‪.‬‬
‫;’‪in_s2 <= ‘0‬‬
‫;’‪WAIT UNTIL reset = ‘1‬‬
‫;’‪WAIT UNTIL clk= ‘1‬‬
‫;’‪in_s1 <= ‘0‬‬
‫;’‪in_s2 <= ‘1‬‬
‫یک روش دیگر برای انتظار لبه پالس ساعت‪ ،‬تولید زمان دوره تناوب آن است‪ .‬با این‬
‫ندارد‪.‬‬
‫سیگنال‬
‫نیازی به‬
‫رفتاری دیگر‬
‫روش‬
‫‪ Clk‬پالس‬
‫چندین‬
‫اندازه‬
‫انتظار به‬
‫مدل امکان‬
‫البته‬
‫ساعت هم وجود دارد‪.‬‬
‫;‪CONSTANT period : TIME := 50 ns‬‬
‫;‪WAIT FOR period‬‬
‫;‪WAIT FOR 2 * period‬‬
‫محیط های آزمایش به سه کالس تقسیم بندی می شوند‪.‬‬
‫در کالس اول که ساده ترین کالس است‪ ،‬تنها سیگنال های ورودی مدل تولید می شوند و‬
‫سیگنال های خروجی به صورت دستی و در محیط شبیه ساز مورد بررسی قرار می گیرند‪.‬‬
‫این روش ساده و در عین حال برای مدارهای ساده بسیار مفید است‪.‬‬
‫البته در مدارهای با تعداد زیاد ورودی و خروجی عمال کاربردی ندارد‪.‬‬
‫در کالس ‪ 2‬نه تنها سیگنال های ورودی تولید می شوند بلکه درستی ارزش سیگنال های‬
‫‪Test_My_comp‬‬
‫شوند‪.‬‬
‫خروجی هم بررسی می‬
‫;‪LIBRARY ieee‬‬
‫;‪USE ieee.std_logic_1164.ALL‬‬
‫تحلیل زمانی هم در برنامه صورت می گیرد‪.‬‬
‫در کالس ‪3‬‬
‫‪My_comp‬‬
‫‪ENTITY test_my_comp IS‬‬
‫;‪PORT (d_out, en, overflow : OUT std_logic‬‬
‫‪q:‬‬
‫;))‪OUT std_logic_vector (2 DOWNTO 0‬‬
‫‪clk‬‬
‫;‪END‬‬
‫‪D_out‬‬
‫‪ARCHITECTURE testbench OF test_my_comp IS‬‬
‫‪resetn‬‬
‫‪en‬‬
‫‪COMPONENT my_comp‬‬
‫‪D_in‬‬
‫‪overflow‬‬
‫‪PORT (clk, resetn, d_in :‬‬
‫;‪IN std_logic‬‬
‫‪a‬‬
‫‪a, b:‬‬
‫;)‪IN std_logic_vector (2 DOENTO 0‬‬
‫‪q‬‬
‫‪d_out, en:‬‬
‫;‪OUT std_logic‬‬
‫‪b‬‬
‫‪overflow:‬‬
‫;‪OUT std_logic‬‬
‫‪q:‬‬
‫;)‪OUT std_logic_vector (2 DOWNTO 0‬‬
‫;‪END component‬‬
SIGNAL clk:
std_logic:= ‘0’;
SIGNAL resetn:
std_logic:= ‘0’;
SIGNAL d_in:
std_logic:= ‘0’;
SIGNAL a, b:
std_logic_vector (2 DOENTO 0);
FOR U1: my_comp USE ENTITY work.my_comp (rtl);
BEGIN
U1: my_comp PORT MAP (clk, resetn, d_in, a, b, d_out, en, overflow, q);
clk <= NOT clk AFTER 50 ns;
resetn <= ‘1’ AFTER 125 ns;
a <=
“000”,
“010” AFTER 125 ns,
“100” AFTER 175 ns;
b <=
“000”,
“100” AFTER 125 ns,
“011” AFTER 175 ns;
PROCESS
BEGIN
d_in <= ‘0’;
WAIT UNTIL resetn = ‘1’;
d_in <= ‘1’;
WAIT UNTIL clk = ‘1’;
d_in <= ‘0’ AFTER 10 ns;
WAIT;
END PROCESS;
END;
‫تمرین ‪ :1‬یک جمع کننده ‪ 4‬بیتی بسازید‪ .‬این جمع کننده باید دو عدد چهار بیتی‬
‫دودویی را به عنوان ورودی دریافت کرده و حاص جمع آن را در خروجی نمایش دهد‪.‬‬
‫تمرین ‪ :2‬ماژولی بسازید که ‪ 8‬ورودی و ‪ 3‬خروجی دارد‪ .‬مدار مورد نظر باید تعداد‬
‫صفرهای داده ورودی را بشمارد و تعداد صفرها را به صورت دودویی در خروجی خود نشان‬
‫دهد‪.‬‬
‫تمرین ‪ :3‬یک شیفت رجیستر ‪ 4‬بیتی شامل ورودی ریست آسنکرون طراحی کنید‪.‬‬
‫تمرین ‪ :4‬یک مدار شمارنده ‪ BCD‬با لبه های باال رونده و پایین رونده کالک طراحی‬
‫کنید‪ .‬این مدار‪ 1 ،‬ورودی کالک و ‪ 4‬خروجی برای شمردن دارد‪ .‬با هر بار لبه باال‬
‫رونده یا پایین رونده کالک‪ ،‬خروجی یک واحد افزایش می یابد‪.‬‬