860 likes | 1.15k Views
مباحث ویژه در الکترونیک. آرایه های دروازه ای قابل برنامه ریزی میدانی Field Programmable Gate Arrays (FPGAs). مدرس : دکتر محمدرضا مسلمی moslemi@iauzarghan.ac.ir. مقدمه. ASIC چیست؟. مخفف کلمات Application Specific Integrated IC است.
E N D
مباحث ویژه در الکترونیک آرایه های دروازه ای قابل برنامه ریزی میدانی Field Programmable Gate Arrays (FPGAs) مدرس: دکتر محمدرضا مسلمی moslemi@iauzarghan.ac.ir
مقدمه ASIC چیست؟ • مخفف کلمات Application Specific Integrated ICاست. • این واژه معمولا به مدارهای مجتمعی که صرفا برای کاربردهای خاص ساخته می شوند اطلاق می شود. • از این نوع مدارهای مجتمع در ساخت انواع میکروپروسسورها، انواع حافظه های خواندنی-نوشتنی (RAM) و فقط خواندنی (ROM) استفاده می شود. مزایا • در صورتی که مدارهای با کاربرد خاص به صورت مدار مجتمع در آیند، کاهش قابل توجهی در اندازه مدار خواهیم داشت. • با کاهش اندازه مدار • یکپارچگی سیگنال ها در مدار افزایش می یابد. • سرعت مدار افزایش می یابد.
معایب • معمولا از زمان طراحی این مدار تا تولید آن توسط کارخانجات سازنده آی سی زمان نسبتا طولانی نیاز است. • به دلیل آن که تولید توسط کارخانجات تولید آی سی و در یک فرآیند خارج از روال آن انجام می شود، هزینه تمام شده بالایی دارند. معمولا برای تولید انبوه استفاده می شوند و برای تعداد کم مقرون به صرفه نمی باشند.
FPGAچیست؟ • مخفف کلمات Field Programmable Gate Arrayاست. • این واژه معمولا به مدارهای مجتمعی که برای پیاده سازی مدارهای دیجیتال قابل برنامه ریزی هستند اطلاق می شود. • از این نوع مدارهای مجتمع در ساخت انواع میکروپروسسورها، انواع حافظه ها، مدارات ورودی-خروجی و پردازش تصویر استفاده می شود. مزایا • در صورتی که مدارهای دیجیتال در یک FPGA قرار گیرد، کاهش قابل توجهی در اندازه مدار خواهیم داشت. • با کاهش اندازه مدار • یکپارچگی سیگنال ها در مدار افزایش می یابد. • سرعت مدار افزایش می یابد.
ظرفیت بالای فشرده سازی دارند. • قیمت تمام شده آنها بسیار پایین می باشد • زمان عرضه این آی سی ها به بازار بسیار کم می باشد. • امنیت مدار بالا رفته و امکان کپی کردن آن از بین می رود. معایب • سطح سیلیکون FPGA به صورت بهینه مورد استفاده قرار نمی گیرد. • تاخیر و توان مصرفی آنها نسبت به مدارات ASIC بیشتر است. کاربردها اگرچه نمی توان محدوده خاصی برای کاربرد این مدارها تعیین کرد با این وجود برخی از کاربردهای آنها عبارتند از: کارتهای ورودی-خروجی، فیلترهای دیجیتال، میکروکنترلر و میکروپروسسورهای خاص، پردازش سیگنال و تصویر، سیستم های مخابراتی و ابزار دقیق و سیستم های نظامی
شرکت های سازنده مهم ترین شرکت های سازنده FPGA عباتند از: Xilinx, Altera, Lattice, Actel مهم ترین سهم شرکت های سازنده از بازار FPGA تاریخچه آی سی های دو شرکت مهم تولید کننده
درباره زایلینکس (Xilinx) این شرکت در سال 1984 تاسیس گردید. بیش از 2600 کارمند دارد. بیش از نیمی از محصولات FPGA مورد نیاز را در دنیا تامین می کند. با سازندگان مهمی چون IBM، UMC و Seiko مشارکت دارد. مهمترین نرم افزارهای شبیه سازی: ISI, Fandation درباره آلترا (Altera) این شرکت در سال 1983 تاسیس گردید. در سال 1992 ساختار جدول جستجو (Look Up Table) را معرفی نمود. دومین شرکت تولید کننده آی سی های FPGA در دنیا است. با شرکت TSMC مشارکت دارد. مهمترین نرم افزارهای شبیه سازی: Quartus II, Max Plus II
ساختار داخلی FPGA چگونه می توان مدارهای دیجیتالی مختلف را درون یک FPGA پیاده سازی کرد؟ همانطور که می دانیم برای هر مدار دیجیتال با هر تعداد ورودی و خروجی می توان یک جدول درستی (Truth table) رسم نمود. در جدول درستی تمامی حالت های ممکن ورودی به تصویر درآمده و به ازای هر یک از این حالات خروجی تعیین می گردد. فرض کنید مدار مورد نظر 4 ورودی و 1 خروجی دارد. در این حالت می توان این مدار را با یک RAM با 4 بیت ورودی آدرس و 1 بیت خروجی داده جایگزین نمود. RAMمورد نظر دارای 16 آدرس مختلف، معادل 16 حالت ورودی جدول درستی است که در هر آدرس خروجی تابع مورد نظر نوشته می شود. بسته به این که ورود مدار چه باشد داده ذخیره شده در یکی از خانه های RAM در خروجی ذخیره می شود. برای پیاده سازی مدارهای بزرگتر می توان از مجموعه ای از این بلوک های حافظه استفاده نمود.
در این مدارها به دلیل استفاده از RAM، مدار ذخیره شده در FPGA فرار بوده و پس از قطع برق از بین می رود. بنابراین پس از قطع برق، پیکربندی مجدد لازم است. معمولا کل برنامه را درون یک PROM کپی می کنند تا پس از وصل برق، مجددا درون FPGA بارگذاری شود. استفاده از RAM باعث افزایش انعطاف پذیری می گردد. یعنی هر زمان که بخواهیم می توانیم با پیکر بندی مجدد، مدار داخلی را عوض کنیم. چهار بلوک زیر می تواند در ساختار داخلی FPGA به عنوان بلوک های پایه مورد استفاده قرار گیرد. • PROM (Anti fuse) • EEPROM • FLASH • RAM سازندگان دنیای FPGA، به کوچکترین واحد تشکیل دهنده (یعنی هر یک از حافظه های مورد استفاده) اصطلاحا LUT (Look Up Table) می گویند.
یک مدار منطقی ثابت مثالی از روش پیاده سازی یک منطق برنامه پذیر با 3 ورودی و یک خروجی با استفاده از آنتی فیوز
چگونه می توان مدارهای ترتیبی را درون یک FPGA پیاده سازی کرد؟ مدارهای ترتیبی (Sequential) نیز می توانند درون یک FPGA پیاده سازی شوند. در FPGA، خروجی هر LUT به صورت مستقیم و همچنین از طریق یک فلیپ فلاپ به یک مالتی پلکسر وارد می شود. بسته به ورودی کنترل MUX، مدار ترکیبی یا ترتیبی خواهد بود. از ترکیب دو سلول منطقی (Logic Cell) یک Slice به وجود می آید واحد پایه در FPGA Xilinx: LC – Logic Cell Altera: LE – Logic Element
در Slice مداری برای انتقال رقم نقلی نیز وجود دارد. از ترکیب 2 عدد Slice یک Configurable Logic Block (CLB) تشکیل می گردد. Slice 0 CLB در واقع اصلی ترین بخش از هر FPGA است که توابع منطقی را پیاده سازی می کند. LUT PRE Carry D Q CE CLR در سری Stratix II خانواده Altera اصطلاحا ALM (Adaptive Logic Module) نامیده می شود. LUT Carry PRE D Q CE یک Slice که از ترکیب دو LC تشکیل شده است. CLR هر Slice دارای 4 خروجی می باشد. 2 خروجی حافظه و 2 خروجی ترکیبی
در اغلب FPGA های جدید علاوه بر تعداد زیاد CLB، برخی امکانات دیگر نیز برای تسهیل در پیاده سازی مدارهای دیجیتال پیچیده تر وجود دارد. یکی از مهم ترین این امکانات RAM داخلی غیر از نمونه های کوچک موجود در LUT ها است. در صورتی که بخواهیم مداری با تعداد زیاد ورودی را پیاده سازی نماییم، به جای استفاده از تعداد زیاد CLB از بخشی از همین حافظه داخلی استفاده می کنیم. به عنوان مثال، مدل اسپارتان 2 از شرکت زایلینکس، دارای بلوک های هر کدام با ظرفیت 4096 بیت است. جدول نحوه استفاده از حافظه داخلی اسپارتان 2
ضرب کننده در بعضی محصولات جدید شرکت های Xilix, Altera بلوک های ضرب کننده وجود دارد. عمل ضرب در این محصولات را می توان توسط ضرب کننده های داخلی 18 بیتی نیز با سرعت بالاتر انجام داد. این ضرب کننده ها معمولا در کارهای پردازش سیگنال کاربرد دارند. میکروپروسسور داخلی در بعضی محصولات جدید شرکت های Xilix, Altera مثل Virtex-II Pro یک میکروپروسسور داخلی وجود دارد. این FPGA کاملا تخصصی است و برای کاربردهای تخصصی استفاده می شود. PowerPC در واقع یک میکروپروسسور داخلی است که توسط شرکت IBM داخل FPGA قرار داده شده است.
مراحل مختلف ساخت یک FPGA طراحی ابتدایی • در این مرحله باید مدار مورد نظر خود را طراحی نماییم. • روش معمول برای پیاده سازی مدار استفاده از برنامه های سطح بالا برای برنامه ریزی مدار است. • البته در بسیاری از نرم افزارهای شبیه ساز، امکان این که شماتیک مدار را رسم کرد نیز وجود دارد. • این نرم افزارها قادرند خروجی متنی برنامه را نیز به زبان های مرسوم تولید کنند. • HDL Designer (HDS)یکی از این نرم افزارهاست. • البته این امکان معمولا نیاز به دانستن یک زبان برنامه نویسی را برای کارهای پیچیده تر منتفی نمی کند.
دو زبان اصلی برنامه نویسی 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): نحوه عملکرد مدار را مشخص می کند. کتابخانه معمولا قطعات پر استفاده و معمول را در کتابخانه قرار می دهند تا بتوان از قابلیت های استفاده مجدد و اشتراک گذاری آنها در سایر برنامه نیز استفاده نمود. معمولا در هر کد VHDL به حداقل 3 بسته (Package) متعلق به 3 کتابخانه نیاز داریم.
بسته std_logic_1164 مربوط به کتابخانه ieee • بسته standard مربوط به کتابخانه std • بسته work متعلق به کتابخانه work برای اعلان کتابخانه به دو خط کد نیاز داریم: LIBRARY library_name; Use library_name.package_name.package_parts; مثلا LIBRARY ieee; Use ieee.std_logic_1164.all; LIBRARY std; Use std.standard.all; VHDL به حروف بزرگ و کوچک حساس نمی باشد.
موجودیت (Entity) • موجودیت در کد به صورت زیر تعریف می شود. • ENTITY entity_name IS • PORT ( • port_name: signal_modesignal_type; • port_name: signal_modesignal_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 PORT (a, b: IN BIT; -- inputs x: OUT BIT); -- outputs END nand_gate; ARCHITECTURE my_arch of nand_gate IS Signal int: std_logic; -- internal signal decleration BEGIN int <= a and b; x <= NOT int; END my_arch ; ENTITY nand_gate IS PORT (a, b: IN BIT; x: OUT BIT); END nand_gate; ARCHITECTURE my_arch of nand_gate IS BEGIN x <= a NAND b; END my_arch ; به جای تعریف سیگنال داخلی int می توان از عملگر NAND استفاده کرد. عملگرهای منطقی زیر در استاندارد 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 xorY; 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
داده های از قبل تعریف شده این داده ها در استانداردهای IEEE1076 و IEEE1164 و در کتابخانه ها و بسته های زیر تعریف شده اند.
نوع BIT و BIT_VECTOR (دو سطح منطقی ‘0’ و ‘1’ را دارند)
انواع STD_LOGIC و STD_LOGIC_VECTOR • یک سیستم منطقی 8 مقداره متعلق به استاندارد ieee1164 است که بیشتر این مقادیر فقط برای شبیه سازی استفاده می شوند. • فقط مقادیر ‘0’, ‘1’, ‘Z’ قابل سنتز هستند. • حالت های «ضعیف» و «قوی» به این دلیل استفاده شده اند که اگر دو سیگنال از این نوع به یک گره متصل باشند مقادیر نوع قوی تعیین کننده نهایی خواهند بود.
انواع STD_ULOGIC و STD_ULOGIC_VECTOR • یک سیستم منطقی 9 مقداره است. • علاوه بر مقادیر قبلی مقدار ‘U’ (Unresolved) نیز اضافه شده است. • در این حالت بر خلاف حالت قبلی نمی توان سیم های با مقادیر مختلف را به هم متصل نمود. برای نشان دادن خطای مربوطه از این مقدار استفاده می شود.
نوع 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]; نحوه استفاده مثال: نحوه تعریف یک آرایه 1D*1D 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; مثال: نحوه تعریف یک آرایه 2D TYPE matrix2D IS ARRAY (0 to 3, 7 downto 0) of std_logic; -- 2D Array پیوند دهی داده ها: علامت & به معنی پیوند دهی بین داده ها است. • ARCHITECTURE rtl OF exIS • SIGNAL a:std_logic_vetor (5 DOWNTO 0); • SIGNAL b, c, d : std_logic_vector(2 DOWNTO 0); • BEGIN • B <= ‘0’ & c(1) & d(2); • END generic_decoder; If c = “011”, d = “101” ===> B = “011” یک نمونه دیگر از کاربرد این دستور 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:invector_array (3 downto 0); S vector_array (1 downto 0); Y: out bit); end MUX;
بخش اعلام بسته شامل علاوه بر معرفی داده ها، شامل functionها، procedure ها، ثابت های مورد استفاده در آن بسته نیز می باشد. بخش بدنه بسته بیان کننده رفتار زیر برنامه هایی است که در بخش اعلام معرفی شده اند. PACKAGE my_packIS FUNCTION minimum (a, b: IN std_logic_vector) RETURN std_logic_vector; CONSTANT max_int: integer := 16#FFFF#; TYPE arithmetic_mode_typeIS (signed, unsigned) END my_pack; -------------------------------------------------------------------------------- PACKAGE BODY my_packIS 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 به کار می رود.
برای انجام عملیات منطقی روی داده های از نوع BIT، STD_LOGIC و STD_ULOGIC استفاده می شود. عملگرهای منطقی: NOT, AND, OR, NAND, NOR, XOR, XNOR • عملگرهای منطقی مثال: Y <= NOT a AND b; -- (a’.b) Y <= NOT(a AND b); -- (a.b)’ Y <= a NAND b; -- (a.b)’ • عملگرهای ریاضی برای انجام عملیات ریاضی روی داده های از نوع INTEGER، SIGNED، UNSIGNEDو REAL استفاده می شود. عملگرهای منطقی: + (جمع), - (تفریق), * (ضرب), / (تقسیم), ** (توان), MOD (خارج قسمت), REM (باقیمانده), ABS (قدرمطلق)
عملگرهای رابطه ای یا مقایسه ای برای انجام مقایسه بین دو مقدار داده استفاده می شود. عملگرهای منطقی: = (مساوی), /= (مخالف), < (کوچکتر), > (بزرگتر), <= (کوچکتر یا مساوی), >= (بزرگتر یا مساوی) • عملگرهای شیفت برای انجام شیفت استفاده می شود. sll: مکانهای سمت راست با صفر پر می شوند. srl: مکانهای سمت چپ با صفر پر می شوند. ARCHITECTURE rtlOF ex3IS BEGIN BEGIN q1 <= ‘0’; q2 <= ‘0’; q3 <= ‘0’; END rtl; ARCHITECTURE rtl2 OF ex3IS BEGIN BEGIN q1 <= “001”; q2 <= “010”; q3 <= “111”; END rtl; مقدار دهی چند گانه
عبارت IF یک دستور IF شامل یک یا چند عبارت داخلی است که بسته به برقراری شروط، یکی از عبارت ها اجرا می شود. ENTITY ex_ifIS PORT (a, b : IN INTEGER; c : OUTBOOLEAN); END; ARCHITECTURE rtlOF ex_ifIS BEGIN PROCESS (a,b) BEGIN IF a > b THEN c <= TRUE; ELSE c <= FALSE; END IF; END PROCESS; END rtl; IF SEL = ‘0’ THEN C <= A; ELSE C <= B; END IF;
مجددا تاکید می گردد که همانند یک سخت افزار که ذاتا موازی است، کد VHDL نیز به صورت موازی اجرا می شود. در نتیجه ترتیب خطوط در VHDL معنی ندارد. ARCHITECTURE example of ex IS BEGIN a <= b; b <= c; END my_arch ; ARCHITECTURE example of ex IS BEGIN b <= c; a <= b; END my_arch ; مثال فوق به این معنا است که وقتی که c تغییر می کند، تمام خطوطی که C در سمت راست قرار دارد به طور همزمان اجرا می شوند. عبارت WHEN 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; a ex b c q Data [1 0]
طراحی یک مدار مقایسه کننده 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 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; 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;