Latch ও Flip-Flop — সার্কিট যখন প্রথম মনে রাখতে শেখে
Latches and Flip-Flops
একটা gate-এর আউটপুট নিজের ইনপুটে ফিরিয়ে দিলে (feedback) সার্কিট প্রথমবার 'মনে রাখতে' শেখে — SR latch থেকে D latch হয়ে edge-triggered flip-flop পর্যন্ত, এটাই combinational থেকে sequential logic-এ প্রবেশের মুহূর্ত।
আগে এটা বুঝি
গত লেসনের ALU-তে প্রতিটা gate-এর আউটপুট শুধু বর্তমান input-এর উপর নির্ভর করত — input বদলালে সাথে সাথে (propagation delay ছাড়া) output বদলে যেত। কোনো “স্মৃতি” নেই। ইনপুট সরিয়ে নিলে আউটপুটও মুহূর্তেই হারিয়ে যায়।
আজ আমরা এই curriculum-এর সবচেয়ে গুরুত্বপূর্ণ ধারণাগত মোড়ে পৌঁছাচ্ছি: কীভাবে একটা সার্কিট নিজের ফলাফল মনে রাখতে পারে, এমনকি ইনপুট বদলে গেলেও। এই একটা লাফেই আমরা combinational থেকে sequential logic-এ প্রবেশ করছি — যেখান থেকে register, counter, state machine, আর শেষ পর্যন্ত পুরো CPU-র memory-সচেতন আচরণের জন্ম হয়।
মূল ধারণা
SR Latch — Feedback-এর জাদু
কৌশলটা আশ্চর্যজনকভাবে সরল: একটা gate-এর আউটপুট আরেকটা gate-এর ইনপুটে ফিরিয়ে দিন।
দুইটা NOR gate নিন, প্রতিটার আউটপুট অন্যটার একটা ইনপুটে জুড়ে দিন:
┌───────┐
R ───┤ │
│ NOR ├──┬──── Q
┌───┤ │ │
│ └───────┘ │
│ │
│ ┌───────┐ │
└───┤ │ │
S ───┤ NOR ├──┴──── Q'
└───────┘যুক্তি — কেন এটা state ধরে রাখে: ধরুন S=0, R=0 (দুইটাই
নিষ্ক্রিয়), আর বর্তমানে Q=1, Q'=0। প্রথম NOR gate: input
(R=0, Q'=0) → NOR(0,0)=1 → Q=1 (নিজেকেই বজায় রাখছে)। দ্বিতীয়
NOR gate: input (S=0, Q=1) → NOR(0,1)=0 → Q'=0 (নিজেকেই বজায়
রাখছে)। কোনো ইনপুট বদল ছাড়াই সার্কিট নিজের আগের আউটপুট বজায়
রাখছে — এটাই memory-র জন্ম।
| S | R | ফলাফল |
|---|---|---|
| 0 | 0 | Hold — আগের Q বজায় থাকে |
| 0 | 1 | Reset — Q=0 |
| 1 | 0 | Set — Q=1 |
| 1 | 1 | নিষিদ্ধ (নিচে দেখুন) |
D Latch — Forbidden State এড়ানোর কৌশল
SR latch-এর সমস্যা সমাধানের সহজ উপায়: input-কেই এমনভাবে সীমাবদ্ধ
করুন যাতে S=R=1 কখনো ঘটতেই না পারে। একটা D (Data) input
আর একটা Enable (E) signal দিয়ে — S আর R-কে গঠনগতভাবেই
সবসময় পরস্পর-বিরোধী (একটা 1 হলে আরেকটা 0) বানিয়ে দিন।
S = D AND E
R = D' AND EE=1 হলে: D=1 হলে S=1,R=0 (Set); D=0 হলে S=0,R=1 (Reset)
— S=R=1 কখনো ঘটে না, কারণ D আর D' একই সাথে 1 হতে পারে
না।
E=0 হলে: S=0, R=0 — Hold। D latch তখন আগের মান ধরে রাখে,
D-এর বর্তমান মান যাই হোক না কেন।
E=1 অবস্থায় D latch transparent — output সরাসরি input অনুসরণ
করে, যতক্ষণ Enable HIGH থাকে।
ভেতরে কী ঘটছে
Level-Triggered বনাম Edge-Triggered — কেন এই পার্থক্যটা জীবন-মরণ
D latch-এর “transparent” আচরণ একটা লুকানো বিপদ তৈরি করে সিঙ্ক্রোনাস সিস্টেমে (যেখানে অনেকগুলো memory element একটা common clock শেয়ার করে, পরের লেসনের বিষয়)।
কল্পনা করুন দুইটা D latch chain-এ জোড়া, আর দ্বিতীয়টার output কোনোভাবে
প্রথমটার input-এ ফিরে যাচ্ছে (একটা counter-এর মতো ফিডব্যাক লুপ,
লেসন ১৩-এ দেখবেন)। যদি clock/enable 1 থাকে একটা পুরো সময়ের
জন্য (level-triggered), তাহলে সেই সময়ের মধ্যে signal বারবার
পুরো লুপ ঘুরে আসতে পারে — একটা মাত্র clock pulse-এ latch একাধিকবার
বদলে যেতে পারে, যা সম্পূর্ণ অপ্রত্যাশিত।
সমাধান — Edge-triggered flip-flop: state শুধু clock-এর একটা নির্দিষ্ট মুহূর্তে (rising edge অথবা falling edge, level না) বদলায় — বাকি পুরো clock period জুড়ে input যা-ই হোক, output স্থির থাকে।
Master-Slave গঠন — দুইটা D latch দিয়ে একটা edge-triggered flip-flop:
- Master latchEnable = CLK — CLK LOW থাকাকালীন transparent, input গ্রহণ করে
- Slave latchEnable = CLK' — CLK HIGH থাকাকালীন transparent, master-এর output গ্রহণ করে
- ফলাফলCLK rising edge-এ (LOW→HIGH transition) মুহূর্তেই master বন্ধ (freeze) হয়, slave খোলে — ঠিক সেই মুহূর্তের data-ই output-এ যায়
CLK LOW-তে: master transparent (input অনুসরণ করছে), slave frozen
(আগের মান ধরে আছে) — output বদলায় না। CLK HIGH-তে: master frozen
(শেষ মুহূর্তের input capture করে রেখেছে), slave transparent (সেই
capture করা মান output-এ পাঠাচ্ছে)। কখনোই দুইটাই একসাথে transparent
না — তাই কোনো feedback loop এক clock period-এ একাধিকবার ঘুরতে
পারে না। শুধু rising edge-এর ঠিক মুহূর্তের D মান-ই output-এ
প্রতিফলিত হয়।
উদাহরণ
JK ও T Flip-Flop
JK flip-flop — SR-এর সমস্যা (forbidden state) সমাধানের আরেকটা
পথ, কিন্তু D-এর চেয়ে ভিন্নভাবে: J=K=1-কে নিষিদ্ধ না করে, একে
একটা toggle (বর্তমান output উল্টে দেওয়া) হিসেবে সংজ্ঞায়িত
করা হয়।
| J | K | ফলাফল |
|---|---|---|
| 0 | 0 | Hold |
| 0 | 1 | Reset (Q=0) |
| 1 | 0 | Set (Q=1) |
| 1 | 1 | Toggle (Q = আগের Q’) |
T flip-flop — JK-এর সরলীকরণ, J আর K কে একসাথে জুড়ে দিলে
(T = J = K): T=0 হলে Hold, T=1 হলে Toggle। এটাই সবচেয়ে সরল
“memory + change” element, আর পরের লেসনে counter-এর একমাত্র building
block।
নিজে চালিয়ে দেখুন
Logisim-এ SR latch-এর forbidden state নিজে দেখুন
১. দুইটা NOR gate cross-coupled সাজান (উপরের diagram)
২. S=1, R=0 দিন — Q=1 হওয়া উচিত, verify করুন
৩. S=0, R=0-এ ফিরুন — Q=1 বজায় থাকা উচিত (Hold state)
৪. এবার S=1, R=1 দিন — দুইটা আউটপুটই 0 হওয়া লক্ষ্য করুন
৫. একই সাথে (simulator-এর step/tick দিয়ে) S=0, R=0-এ ফিরুন
— Logisim বহু simulation-এ একটা নির্দিষ্ট ফলাফল দেখাবে (কারণ
simulator deterministic simulation order ব্যবহার করে), কিন্তু
বাস্তব হার্ডওয়্যারে এই ফলাফল transistor-এর মাইক্রোস্কোপিক
asymmetry-র উপর নির্ভর করে, প্রতিটা চিপে ভিন্ন হতে পারে
এই পার্থক্যটাই (simulator-এর deterministic ফলাফল বনাম বাস্তব হার্ডওয়্যারের অনির্ধারিত ফলাফল) মনে রাখা জরুরি — simulator একটা মডেল, বাস্তবতা না।
S=R=1 থেকে S=R=0-তে একসাথে ফিরলে সার্কিট simulator-এও একটা অনির্ধারিত/দোদুল্যমান অবস্থা দেখায়, যা তাত্ত্বিক আলোচনার বাস্তব প্রমাণ।
নিজে বানান
D Latch থেকে Master-Slave D Flip-Flop
- প্রথমে একটা D latch বানান (SR latch + S=D·E, R=D̄·E লজিক)
- দুইটা D latch chain করুন — প্রথমটার Enable = CLK, দ্বিতীয়টার Enable = CLK প্রতিসম (inverted)
- CLK-কে ধীরে toggle করে (manual clock) verify করুন output শুধু rising edge-এই বদলায়
- CLK HIGH অবস্থায় D বদলে দেখুন output তৎক্ষণাৎ বদলায় কি না (বদলানো উচিত না — এটাই edge-triggered আচরণের প্রমাণ)
- বিল্ট-ইন D flip-flop primitive-এর সাথে তুলনা করে একই আচরণ নিশ্চিত করুন
এই BuildIt-টাই এই লেসনের কেন্দ্রীয় দাবি হাতেকলমে প্রমাণ করে — “master-slave গঠন level-triggered latch থেকে edge-triggered flip-flop তৈরি করে” — নিজের চোখে verify করা।
বাস্তব সিস্টেমে
Flip-Flop যেখানে সর্বত্র
-
প্রতিটা CPU register — পরের লেসনে দেখব একটা N-bit register আসলে N-টা D flip-flop সমান্তরালে, একটা common clock শেয়ার করছে।
-
Debounce circuit — যান্ত্রিক সুইচ (কীবোর্ড, বাটন) চাপলে প্রকৃতপক্ষে কয়েক মিলিসেকেন্ড ধরে বারবার contact bounce করে (ON-OFF-ON) — একটা SR latch দিয়ে এই bounce “ধরে রাখা” প্রথম stable অবস্থায় filter করা যায়, একটা ক্লাসিক সরল ব্যবহার।
-
Metastability mitigation — synchronizer chain — যখন একটা asynchronous signal (ভিন্ন clock domain থেকে আসা) একটা flip-flop-এ ঢোকে ঠিক clock edge-এর কাছাকাছি সময়ে, output সাময়িকভাবে অনির্ধারিত (metastable) থাকতে পারে — বাস্তব ডিজাইনে দুই বা তিনটা flip-flop পরপর ব্যবহার করে (synchronizer chain) এই ঝুঁকি ব্যবহারিকভাবে উপেক্ষণীয় মাত্রায় নামানো হয়। পরের লেসনে (clock ও timing) আরও বিস্তারিত।
-
JK flip-flop-এর ঐতিহাসিক নাম — কথিত আছে “J” আর “K” অক্ষরগুলো Jack Kilby (integrated circuit-এর সহ-উদ্ভাবক)-র নাম থেকে এসেছে, যদিও এটা সুনিশ্চিতভাবে প্রমাণিত না — একটা মজার, অমীমাংসিত ইতিহাসের টুকরো।
-
SRAM cell-এর মূল — লেসন ১৪-তে দেখবেন SRAM মূলত এই একই cross-coupled feedback ধারণা, শুধু গেট-লেভেলের বদলে সরাসরি transistor-লেভেলে ডিজাইন করা (৬-transistor কনফিগারেশনে, কম এলাকার জন্য)।
যে ভুলগুলো সবাই করে
“Latch আর flip-flop একই জিনিস, শুধু নাম আলাদা।”
সম্পূর্ণ ভিন্ন আচরণ। Latch level-triggered — enable HIGH থাকাকালীন পুরো সময় transparent (input সরাসরি অনুসরণ করে)। Flip-flop edge-triggered — শুধু clock-এর একটা নির্দিষ্ট মুহূর্তে (rising বা falling edge) state বদলায়, বাকি পুরো period-এ স্থির থাকে। এই পার্থক্যটাই সিঙ্ক্রোনাস সিস্টেম ডিজাইনে flip-flop-কে ব্যবহারিকভাবে অপরিহার্য করে তোলে (আগের hood section-এ ব্যাখ্যা করা feedback loop সমস্যা এড়াতে)।
“S=R=1 নিষিদ্ধ মানে সার্কিট 'ভেঙে যায়' বা কাজ করা বন্ধ করে দেয়।”
সার্কিট কাজ করা বন্ধ করে না — এটা একটা সুনির্দিষ্ট আউটপুট
(Q=Q'=0) দেয়, শুধু সেই আউটপুট Q/Q’ পরিপূরক হওয়ার প্রত্যাশিত
নিয়ম ভাঙে। আসল সমস্যাটা ঘটে পরে, যখন S আর R একসাথে ফিরে
আসে — তখন কোন দিকে সার্কিট স্থির হবে তা অনির্ধারিত। এটা “ভাঙা”
সার্কিট না, এটা একটা সংজ্ঞায়িত না এমন আচরণ — অনেকটা signed
integer overflow-এর মতো (Level 1) যেখানে ভাষা কোনো গ্যারান্টি
দেয় না, কিন্তু প্রোগ্রাম চলতেই থাকে, শুধু ফলাফল অবিশ্বস্ত।
বুঝেছেন কি না দেখুন
1একটা SR latch-এ বর্তমান অবস্থা Q=0, Q'=1 (Reset)। ইনপুট
S=0, R=0 (Hold) দেওয়া হলে Q-এর নতুন মান কী হবে? দুইটা NOR
gate-এর ইনপুট-আউটপুট হিসাব করে দেখান।
প্রয়োগ
Q=0, Q'=1 (Reset)। ইনপুট
S=0, R=0 (Hold) দেওয়া হলে Q-এর নতুন মান কী হবে? দুইটা NOR
gate-এর ইনপুট-আউটপুট হিসাব করে দেখান।প্রথম NOR gate (যা Q দেয়): input (R=0, Q'=1) → NOR(0,1) = 0
→ Q = 0।
দ্বিতীয় NOR gate (যা Q' দেয়): input (S=0, Q=0) → NOR(0,0) = 1 → Q' = 1।
Q=0, Q'=1 — অপরিবর্তিত। যেমন প্রত্যাশিত, S=R=0 Hold state
— latch তার আগের মান বজায় রেখেছে। লক্ষ্য করুন প্রতিটা gate-এর
আউটপুট তার নিজের আগের মানকেই “সমর্থন” করছে (Q'=1 থাকায় প্রথম
gate Q=0 বজায় রাখছে, Q=0 থাকায় দ্বিতীয় gate Q'=1 বজায়
রাখছে) — এটাই stable feedback loop-এর সংজ্ঞা।
2একজন শিক্ষার্থী প্রশ্ন করে: “যদি D latch-এ S=R=1 কখনোই না ঘটতে
পারে, তাহলে D latch-কে কি ‘সবসময় নিরাপদ’ বলা যায়, কোনো timing
সতর্কতা ছাড়াই?”
যুক্তি
S=R=1 কখনোই না ঘটতে
পারে, তাহলে D latch-কে কি ‘সবসময় নিরাপদ’ বলা যায়, কোনো timing
সতর্কতা ছাড়াই?”না — D latch নিজেই আরেকটা সমস্যা বহন করে: transparency।
Enable=1 থাকাকালীন, D latch input-কে সরাসরি output-এ pass করে
দেয় — কোনো “capture” মুহূর্ত নেই, পুরো সময়টাই খোলা। এই hood section-এ
আলোচিত feedback-loop সমস্যাটা (একটা signal এক clock period-এ
বহুবার লুপ ঘুরে একাধিকবার state বদলে ফেলতে পারা) ঠিক এই transparency-র
কারণেই ঘটে, S=R=1 সমস্যা থেকে সম্পূর্ণ আলাদা একটা ভিন্ন সমস্যা।
তাই D latch “forbidden state” সমস্যা সমাধান করে, কিন্তু “কখন state বদলাবে” সমস্যা সমাধান করে না — এই দ্বিতীয় সমস্যার সমাধান হলো edge-triggered flip-flop (master-slave গঠন), যেখানে transparency window কার্যত শূন্যে নেমে আসে (শুধু edge-এর ঠিক মুহূর্তে)।
নীতি: “নিরাপদ” সবসময় প্রসঙ্গ-নির্ভর — কোন নির্দিষ্ট সমস্যা সমাধান হচ্ছে সেটা স্পষ্ট করে বলা জরুরি।
3একটা T flip-flop-এ Q=1 (বর্তমান)। T=1 তিনবার পরপর clock edge-এ
প্রয়োগ করা হলে, প্রতিটা edge-এর পর Q-এর মান কী হবে (৩টা মান
তালিকাবদ্ধ করুন)?
প্রয়োগ
Q=1 (বর্তমান)। T=1 তিনবার পরপর clock edge-এ
প্রয়োগ করা হলে, প্রতিটা edge-এর পর Q-এর মান কী হবে (৩টা মান
তালিকাবদ্ধ করুন)?T=1 মানে প্রতিবার toggle:
- প্রাথমিক:
Q=1 - ১ম edge:
Q = 1 \oplus 1 = 0 - ২য় edge:
Q = 1 \oplus 0 = 1 - ৩য় edge:
Q = 1 \oplus 1 = 0
ফলাফল: 0, 1, 0 — একটা alternating প্যাটার্ন। প্রতি দুই clock edge-এ একবার সম্পূর্ণ চক্র। এই আচরণটাই — একটা T flip-flop প্রতি দুই input pulse-এ একবার output toggle করে — পরের লেসনে binary counter-এর সবচেয়ে নিচের bit-এর জন্মদাতা, যেখানে প্রতিটা পরবর্তী bit তার আগের bit-এর অর্ধেক frequency-তে toggle করে (ঠিক binary সংখ্যা গণনার মতো)।
4একজন ডিজাইনার একটা বড় সিঙ্ক্রোনাস সার্কিটে ভুলবশত flip-flop-এর
বদলে transparent latch ব্যবহার করেছেন সব state element-এ, কিন্তু
কোনো ফিডব্যাক লুপ নেই (শুধু straight-line pipeline, প্রতিটা stage
পরেরটাকে ফিড করছে, কোনো loop-back নেই)। এই ডিজাইন কি এখনও ভুল
আচরণ করবে?
ডিজাইন
সম্ভবত হ্যাঁ, একটা ভিন্ন কারণে — এমনকি ফিডব্যাক লুপ না থাকলেও।
যদি সব latch একই Enable=CLK সিগন্যাল শেয়ার করে, আর CLK HIGH
থাকাকালীন সবগুলো একসাথে transparent থাকে, তাহলে একটা single clock
pulse-এর মধ্যে data একাধিক pipeline stage দিয়ে “ছুটে যেতে”
পারে — stage 1-এর নতুন input সরাসরি stage 1 দিয়ে pass হয়ে stage
2-এ পৌঁছায়, stage 2 তখনও transparent থাকলে সেটাও pass করে stage
3-এ, এভাবে চলতে থাকে — একটা মাত্র clock pulse-এ যত stage “ধরে”
তত দূর তথ্য এগিয়ে যেতে পারে, যেটা ডিজাইনের উদ্দেশ্য (প্রতি clock-এ
ঠিক এক stage এগোনো) সম্পূর্ণ ভঙ্গ করে।
এটাকে বলে “race-through” — ফিডব্যাক লুপ ছাড়াও transparent latch দিয়ে multi-stage pipeline তৈরি করা বিপজ্জনক, ঠিক একই মূল কারণে (transparency window-এর সময় ডেটা “অনেক দূর” চলে যেতে পারে)।
সমাধান একই: edge-triggered flip-flop ব্যবহার করুন, যেখানে transparency window কার্যত শূন্য — প্রতি clock edge-এ ঠিক এক “ধাপ” ডেটা এগোয়, না কম না বেশি। এটাই কেন pipeline ডিজাইনে (Level 3-এ CPU pipeline-এ বিস্তারিত) flip-flop-ভিত্তিক stage boundary প্রায় universal standard।
এরপর কী
আমরা এখন জানি কীভাবে একটা সার্কিট এক bit মনে রাখে — SR latch থেকে D latch, আর সবচেয়ে গুরুত্বপূর্ণভাবে, edge-triggered D flip-flop। এই একটা মৌলিক building block-ই বাকি পুরো “sequential logic” জগতের ভিত্তি।
পরের লেসনে আমরা প্রথম বাস্তব প্রয়োগ দেখব: অনেকগুলো flip-flop সমান্তরালে সাজিয়ে একটা N-bit register তৈরি করা — CPU-র সেই জায়গা যেখানে সক্রিয় গণনার মধ্যবর্তী মান রাখা হয়। আমরা দেখব write-enable, reset — একটা register-কে বাস্তবে কীভাবে নিয়ন্ত্রণ করা হয়, আর কীভাবে একগুচ্ছ register মিলে একটা সম্পূর্ণ register file তৈরি করে — CPU-র general-purpose register-গুলোর প্রকৃত হার্ডওয়্যার ভিত্তি।
আরও পড়ুন
- Digital Design and Computer Architecture, Ch. 3 — Sequential Logic — Sarah Harris, David Harris · Latch থেকে flip-flop-এর প্রামাণ্য derivation
- CMOS VLSI Design, Ch. 10 — Sequential Circuit Design — Weste & Harris · Master-slave flip-flop-এর transistor-স্তরের বাস্তবায়ন