ساختار شرطی if;
در قسمت هشتم از آموزش FPGA با مدارات ترتیبی در محیط Sequential آشنا شدیم. عناصر پایه سازنده مدارات ترتیبی را شناختیم و به طور مفصل بررسی کردیم که در محیط ترتیبی، ارجاعات چگونه انجام میگیرند.
در این قسمت با ساختار شرطی if در محیط ترتیبی آشنا خواهیم شد، و به دو روش مختلف یک مالتیپلکسر 2 به 1 را توصیف خواهیم کرد. در همین حین نکات زیادی را در رابطه با محیط ترتیبی و نحوه کدنویسی فرا خواهیم گرفت.
توجه داشته باشید که مالتیپلکسر ذاتا یک مدار ترکیبی است، و شاید با خودتان بگویید چرا مداری که ذاتا ترکیبی است را در محیط ترتیبی توصیف میکنیم؟ بله، اصولا نباید مداری که ذاتا ترکیبی است را در محیط ترتیبی توصیف کرد، ولی ما برای آشنایی هرچه بیشتر با محیط ترتیبی، در ابتدا بعضی از مدارات ترکیبی که قبلا توصیف کرده بودیم را در این محیط توصیف میکنیم. اما در نهایت کاری که ما خواهیم کرد، هر مداری را در جای خود توصیف کرده و تا حد امکان به پیشنهاد شرکت زایلینکس، تمامی مدارات را از نوع ترتیبی سنکرون طراحی میکنیم.
در قسمت هفتم تعریفی از مالتیپلکسر ارائه دادیم و شما به خوبی با عملکرد و ساختار این مدار آشنا هستید. اگر به خاطر داشته باشید در آنجا، مالتیپلکسر را با استفاده از ساختار ارجاع انتخابی در محیط ترکیبی، توصیف کردیم. اما در این قسمت میخواهیم همان عملکرد را با استفاده از ساختار شرطی if توصیف کنیم. ساختار شرطی if، پرکاربردترین و قابل انعطافترین ساختار شرطی زبان VHDL میباشد. در قسمتهای آتی با توجه به نحوه پیادهسازی ساختارهای شرطی درون FPGA و همچنین مقایسهای که برای این ساختارها ارائه خواهیم داد، شما متوجه خواهید شد که چرا ساختار شرطی if، پرکاربردترین و قابل انعطافترین ساختار شرطی میباشد.
قبلا، در قسمت ششم گفتیم که در ساختار ارجاع شرطی در محیط Concurrent، شرطها به صورت ذاتی و از لحاظ ساختاری، اولویتدار هستند. ساختار if نیز از همین قاعده پیروی میکند و شرطها دارای اولویت هستند، بدین صورت که شرطها به ترتیب قرار گرفتن در این ساختار مورد بررسی قرار میگیرند و اگر یکی از شرطها برقرار شد، از شرطهای دیگر صرفنظر میشود و این شرطها مورد بررسی قرار نمیگیرند.
به توصیف مالتیپلکسر 2 به 1 با استفاده از ساختار شرطی if در کد توجه کنید:
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; use IEEE.NUMERIC_STD.ALL; entity MUX is Port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; S : in STD_LOGIC; Y : out STD_LOGIC ); end MUX; architecture Behavioral of MUX is begin process(I0,I1,S) begin if(S = '0') then Y <= I0; else Y <= I1; end if; end process; end Behavioral; |
در لیست حساسیت سیگنالهای ورودی و همچنین سیگنال خط فرمان قرار میگیرند، که با تغییر هر کدام از آنها process فعال، و ارجاعات انجام میشوند. در ادامه ساختار شرطی if را به کار بردهایم، به این صورت که هرگاه خط فرمان مقدارش ‘0’ باشد وردی اول به خروجی منتقل میشود در غیر اینصورت، ورودی دوم به خروجی منتقل خواهد شد.
اما روشی دیگر برای توصیف همین کد نیز وجود دارد که معمولا کدنویسان حرفهای به این سبک کد مینویسند. به کد زیر توجه کنید:
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 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity MUX is Port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; S : in STD_LOGIC; Y : out STD_LOGIC ); end MUX; architecture Behavioral of MUX is begin process(I0,I1,S) begin Y <= I1; if(S = '0') then Y <= I0; end if; end process; end Behavioral; |
قبل از هر توضیحی، به این نکته توجه کنید که هر دو کد نوشته شده دقیقا یک عملکرد را توصیف میکنند و در نهایت نیز هر دو کد، یک سختافزار واحد را در درون FPGA میسازند. پس تنها تفاوت این دو کد در ظاهر میباشد و هیچ تفاوت دیگری ندارند.
اگر توجه کنید در کد دوم، عبارت ارجاعی که بعد از else در کد اول آورده شد را برداشتیم و به قبل از if انتقال دادیم، و همانطور که گفتیم با این تغییر خطوط، عملکرد یکسان است. نحوهی کار به این صورت است که میگوییم تحت هر شرایطی I1 به Y ارجاع داده شود، مگر اینکه S برابر با ‘0’ باشد. و این دقیقا همان عملکرد کد اول را دارد. شما به این صورت در نظر بگیرید، تا زمانی که میتوانیم کدمان را به صورت if_then بنویسیم، هیچ لزومی ندارد که از if_then_else استفاده کنیم.
- جابهجایی خطوطِ ساختارهای شرطی
- جابهجایی دو یا چندین خط ارجاع، وقتی که در همهی این ارجاعات سیگنالهای مختلفی به یک سیگنال واحد ارجاع داده شوند (به عبارتی دیگر در سمت چپ همهی ارجاعات یک سیگنال واحد وجود داشته باشد.)
خب همانطور که میدانید در ساختارهای شرطی، چون شرطها داری اولویت هستند پس جابهجایی خطوط میتواند عملکرد را تغییر بدهد. البته ما بعضی اوقات با توجه به همین عملکرد اولویتدار بودن شرطها، مداراتی که واقعا در ذات خود دارای اولویت هستند را به نحو خوبی توصیف میکنیم. در دیجیتال مداراتی وجود دارند که با دریافت ورودیهای نامعتبر، عملکرد مدار صحیح نمیباشد و به احتمال زیاد در خروجی دیتای موردنظر را دریافت نکنیم، البته منطقی است که خروجی نامعتبر و ناشناختهای دریافت کنیم چون ورودی پیشبینی نشدهای به مدار اعمال کردیم. همهی این کارها نیز با زبان VHDL قابل انجام است، در قسمتهای بعد مثالهایی خواهیم داشت که این موضوع را به خوبی پوشش میدهد.
ما قبلا گفتیم که جابهجایی ارجاعات در زبان VHDL تغییری در عملکرد ندارد، چون همهی ارجاعات همزمان باهم انجام میشوند. اما حالتی استثنا وجود دارد. برای درک بیشتر موضوع ابتدا به کد زیر توجه کنید:
1 2 | A <= B; A <= C; |
فرض کنید کد بالا در محیط ترتیبی نوشته شد، و طبق اصولی که تا الان بیان کردیم، میدانیم که هر دو ارجاع باید همزمان باهم انجام شوند. حال اگر قرار باشد هر دو ارجاع همزمان رخ بدهند، مقدار B یا C به A ارجاع داده میشود؟ چون سیگنال A در یک لحظه نمیتواند هم مقدار B و هم مقدار C را به خود بگیرد!
این دقیقا همان حالت استثنا است و در جواب میتوان گفت که در زبان VHDL اگر دو یا چندین ارجاع مختلف به یک سیگنال داشته باشیم (در کد بالا دو ارجاع به سیگنال A) همیشه آخرین ارجاع در نظر گرفته میشود.
اکنون کد زیر را در نظر بگیرید:
1 2 | A <= C; A <= B; |
اگر شما کد اول را در محیط ترتیبی بنویسید، ارجاع A <= C انجام خواهد گرفت، و اگر کد دوم را در محیط ترتیبی بنویسید، ارجاع A <= B انجام خواهد گرفت. پس نتیجه بسیار متفاوت خواهد بود که شما وقتی به یک سیگنال واحد چندین ارجاع مختلف دارید کدام حالت را انتخاب کنید.
البته این توضیحات داده شده است تا شما مفاهیم را به خوبی درک کنید، وگرنه شما هم پس از مدتی کدنویسی درک خواهید کرد که چرا چندین ارجاع مختلف در محیط ترتیبی به یک سیگنال، بدون استفاده از ساختارهای شرطی، با ذات سختافزار در تناقض خواهد بود.
در قسمت دهم انکودرهای اولویتدار را با استفاده از اولویتدار بودن شرطها، در ساختارهای شرطی توصیف خواهیم کرد.
سلام. ببخشید در این شکل علاوه بر lut یه منبع دیگه ای هم هست به نام ld. می خواستم بدونم چه چیزی هست؟ همون فلیپ فلاپ هست؟ https://sisoog.com/wp-content/uploads/2020/02/Screenshot_2.png
سلام علی جان. نازنینم لچ میشه نه فلیپ فلاپ.
با سلام و خسته نباشید.
سوالم درمورد ساختار شرطی if هست….
آیا این دو ساختار زیر با هم تفاوتی دارند از منظر پیاده سازی؟
if () then
elsif () then
end if;
و
if () then
end if;
if () then
end if;
سلام دوست عزیز.
گرچه با هر دوساختار میتوان عملکرد مشابهی را توصیف کرد، اما از منظر پیادهسازی و همچنین سرعت مدار تفاوت وجود دارد.
با توجه به یک سری مسائل که شاید در کامنت قابل بیان نباشد، منطقا ساختار دوم ارجهیت دارد.
امکانش هست یک جلسه آموزشی در این رابطه در سایت قرار بدید؟
مفاهیم جوری نیستند که بخواهیم در یک مقاله همه چیز را توضیح بدهیم وگرنه حتما این کار را میکردیم. مطالب پیوسته به هم هستند و شما هم با خواندن همهی آنها تا حدودی به درک درستی خواهید رسید.
اگر دانش مدار منطقیتان خوب است، سعی کنید کدها را با ادوات دیجیتال روی کاغذ برای مثالهای متنوعی پیادهسازی کنید تا متوجه موضوع بشوید. تنها راه هم برای درک عمیق این موضوع همین است، بدون شناخت دقیق جبر بول و مدارات منطقی راه دیگر و میانبری نیست.
برای مدار منطقی کتاب مانو بد نیست برای شروع خوبه اما خب یکم سادست.
از دو لینک زیر نیز میتونید کمک بگیرید:
https://maktabkhooneh.org/course/263-%D9%85%D8%AF%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B7%D9%82%DB%8C-mk263/
https://maktabkhooneh.org/course/%D9%85%D8%AF%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B7%D9%82%DB%8C-mk85/
خیلی ممنون از توضیحاتتون تا حدودی قانع شدم ولی بخشی از صحبتتون که گفتید” گرچه با هر دوساختار میتوان عملکرد مشابهی را توصیف کرد، اما از منظر پیادهسازی و همچنین سرعت مدار تفاوت وجود دارد.” برام گنگ و نامفهومه . برای مثال وقتی بخواهیم یک انکدر اولویت دار را ( مثل انکدر “آموزش FPGA قسمت دهم” ) با دو ساختار بالا پیاده سازی کنیم موقع پیاده سازی اگر به قسمت view technology schematic نگاهی کنیم هر دو با یک ساختار مشابه پیاده سازی شده اند . پس چطوریه که شما گفتید “از منظر پیادهسازی و همچنین سرعت مدار تفاوت وجود دارد”؟؟
ممنون از اینکه به جزئیات توجه کامل دارید.
با اینکه حدس اولیهام اینه که شما دارید یه تاپ لول از پیادهسازی را مشاهده میکنید، اما احتمال اشتباه بودن حرف من هم وجود دارد. اجازه بدهید خودم بررسی کنم کد موردنظر را، خبرش را بهتون میدم.
دوست عزیز در تکمیل کامنت قبلی توضیحاتی را در ادامه خدمت شما ارائه خواهم داد. برای درک هرچه بیشتر موضوع لطفا توضیحات را با جزئیات دقیق بخوانید و حتی کدهای آورده شده را خودتان تست کنید.
من برای پرسش شما مقالات چندین سایت خارجی را خواندم و همچنین دو کتاب را به صورت اجمالی بررسی کردم، اما تنها چیزی که گفته بودن تفاوت ساختار Case با if را بررسی کرده بودن که موضوع مشخصی است و مورد بحث ما نیست.
در نهایت خودم یه سری تست گرفتم و از یه نفر که تجربه بسیار زیادی در رابطه با FPGA دارند مشورت گرفتم تا به جواب نهایی رسیدم.
همانطور که گفتید دو کدی که در قسمت دهم برای توصیف انکودر اولویتدار نوشتیم در پیادهسازی دقیقا شبیه هم هستند. من هم کدها را تست کردم و هر دو کد در پیادهسازی از دو LUT استفاده میکردند.
اما دلیل این موضوع چیست؟ ببینید جواب در یک جمله قابل بیان نیست و باید مفصلا در رابطه با این موضوع بحث کرد. من هم سعی میکنم منظورم را در این کامنت منتقل کنم.
وقتی ما کدی را مینویسیم نرمافزار با توجه به الگوریتمهایی که دارد و تا جایی که بتواند با توجه به هوشی که دارد کد ما را تغییر میدهد یا بهینه میکند. البته این تغییرات خللی در عملکرد ایجاد نمیکند. پس آن چیزی که مهم است مفهوم و عملکرد است نه نحوهی کدنویسی ما.
در این مثال ساده نرمافزار با توجه به الگوریتمهایش این دو کد را شبیه به هم پیادهسازی کرد. در یک جمله میتوان گفت الگوریتمهایی که وجود دارند در بعضی از اوقات تشخیص خواهند داد که با یک ساختار بهینهتر میتوان همان عملکرد را داشت و پیادهسازی را بر حسب الگوریتم خودشان انجام میدهند. در اینجا هم دقیقا همین تشخیص داده شد و بنا به تشخیص نرمافزار هر دو کد با سادهترین ساختار پیاده شدند.
اما چه موقع مواردی که در بالا گفته شد توسط نرمافزار صورت نمیگیرد؟ مواقعی که کد پیچیدهتر میشود و یا دو کد توصیف شده با استفاده از else و بدون استفاده از else نمیتوانند جایگزین هم شوند و عملکرد مشابهی هم داشته باشند.
ما برای تست همان کد انکودر اولویتدار را کمی تغییر دادیم و به دو صورت کد آن را نوشتیم. پس از اینکه مدارات پیادهسازی شده را مشاهده کردیم، دیدیم که این دو مدار متفاوت هستند.
کدی که تغییر دادیم به صورت زیر است:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Encoder is
Port (
D : in unsigned (3 downto 0);
Q : out unsigned (1 downto 0)
);
end Encoder;
architecture Behavioral of Encoder is
begin
process(D)
begin
if D(3) = ‘1’ AND D(2) = ‘1’ then
Q <= "11"; elsif D(2) = '1' then Q <= "10"; elsif D(1) = '1' then Q <= "01"; end if; end process; end Behavioral;مدار پیادهسازی شده به شکل زیر است:https://sisoog.com/wp-content/uploads/2020/02/Screenshot_1.png
صورت دوم کد مانند زیر است:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Encoder is
Port (
D : in unsigned (3 downto 0);
Q : out unsigned (1 downto 0)
);
end Encoder;
architecture Behavioral of Encoder is
begin
process(D)
begin
if D(3) = ‘1’ and D(2) = ‘1’ then
Q <= "11"; end if; if D(2) = '1' then Q <= "10"; end if; if D(1) = '1' then Q <= "01"; end if; end process; end Behavioral;مدار پیادهسازی شده در این حالت به شکل زیر است:https://sisoog.com/wp-content/uploads/2020/02/Screenshot_2.png
امیدوارم که با این توضیحات کامل متوجه مفاهیم شده باشید. باز اگر جایی برایتان گنگ و نامفهوم است بفرمائید تا اگر دانشمان کافی بود پاسخ بدهیم.
با سلام . اگر همین انکدر را هم با case بنویسیم در پیاده سازی دقیقا شبیه با if است. این به چه دلیلیه ؟ ایا بخاطر این که انکدر یه مثال ساده ای و نرم افزار سنتز بهینه ترین حالت را پیاده سازی می کند؟ امکانش هست مثال ملموس تری بین تفاوت ساختار if و case بزنید؟
اما نکته اول در مورد دو کدی که نوشته اید هر دویشان را عینا امتحان کردم و مداری که برای من پیاده سازی شد با شکلی که شما گذاشته بودید کاملا متفاوت بود( برای مثال در شکل اولی که شما گذاشتید 7 تا lut وجود دارد ولی برای من 2 تا) نمی دونم بخاطر نوع fpgaای که در تنطیمات انتخاب کردم اینطوری شده یا نه ؟؟
و اما نکته دوم در مورد این دو کدی که نوشته اید این هست که هر دو دارای لچ هستند واین تفاوتی هم که در نوع پیاده سازیشان وجود دارد به نظر من بخاطر لچ هایشان هست. توصیه می کنم لچ هر دو کد را برطرف کنید آن وقت می بینید که هر دو تقریبا با یک ساختارمشابه پیاده سازی می شوند و تفاوت چشمگیری با هم ندارند. ( البته تنها تفاوتی که برای من در این دو کد وجود دارد این است که در اولی فقط از یک lut سه ورودی استفاده شده ولی در دومی از یک lut دو ورودی )
اولی
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Encoder is
Port (
D : in unsigned (3 downto 0);
Q : out unsigned (1 downto 0)
);
end Encoder;
architecture Behavioral of Encoder is
begin
process(D)
begin
if D(3) = ‘1’ AND D(2) = ‘1’ then
Q <= "11";
elsif D(2) = '1' then
Q <= "10";
elsif D(1) = '1' then
Q <= "01";
else
Q <= "00";
end if;
end process;
end Behavioral;
دومی
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Encoder is
Port (
D : in unsigned (3 downto 0);
Q : out unsigned (1 downto 0)
);
end Encoder;
architecture Behavioral of Encoder is
begin
process(D)
begin
Q <= "00";
if D(3) = '1' and D(2) = '1' then
Q <= "11";
end if;
if D(2) = '1' then
Q <= "10";
end if;
if D(1) = '1' then
Q <= "01";
end if;
end process;
end Behavioral;
سلام مجدد. ببینید ساختار case بهتر از ساختار if است و در حالت کلی سرعت بیشتری دارد. حال اگر ما کدی با if بنویسیم نرمافزار بررسی میکند که ببیند میتوان آن را با ساختار case یا ساختار سادهتری پیادهسازی کند یا خیر. اگر این کار برایش ممکن باشد آن را انجام خواهد داد. در ساختار case ما فقط میتوانیم شرط مساوی بودن را روی شرطها اعمال کنیم، حال اگر شرطهایی که فقط مساوی بودن را بررسی میکنند با استفاده از ساختار if بنویسیم، خود نرمافزار آن را با cese پیادهسازی میکند.
برای تفاوت ساختارهای if و case به دو عکس زیر توجه کنید:
لینک حذف شده
لینک حذف شده
در مورد قسمت بعدی سوالتان باید بگویم که به احتمال زیاد نوع fpga متفاوتی نسبت به من انتخاب کردید.
در پاسخ قسمت آخر سوالتان هم باید بگویم که با تغییرات کوچکی هم ممکن است پیادهسازی تغییراتی داشته باشد.
سلام
یه توصیه کوچولو : در لیست حساسیت process بهتره فقط سیگنال های پیوسته بخصوص کلاک استفاده بشه
ممنون بابت آموزش هاتون
سلام بر امیر نازنین. ممنون از اینکه به این نکته مهم توجه کردید، بله حرف شما کاملا صحیح میباشد و باید در لیست حساسیت فقط سیگنال کلاک قرار بگیرد، چون هر چیزی به جز این خلاف فلسفه و ذات مدارات ترتیبی خواهد بود. ولی اگر به قسمت هشتم مراجعه کنید، مشاهده میکنید که در پاراگراف سوم گفتیم: “قابل توجه است که در ابتدای کار ما قواعدی را به کار خواهیم برد که در نهایت خودمان این قواعد را بنا به دلایلی نقد و حتی نقض خواهیم کرد”
همچنین قابل ذکر است که در لیست حساسیت به جز سیگنال کلاک، سیگنال ریست هم میتواند قرار بگیرد، در این صورت ریست آسنکرون خواهد بود که کاری توصیه شده نمیباشد. ریست فلیپفلاپهای درون FPGA های شرکت زایلینکس آسنکرون هستند، پس بهتر است اگر با FPGA های شرکت زایلینکس کار میکنیم در لیست حساسیت فقط و فقط سیگنال کلاک قرار بگیرد.
منظورتان از سیگنال پیوسته را هم متوجه نشدم، چون طبق تئوری سیگنال سیستم، در دیجیتال، با کوانتیزاسیون خاصی همهی سیگنالها گسسته هستند. شاید منظور شما اصطلاحی عامیانه میباشد که من از آن بیخبرم.
سلام
بله شما درست میگید … سیگنال ریست رو که 100% میشه در لیست حساسیت بکار برد … اینو خداییش فراموش کرده بودم .
در رابطه با فلیپ فلاپ ها که گفتی “فلیپفلاپهای درون FPGA های شرکت زایلینکس آسنکرون هستند” : کاری با نحوه ریست کردن و مفهوم سنکرون و آسنکرون بودن ندارم . من اینطور برداشت کردم که شما منظورتون اینه که فقط در CLBها فیلیپ فلاپ آسنکرون داریم. اگه منظورتون اینه باید بگم خیر چون 5 نوع فیلیپ فلاپ کاملا متفاوت داریم:
D Flip-Flop with Clock Enable and Asynchronous Clear
D Flip-Flop with Clock Enable and Asynchronous Preset
D Flip-Flop with Clock Enable and Synchronous Reset
D Flip-Flop with Clock Enable and Synchronous Set
Double Data Rate Input D Flip-Flop with Optional Data Alignment, Clock Enable and Programmable Synchronous or Asynchronous Set/Reset
این دقیقا در داکیومنت اسپارتان6 نوشته شده است .
و اون سیگنال پیوسته که نوشتید … فراموشش کنید ! منظورمو بد رسوندم .
ممنون که پاسخ دادی.
نه منظور من حرفی که شما میفرمائید نبود. منظور من از ریست فلیپفلاپها، (GSR (Global Set/Reset بود. البته شما حق داشتید اینطور برداشت کنید چون کامل توضیح نداده بودم. در زیر هم برای شما هم برای افرادی که شاید بعدا به این پست مراجعه میکنند توضیحات لازم را بیان میکنم.
در تمام FPGA های شرکت زایلینکس واحدی به اسم (GSR (Global Set/Reset وجود دارد که هنگام روشن شدن FPGA تمامی مقادیر اولیه را به صورت آسنکرون به فلیپفلاپها اعمال میکند. با توجه به موضوع ذکر شده توصیه ما این است که به هیچ وجه از ریست استفاده نکنید و اگر هم خیلی مصر هستید که از ریست استفاده کنید، حتما از ریست سنکرون استفاده کنید. هرچند که با وجود GSR نیازی به استفاده کردن ریست سنکرون هم آنچنان احساس نمیشود.
اما چرا ما میگوییم از ریست آسنکرون استفاده نکنید؟ چون در صورت استفاده از ریست آسنکرون هم منابع بیشتری استفاده میشود، هم سرعت پایین میآید و هم مدار ما قابلیت اطمینان بالایی ندارد و کلی موارد دیگر. در کل ریست فلیپهای زایلینکس هم سنکرون هستند و هم آسنکرون، اما نکتهای که وجود دارد Set و Reset این فلیپفلاپها هر دو یا باید به صورت سنکرون استفاده شوند یا آسنکرون. شما میتوانید کدی بنویسید و این موضوع را تست کنید. زمانی که سنکرون استفاده کنید مدار بهینهتر است و از منابع کمتری استفاده میکند و همچنین حداکثر کلاک قابل اعمال به مدار بیشتر میشود.
در باب این موضوعات، در قسمت پیشرفته آموزش مفصل بحث خواهیم کرد.