آموزش FPGA قسمت چهاردهم: توصیف عناصر حافظه (بخش سوم)

0
517
توصیف عناصر حافظه
توصیف عناصر حافظه

مجموعه آموزشی FPGA

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

در این قسمت دوباره می‌خواهیم درمورد عناصر حافظه صحبت‌کنیم و ویژگی‌های بیشتری از این عناصر حافظه را موردبررسی قراردهیم، همچنین همین ویژگی‌ها را بااستفاده‌از زبان VHDL توصیف‌خواهیم‌کرد.

ریست (Reset)

همه‌ی ما بارها این کلمه را از افراد مختلف شنیدیم و حتی افرادی که کوچک‌ترین درکی از الکترونیک ندارند به‌صورت شهودی معنای این کلمه را می‌دانند. مثلا وقتی یک فرد بی‌سواد دکمه‌ی دستگاهی را فشار می‌دهد و آن دستگاه ریست می‌شود به‌صورت شهودی می‌فهمد که دارد چه اتفاقی می‌افتد و واقعا برای آن فرد هم نیازی نیست که بداند ریست دقیقا به چه معناست!

باتوجه‌به اینکه ریست در کجا و در چه سیستمی و با چه عملکردی به‌کار رفته‌باشد، می‌تواند تعاریف متفاوتی داشته‌باشد، اما مفهوم‌کلی ریست این است که یک سیستم به یک حالت اولیه یا یک حالت تعیین‌شده بازگردد. نمی‌دانم برای اولین‌بار مفهوم ریست در CPU به‌کار رفته‌باشد یا نه (اگر از تاریخچه این موضوع باخبرید با ما درمیان بگذارید) اما بیایید این موضوع را بررسی کنیم که وقتی ما CPU را ریست می‌کنیم چه اتفاقی می‌افتد؟

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

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

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

عملکرد ریست در این مقاله

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

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

پیاده‌سازی ریست سنکرون

ابتدا کد ریست سنکرون را خواهیم‌نوشت، سپس در ادامه به توضیحات بیشتر در این رابطه خواهیم‌پرداخت.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity Flip_Flop is
Port ( 
D : in STD_LOGIC;
Clock : in STD_LOGIC;
Reset : 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;
if (Reset = '1') then
Q <= '0';
end if; 
end if;

end process;

end Behavioral;

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

وقتی از سنکرون بودن حرف می‌زنیم، منظور همزمان‌بودن است. اولین سوالی که پیش می‌آید این است که همزمان با چی! در اکثر اوقات سنکرون بودن به‌معنای همزمان‌بودن با کلاک است. شاید این توضیحات کمی برای شما گنگ باشد، پس بادقت به ادامه توضیحات توجه‌کنید.

در دیجیتال اگر قرار باشد عملی انجام بگیرد یا دیتا از جایی به جای دیگر منتقل‌شود و به‌طورکلی محتوا یا دیتای حافظه‌ها (رجیسترها) عوض بشوند، دو راه داریم:

  • انتقال دیتا به صورت سنکرون با کلاک
  • انتقال دیتا به صورت آسنکرون

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

اما انتقال دیتا به‌صورت آسنکرون چگونه‌است؟ در انتقال دیتا به‌صورت آسنکرون دیگر کلاکی وجود ندارد و انتقال دیتا با یک زمان‌بندی خاص صورت می‌گیرد، مثلا هر ثانیه یکبار دیتا منتقل می‌شود. در ادامه کد ریست آسنکرون را نیز خواهیم‌نوشت.

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

پیاده‌سازی ریست آسنکرون

ابتدا به کد زیر توجه‌کنید:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity Flip_Flop is
Port ( 
D : in STD_LOGIC;
Clock : in STD_LOGIC;
Reset : in STD_LOGIC;
Q : out STD_LOGIC
);
end Flip_Flop;

architecture Behavioral of Flip_Flop is

begin

process(Clock, Reset)
begin

if rising_edge(Clock) then
Q <= D; 
end if;

if (Reset = '1') then
Q <= '0';
end if;

end process;

end Behavioral;

 

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

چون Reset هم در لیست حساسیت قرارگرفته‌است، با تغییرات برروی Reset، بدون‌توجه‌به اینکه کلاک در چه حالتی قرار دارد، process فعال می‌شود. پس‌از فعال‌شدن process با یک شرط مقدار Reset را بررسی می‌کنیم، اگر همان مقدار مدنظرما بود عمل ریست انجام می‌شود.

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

 

منبع:‌سیسوگ

مطلب قبلیآموزش میکروبلیز قسمت سوم: آموزش زبان برنامه‌نویسی C
مطلب بعدیراه‌اندازی ریموت با آردوینو

پاسخ دهید

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