Reset
در قسمت پانزدهم از مجموعه آموزشی FPGA درمورد نحوهی نوشتن ریست در FPGAهای شرکت Xilinx مفصلا صحبت کردیم و از منطق سختافزاری که درون FPGA وجود دارد پرده برداشتیم و نهایتا طبق شماتیک مدار پیادهسازی شده در FPGA به شما توصیه کردیم که هرموقع خواستید از ریست استفادهکنید، آنرا با مقدار ۱ منطقی مقایسه کنید. در این قسمت قصد داریم به شما توصیه کنیم که نهایتا از ریست استفاده نکنید و به جای آن از راهکاری که عملکردی مشابه دارد استفادهکنید. پس با ما همراه باشید تا باهم یک سری نکات مفید و مهم را مرورکنیم. قبلاز اینکه راهکاری جایگزین برای ریست ارائهبدهیم، میخواهیم درمورد Set، که درمقابل Reset قرار دارد صحبتکنیم و این مورد را بااستفادهاز زبان VHDL در FPGA پیادهسازی کنیم.
Set
Set هم عملکردی تقریبا مشابه با Reset دارد، اما بهجایاینکه مقدار ۰ منطقی را در فلیپفلاپ یا رجیستر جایگزین کند، مقدار ۱ منطقی را جایگزین خواهد کرد(توجهکنید که بعضی از این تعاریف قراردادی هستند و لزومی ندارد که دقیقا یک تعریف علمی از این پارامترها وجود داشتهباشد). قبلاز توضیحات مربوطه، در ابتدا Set را بااستفادهاز زبان VHDL توصیف خواهیم کرد سپس توضیحات اضافه را بیانخواهیمنمود.
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; Set : 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; if (Set = '1') then Q <= '1'; end if; end if; end process; end Behavioral;
همانطورکه در کد بالا واضح و مشخص است تنها عاملی که میتواند باعث فعالشدن perocess شود، کلاک میباشد و این یعنی اینکه مدار ما سنکرون است و مشخصا Reset و Set مدار هم سنکرون است. طبق توضیحات گذشته دوباره Set را با مقدار ۱ منطقی مقایسه کردیم و اگر برابر این مقدار بود، آنگاه ارزش رجیستر هر مقداری بود به مقدار ۱ تغییر پیدا خواهد کرد. شاید از دوران دانشگاه، از درس مدارات منطقی به یاد داشتهباشید که میگفتیم اولویت با Set است یا Reset؟ یعنی اگر بهطورهمزمان این دو مقدار برابر با یک باشند(طبق کد بالا) کدامین عمل Set یا Reset انجام میشود! اصلا آیا بااستفادهاز کد VHDL این قابلیت و انعطاف برای ما وجود دارد که تعیینکنیم در ابتدا کدام یک از این اعمال انجامشود و برای این اعمال اولویت تعیینکنیم؟ بله زبان VHDL این انعطاف و قابلیت را به ما میدهد که این موضوع را هموار کنیم. در کد بالا اولویت با Set بود، کدی را در ادامه خواهیم نوشت که اولویت آن با Reset خواهد بود. شما در ابتدا خودتان به تفاوت کوچکی که در کد وجود دارد توجهکنید تا بهصورت شهودی متوجهشوید که دلیل اولویت در این امر ناشی از چیست تا ما در ادامه پساز نوشتن کد دوم دلیل را بیانکنیم.
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; Set : 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 (Set = '1') then Q <= '1'; end if; if (Reset = '1') then Q <= '0'; end if; end if; end process; end Behavioral;
اما دلیل اینکه با جابهجایی چند خط اولویت عوضشد چیست؟
در زبان VHDL، اگر به یک سیگنال مشخص در محیط ترتیبی، بااستفادهاز ساختارهای شرطی چندین ارجاع داشتهباشیم، و بیشاز یک شرط صحیح باشد، آنگاه ارجاعی صورتخواهدگرفت که در آخرین شرط قرار دارد.
درنظربگیرید که اگر بدوناستفادهاز ساختارهای شرطی در محیط ترتیبی چندین ارجاع بنویسید، قبلاز مرحله سنتز، بقیه ارجاعات توسط نرمافزار حذف خواهند شد و تنها آخرین ارجاع درنظر گرفتهخواهدشد. باتوجهبه نکته طلایی بالا، چون ما بااستفادهاز ساختار شرطی if این کار را انجامدادیم، حال اگر Set و Reset هردو برابر با ۱ منطقی باشند ارجاع مرتبط با شرط دوم در اولویت است و انجامخواهدشد. در کد اول اولویت با Set است و در کد دوم اولویت با Reset است. همانطورکه میدانید ساختار شرطی if ذاتا در ساختار خود دارای اولویت است، یعنی بهترتیب از بالا به پایین اگر یکیاز شرطها برقرار باشد شرطهای زیرین دیگر بررسی نمیشوند و این خود یعنی اولویت. در ادامه دو کد بالا را بااستفادهاز این تکنیک نیز توصیفخواهیمکرد. چون قبلا در این رابطه توضیحدادیم دیگر توضیح اضافهای نخواهیمداد و خودتان برای درک بیشتر به قسمتهای قبلی که مربوط به ساختارهای شرطی است مراجعهکنید.
اولویت با Reset
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; Set : 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'; elsif (Set = '1') then Q <= '1'; end if; end if; end process; end Behavioral;
اولویت با Set
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; Set : 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 (Set = '1') then Q <= '0'; elsif (Reset = '1') then Q <= '1'; end if; end if; end process; end Behavioral;
امیدوارم که تا اینجا بهخوبی تفاوتها را درککردهباشید و بهطورکامل متوجهشدهباشید که وقتی در پروژهای میخواهید اولویت تعریفکنید به چه نحو و از چه تکنیکهایی استفادهکنید. بهعنوان یک نکته بههیچوجه مدارتان را آسنکرون طراحی نکنید این مورد توصیه اکید خود زایلینکس نیز میباشد، ریست نیز از این قاعده مستثنی نیست و باید همیشه آن را سنکرون تعریفکنید. اما ما قصد داریم در ادامه به شما نکتهای را بیاموزیم که حتی نیاز به استفادهاز ریست سنکرون هم نداشتهباشید.
در تمام FPGAهای شرکت زایلینکس واحدی به اسم(GSR (Global Set/Reset وجود دارد که هنگام روشنشدن FPGA تمامی مقادیر اولیه را بهصورت آسنکرون به فلیپفلاپها اعمال میکند. شما میتوانید سیگنالهایتان را با مقادیر اولیه تعریف کنید و از این تکنیک استفادهکنید.
اگر از تکنیک بالا و یا درصورتنیاز بهجای ریست آسنکرون، از ریست سنکرون استفادهکنید، بنابه دلایلی که پیداکردن این دلایل را برعهده خودتان میگذاریم، مدار شما هم سرعت بالاتری خواهد داشت هم منابع کمتری استفادهخواهدکرد. حال که بهخوبی با اصول و توصیف فلیپفلاپها و جزئیات آنها آشنا شدیم در قسمت هفدهم با رجیسترها که خود متشکل از چندین فلیپفلاپ در کنارهم هستند آشناخواهیمشد.
منبع:سیسوگ