توسط احمد ثقفی 

19 مرداد, 1395

خطای کدنویسی

آیا به تازگی شروع به کدنویسی به زبان VHDL کرده‌اید و بعد از نوشتن هر کد با انواع پیام‌های مربوط به خطای کدنویسی روبرو می‌شوید؟

آیا این پیام‌ها شما را سردرگم کرده‌اند و نمی‌دانید چگونه آنها را برطرف کنید؟

در این مقاله، ۱۰ خطای کدنویسی رایج به زبان VHDL را معرفی خواهم کرد و برای هر خطا، دلیل رخ دادن آن، متن پیام خطا، و نحوه برطرف کردن آن را توضیح خواهم داد.

More...

برای دانلود فایل PDF این مقاله، روی دکمه زیر کلیک کنید:

اولین مرحله بعد از نوشتن یک کد توصیف سخت‌افزاری به زبان VHDL، بررسی خطاهای کدنویسی است. برای این منظور، می‌توانید در نرم‌افزار ISE از گزینه Check Syntax استفاده کنید. خطاهایی که در این مرحله گزارش می‌شوند مربوط به Syntax یا عباراتی است که شما در کد به کار برده‌اید. مثلا املای غلط یک ساختار یا عبارت توصیفی می‌تواند باعث ایجاد یک خطای Syntax شود. فراموش کردن پرانتز یا نقطه‌ویرگول، عدم تعریف یک سیگنال یا ماجول که در کد استفاده شده است هم می‌تواند باعث ایجاد این خطا شود.

برای آشنایی با نرم‌افزار ISE این برنامه ویدئویی را ببینید…

اما خطاهای کدنویسی محدود به خطاهای Syntax نمی‌شوند. مثلا در مرحله سنتز، یعنی زمانی که مطمئن هستید کد شما از لحاظ Syntax دارای خطایی نیست هم ممکن است خطاهای دیگری وجود داشته باشد. به عنوان نمونه، اگر در محیط Concurrent به یک سیگنال، بیش از یک بار ارجاع انجام دهید، با خطای Multiple Resource Assignment مواجه خواهید شد.

به همین ترتیب، در مراحل Map و Routing هم خطاهای کدنویسی مختص همان مراحل ممکن است ایجاد شود. بعضی از این خطاها حتی ممکن است در کد VHDL رخ ندهد و مربوط به فایل UCF باشد. مثلا اگر شما در فایل UCF، شماره پینی را ذکر کنید که در FPGA انتخاب شده در پروژه وجود نداشته باشد، با خطایی مواجه خواهید شد که به شما اعلام می‌کند چنین مکانی در FPGAای که شما انتخاب کرده‌اید وجود ندارد.

 

انواع پیام‌ها در نرم‌افزار ISE

بعد از وارد کردن یک کد توصیف سخت‌افزاری در نرم‌افزار ISE و زمانی که مراحل Check Syntax، سنتز، جانمایی، مسیریابی و ساخت فایل پیکره‌بندی یا همان bit file را انجام می‌دهید، با انواع پیام‌ها از جانب نرم‌افزار ISE روبرو می‌شوید. این پیام‌ها در پنجره console که در پایین پنجره اصلی قرار دارد ظاهر می‌شوند. به طور کلی، این پیام‌ها به سه دسته تقسیم می‌شوند: اطلاعات یا Info، هشدار یا Warning و خطا یا Error.

اطلاعات یا Info پیام‌هایی هستند که نرم‌افزار ISE به شما اعلام می‌کند تا شما را از بعضی اتفاقات مهم که در هنگام انجام مراحل پیاده‌سازی افتاده است با خبر کند. اصولا لازم نیست که شما در قبال این اطلاعات عمل خاصی انجام دهید و فرآیند پیاده‌سازی به طور عادی انجام می‌شود.

هشدار یا Warning پیام‌هایی هستند که نرم‌افزار ISE به شما اعلام می‌کند تا آنها را بررسی کنید و در صورت لزوم دست به تغییراتی در کد بزنید. البته هشدارها باعث توقف فرآیند پیاده‌سازی نمی‌شوند و در صورتیکه که در هنگام پیاده‌سازی یک کد، فقط با هشدارها مواجه شوید، مدار به طور کامل و بدون مشکل، پیاده‌سازی خواهد شد. با این حال، ممکن است نتیجه نهایی با آنچه شما در ذهن داشته‌اید به طور کامل همخوانی نداشته باشد.

به عنوان مثالی از هشدار در مرحله سنتز، فرض کنید شما سیگنالی را در کد VHDL تعریف کرده‌اید اما از آن یا بخشی از آن استفاده نکرده‌اید. شما ممکن است عمدا از این سیگنال استفاده نکرده باشید یا شاید هم فراموش کرده باشید تا آن را در کد به کار ببرید. در هر صورت، نرم‌افزار در مرحله سنتز به شما هشدار می‌دهد که سیگنالی در کد شما وجود دارد که استفاده نشده است. شما این هشدار را بررسی می‌کنید. اگر فراموش کرده‌اید که از آن سیگنال استفاده کنید، قاعدتا آن را در جایی از کد به کار خواهید برد. در غیر این صورت، می‌توانید این پیام هشدار را نادیده بگیرید.

خطاها یا Error پیام‌هایی هستند که در صورت وقوع، باعث توقف فرآیند پیاده‌سازی می‌شوند. این نوع پیام‌ها اصولا مربوط به مواردی هستند که با اصول پیاده‌سازی در تناقض هستند. مثلا اگر شما به یک سیگنال در محیط Concurrent بیش از یک بار ارجاع دهید، با خطا روبرو می‌شوید و فرآیند سنتز هم متوقف خواهد شد. در هنگام مواجه شدن با یک خطای کدنویسی مجبور هستید آنها را حتما برطرف کنید تا بتوانید کدتان را به طور کامل و صحیح پیاده‌سازی کنید.

 

خطاهای کدنویسی رایج در زبان VHDL

همانطور که در ابتدای این مقاله هم اشاره کردم، خطاها ممکن است در هر کدام از مراحل منجر به پیاده‌سازی رخ دهند. در این مقاله، به بررسی ۱۰ خطای رایج کدنویسی در زبان VHDL خواهم پرداخت.

 

خطای شماره ۱: نقطه‌ویرگول یا پرانتز یا بخشی از ساختار فراموش شده است

ERROR : HDLCompiler:806 – “D:\Project\example.vhd” Line 77: Syntax error near “if”.

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن یا نزدیک آن رخ داده است در این پیام مشخص شده است. عنوان این خطا Syntax error near W است که به جای W یکی از کلمات موجود در کد که نزدیک محل خطا است قرار می‌گیرد. در پیام فوق، خطا نزدیک عبارت if در کد رخ داده است.

مرحله رخداد: Check Syntax – کامپایل

دلیل بروز خطا: فراموش کردن تایپ پرانتز، ویرگول یا نقطه‌ویرگول یا بخشی از ساختارهای استفاده شده در کد. مثلا ممکن است در ساختار if-then-else عبارت then فراموش شود.

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

 

خطای شماره ۲: استفاده از سیگنال تعریف نشده

ERROR : HDLCompiler:69 – ” D:\Project\example.vhd” Line 43: <my_signal> is not declared.

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا <my_signal> is not declared است که my_signal اشاره دارد به سیگنالی که در کد استفاده شده است اما تعریف نشده است.

مرحله رخداد: Check Syntax – کامپایل

دلیل بروز خطا: از سیگنالی در کد استفاده شده است که تعریف نشده است.

نحوه برطرف کردن خطا: ابتدا بررسی کنید که سیگنال مورد نظر، باید دارای چه نوع و عرض بیتی باشد. سپس آن را در محل تعریف سیگنال‌ها، یعنی قبل از begin بخش architecture تعریف کنید.

 

خطای شماره ۳: پکیجی که صدا نشده است

ERROR : HDLCompiler:69 – ” D:\Project\example.vhd” Line 16: <unsigned> is not declared.

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا <unsigned> is not declared است که unsigned اشاره دارد به یک type یا نوع که در کد استفاده شده است اما تعریف نشده است. این نوع و نوع signed در پکیج numeric_std تعریف شده‌اند و اگر شما فراموش کنید که این پکیج را در ابتدای کد صدا بزنید، با این پیام مواجه خواهید شد.

مرحله رخداد: Check Syntax – کامپایل

دلیل بروز خطا: از انواع signed یا unsigned استفاده شده است اما پکیج مربوط به آنها که numeric_std نام دارد در ابتدای کد صدا نشده است.

نحوه برطرف کردن خطا: کافیست عبارت زیر را در ابتدای کد بنویسید تا پکیج numeric_std صدا شود:

use ieee.numeric_std.all;

 

خطای شماره ۴: مقداردهی اولیه چندبیتی به سیگنال تک‌بیتی

ERROR : HDLCompiler:837 – “D:\Project\example.vhd” Line 26: Type std_logic does not match with a string literal

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا Type std_logic does not match with a string literal است.

مرحله رخداد: Check Syntax – کامپایل

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

نحوه برطرف کردن خطا: به سیگنال تک‌بیتی که دارای ارجاع غلط است، یک مقدار تک‌بیتی ارجاع دهید:

signal   my_signal : std_logic := ‘۰’;

 

خطای شماره ۵: ارجاع یک سیگنال به سیگنالی با نوع (type) متفاوت

ERROR : HDLCompiler:1728 – “D:\Project\example.vhd” Line 83: Type error near my_signal ; current type unsigned; expected type signed

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطاType error near my_signal ; current type unsigned; expected type signed است که در آن عبارت my_signal اشاره دارد به نام سیگنالی که خطا روی آن رخ داده است.

مرحله رخداد: Check Syntax – کامپایل

دلیل بروز خطا: این خطا وقتی رخ می‌دهد که شما یک سیگنال با نوع signed را به یک سیگنال با نوع unsigned ارجاع دهید یا بالعکس.

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

 

خطای شماره ۶: ارجاع یک سیگنال به سیگنالی با عرض بیت متفاوت

ERROR:HDLCompiler:410 – “D:\Project\example.vhd” Line 88: Expression has 8 elements ; expected 3

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا Expression has 8 elements ; expected 3 است که در آن عدد ۸ اشاره به عرض بیت سیگنال سمت راست ارجاع و عدد ۳ اشاره به عرض بیت سیگنال سمت چپ ارجاع دارد.

مرحله رخداد: سنتز

دلیل بروز خطا: این خطا وقتی رخ می‌دهد که شما یک سیگنال را به سیگنالی با عرض بیت متفاوت ارجاع دهید.

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

 

خطای شماره ۷: عبارت when others در ساختار case فراموش شده است

ERROR : HDLCompiler:299 – “D:\Project\example.vhd” Line 79: case statement does not cover all choices. ‘others’ clause is needed

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا case statement does not cover all choices. ‘others’ clause is needed است.

مرحله رخداد: سنتز

دلیل بروز خطا: شروطی که در عبارت case در زبان VHDL به کار می‌رود باید تمام حالات سیگنال شرط را بپوشاند. چون در عمل معمولا چنین چیزی ممکن نیست، از عبارت when others به عنوان آخرین شرط این عبارت استفاده می‌شود. این خطا وقتی رخ می‌دهد که شما فراموش کرده باشید از عبارت when others به عنوان آخرین شرط در ساختار case استفاده کنید.

نحوه برطرف کردن خطا: عبارت when others را به عنوان آخرین شرط در ساختار case قرار دهید.

 

خطای شماره ۸: ارجاع بیش از یک بار در محیط Concurrent به یک سیگنال

ERROR : HDLCompiler:1401 – “D:\Project\example.vhd” Line 68: Signal my_signal in unit my_module is connected to following multiple drivers:

شرح پیام: آدرس فایل VHDL یا ماجولی که خطا در آن رخ داده است به همراه سطری که خطا در آن رخ داده است در این پیام مشخص شده است. عنوان این خطا Signal my_signal in unit my_module is connected to following multiple drivers است. در این پیام، my_signal اشاره دارد به سیگنالی که ارجاع بیش از یک بار به آن رخ داده است و my_module اشاره دارد به ماجولی که این خطا در آن رخ داده است.

مرحله رخداد: سنتز

دلیل بروز خطا: در زبان VHDL، به یک سیگنال می‌توان به هر تعداد بار در محیط Process ارجاع داد. اما به یک سیگنال می‌توان فقط یک بار در محیط Concurrent ارجاع داد. همچنین اگر به سیگنالی در محیط Process ارجاع شد، نمی‌توان به آن در محیط Concurrent ارجاع داد و بالعکس. اگر هر کدام از این قوانین نقض شوند، پیام خطای ارجاع چندگانه رخ خواهد داد.

نحوه برطرف کردن خطا: باید کد را بررسی کرد و با توجه به شرایط مساله، فقط در یک از محیط‌های Concurrent یا Process به سیگنال ارجاع داد.

 

خطای شماره ۹: اتصال یک پورت به پایه‌ای که در FPGA وجود ندارد

ERROR : MapLib:30 – LOC constraint P200 on my_port is invalid: No such site on the device.

شرح پیام: عنوان این خطا LOC constraint P200 on my_port is invalid: No such site on the device است. در این پیام، my_ port اشاره دارد به پورتی در entity که خطا در مورد اتصال آن با یکی از پین‌های FPGA رخ داده است.

مرحله رخداد: Map

دلیل بروز خطا: در زبان VHDL و در نرم‌افزار ISE، در فایل UCF مشخص می‌شود که پورت‌های ماجول به کدام پین‌های FPGA متصل می‌شوند. اگر در این فایل، شماره پینی به کار رود که در FPGA انتخاب شده در نرم‌افزار وجود نداشته باشد، خطای فوق رخ می‌دهد.

نحوه برطرف کردن خطا: با بررسی شماره پین‌های FPGA و بردی که FPGA روی آن نصب شده است باید شماره پین صحیح را پیدا کرد و در فایل UCF وارد کرد.

 

خطای شماره ۱۰: عدم ارجاع به پورت خروجی

ERROR : PhysDesignRules:368 – The signal <my_signal_OBUF> is incomplete. The signal is not driven by any source pin in the design.

شرح پیام: عنوان این خطا The signal <my_signal_OBUF> is incomplete. The signal is not driven by any source pin in the design است. در این پیام، my_signal اشاره دارد به پورتی در entity که هیچ سیگنالی به آن ارجاع نشده است.

مرحله رخداد: ساخت فایل پیکره‌بندی یا bit file

دلیل بروز خطا: در زبان VHDL و در نرم‌افزار ISE، به پورتی که به صورت خروجی در entity تعریف شود باید یک سیگنال یا یک مقدار را ارجاع داد. در صورتیکه به یک پورت خروجی هیچ مقداری ارجاع داده نشود، این پیام خطا ظاهر می‌شود.

نحوه برطرف کردن خطا: با توجه به شرایط مساله، باید مقدار مناسبی را به پورت خروجی که خطا در مورد آن رخ داده است ارجاع داد.

دیباگ کد VHDL

استراتژی برطرف کردن خطاها

وقتی برای بار اول کدی را در نرم‌افزار ISE وارد می‌کنید، ممکن شامل ده‌ها خطای کدنویسی باشد. بسیاری از این خطاها به یکدیگر ارتباط دارند و با برطرف شده یکی از آنها، ممکن است تعداد زیادی از آنها خود به خود برطرف شوند. اما برای استفاده از این خاصیت، باید به روش زیر عمل کنید:

برای برطرف کردن خطاها، همواره از اولین خطا شروع کنید.

لیست خطاها در پنجره Console قرار دارند و با توجه به اینکه این پنجره بسیار کوچک است و تعداد خطاهای کد شما ممکن است در این پنجره جا نشوند، باید حتما محتوای پنجره را به سمت بالا اسکرول کنید تا به اولین پیام خطا برسید.

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

بعد از برطرف کردن اولین خطا، به جای اینکه فورا شروع به بر طرف کردن خطاهای بعدی کنید، فایل را ذخیره کنید و مجددا فرآیند پیاده‌سازی را انجام دهید. در این حالت، ممکن است به جای یک خطا، تعداد زیادی خطا برطرف شده باشد. حال می‌توانید به سراغ اولین خطای موجود بروید و مجددا مراحل برطرف کردن خطا را تکرار کنید.

سعی کنید هر بار که یک خطا را برطرف می‌کنید، پیام خطا را به طور کامل بخوانید و کمی به مفهوم آن فکر کنید. با این کار، بعد از مدتی با پیام‌های خطا آشنا می‌شوید و در بسیاری از موارد می‌توانید فقط با خواندن پیام خطا و بدون مشاهده کد، خطای رخ داده و نحوه برطرف کردن آن را حدس بزنید.

پیام‌های خطایی که در این مقاله به معرفی آنها پرداختم، تنها بخشی از خطاهایی است که ممکن است در هنگام پیاده‌سازی مدارات دیجیتال به کمک زبان VHDL و در نرم‌افزار ISE با آنها برخورد کنید. البته این ۱۰ خطایی که در این مقاله انتخاب شده‌اند، جزء رایج‌ترین خطاهایی هستند که شما با آنها برخورد خواهید کرد. برای آشنایی بیشتر با این ۱۰ خطا و دیگر خطاها می‌توانید در حالی که کامپیوترتان به اینترنت متصل است، روی کلمه قرمز رنگ ERROR در پنجره Console کلیک کنید.

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

 

آیا مقاله ۱۰ خطای کدنویسی رایج در زبان VHDL برای شما مفید بود؟

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

کانال تلگرام آموزش FPGA از صفر

برای عضویت در کانال تلگرام و دسترسی به آموزش‌های بیشتر و اطلاع سریع از زمان انتشار آموزش‌ها و تخفیف‌های ویژه، روی دکمه زیر کلیک کنید:

شاید به این موضوعات نیز علاقه داشته باشید:

  • احسن بسیار مقاله خوب و مفیدی بود …
    مخصوصا قسمت آخر که اشاره به استراتژی خطایابی کردید …
    تشکر

  • سلام خسته نباشید سوالی داشتم من در پروژه بسیار ساده ای چند پورت تعریف کردم مثل زیر :
    ;A:in std_logic
    ;B:in std_logic
    C:out std_logic
    بعد در قسمت begin
    به این صورت نوشتم :
    ;C <= A AND B
    و در قسمت UCF به این صورت نوشتم :
    ;"NET "A" LOC="F12
    ;"NET "B" LOC="G12
    ;"NET "C" LOC="K12
    اما هنگام ساخت بیت فایل ارور IO STANDARD دریافت میکنم البته اینم بگم من FPGA ندارم و فقط یکسری F12 و G12 و K12 رو از خودم نوشتم میشه لطفا بگین چطور ارور رو برطرف کنم ؟

    • سلام،

      در همان فایل UCF باید قیدهای مربوط به تعیین استاندارد پین‌هایی که استفاده کرده‌اید را هم اضافه کنید.

      موفق باشید.

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

    ۷ تکنیک پیشرفته کدنویسی برای FPGA

    >