در قسمت سیزدهم از آموزش FPGA بحث مربوط به توصیف عناصر حافظه را ادامه داده بودیم و مفصلا در مورد اینکه درون FPGA، حافظهها چگونه به وجود میآیند صحبت کردیم. همچنین اگر خاطرتان باشد گفتیم با توجه به اینکه در محیط ترکیبی یا محیط ترتیبی به یک سیگنال ارجاع دهیم، آن سیگنال میتواند تبدیل به سیم یا رجیستر (حافظه) شود. نهایتا در قسمت سیزدهم شماتیک مداری که در FPGA به وجود آمده بود را به شما نشان دادیم تا درک بهتر و صحیحتری از نحوهی پیادهسازی کدی که مینویسید در FPGA داشته باشید.
در این قسمت دوباره میخواهیم در مورد عناصر حافظه صحبت کنیم و ویژگیهای بیشتری از این عناصر حافظه را مورد بررسی قرار دهیم، همچنین همین ویژگیها را با استفاده از زبان VHDL توصیف خواهیم کرد.
ریست (Reset)
همهی ما بارها این کلمه را از افراد مختلف شنیدیم و حتی افرادی که کوچکترین درکی از الکترونیک ندارند به صورت شهودی معنای این کلمه را میدانند. مثلا وقتی یک فرد بیسواد دکمهی دستگاهی را فشار میدهد و آن دستگاه ریست میشود به صورت شهودی میفهمد که دارد چه اتفاقی میافتد و واقعا برای آن فرد هم نیازی نیست که بداند ریست دقیقا به چه معناست!
با توجه به اینکه ریست در کجا و در چه سیستمی و با چه عملکردی به کار رفته باشد، میتواند تعاریف متفاوتی داشته باشد، اما مفهوم کلی ریست این است که یک سیستم به یک حالت اولیه یا یک حالت تعیین شده بازگردد. نمیدانم برای اولین بار مفهوم ریست در CPU به کار رفته باشد یا نه (اگر از تاریخچه این موضوع باخبرید با ما در میان بگذارید) اما بیایید این موضوع را بررسی کنیم که وقتی ما CPU را ریست میکنیم چه اتفاقی میافتد؟
توضیحاتی که در بالا ذکر کردیم، تشریح روند کلی، عملکرد ریست در CPU بود تا شما بیشتر با مفهوم ریست آشنا شوید. به دو دلیل وارد مباحث تئوری این موضوع نمیشویم، دلیل اول اینکه مقالات سیسوگ بیشتر جنبهی فنی دارند و اگر قرار باشد موضوعی بررسی گردد سعی میشود به صورت کاربردی بررسی شود تا علمی و تئوری، ناگفته نماند که مباحث علمی و تئوری به مراتب ارزشی چند برابر دارند. دلیل دوم هم اینکه در FPGA اصلا چیزی به اسم CPU وجود ندارد که ما بخواهیم وقت بگذاریم و این موضوع را بررسی کنیم.
اما حدس محتمل من این است که برای اولین بار مفهوم ریست در رابطه با فلیپفلاپها به کار رفته باشد که اتفاقا موضوع مورد بحث ما در ادامه همین مورد است.
عملکرد ریست در این مقاله
ریست مورد بررسی ما نیز سیستم را به یک حالت اولیه برمیگرداند که این حالت اولیه، هر چیزی میتواند باشد. حالت اولیهای که ما در نظر گرفتیم این است که مقادیر فلیپفلاپ یا رجیستر صفر شوند. توجه کنید که ریست میتواند مقادیر رجیسترها را به هر مقدار دیگری به جز صفر نیز تغییر دهد. در واقع این انعطاف وجود دارد که مقدار اولیه را ما تعیین کنیم و پس از اینکه سیستم ریست شد مقادیر قبلی با مقادیر تعیین شده توسط ما جایگزین شوند.
فکر کنم در مورد ماهیت ریست و اینکه چه کاری انجام میدهد به اندازه کافی صحبت کردیم و اکنون وقت آن است که این عملکرد را با استفاده از زبان VHDL در FPGA پیادهسازی کنیم. اما قبل از پیادهسازی این نکته را بدانید که ریست هم میتواند سنکرون باشد و هم آسنکرون.
پیادهسازی ریست سنکرون
ابتدا کد ریست سنکرون را خواهیم نوشت، سپس در ادامه به توضیحات بیشتر در این رابطه خواهیم پرداخت.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 فعال میشود، سپس لبهی بالاوندهی کلاک را تشخیص دادیم و در زیر لبهی بالاروندهی کلاک گفتیم اگر سیگنال ریست برابر با یک شد آنگاه محتوای فلیپفلاپ صفر شود. توجه کنید که اگر لبهی بالاروندهی کلاک برقرار نباشد، حتی اگر سیگنال ریست یک باشد عمل ریست انجام نخواهد شد و این یعنی ریست سنکرون با کلاک.
پیادهسازی ریست آسنکرون
ابتدا به کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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 و … از جمله سوالاتی هستند که در قسمت پانزدهم جواب داده خواهند شد.
سلام و خسته نباشید
اتفاقا در آموزش قبل بنده میخواستم به ریست اشاره کنم … منتظر بودم آموزش جدید ارائه بشه …
ممنونم
سلام و درود بر امیر نازنین. ممنون از اینکه ما را دنبال میکنید. بحث ریست ادامه خواهد داشت در قسمت بعدی نکاتی را خواهیم گفت که به احتمال زیاد در هیچ آموزش فارسی زبانی گفته نشده است و برای شما جدید خواهند بود.