Reset;
در قسمت پانزدهم از آموزش FPGA در مورد نحوهی نوشتن ریست در FPGAهای شرکت Xilinx مفصلا صحبت کردیم و از منطق سختافزاری که درون FPGA وجود دارد پرده برداشتیم و نهایتا طبق شماتیک مدار پیادهسازی شده در FPGA به شما توصیه کردیم که هر موقع خواستید از ریست استفاده کنید، آن را با مقدار 1 منطقی مقایسه کنید.
در این قسمت قصد داریم به شما توصیه کنیم که نهایتا از ریست استفاده نکنید و به جای آن از راهکاری که عملکردی مشابه دارد استفاده کنید. پس با ما همراه باشید تا باهم یک سری نکات مفید و مهم را مرور کنیم.
قبل از اینکه راهکاری جایگزین برای ریست ارائه بدهیم، میخواهیم در مورد Set، که در مقابل Reset قرار دارد صحبت کنیم و این مورد را با استفاده از زبان VHDL در FPGA پیادهسازی کنیم.
Set
Set هم عملکردی تقریبا مشابه با Reset دارد، اما به جای اینکه مقدار 0 منطقی را در فلیپفلاپ یا رجیستر جایگزین کند، مقدار 1 منطقی را جایگزین خواهد کرد (توجه کنید که بعضی از این تعاریف قراردادی هستند و لزومی ندارد که دقیقا یک تعریف علمی از این پارامترها وجود داشته باشد).
قبل از توضیحات مربوطه، در ابتدا Set را با استفاده از زبان VHDL توصیف خواهیم کرد سپس توضیحات اضافه را بیان خواهیم نمود.
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 32 33 34 35 36 37 | 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 را با مقدار 1 منطقی مقایسه کردیم و اگر برابر این مقدار بود، آنگاه ارزش رجیستر هر مقداری بود به مقدار 1 تغییر پیدا خواهد کرد.
شاید از دوران دانشگاه، از درس مدارات منطقی به یاد داشته باشید که میگفتیم اولویت با Set است یا Reset؟ یعنی اگر به طور همزمان این دو مقدار برابر با یک باشند (طبق کد بالا) کدامین عمل Set یا Reset انجام میشود! اصلا آیا با استفاده از کد VHDL این قابلیت و انعطاف برای ما وجود دارد که تعیین کنیم در ابتدا کدام یک از این اعمال انجام شود و برای این اعمال اولویت تعیین کنیم؟ بله زبان VHDL این انعطاف و قابلیت را به ما میدهد که این موضوع را هموار کنیم.
در کد بالا اولویت با Set بود، کدی را در ادامه خواهیم نوشت که اولویت آن با Reset خواهد بود. شما در ابتدا خودتان به تفاوت کوچکی که در کد وجود دارد توجه کنید تا به صورت شهودی متوجه شوید که دلیل اولویت در این امر ناشی از چیست تا ما در ادامه پس از نوشتن کد دوم دلیل را بیان کنیم.
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 32 33 34 35 36 37 | 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; |
اما دلیل اینکه با جابهجایی چند خط اولویت عوض شد چیست؟
در نظر بگیرید که اگر بدون استفاده از ساختارهای شرطی در محیط ترتیبی چندین ارجاع بنویسید، قبل از مرحله سنتز، بقیه ارجاعات توسط نرمافزار حذف خواهند شد و تنها آخرین ارجاع در نظر گرفته خواهد شد.
با توجه به نکته طلایی بالا، چون ما با استفاده از ساختار شرطی if این کار را انجام دادیم، حال اگر Set و Reset هر دو برابر با 1 منطقی باشند ارجاع مرتبط با شرط دوم در اولویت است و انجام خواهد شد. در کد اول اولویت با Set است و در کد دوم اولویت با Reset است.
همانطور که میدانید ساختار شرطی if ذاتا در ساختار خود دارای اولویت است، یعنی به ترتیب از بالا به پایین اگر یکی از شرطها برقرار باشد شرطهای زیرین دیگر بررسی نمیشوند و این خود یعنی اولویت. در ادامه دو کد بالا را با استفاده از این تکنیک نیز توصیف خواهیم کرد. چون قبلا در این رابطه توضیح دادیم دیگر توضیح اضافهای نخواهیم داد و خودتان برای درک بیشتر به قسمتهای قبلی که مربوط به ساختارهای شرطی است مراجعه کنید.
اگر با FPGA آشنایی ندارید اول مقاله FPGA چیست؟ را مطالعه نمایید.
اولویت با Reset
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 32 33 34 35 | 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
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 32 33 34 35 | 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; |
به عنوان یک نکته به هیچ وجه مدارتان را آسنکرون طراحی نکنید این مورد توصیه اکید خود زایلینکس نیز میباشد، ریست نیز از این قاعده مستثنی نیست و باید همیشه آن را سنکرون تعریف کنید. اما ما قصد داریم در ادامه به شما نکتهای را بیاموزیم که حتی نیاز به استفاده از ریست سنکرون هم نداشته باشید.
اگر از تکنیک بالا و یا در صورت نیاز به جای ریست آسنکرون، از ریست سنکرون استفاده کنید، بنا به دلایلی که پیدا کردن این دلایل را بر عهده خودتان میگذاریم، مدار شما هم سرعت بالاتری خواهد داشت هم منابع کمتری استفاده خواهد کرد.
حال که به خوبی با اصول و توصیف فلیپفلاپها و جزئیات آنها آشنا شدیم در قسمت هفدهم با رجیسترها که خود متشکل از چندین فلیپفلاپ در کنار هم هستند آشنا خواهیم شد.
مشکلی که من در اینجا دارم این است که vhdl یک زبان توصیف سخت افزار است و وقتی بخواهیم کدی را توصیف کنیم مثلا کد زیر باید نگاه مان یک نگاه سخت افزاری باشد نه برنامه نویسی. برای مثال اگر بخواهیم کد زیر را به صورت سخت افزاری تحلیل کنیم موقعی که Clock Enable ( سیگنال Enable در کد زیر ) برابر با 0 می شود قاعدتا نباید تغییرات set یا reset در خروجی FF اثر گذار باشد اما اگر نگاه مان به کد زیر یک نگاه برنامه نویسی باشد موقعی که Enable برابر با 0 می شود تغییرات set یا reset روی خروجی اثر می گذارد. نکته ای که برای من در اینجا نامفهوم این است که موقعی که کد زیر را شبیه سازی می کنیم ( با برنامه modelsim ) لحظه ای که Enable برابر با 0 می شود تغییرات set یا reset روی خروجی اثر می گذارد در صورتیکه نباید اینگونه باشد ؟؟
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FLIP_FLAP is
Port (
ClOCK : in STD_LOGIC;
Reset : in STD_LOGIC;
SET : in STD_LOGIC;
B : in std_logic;
G1 : in std_logic;
En : in std_logic;
A : out std_logic
);
end FLIP_FLAP;
architecture Behavioral of FLIP_FLAP is
signal Enable : STD_LOGIC;
begin
Enable <= G1 AND En ;
process(CLOCK)
begin
if rising_edge(ClOCK) then
if (SET = '1') then
A <= '1';
elsif(RESET = '1') then
A <= '0';
elsif (Enable = '1') then
A <= B;
end if;
end if;
end process;
end Behavioral;
قسمتی از تست بنچ :
wait for 100 ns;
B <='1';
RESET <='0';
SET <='0';
En <='0';
G1 <='1';
wait for 20 ns;
B <='1';
RESET <='1';
SET <='1';
En <='1';
G1 <='1';
wait for 20 ns;
B <='0';
RESET <='1';
SET <='1';
En <='1';
G1 <='1';
wait for 20 ns;
B <='0';
RESET <='0';
SET <='1';
En <='1';
G1 <='1';
wait for 20 ns;
B <='1';
RESET <='0';
SET <='0';
En <='1';
G1 <='1';
wait for 20 ns;
B <='0';
RESET <='0';
SET <='0';
En <='1';
G1 <='1';
wait for 20 ns;
B <='0';
RESET <='0';
SET <='1';
En <='0';
G1 <='1';
wait for 20 ns;
B <='1';
RESET <='1';
SET <='0';
En <='0';
G1 <='1';
wait for 20 ns;
B <='0';
RESET <='0';
SET <='1';
En <='0';
G1 <='1';
دوست عزیز من مشکل شما را بررسی کردم. کدی که شما نوشته بودید اشتباه بود و در واقع Enable آن کلاک مدار را قطع و وصل نمیکرد.
شما با این پیش فرض که کدتان درست است یک سری نتایج درست را استنتاج میکردید. خب به هر حال …
کد درست به شکل زیر است و من این کد را در isim تست کردم و همان تحلیلهایی که مدنظر است را مشاهده کردم:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FLIP_FLAP is
Port (
ClOCK : in STD_LOGIC;
Reset : in STD_LOGIC;
SET : in STD_LOGIC;
B : in std_logic;
G1 : in std_logic;
En : in std_logic;
A : out std_logic
);
end FLIP_FLAP;
architecture Behavioral of FLIP_FLAP is
signal Enable : STD_LOGIC;
begin
Enable <= G1 AND En ; process(CLOCK) begin if rising_edge(ClOCK) thenif (Enable = '1') then A <= B;if (SET = '1') then A <= '1'; elsif(RESET = '1') then A <= '0'; end if;end if; end if; end process; end Behavioral;تست بنچ هم به صورت زیر است:LIBRARY ieee; USE ieee.std_logic_1164.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --USE ieee.numeric_std.ALL; ENTITY TB_FF IS END TB_FF; ARCHITECTURE behavior OF TB_FF IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT FLIP_FLAP PORT( ClOCK : IN std_logic; Reset : IN std_logic; SET : IN std_logic; B : IN std_logic; G1 : IN std_logic; En : IN std_logic; A : OUT std_logic ); END COMPONENT;--Inputs signal ClOCK : std_logic := '0'; signal Reset : std_logic := '0'; signal SET : std_logic := '0'; signal B : std_logic := '0'; signal G1 : std_logic := '0'; signal En : std_logic := '0';--Outputs signal A : std_logic;-- Clock period definitions constant ClOCK_period : time := 10 ns; BEGIN -- Instantiate the Unit Under Test (UUT) uut: FLIP_FLAP PORT MAP ( ClOCK => ClOCK,
Reset => Reset,
SET => SET,
B => B,
G1 => G1,
En => En,
A => A
);
— Clock process definitions
ClOCK_process :process
begin
ClOCK <= '0'; wait for ClOCK_period/2; ClOCK <= '1'; wait for ClOCK_period/2; end process;-- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns;wait for ClOCK_period*10;-- insert stimulus hereReset <= '1'; SET <= '0'; B <= '1'; G1 <= '1'; En <= '1';wait; end process;END;شما میتوانید ورودیهایی که من نوشتم را تغییر بدهید و ورودیهای متفاوتی اعمال کنید و نتایج را ببینید.
با سلام . در عمل بین سه پین ورودی فلیپ فلاپ یعنی reset, set و clock enable اولویت به ترتیب با کدام یک از آنهاست ؟
سلام نازنینم. اولویت آن چیزی است که شما تعیین میکنید.
البته با توجه به مدار منطقی و بحث فلیپفلاپها موارد دیگهای هم وجود دارد که برای اینکه سردرگم نشوید بیان نمیگردد.
با عرض سلام . ببخشید سوالم را بد مطرح کردم و این سوالی که پرسیدم فراتر از بحث این جلسه است . فرض کنیم فلیپ فلاپی که توصیف می کنیم دارای CLOCK ENABLE است . اگر کلاک اینیبل غیر فعال باشد( یعنی 0 باشد) انتظار داریم سیگنال کلاک به فلیپ فلاپ اعمال نشود حال اگر در این زمان پایه reset هم برابر با 1 شود آیا با وجود اینکه کلاکی به فلیپ فلاپمان اعمال نمی شود باید خروجیمان هم 0 شود؟؟ ( انتظار داریم موقعی که clock enable برابر با 0 شود به فلیپ فلاپ کلاکی اعمال نشود در نتیجه شرط (if rising_edge(clock هم برقرار نباشد .اما هنگام شبیه سازی کد مثلا با modelsim موقعی که clock enable =0 می شود به طبع نباید کلاکی هم به FF اعمال شود یا یکجورایی فلیپ فلاپمان خاموش است اما موقعی که یکی از پایه های SET یا RESET فعال بشود خروجی فلیپ فلاپ هم تغییر می کند. در صورتیکه نباید همچین اتفاقی بیافتد )
سلام نازنینم. خب الان دو تا سوال ایجاد میشه:
سوال اول اینکه آیا ریست شما سنکرون میباشد؟ اگر ریست شما سنکرون باشد، منطقا با قطع کلاک هر تغییری بر روی ریست عملا بی تاثیر است.
سوال دوم اینکه آیا ریست شما آسنکرون میباشد؟ اما اگر ریست شما آسنکرون باشد، بدون توجه به اینکه کلاک فعال باشد یا غیر فعال، هر نغییری بر روی ریست، به مدار اعمال خواهد شد.
Reset ما در اینجا سنکرون است . پس با قطع کلاک هر تغییری بر روی رسیت باید بی تاثیر باشد چرا پس در شبیه سازی این اتفاق رخ نمی دهد ؟
یحتمل یا جایی از کد را اشتباه نوشتهاید یا سناریوی تستتان اشتباه است.
ببخشید کد زیر برای فلیپ فلاپ صحیح یا غلط ؟
architecture Behavioral of FLIP_FLAP is
signal Enable : STD_LOGIC;
begin
Enable <= G1 AND En ;
process(CLOCK)
begin
if rising_edge(ClOCK) then
if (RESET = '1') then
A <= '0';
elsif(SET = '1') then
A <= '1';
elsif (Enable = '1') then
A <= B;
end if;
end if;
end process;
end Behavioral;
بله این قسمتش که اینجا فرستادید صحیح، مگر اینکه در تعریف پورتها یا جای دیگر اشتباهی کرده باشید.
پس در این کد اگر سیگنال Enable ( همان کلاک اینیبل ) برابر با 0 شود آیا تغییرات Reset یا SET روی خروجی فلیپ فلاپ باید اثر داشته باشد یا نه ؟؟
اگر Reset یا SET سنکرون باشند با قطع کلاک اعمال نخواهند شد.
سلام بر شما
اجازه بدید یک توضیح دقیق در مورد set و reset در فلیپ ها به شما بدهم.
فلیپ فلاپ ها در FPGA در حالت کلی دو ورودی set و reset دارند که فقط یکی از آنها می تونه استفاده بشه. اگر شما تمایل داشته باشید مثل کدی که نوشتید هم set و reset تو مدارتون داشته باشید عملا از دو فلیپ فلاپ پشت سرهم استفاده میشه.
اولویت اجرا هم به این صورت هست که
۱- ریست
۲- ست
۳- کلاک اینیبل
پیشنهاد ویژه من به شما اینکه سند شماره wp275 رو مطالعه کنید. خیلی ساده این موضوع را به شما توضیح داده. از لینک زیر می تونید برای دانلودش استفاده کنید.
https://www.xilinx.com/support/documentation/white_papers/wp275.pdf
درود بر آقا محسن دوست نازنیم. تشکر میکنم بابت اینکه دانش بسیار تخصصیتان را در اختیار ما و سایر خوانندگان سیسوگ قرار میدهید.
من قبلا یکی از همین داکیومنتا را خونده بودم که دو ورودی set و reset هر دو میتوانند استفاده شوند اما باید هر دو یا سنکرون باشند یا آسنکرون، و این متفاوت هست با اینکه فقط یکی از اینها میتواند استفاده بشود.
حالا احتمال این وجود دارد که من دقیق مطالعه نکرده باشم. این سندی که شما فرستادید را نیز مطالعه میکنم تا شبهه برطرف شود.
با سلام . اگر بخواهیم علاوه بر پایه های set و reset از پایه clock enable هم استفاده کنیم کدمان را باید به چه نحوی بنویسیم ؟؟
سلام نازنینم. موردی که میفرمائید غالبا برای کنترل توان صورت میگیرد.
روشهایی برای این کار وجود دارد که تنها یکی از این روشها اصولی میباشد و البته جز تمهیداتی است که خود شرکت زایلینکس برای این مورد ارائه داده است و شما میتوانید از آن استفاده کنید و به بهترین نحو ممکن روی کلاک کنترل داشته باشد و هر موقع بخواهید آن را فعال یا غیر فعال کنید.
چون توضیح دادنش کمی زمانبر است و در یک کامنت نمیگنجد و خودش میتواند یک یا چندین مقاله باشد شما را به سایت خوب هگزالینکس ارجاع میدهم که در این مورد توضیحات خوبی ارائه نمودند.
روی لینک زیر کلیک کنید:
https://hexalinx.com/
سلام و عرض ادب. از جنابعالی بابت آموزش های کامل و ارزشمندتان کمال تشکر را دارم. استاد در مورد GSR نیاز به مثال نبود ؟ حقیقتش درست درک نکردیم چی شد آخرش!
سلام سروش نازنین. خوشحالم از اینکه این آموزش توانسته تا این حد برای شما مفید بوده باشه. همانطور که میدانید مبحث FPGA بسیار تخصصی میباشد و به دنبال آن تولید محتوا نیز برای آن بسیار سخت و زمانبر است و من هم متاسفانه به دلیل ضیق وقت نتوانستم مثالش را براتون ارائه بدم.
صبور باشید در قسمتی سعی خواهم کرد به این موضوع بپردازم.
سلام خدمت شما دوست عزیز
توضیحی که در مورد GSR داده شده کاملاً کافی است. اصلاً نیازی نیست زیاد روی این بلوک تمرکز کنید. فقط کافیه بدونید بلافاصله بعد از پیکره بندی یا برنامه ریزی FPGA کل سیستم به صورت یکباره ریست میشه و اصطلاحاR یک ریست سرتاسری به مدار شما اعمال میشه.
این ریست سرتاسری یک مزیت ویژه محسوب میشه، چون بدون اینکه شما سیگنال ریستی تعریف کرده باشید یا سیگنال ست برای مقدار دهی اولیه تعریف کرده باشید، همه چیز درست همونجوری که شما به سیگنالها مقدار دهی اولیه کردید، سرجای خودش قرار میگیره. حتی یک مسیر اضافی هم تو FPGA ایجاد نمیشه.
حالا فرض کنیم وسط کار تصمیم دارید دقیقاً همه این شرایط رو از نو ایجاد کنید. و یکجوری سیستم رو ریست کنید که همه چیز به حالت اول روشن شدن سیستم برگرده. حالا دوتا راه دارید.
۱- یک سیگنال ریست یا ست سرتاسری تعریف کنید و تو همه پروسس ها ازش برای مقدار دهی مجدد به سیگنال ها استفاده کنید. که در این صورت فاتحه مدار خونده میشه و عملا fanout سیگنال ریست سر به آسمون میزاره.
۲- از بلوک GSR استفاده کنید و یک گلوبال ریست یا ریست سرتاسری به مدار اعمال کنید.
امیدورام این توضیحات تکمیلی کمکتون بکنه.
سلام محسن عزیز. بله کلا توصیه اینه که تا جای ممکن از ریست استفاده نکنیم و همون ریست اولیه که حافظهها را به مقدار 0 مقداردهی اولیه میکنه کفایت میکنه.
وسط کار هم چندین راه وجود داره بهتر اینه که به هر صورت کنترل ما بیشتر باشه رو این موضوع و سنکرون بودن ریست بسیار بهتر از آسنکرون بودنشه.
دو مورد آخر را خواستم خودم بیشتر باز کنم و توضیح بدم ولی خب حالا که خودتون اشاره کردید و یحتمل باهاش برخورد هم داشتید ترجیح میدم شما توضیح بدید.
اگه لازم میدونید یک تکه کد هم برا به کارگیریشون هم بنویسید و دست آخر یکی از آنها را به عنوان کد پیشنهادی انتخاب کنید.
سلام
مثل همیشه مطلب مفیدی بود.
متشکریم
سلام امیر نازنین. خوشحالم از اینکه این مطلب برای شما مفید بوده است.