مقدمه
در قسمت یازدهم از مجموعه آموزشی FPGA با ساختارشرطی case آشنا شدیم و به مقایسه ساختارهای شرطی در محیط ترتیبی پرداختیم. درنهایت مقایسهای تخصصی در رابطه با این ساختارها ارائهدادیم و توصیههایی برای هرچه حرفهایترشدن شما بیانکردیم.
در قسمتهای قبل چندین فیدبک از دوستان داشتیم که گفته بودند اگر کد را به نحو دیگری بنویسیم صحیحتر میباشد، بله حرف دوستان عزیز کاملا درست بود و ماهم قصد نداریم که سخن قبلیمون که گفتهبودیم: همه برابرند، را تکذیبکنیم و اکنون بگوییم: همه برابرند ولی بعضیها برابرترند(اشاره به یک رمان معروف). اکنون میخواهیم به شما بگوییم که آن کارهای غیراصولی که در قسمتهای قبل انجام میدادیم به عمد بود! ولی در این قسمت قصد داریم که کمکم از آن کارهای غیراصولی گذر کرده و شما را با کدنویسی اصولی و حرفهای آشناکنیم. تنها دلیلی هم که ما در قبل بهصورت غیراصولی کد مینوشتیم این بود که شما اشتباهات مختلف را بشناسید و مفهوم را بهخوبی درک کنید، حال وقتی به شما کدنویسی اصولی گفته شود قدر عافیت میدانید، بالاخره قدر عافیت کسی داند که به مصیبتی گرفتار آید.
قبلا ما مدارات ترکیبی را در محیط ترتیبی توصیف میکردیم که کاری اشتباه بود، از این قسمت به بعد دیگر مدرات ترکیبی را در محیط ترتیبی توصیف نخواهیمکرد. دقت بفرمائید که یک مدار ترتیبی در دل خود شامل مدار ترکیبی است، اما ما بهصورت مستقیم یک مدار ترکیبی خالص را در محیط ترتیبی توصیف نخواهیم کرد. در ادامه همچنین مقدماتی از بحث کلاک بیان میکنیم و نهایتا در این قسمت به توصیف عناصر پایه در FPGA بسنده خواهیمکرد.
در مدارات ترتیبی، خروجی علاوهبر ورودی در همینلحظه به ورودیهای لحظات قبل نیز بستگی دارد. حال ما برای ساخت چنین مداراتی ابتدا باید به تشریح و ساختن حافظهها که عناصر پایه این مدارات هستند بپردازیم.
حافظهها در دیجیتال و منحصرا در مدارات ترتیبی
در دیجیتال معمولا حافظهها را به ۲دستهکلی بهصورتزیر تقسیم میکنند:
- لچ
- فلیپفلاپ
کار حافظهها این است که مقادیر دیجیتال را در خود نگهدارند و این مقادیر تا زمانیکه ما تعیین میکنیم در حافظه ثابت خواهند ماند. مقادیر دیجیتال ذخیرهشده در حافظه چه زمانی و چگونه تغییر میکنند؟ جواب این سوال تفاوت بین لچ و فلیپفلاپ را نتیجه میدهد، پس با دقت به ادامه توضیحات توجهکنید.
برای اینکه مقداری که در حافظهها ذخیرهشدهاست با مقدار دیگری جایگزین شود، باید یکیاز پایههای ورودی این حافظهها تحریک شود. حالاینکه این حافظهها حساس به چه نوع تحریکی باشند، مشخص میکند که این حافظه لچ است یا فلیپفلاپ. لچها حساس به سطح سیگنال کلاک و فلیپفلاپها حساس به لبهی سیگنال کلاک میباشند، یعنی اگر قرار باشد مقدار لچ تغییر کند باید یکیاز پایههای ورودی این لچ، سطح مثبت یا منفی سیگنال کلاک را تشخیصدهد، همچنین برای اینکه مقدار فلیپفلاپ تغییر کند باید یکیاز پایههای ورودی این فلیپفلاپ لبهی مثبت یا منفی سیگنال کلاک را تشخیصدهد.
پیادهسازی با لچ یا فلیپفلاپ؟
اگر مدارات منطقی را بهصورت خیلیدقیق بررسیکنیم در جزئیات لچ و فلیپفلاپ تفاوتهایی وجود خواهد داشت، اما تفاوت اصلی همان موردبالا بود که بیانکردیم. همین تفاوتها و یکسری پارامترهای دیگر مربوط به FPGA ها گاها باعث ایجاد مشکلاتی در پیادهسازی میشود که هم افراد حرفهای و هم خود شرکت xilinx پیشنهاد میکند که از لچ در پیادهسازی استفادهنکنیم.
ماهم در این مجموعه آموزشی نه به توصیف لچ خواهیم پرداخت و نه از این به بعد در هیچکدام از مثالها یا پیادهسازیها از لچ استفادهخواهیمکرد. بلکه در تمامی مثالها و پیادهسازیها حافظه مورداستفاده ما فلیپفلاپ خواهد بود.
قبلاز اینکه به پیادهسازی فلیپفلاپ بپردازیم نیاز است که مقدماتی از توصیف کلاک در FPGA بدانیم، چون برای توصیف فلیپفلاپ نیاز است که لبهی سیگنال کلاک را تشخیصبدهیم.
پیادهسازی مدارات ترتیبی در محیط Sequential
فرضکنید میخواهیم یک فلیپفلاپ را بااستفادهاز زبان VHDL توصیف و درنهایت در FPGA پیادهسازی کنیم، بدینمنظور ابتدا باید یک process ایجاد کنیم، سیگنالی که در لیست حساسیت process قرار خواهد گرفت، چیست؟ همانطورکه میدانید ذات مدارات ترتیبی وابسته به سیگنال کلاک میباشد پس حداقل باید سیگنال کلاک در لیست حساسیت process قرار بگیرد، البته درنهایت به شما خواهیم گفت که در اکثر مواقع فقط همین سیگنال کلاک باید در لیست حساسیت نوشتهشود.
وقتی سیگنال کلاک را در لیست حساسیت process نوشتیم، هر تغییری که روی کلاک رخ بدهد process فعال خواهد شد و هر ارجاعی که در این محیط وجود داشته باشد با هرگونه تغییر کلاک انجام میشود که این موضوع مطلوب و مدنظرما نمیباشد. برای رفعکردن این مشکل باید بتوانیم لبهی سیگنال کلاک را تشخیصبدهیم تا تغییرات با لبهی کلاک صورت بپذیرند، در اینجا ما قصد داریم که مدار ترتیبی موردنظر با لبهی بالارونده کار کند، پس در ادامه ابتدا با نحوهی تشخیص لبهی بالاروندهی کلاک در FPGA آشناخواهیمشد و سپس فلیپفلاپ حساس به لبهی بالارونده را توصیفخواهیمکرد.
لبهی کلاک
همانطورکه گفتیم وقتی در لیست حساسیت process، سیگنال کلاک را قرار میدهیم، با هرگونه تغییر کلاک، process فعال میشود. حال ما باید پساز فعالشدن process شرطی را قرار بدهیم که یکی لبههای کلاک را بررسیکند و زمانیکه لبهی کلاک تشخیصدادهشد ارجاعات موردنظر انجام بشوند، بهعبارتیدیگر ارجاعات را زیرشرط لبهی کلاک مینویسیم تا تمامی ارجاعات سنکرون با لبهی کلاک باشند و مشکلی که در بالا بیانکردیم رفعگردد و با هرگونه تغییر کلاک ارجاعات انجام نشوند.
تشخیص لبهی کلاک
راههای مختلفی برای اینکه لبههای کلاک را تشخیصبدهیم وجود دارد، درادامه دو روش به شما معرفیخواهیمکرد و درنهایت یکیاز این دو روش را برخواهیم گزید و هرموقع خواستیم لبهی کلاک را تشخیصبدهیم از این راه استفادهخواهیمکرد.
در زبان VHDL قابلیتی به اسم attribute وجود دارد که میتوانیم بااستفادهاز این قابلیت لبهی کلاک را تشخیصبدهیم. البته attributeهای مختلفی در زبان VHDL وجود دارد که ما با همهی این attribute ها کار نداریم و فقط قصد داریم بااستفادهاز attribute نوع event لبهی کلاک را تشخیصبدهیم. خروجی attribute نوع event دو مقدار منطقی ‘۰’ یا ‘۱’ میباشد و متناسب با شرایط میتواند هرکدام از این دو مقدار منطقی باشد. اگر مقدار سیگنال در process فعلی که فعالشدهاست، نسبتبه آخرینباری که process فعالشدهاست تغییر کرده باشد، خروجی attribute مقدار ‘۱’ منطقی خواهد بود، درغیر اینصورت خروجی attribute مقدار ‘۰’ منطقی خواهد بود.
ابتدا به کد زیر توجهکنید:
if (Clock'event and Clock = '1') then
در کد بالا از event استفادهکردیم و عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘۱’ باشد و این یعنی لبهی بالاروندهی کلاک.
برای توصیف لبهی پایین به کد زیر توجهکنید:
if (Clock'event and Clock = '0') then
در کدبالا عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘۰’ باشد و این یعنی لبهی پایینروندهی کلاک.
روش سرراستتر و سادهتری برای تشخیص لبهی کلاک وجود دارد که همان روش برگزیده ما خواهد بود و از این به بعد فقط از این روش استفادهخواهیمکرد.
if rising_edge(Clock) then
کد بالا به لبهی بالاروندهی کلاک اشاره میکند، مشابها همین روش برای لبهی پایینروندهی کلاک نیز وجود دارد.
خب حالا که مقدمات کلاک را بهخوبی بررسیکردیم و با تمامی زیروبم آن آشناشدیم، قصد داریم فلیپفلاپ را بااستفادهاز زبان VHDL توصیف کنیم، به کدزیر توجهکنید:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Flip_Flop is Port ( Clock : in STD_LOGIC; D : in STD_LOGIC; Q : out STD_LOGIC ); end Flip_Flop; architecture Behavioral of Flip_Flop is begin process (Clock) begin if rising_edge(Clock) then Q <= D; end if; end process; end Behavioral;
کدبالا توصیف یک فلیپفلاپ بااستفادهاز زبان VHDL میباشد، اینکه چرا کد مربوطه منجربه ساخت یک فلیپفلاپ در FPGA میشود، سیگنالها در محیط ترکیبی و ترتیبی تبدیل به چه چیزی خواهند شد و ربط سیگنال به حافظه چیست و کلی سوال دیگر را در قسمت سیزدهم بررسی خواهیم کرد، پس با ما همراه باشید.
منبع: سیسوگ