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

13 شهریور, 1396

درستی‌آزمایی مدار دیجیتال

چطور از یک نرم‌افزار مدل‌سازی مثل متلب برای بررسی و اثبات صحت عملکرد مدار استفاده کنیم؟

شما یک ماجول دیجیتال را به کمک زبان VHDL یا Verilog پیاده‌سازی کرده‌اید. قاعدتا اولین چیزی که به دنبال آن هستید، این است که آیا این مدار درست کار می‌کند یا نه.

در مورد مدارات پیچیده، خصوصا مداراتی که یک الگوریتم پردازشی را پیاده‌سازی می‌کنند، نرم‌افزار متلب می‌تواند کمک زیادی به شما بکند.

More...

در این برنامه ویدئویی، به شما نشان می‌دهم چطور از متلب کمک بگیرید و به صورت حرفه‌ای از آن برای درستی‌آزمایی مدار دیجیتال استفاده کنید.

به همراه این برنامه ویدئویی، فایل‌های نمونه تست‌بنچ و مدل متلب را هم برای دانلود قرار داده‌ام تا بتوانید به کمک آنها ماجول‌های خودتان را تست کنید.

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

درستی‌آزمایی مدار دیجیتال فرآیندی است که به کمک آن می‌توانید به خودتان، مدیرتان یا کارفرمایتان اثبات کنید که مدار شما درست کار می‌کند.

برای آشنایی بیشتر در مورد مراحل ساخت و ارائه یک سیستم دیجیتال، این مقاله را مطالعه کنید…

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

نرم‌افزار متلب می‌تواند در این زمینه کمک زیادی به شما بکند.

در این برنامه، می‌آموزید چطور نتایج حاصل از شبیه‌سازی یک مدل متلب را در فایل متنی دخیره کنید. همچنین با شبیه‌سازی ماجول VHDL و ذخیره‌سازی نتایج آن در فایل متنی از طریق تست‌بنچ آشنا می‌شوید.

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

برای آشنایی با نحوه شبیه‌سازی مدار دیجیتال به کمک نرم‌افزار ISim این برنامه ویدئویی را ببینید…

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

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

ویدئو یا متن؟

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

برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:

در این مقاله قصد دارم در مورد موضوع بسیار مهم "درستی‌آزمایی مدار در پیاده‌‌سازی سیستم‌‌های دیجیتال" صحبت کنم.

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

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

در این مقاله، قصد دارم در مورد نحوه‌ی استفاده از نرم‌افزار متلب به عنوان مرجع و ابزاری برای انجام درستی‌‌آزمایی در فرآیند پیاده‌‌سازی مدارات دیجیتال به کمک FPGA صحبت کنم.

مروری کلی بر فرآیند درستی‌آزمایی

ابتدا فرآیند درستی‌‌آزمایی را یک بار با هم مرور می‌کنیم تا ببینیم منظور از درستی‌‌آزمایی چیست؟

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

برای درست کردن چنین مدلی، ممکن است از نرم‌افزار متلب یا حتی یک زبان برنامه‌‌نویسی، مانند زبان C استفاده کنید.

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

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

فرض کنید شما در نرم افزار ISE به زبان VHDL یا Verilog، ماجول خودتان را پیاده‌‌سازی کرده‌اید. بعد از پیاده‌‌سازی ماجول، باید آن را شبیه‌‌سازی کنید. برای شبیه‌‌سازی، نیاز به ایجاد یک تست‌‌بنچ دارید و باید ورودی‌‌های مورد نظرتان را درون تست‌‌بنچ به ماجول اعمال کنید.

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

دلیل این ذخیره‌‌سازی به صورت متن، این است که در آخرین مرحله‌‌ی کار بتوانیم نتیجه‌‌ی خروجی حاصل از اعمال یک ورودی یکسان به مدل سطح بالا و ماجول VHDL یا Verilog را با هم مقایسه کنیم.

پس از این مقایسه (که آن را به کمک نرم‌‌افزار متلب انجام می‌‌دهیم)، می‌‌توانیم مطمئن شویم که آیا عملکرد مداری که در نرم افزار ISE پیاده‌‌سازی کرده‌‌ایم، کاملاً مشابه عملکرد مدل ما در نرم‌‌افزار متلب یا C است یا خیر.

برای درک درست‌‌تر این موضوع، من شکل زیر را آماده کرده‌‌ام که ارتباط بین نرم‌‌افزار سطح بالایی چون متلب و نرم‌‌افزار پیاده‌‌سازی مثل ISE را در فرآیند درستی‌‌آزمایی به صورت کامل نشان می‌‌دهد.

نمایش نحوه‌ی ارتباط نرم‌افزار متلب و ISE در فرایند درستی‌آزمایی

نحوه‌ی ارتباط نرم‌افزار متلب و ISE در فرایند درستی‌آزمایی مدار در پیاده‌‌سازی سیستم‌‌های دیجیتال

این شکل توسط یک خط‌‌چین به دو بخش تقسیم شده است؛ بخش بالا مربوط به مراحلی است که در نرم‌‌افزار متلب انجام می‌‌دهیم. بخش پایین مربوط به مراحلی است که در نرم‌‌افزار ISE انجام می‌‌دهیم.

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

پس از اطمینان از درستی مدل‌تان در نرم‌‌افزار متلب، باید ورودی و خروجی را در فایل‌های متنی جداگانه ذخیره کنید.

پس از آن، به سراغ نرم‌‌افزار ISE می‌‌رویم و ماجول‌‌مان را به کمک زبان VHDL یا Verilog پیاده‌‌سازی می‌‌کنیم.

سپس باید به کمک تست‌‌بنچ، این ماجول را در نرم‌‌افزار ISE شبیه‌‌سازی کنیم. در این مرحله باید دقیقاً همان ورودی‌‌هایی را که به مدل متلب اعمال کرده بودیم، به ماجول VHDL یا Verilog اعمال کنیم.

بنابراین، ورودی‌‌ها را به کمک تست‌‌بنچ، از فایل متنی حاوی ورودی‌های متلب می‌‌خوانیم و به مدل VHDL یا Verilog اعمال می‌‌کنیم.

در هنگام شبیه‌‌سازی، خروجی ماجول VHDL را نیز در یک فایل متنی دیگر ذخیره می‌‌کنیم.

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

انتظار داریم اگر همه‌ی کارها را درست انجام داده باشیم، این دو خروجی کاملاً برهم منطبق شوند.

اجرای مراحل درستی‌آزمایی به کمک یک مثال

اجازه دهید که به کمک یک مثال، تمام این مراحل را به کمک نرم‌‌افزار متلب و نرم‌‌افزار ISE، یکبار با هم انجام دهیم.

مدل متلب

من قبلاً در نرم‌‌افزار متلب مدل ساده‌‌ای را آماده کرده‌‌ام که آن را در شکل زیر می‌‌بینید.

نمایش یک مدل ساده سیمولینک جهت به کارگیری در فرایند درستی‌آزمایی به کمک نرم‌افزار متلب

یک مدل نمونه در سیمولینک متلب

این مدل، یک مدل بسیار ساده است. هدف من از ایجاد آن، صرفا نشان دادن فرایند درستی‌آزمایی است.

در این مدل ساده، یک ورودی داریم که پس از اعمال به مدل، در مقدار ثابت هشت ضرب می‌شود.

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

نمایش پنجره‌ی تنظیمات بلوک Sine Wave در سیمولینک متلب

پنجره‌ی تنظیمات بلوک Sine Wave در متلب

همان‌‌طور که می‌‌بینید، دامنه‌‌ی این سیگنال سینوسی را ۸۰۰۰ تعیین کرده‌‌ام؛ زیرا می‌‌خواهم ورودی مدارم را ۱۴ بیتی قرار دهم. همچنین مقدار فرکانس را یک مگاهرتز مشخص کرده‌‌ام؛ عبارت 2*pi*1e6 نشان‌‌دهنده‌‌ی فرکانس یک مگاهرتز است.

با توجه به اینکه قرار است کلاکی با فرکانس ۱۰۰ مگاهرتز ایجاد کنم و به مدار اعمال کنم، در بلوک‌‌هایی که در نرم افزار متلب نیز شبیه‌‌سازی می‌‌کنم، Sample Time را روی ۱۰۰ مگاهرتز قرار می‌‌دهم که با مقادیری که قرار است بعداً به عنوان کلاک از آن استفاده شود، یکسان باشد.

مدل یا سیستم من در واقع فقط متشکل از یک ضرب‌‌کننده و یک مقدار ثابت هشت است؛ یعنی هر ورودی را در مقدار ثابت هشت ضرب می‌‌کنیم و به خروجی اعمال می‌‌کنیم. در سیستم، یک بلوک رُند‌‌کننده نیز قرار داده‌‌ام که سیگنالی که در ورودی ظاهر می‌‌شود را ابتدا رُند‌‌ کند و سپس به سیستم اعمال کنم؛ چون قرار است این ورودی را عیناً به ماجول HDL نیز اعمال کنم؛ بنابراین با رند کردن آن، بخش‌‌های اعشاری را از بین می‌‌برم.

شبیه‌سازی مدل متلب

برای اینکه بتوانم ورودی و خروجی مدار را هم‌‌زمان در یک Scope مشاهده کنم، از یک مالتی‌‌پلکسر دو به یک استفاده کرده‌‌ام. خروجی مدار را به ورودی اول مالتی‌‌پلکسر و ورودی مدار را نیز به ورودی دوم مالتی‌‌پلکسر داده‌‌ام. همچنین خروجی این مالتی‌‌پلکسر را به Scope متصل کرده‌‌ام.

اکنون با کلیک بر آیکن Run در بالای صفحه، شبیه‌‌سازی را اجرا می‌‌کنم.

نمایش نحوه‌ی Run کردن شبیه‌سازی در نرم‌افزار متلب

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

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

نمایش نحوه‌ی متوقف کردن شبیه‌سازی در نرم‌افزار متلب

متوقف کردن شبیه‌سازی مدل در نرم‌افزار متلب

اکنون به سراغ Scope می‌‌رویم تا ببینیم چه چیزی در آن دیده می‌‌شود؟

نمایش امواج رکورد شده توسط اسیلوسکوپ در نرم‌افزار متلب

امواج رکورد شده توسط اسیلوسکوپ در نرم‌افزار متلب

با گزینه zoom axis می‌‌توان سیگنال‌‌های Scope را باز کرد تا بهتر دیده شوند. به کمک گزینه‌ی zoom، شکل را بزرگ‌نمایی می‌کنیم.

نمایش امواج رکورد شده توسط اسیلوسکوپ در نرم‌افزار متلب

امواج رکورد شده توسط اسیلوسکوپ در نرم‌افزار متلب

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

ذخیره‌سازی ورودی‌ها و خروجی‌های مدل متلب

همان‌‌طور که قبلاً توضیح دادم، باید ورودی و خروجی این مدل را در فایل‌‌های متنی جداگانه‌‌ای ذخیره کنیم؛ برای این کار، از بلوک To-Workspace استفاده می‌‌کنیم؛ به این صورت که یک بلوک To-Workspace را در ورودی و یک بلوک را نیز در خروجی قرار می‌‌دهیم.

این بلوک‌‌ها در حین شبیه‌‌سازی، تمامی مقادیر موجود در ورودی‌شان را ذخیره می‌‌کنند. تنها تغییری که شما لازم است در این بلوک‌‌ها اعمال کنید، تعیین اسم متغیرها به صورت دلخواه است. من نام متغیرهای مربوط به ورودی و خروجی را به ترتیب Input_Vector و Output_Vector قرار داده‌‌ام.

نمایش محل قراردادن بلوک‌های To Workspace در مدل

محل قراردادن بلوک‌های To-Workspace در مدل

پس از قرار دادن بلوک‌‌های To-Workspace در نقاط مورد نظر، باید مدل را شبیه‌‌سازی و سپس مقادیر متغیرها را در یک فایل ذخیره کنید؛ برای ذخیره‌‌سازی متغیرها در فایل، من قبلاً یک m-file آماده کرده‌‌ام که کد آن را در شکل زیر می‌‌بینید.

%-- Log from MATLAB Model.

Input_Vec = Input_Vector.data(1:1000);
Output_Vec = Output_Vector.data(1:1000);

file_Input_Signal1 = fopen('\Example_Verification\Simple_Algorithm_MATLAB\Input_Vec.txt','w');
file_Input_Signal2 = fopen('\Example_Verification\Simple_Algorithm_MATLAB\Output_Vec.txt','w');

for i = 1:length(Input_Vec)
    fprintf(file_Input_Signal1,'%d\r\n',Input_Vec(i));
    fprintf(file_Input_Signal2,'%d\r\n',Output_Vec(i));
end;

fclose(file_Input_Signal1);
fclose(file_Input_Signal2);

%%

%-- Log from MATLAB Model and VHDL simulation.

file_Output_Signal_1 = fopen('E:\Example_Verification\Simple_Algorithm_MATLAB\Output_Vec.txt');
Output_Vec_Sig = fscanf(file_Output_Signal_1 , '%d');
fclose(file_Output_Signal_1);

file_Output_Signal_2 = fopen('E:\Example_Verification\Simple_Algorithm_MATLAB\Output_Vec_HDL.txt');
Output_Vec_Sig_HDL = fscanf(file_Output_Signal_2 , '%d');
fclose(file_Output_Signal_2);



plot(Output_Vec_Sig(10:500))
hold
plot(Output_Vec_Sig_HDL(13:503), 'ro')
legend('MATLAB Model','VHDL Module')

ما نام دو متغیرمان را Input_Vector و Output_Vector قرارداده بودیم. چون این متغیرها به صورت استراکچری هستند، برای جدا‌‌کردن بخش دیتای متغیر، باید عبارات Input_Vector.Data و Output_Vector.Data را در کدمان بنویسیم (خط سوم و چهارم کد).

با توجه به مدت زمانی که شبیه‌‌سازی را انجام داده‌‌ایم، تعداد زیادی نمونه در این متغیرها نوشته شده است که من می‌‌خواهم برای کاربرد خودم هزار نمونه از این متغیرها را جدا کنم؛ بنابراین در پرانتز عبارت 1:1000 را نوشتم (یعنی از نمونه‌‌ی یکم تا نمونه‌‌ی هزارم را جدا کن).

هم‌‌چنین حاصل را به متغیرهای جدیدی به‌‌نام‌‌های Input_Vect و Output_Vect منتقل می‌کنیم.

حالا می‌‌خواهم مقادیر این دو متغیر را در دو فایل جداگانه ذخیره کنم؛ بنابراین به کمک دستور fopen دو فایل به نام‌‌های Input_Vect.txt و Output_Vect.txt را در مُد Write باز می‌‌کنم (نوشتن W به معنی دستور برای باز کردن فایل در مُد Write است).

سپس یک حلقه For به طول هزار، برابر با طول Input_Vector باز می‌‌کنم. با دستور fprintf (در دو خط ۱۱اُم و ۱۲اُم کد)، از متغیر‌‌های Input_Vect و Output_Vect نمونه به نمونه می‌‌خوانم و آن‌‌ها را در فایل‌‌های Input_Vect.txt و Input_Vect.txt می‌‌نویسم.

در انتها، با دستور fclose این دو فایل را می‌‌بندم.

من در این کد از قابلیتی که در m-file برای تقسیم کد به بخش‌‌های مختلف وجود دارد، استفاده کرده‌‌ام؛ بدین صورت که با قرار دادن دو علامت % در m-file، آن را به دو بخش یا Section تقسیم کرده‌‌ام. با کلیک در محیط هر بخش، آن بخش انتخاب می‌شود و رنگ زمینه‌‌ی آن تیره‌‌تر می‌‌شود.

نمایش نحوه‌ی تقسیم کد متلب به چند زیر‌بخش برای شبیه‌سازی هر قسمت به صورت جداگانه

نحوه‌ی تقسیم کد متلب به چند زیر‌بخش

اما این قابلیت چه حسنی دارد؟ شما می‌‌تونید روی Section اول کلیک کنید و مطابق شکل زیر، از منوی بالای صفحه، گزینه Run Section را انتخاب کنید. در این صورت به‌‌جای شبیه‌‌سازی کل m-file، فقط Sectionای که فعال شده است، شبیه‌‌سازی می‌‌شود.

نمایش نحوه‌ی شبیه‌سازی هر قسمت از کد متلب به صورت جداگانه

نحوه‌ی شبیه‌سازی یک قسمت از کد متلب

من Section اول m-file را انتخاب و شبیه‌‌سازی می‌‌کنم تا دیتا درون دو فایل تعیین شده ذخیره شود. اکنون به سراغ دیدن محتوای این دو فایل می‌‌رویم.

به فولدری که آدرسش را به هنگام باز کردن فایل‌‌ها در کد داده بودم، می‌‌روم. در این فولدر، فایل‌‌های Input_Vect.txt و Output_Vect.txt ساخته شده‌‌اند. اگر فایل مربوط به داده‌‌ی ورودی را با دبل کلیک باز کنیم، Sampleهای سیگنال حاصل‌‌ضرب سینوس در پالس مربعی را می‌‌بینیم. همچنین در فایل داده‌‌ی خروجی، هشت برابر شده‌‌ی ورودی را می‌‌بینیم.

نمایش متغیرهای خروجی در فایل متنی

متغیرهای خروجی ذخیره شده در فایل متنی

نمایش متغیرهای ورودی در فایل متنی

متغیرهای ورودی ذخیره شده در فایل متنی

پیاده‌سازی مدل به کمک نرم‌افزار ISE

اکنون باید بر مبنای مدلی که در Simulink ایجاد کرده بودیم، کد مدل VHDL را بنویسیم. این کد را در شکل زیر می‌‌بینیم.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Top_Module is

    Port ( 
        Clock         : in  STD_LOGIC;
        Input_Signal  : in  signed  (13 downto 0);
        Output_Signal : out signed  (16 downto 0)
			);
			
end Top_Module;

architecture Behavioral of Top_Module is

	signal	Input_Signal_Int	:	signed				(13 downto 0)				:=	(others=>'0');
	signal	Output_Signal_Int	:	signed				(16 downto 0)				:=	(others=>'0');
begin
	Output_Signal						<=	Output_Signal_Int;
	process(Clock)
	begin
		if rising_edge(Clock) then
		
			Input_Signal_Int		<=	Input_Signal;
			Output_Signal_Int		<=	Input_Signal_Int & "000";
		
		end if;
	end process;
end Behavioral;

همان‌‌طور که در کد مشاهده می‌‌شود، ورودی را به صورت علامت‌‌دار ۱۴ بیتی و خروجی را به صورت علامت‌‌دار ۱۷ بیتی در نظر گرفته‌‌ایم. با توجه به این که سیگنال ورودی در هشت ضرب می‌‌شود، نیاز است که به خروجی سه بیت اضافه کنیم.

یک process بسیار ساده در کد می‌‌بینیم که در آن، ابتدا ورودی را طبق الگوی استاندارد کدنویسی رجیستر کرده‌‌ایم. برای ایجاد خروجی، کافی است که سه عدد صفر در سمت راست ورودی قرار دهیم؛ درواقع، سه Shift در ورودی ایجاد می‌‌کنیم. هر Shift به سمت چپ، یک ضرب‌‌در دو محسوب می‌‌شود. پس سه Shift برابر با ضرب‌‌در هشت می‌‌شود. همچنین طبق الگوی استاندارد کدنویسی در خط ۲۰اُم و در محیط Concurrent، سیگنال Output_Signal_Int را به پورت خروجی اعمال می‌‌کنیم.

به این ترتیب، با این مدار ساده، ورودی را در هشت ضرب می‌‌کنیم و سپس به خروجی اعمال می‌‌کنیم.

ایجاد تست‌بنچ و شبیه‌سازی در نرم‌افزار ISIM

پس از مرحله‌ی پیاده‌‌سازی، نیاز به ایجاد یک تست‌‌بنچ داریم. باید تست‌‌بنچ را طبق روشی که به صورت استاندارد انجام می‌‌شود، ایجاد کنید. در شکل زیر، تست‌‌بنچ مدار را با تغییراتی که در ادامه توضیح خواهم داد، می‌‌بینید.

برای مشاهده کد کلیک کنید...

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

use ieee.std_logic_textio.all;
use std.textio.all;
 
ENTITY Simple_Algorithm_VHDL_tb IS
END Simple_Algorithm_VHDL_tb;
 
ARCHITECTURE behavior OF Simple_Algorithm_VHDL_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT Top_Module
    PORT(
         Clock : IN  std_logic;
         Input_Signal : IN  signed(13 downto 0);
         Output_Signal : OUT  signed(16 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal Clock : std_logic := '0';
   signal Input_Signal : signed(13 downto 0) := (others => '0');

 	--Outputs
   signal Output_Signal : signed(16 downto 0);

   -- Clock period definitions
   constant Clock_period : time := 10 ns;
 
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: Top_Module PORT MAP (
          Clock => Clock,
          Input_Signal => Input_Signal,
          Output_Signal => Output_Signal
        );

   -- Clock process definitions
   Clock_process :process
   begin
		Clock <= '0';
		wait for Clock_period/2;
		Clock <= '1';
		wait for Clock_period/2;
   end process;
 
 
 

	Read_Input_Vector: process(Clock)
	
		file		input_text	: text open read_mode is "E:\Example_Verification\Simple_Algorithm_MATLAB\Input_Vec.txt";
		variable LI1			: line;
		variable LI1_var		: integer;
		
	begin
	
		if rising_edge(Clock) then
		
			readline(input_text,LI1);
			read(LI1,LI1_var);
			Input_Signal				<= to_signed(LI1_var,14);
			
		end if;	
	end process;



	write_Output_Vector: process(Clock)
	
		file 		output_text	: text open write_mode is "E:\Example_Verification\Simple_Algorithm_MATLAB\Output_Vec_HDL.txt";
		variable LO1			: line;
		
	begin
	
		if rising_edge(Clock) then
		
			write(LO1, to_integer(Output_Signal));
			writeline(output_text , LO1);
			
		end if;
	end process;

END;

ایجاد تغییرات در تست‌بنچ به منظور ذخیره‌سازی خروجی مدل HDL

برای عملیات‌های خواندن از فایل و نوشتن در فایل، باید در تست‌‌بنچ استاندارد، تغییراتی ایجاد کنیم؛ اولاً باید در ابتدای کد، دو خط مربوط به فراخوانی دو پکیج را اضافه کنیم (خط پنجم و ششم کد تست‌‌بنچ). دوماً باید Processای که به صورت استاندارد در تست‌‌بنچ وجود دارد و ورودی به کمک آن به مدار اعمال می‌‌شود را پاک کنیم. سپس به‌‌جای آن، دو Process‌‌، مطابق شکل، به کد اضافه کنیم. Process اول که آن ‌را Read_Input_Vector نامیده‌‌ایم، Data را از فایل Input_Vect (شامل ورودی‌‌ها) می‌‌خواند و آن‌‌ها را سمپل به سمپل به ورودی ماجول HDLمان اعمال می‌‌کند.

اما Process دوم چه کار می‌‌کند؟ در Procces دوم (که Write_Output_Vector نام‌‌گذاری شده است)، فایل جدیدی به نام Output_Vect_HDL.txt را در مُد Write باز می‌کند. سپس خروجی ماجول HDL را کلاک به کلاک می‌خواند و در این فایل می‌‌نویسد.

برای انجام تمامی این خواندن و نوشتن‌‌ها، لازم است تست‌‌بنچ را شبیه‌‌سازی کنیم. از منوی سمت چپ، روی گزینه Simulate Behavioral Model دبل کلیک می‌‌کنیم تا نرم‌‌افزار ISim اجرا شود.

نمایش نحوه‌ی شبیه‌سازی تست بنچ

اجرای نرم‌افزار ISim برای شبیه‌سازی تست بنچ

همان‌‌طور که می‌‌دانید به صورت پیش‌‌فرض، پس از اجرای نرم‌‌افزار، شبیه‌‌سازی به اندازه یک میکروثانیه  انجام می‌‌شود. اما با توجه به این که ما هزار نمونه در نرم‌‌افزار متلب پیدا کرده بودیم و به ماجولمان اعمال کرده بودیم، برای شبیه‌‌سازی تمام نمونه‌‌ها، نیاز داریم که شبیه‌‌سازی را به مدت 10 میکروثانیه انجام دهیم؛ بنابراین عدد 10us را مطابق شکل زیر، در کادر مخصوص به زمان شبیه‌سازی، در منوی بالای صفحه، تایپ می‌‌کنیم. اکنون گزینه‌ی Run for the time specified on the toolbar را کلیک می‌‌کنیم تا شبیه‌‌سازی انجام شود.

نمایش نحوه‌ی تغییر زمان شبیه‌سازی

شبیه‌سازی تست‌بنچ به کمک نرم‌افزار ISim

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

مقایسه‌ی خروجی‌های حاصل از مدل متلب و مدل HDL

حالا باید به عنوان آخرین مرحله، دو خروجی حاصل از اعمال یک بردار یکسان، به مدل متلب و مدل VHDL را با هم مقایسه کنیم.

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

اکنون به نرم افزار متلب برمی‌‌گردیم و m-file قبلی را دوباره باز می‌‌کنیم. همان‌‌طور که قبلاً توضیح دادم، بخش اول m-file مربوط به ذخیره‌‌سازی دو بردار ورودی و خروجی مدل متلب است. اما کد بخش دوم، دو فایل شامل خروجی‌‌های مدل متلب و مدل HDL را می‌‌خواند و آن‌‌ها را در یک نمودار پلات می‌‌کند.

نمایش کد متلب برای پلات کردن خروجی مربوط به مدل متلب و خروجی حاصل از شبیه‌سازی کد VHDL

کد متلب برای پلات کردن خروجی مدل متلب و خروجی حاصل از شبیه‌سازی کد VHDL در یک قاب

همان‌‌طور که در خط ۳۱اُم از کد می‌‌بینید، من از دستور Plot استفاده کرده‌‌ام و پس از پلات خروجی مدل متلب، آن را با دستور Hold در نمودار نگه داشته و سپس خروجی مدل VHDL را پلات کرده‌‌ام. اکنون با کلیک بر گزینه‌‌ی Run Section از بالای صفحه، هر دو خروجی را در یک نمودار خواهیم دید.

نمایش نمودار مقایسه‌ی دو خروجی مدل متلب و کد VHDL

نمودار مقایسه‌ی دو خروجی مدل متلب و کد VHDL

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

به این ترتیب ما می‌‌توانیم نتیجه‌‌گیری کنیم که مداری که با زبان VHDL پیاده‌‌سازی کردیم، عملکردش کاملاً صحیح و منطبق با مدلی است که قبلاً در متلب ایجاد کرده بودیم.

تنها نکته‌‌ی باقی‌‌مانده این است که برای رسم خروجی مدل متلب، از سمپل ۱۰ شروع کردم اما برای خروجی مدل VHDL، از سمپل ۱۳ شروع به خواندن کردم و دو نمودار را روی هم نمایش دادم. دلیل این کار، وجود چند کلاک Latency یا تأخیر در مدل VHDL است. در حالی که در مدل متلب این تأخیر وجود ندارد. برای جبران تأخیر مدل VHDL، دیتا را با سه شیفت از فایل می‌‌خوانیم. همان‌‌طور که دیدید، دو نمودارکاملاً برهم منطبق هستند؛ بنابراین جبران تاخیر به درستی انجام شده است.

روند بیان شده در این مقاله را در پیاده‌‌سازی تمام ماجول‌‌ها (به خصوص ماجول‌‌های شامل الگوریتم‌‌های پردازش سیگنال)، انجام می‌‌دهیم.

به طور خلاصه، در این روند ابتدا یک مدل متلب (یک مدل سطح بالا) ایجاد کرده و سپس بر اساس آن، یک مدل VHDL ایجاد می‌‌کنیم. در نهایت، با اعمال ورودی یکسان به هر دو مدل، و سپس مقایسه‌ی خروجی‌‌ها، از صحت عملکرد پیاده‌‌سازی مطمئن می‌‌شویم.

به شما توصیه می‌‌کنم که شما هم از این به بعد برای پیاده‌‌سازی ماجول‌‌ها از این روند استفاده کنید تا بتوانید کارهایتان را اصولی‌‌تر و مطمئن‌‌تر انجام دهید.

امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژه‌‌هایتان استفاده کنید.

آیا برنامه ویدئویی درستی‌آزمایی مدار دیجیتال به کمک متلب برای شما مفید بود؟

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

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

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

درباره نویسنده:

احمد ثقفی

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

  • با سلام. خیلی ممنون از توضیحات عالی تون.
    یک سوال داشتم: من با Fdatool یک فیلتر طراحی کردم و اون رو توسط fir core موجود در اسپارتان ۶ در پیاده کردم. حالا میخام پاسخ فرکانسی فیلتر پیاده شده رو به کمک متلب به دست بیارم. یک روش این هستش که مثلا بیام مثل کد شما یک سیگنال درست کنم و اون رو داخل فایل ذخیره کنم و خروجی رو ببینم. اما من پاسخ فرکانسی رو میخام. چجوری باس اینکار رو انجام بدم؟ممنون میشم راهنمایی کنید.

    • سلام،

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

      موفق باشید.

  • سلام روز تون به خیر .چطور میتونم صحت برنامه رو در متلب برحسب درصد تعیین کنم به طور مثال بگم ۹۰ درصد عمل تطبیق درست انجام میده

    • سلام،

      این کار را معمولا بر حسب dB بیان می‌کنند. از تفاضل سیگنال مورد نظر از سیگنالی که عملا به دست آمده است در یک فرمول استفاده می‌کنیم تا مقدار را بر حسب dB بیان کنیم.

      موفق باشید.

  • با سلام آیا امکان بهره برداری از نتایج ise در متلب وجود دارد یا خیر؟ مثلا میشه سیگنال های دیجیتالی که تو ise بدست اومده در یک مدار جداگانه در متلب به ورودی آن داد؟ ممنون میشم پاسخ بدید

    • سلام،

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

      موفق باشید.

  • ممنون از آموزش های مفیدتون. یه سوال هم دارم اگر بخواهیم به عنوان مثال یک جمع کننده را که در وریلاگ پیاده سازی کرده ایم را بر روی یک تصویر در متلب اعمال کنیم چه کاری باید انجام بدیم؟

  • با سلام و وقت بخیر. خیلی ممنون از توضیحات عالیتون.
    من فایل های ورودی سیگنالم رو از متلب به تست بنچ انتقال دادم و تبدیلات مورد نظر رو هم اعمال کردم (سیگنال رو به signed و بعد به std logic vector تبدیل کنه و خروجی رو هم signed و بعد integer تبدیل کنه) و بدون خطا سنتز شد اما وقتی با isim شبیه سازی میکنم با ارور error read a non-integer, an integer expected مواجه میشم. ممنون میشم راهنماییم کنید.

    • سلام،

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

      موفق باشید.

  • سلام و احترام
    ممنون از توضیحات خوب شما
    علت اینکه من نمیتونم کد فوق را شبیه سازی کنم چی هست؟
    خطای زیر را میده:

    ERROR: at 0 ps: Could not open file ‘C:UserszahraDownloadsNew folder (19)Example_VerificationExample_VerificationSimple_Algorithm_MATLABInput_Vec.txt’ of text
    ERROR: ERROR: The simulation failed to launch for the following reason:
    The Simulation shut down unexpectedly during initialization. Please review the ISim log (isim.log) for details.

    • سلام،

      لطفا در مسیر نگهداری فایل‌ها از فولدر با نامی که در آن space وجود دارد استفاده نکنید. مثلا فولدر New Folder دارای space است.

      موفق باشید.

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

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

    >