مقدمه
در قسمت نهم از مجموعه آموزشی FPGA ساختارشرطی if را تشریح کردیم و بااستفادهاز توصیف مالتیپلکسر، با بعضیاز قابلیتهای این ساختار آشناشدیم.
در این قسمت قصد داریم با ساختارشرطی if بیشتر آشناشویم و قابلیتهای دیگر این ساختار را بااستفادهاز توصیف انکودر اولویتدار شناساییکنیم. پس با ما همراه باشید.
انکودر
انکودر مداری شناختهشده در دیجیتال میباشد و بهاحتمالزیاد شما هم بهعنوان یک مهندس الکترونیک، که درحال خواندن این مقاله هستید با ماهیت انکودر آشنا هستید. پس به توضیح این مدار نخواهیمپرداخت و فقط برای یادآوری، جدول صحت یک انکودر ۲*۴ را در زیر برای شما خواهیمآورد. درادامه همین جدول صحت را بااستفادهاز زبان VHDL توصیفخوهیمکرد.
در جدول صحت بالا مشاهده میکنید که در هرلحظه فقط یکیاز ورودیها میتواند مقدار ‘۱’ را داشتهباشد. به بیاندیگر انکودر انتظار دارد در هرلحظه فقط یکیاز ورودیهایش مقدار ‘۱’ را داشتهباشد چون درغیر اینصورت مقدارخروجی مدار، آن مقدار موردانتظار ما نخواهد بود و یک خروجی غیرصحیح خواهیمداشت. و همانطورکه در قسمتقبل ذکرکردیم در چنین مداراتی یا سازندگان تراشهها، این موارد را پیشبینی و تمهیداتی برای این موارد درنظر میگیرند یا اینکه ما باید حواسمان باشد و ورودی ناشناختهای به مدار اعمال نکنیم.
ما قصد داریم در این قسمت کد انکودر را بهنحوی بنویسیم که اگر ورودی ناشناختهای به انکودر اعمالشد، بهنحوی طبق خواستهی ما ورودی تصحیح شود. اما چگونه؟
انکودر اولویتدار
یک انکودر انتظار دارد که از بین همهی ورودیهایش، در هرلحظه فقط یکیاز ورودیها مقدارش ‘۱’ و مقدار بقیه ورودیها ‘۰’ باشد.
حال اگر برحسب اشتباه حالتی بهغیر از حالت بیانشده به ورودیها اعمالشود، باید تصحیح صورتگیرد. ما این روند تصحیحشدن را بااستفادهاز اولویت در بیتهای ورودی هموار میکنیم. این اولویت میتواند سنگینترین بیت، یا سبکترین بیتِ ورودی باشد. ما در این آموزش قصدداریم مبنای اولویت را بیتِ سنگین قراربدهیم. روند به اینصورتاست که از بیت سنگین به بیت سبک مقدار بیتها بررسی میشود تا به اولین بیتی برسیم که مقدارش ‘۱’ باشد. به مجرداینکه به اولین بیتی رسیدم که مقدارش ‘۱’ است، بقیه بیتها دیگر بررسی نمیشوند و فرض میشود که بهجز بیت موردنظر بقیه بیتها مقدارشان ‘۰’ است و این روند معادل حالتی است که در هر لحظه فقط یک بیت مقدارش ‘۱’ است. به مداری که بهواسطه عملیات بالا در زبان VHDL توصیف میشود انکودر اولویتدار میگویند.
مدار انکودر اولویتدار را بااستفادهاز ساختارشرطی if در زبان VHDL توصیف میکنیم. نحوهی توصیف به اینصورت است که اولویت بیتها را بااستفادهاز اولویتی که در ذات ساختارشرطی if وجود دارد هموار میکنیم.
قبلاز توضیحات بیشتر ابتدا به کد زیر توجهکنید:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Encoder is Port ( D : in unsigned (3 downto 0); Q : out unsigned (1 downto 0) ); end Encoder; architecture Behavioral of Encoder is begin process(D) begin if D(3) = '1' then Q <= "11"; elsif D(2) = '1' then Q <= "10"; elsif D(1) = '1' then Q <= "01"; else Q <= "00"; end if; end process; end Behavioral;
در جلسه قبل ساختار if بهطورکامل توضیحدادهنشد و قولدادیم که در قسمتبعد، که این قسمت باشد ساختار if را بهطورکامل و مفصل توضیحبدهیم، اکنون در کدبالا سینتکس و الگوی کلی این ساختار را بهطورکامل مشاهده میکنید و عملکرد بدینگونه است که زمانی که process فعال میشود، شرطها با اولویت از بالا به پایین بررسی میشوند تازمانیکه به اولین شرط صحیح برسیم. پساز اینکه به اولین شرط صحیح رسیدیم، بقیه شرطها دیگر بررسی نمیشوند و درنتیجه نهایتا یکیاز این ارجاعات انجامخواهدگرفت.
اگر خاطرتان باشد در قسمت نهم ذکرکردیم که اگر در محیط ترتیبی دو یا چندین ارجاع داشتهباشیم که در سمت چپ آنها یک سیگنال واحد باشد، فقط آخرین ارجاع درنظرگرفته میشود و بقیهی ارجاعات قبلاز مرحله سنتز حذف میشوند. حال شاید از خودتان بپرسید چرا در کد بالا که سمت چپ همهی ارجاعات سیگنال Q قرار دارد، همهی ارجاعات بهجز ارجاع آخر، قبلاز مرحله سنتز حذف نشدهاند؟ در پاسخ باید بگوییم که اینجا ارجاعات با شروطخاصی انجام میگیرند و موضوع خیلی متفاوت خواهد بود با زمانیکه چندین ارجاع به یک سیگنال را در محیط ترتیبی بدون هیچشرطی بنویسیم.
توجهکنید که در ساختارشرطی if، کلمه کلیدی elsif قرار دارد نه elseif. اگر با زبانهای مختلف کد مینویسید این سینتکسها در اوایل کار شاید کمی شما را اذیتکنند، مثلا در زبان C مینویسیم else if، در زبان پایتون مینویسیم elif و علیالقاعده در زبان VHDL هم که مینویسیم elsif. اگر شما زبانهای دیگری میشناسید که این عبارت بهنحودیگری نوشته میشود، خوشحال میشویم که این زبانها را به ما نیز معرفیکنید.
در این قسمت نیز ما همانند سایر قسمتها در وهلهی اول کدی بهصورت مقدماتی نوشتیم، اما اکنون قصدداریم همین کد را کمی بهتر بنویسیم و تغییراتی در کد اولیه ایجادکنیم.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Encoder is Port ( D : in unsigned (3 downto 0); Q : out unsigned (1 downto 0) ); end Encoder; architecture Behavioral of Encoder is begin process(D) begin Q <= "00"; if D(1) = '1' then Q <= "01"; end if; if D(2) = '1' then Q <= "10"; end if; if D(3) = '1' then Q <= "11"; end if; end process; end Behavioral;
اولین چیزی که در کد بالا توجه شما را جلب میکند اولویتهای نوشتن خطوط ارجاع است، در کد دوم ظاهرا بهنظر میرسد که اولویتها را برعکس کردیم. خیر اینگونه نیست، کد اول و کد دوم ازلحاظ عملکرد دقیقا یکی هستند. برای درک بیشتر موضوع با دقت به توضیحاتزیر توجهکنید.
در ساختار if_then_else (کد اول) شرطها از بالا به پایین بررسی میشوند و هر زمانیکه شرطی برقرار شد، شرطهای زیرین دیگر بررسی نمیشوند و همانطورکه حدس میزنید اولویت از بالا به پایین است. درنهایت تنها یک ارجاع بیرون آمده از این شرطها وجود دارد. اما در ساختار if_then (کد دوم) شرطها موازی باهم بررسی میشوند (برخلاف کد اول، همهی شرطها بررسی میشوند) و هیچ اولویتی وجود ندارد. درنهایت ممکناست چندین ارجاع مختلف بیرونآمده از شرطها داشتهباشیم.
فرضکنید در کد دوم، دوتا از شرطها برقرار باشند، حال دو ارجاع مختلف بیرونآمده از دل این شرطها داریم. هر دوتای این ارجاعات، ارجاع به سیگنال Q هستند، شبیه به این میماند که دو ارجاع به یک سیگنال یکسان، بدون هیچشرطی در محیط ترتیبی داشتهباشیم. و همانطورکه از گذشته میدانید آخرین ارجاع انجامخواهدگرفت و ارجاع دیگر بیاثر خواهد بود. پس ما همیشه بالاترین اولویتمان را در آخرین شرط قرارخواهیمداد تازمانیکه قرار است آخرین ارجاع انجامبگیرد، هیچ مشکلی در رعایت اولویتها نباشد و درنهایت انکودر اولویتدار بهخوبی توصیفشود.
ساختارشرطی if را بهطورکامل بررسیکردیم و هرآنچه نیاز بود شما از کلیات این ساختار بدانید بیانشد. در قسمت یازدهم ساختارشرطی case را بررسیخواهیم کرد. پس با ما همراه باشید.
منبع: سیسوگ