آموزش FPGA قسمت ششم: شبیه‌سازی ساختار ارجاع شرطی در ISIM

0
651
شبیه‌سازی ساختار ارجاع شرطی در ISIM
شبیه‌سازی ساختار ارجاع شرطی در ISIM

ساختار ارجاع شرطی

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

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

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

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

ALU چیست؟

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

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

در زیر، جدولی را مشاهده می‌کنید که بیان می‌کند باتوجه‌به ارزش ورودی ۳بیتی S، چه عملیاتی روی دو ورودی A و B صورت‌بگیرد.

عملیات روی ورودی‌های A و B
عملیات روی ورودی‌های A و B

 

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

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

ساختار ارجاع شرطی

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

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

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

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

entity ALU is
Port ( 
A : in signed (3 downto 0);
B : in signed (3 downto 0);
S : in unsigned (2 downto 0);
F : out signed (3 downto 0)
);
end ALU;

architecture Behavioral of ALU is

signal B_A : signed (3 downto 0) := (others=>'0'); 
signal A_B : signed (3 downto 0) := (others=>'0'); 
signal AADDB : signed (3 downto 0) := (others=>'0'); 
signal AXORB : signed (3 downto 0) := (others=>'0'); 
signal AORB : signed (3 downto 0) := (others=>'0'); 
signal AANDB : signed (3 downto 0) := (others=>'0');

begin

B_A <= B - A;
A_B <= A - B;
AADDB <= A + B;
AXORB <= A xor B;
AORB <= A or B;
AANDB <= A and B;

F <= "0000" when s="000" else
B_A when s="100" else
A_B when s="010" else
AADDB when s="110" else
AXORB when s="001" else
AORB when s="101" else
AANDB when s="011" else
"1111";


end Behavioral;

 

در ابتدا سه پورت A, B, F همه را به‌صورت چهاربیتی و ازنوع علامت‌دار و همچنین پورت S را به‌صورت ۳بیتی و ازنوع بدون علامت تعریف می‌کنیم. سوالی که ممکن‌است برایتان پیش بیایید، این است که چه‌موقع پورت‌ها را علامت‌دار و چه‌موقع بدون علامت تعریف می‌کنیم؟ توجه‌کنید از این به بعد پورت‌ها یا سیگنال‌هایی که قرار است محاسبات ریاضی روی آن‌ها صورت گیرد را از نوع علامت‌دار، و پورت‌ها یا سیگنال‌هایی که قرار نیست محاسبات ریاضی روی آن‌ها صورت‌گیرد و صرفا از آن‌ها به‌عنوان شمارنده یا مشخص‌کردن حالت‌های مختلف کاری، شبیه کاری که ما در این پروژه انجام‌دادیم استفاده می‌کنیم، را از نوع بدون علامت تعریف می‌کنیم.

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

حال زمان آن رسیده‌است که از عملکرد کد مربوطه مطمئن‌شویم، برای این کار باید یک فایل جداگانه برای شبیه‌سازی ایجاد کنیم، که به فایل Test Bench معروف است. برای ساختن این فایل در قسمت Hierarchy راست‌کلیک کرده و گزینه New Source را انتخاب می‌کنیم. پنجره‌ای که باز خواهد شد برای شما جدید نمی‌باشد، چون قبلا ما در همین پنجره یک فایل VHDL Module ایجاد کردیم. اما اکنون قصد داریم با نوعی فایل جدید به اسم VHDL Test Bench آشناشویم که از این فایل برای شبیه‌سازی استفاده می‌کنیم.

فایل VHDL Test Bench
فایل VHDL Test Bench

 

شبیه تصویربالا حواستان باشد گزینه‌ی VHDL Test Bench را انتخاب‌کرده‌باشید، چون درغیر این‌صورت ممکن‌است فایلی با نوعی دیگر برایتان ایجاد گردد.

پس‌از طی مراحل بالا، فایل Test Bench برای شما ساخته خواهد شد، اما شما این فایل را مشاهده نمی‌کنید!

فایل Test Bench
فایل Test Bench

 

برای رفع این مشکل همانند تصویر بالا، در بالای قسمت Hierarchy، گزینه View را روی حالت Simulation قرار دهید. سپس با دوبار کلیک‌کردن روی فایل ALU_tb، این فایل برایتان باز خواهد شد.

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

شما اگر قصد دارید این پروژه را خودتان انجام‌دهید و مرحله‌به‌مرحله پیش‌بروید فایل Test Bench موردنظر را مانند کدی که در زیر خواهیم آورد ویرایش‌کنید.

قاعدتا برای اینکه شبیه‌سازی انجام‌شود، بایستی یکسری ورودی به مدار اعمال شود. برای این کار مانند کد زیر در قسمت insert stimulus here مقادیری را به پورت‌های ورودی اعمال خواهیم کرد.

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

ENTITY ALU_tb IS
END ALU_tb;

ARCHITECTURE behavior OF ALU_tb IS 

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT ALU
PORT(
A : IN signed (3 downto 0);
B : IN signed (3 downto 0);
S : IN unsigned (2 downto 0);
F : OUT signed (3 downto 0)
);
END COMPONENT;


--Inputs
signal A : signed (3 downto 0) := (others => '0');
signal B : signed (3 downto 0) := (others => '0');
signal S : unsigned (2 downto 0) := (others => '0');

--Outputs
signal F : signed (3 downto 0);
-- No clocks detected in port list. Replace <clock> below with 
-- appropriate port name 


BEGIN

-- Instantiate the Unit Under Test (UUT)
uut: ALU PORT MAP (
A => A,
B => B,
S => S,
F => F
);

-- Clock process definitions




-- Stimulus process
stim_proc: process
begin 
-- hold reset state for 100 ns.
wait for 100 ns;




-- insert stimulus here

A <= "0011";
B <= "0100";
S <= "110";


wait;
end process;

END;

 

اگر به کد بالا دقت کنید ما مقدار”۰۰۱۱″ به منزله‌ی ۳دهدهی را به ورودی A و مقدار “۰۱۰۰” به منزله‌ی ۴دهدهی را به ورودی B، و همچنین مقدار “۱۱۰” را به ورودی S اعمال کردیم که با این مقدار، طبق جدول‌بالا، باید حالت A Plus B فعال‌شود و ارزش عددی A و B با همدیگر جمع‌شده و در خروجی F نمایش‌داده‌شود. پس ما باید در شبیه‌سازی مقدار “۰۱۱۱” یا همان ۷دهدهی را در خروجی مشاهده‌کنیم.

حال برای مشاهده‌ی نتایج شبیه‌سازی باید ابتدا فایل ALU_tb را انتخاب‌کرده و سپس مانند تصویر زیر، در قسمت Processes، با دوبار کلیک‌کردن روی گزینه Simulate Behavioral Model محیط شبیه‌سازی یا همان نرم‌افزار ISim بازخواهدشد.

محیط شبیه‌سازی نرم‌افزار ISim
محیط شبیه‌سازی نرم‌افزار ISim

 

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

شبیه‌سازی
شبیه‌سازی

 

خب همانطورکه در تصویر بالا مشاهده می‌کنید مقدارخروجی “۰۱۱۱” می‌باشد، و برابر با مقدار موردانتظار است. شاید شما بخواهید این اعداد را به‌صورت دهدهی نیز مشاهده‌نمائید، بدین‌منظور همه‌ی ورودی-خروجی‌ها را انتخاب‌کرده و سپس با راست‌کلیک‌کردن بر‌روی آن‌ها از گزینه Radix حالت Signed Decimal را انتخاب‌نمائید.

حالت Signed Decimal
حالت Signed Decimal

 

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

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

 

منبع: سیسوگ

مطلب قبلیویزوینو(VISUINO) راحت‌تر از آردوینو(ARDUINO)
مطلب بعدیآموزش FPGA قسمت هفتم: ساختار ارجاع انتخابی

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید