Foundationপ্রথম নীতি থেকে
LEVEL 2লেসন ৯/১৬কঠিন১ ঘণ্টা ৫ মিনিট

Latch ও Flip-Flop — সার্কিট যখন প্রথম মনে রাখতে শেখে

Latches and Flip-Flops

একটা gate-এর আউটপুট নিজের ইনপুটে ফিরিয়ে দিলে (feedback) সার্কিট প্রথমবার 'মনে রাখতে' শেখে — SR latch থেকে D latch হয়ে edge-triggered flip-flop পর্যন্ত, এটাই combinational থেকে sequential logic-এ প্রবেশের মুহূর্ত।

এই লেসন শেষে আপনি পারবেন

  • SR latch-কে দুইটা cross-coupled NOR gate দিয়ে তৈরি করে ফিডব্যাক কীভাবে state ধরে রাখে তা ব্যাখ্যা করতে পারবেন
  • SR latch-এর forbidden state (S=R=1) কেন race condition তৈরি করে তা বিশ্লেষণ করতে পারবেন
  • D latch কীভাবে সেই forbidden state গঠনগতভাবেই এড়িয়ে যায় তা দেখাতে পারবেন
  • Level-triggered latch আর edge-triggered flip-flop-এর পার্থক্য এবং কেন সিঙ্ক্রোনাস ডিজাইনে flip-flop-ই স্ট্যান্ডার্ড তা ব্যাখ্যা করতে পারবেন
  • JK ও T flip-flop-এর আচরণ truth table থেকে ডেরাইভ করতে পারবেন

আগে যা বোঝা থাকা দরকার

আগে এটা বুঝি

গত লেসনের 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'
       └───────┘
SR Latch — দুইটা cross-coupled NOR gate। Q আর Q' একে অপরের feedback-এ আটকে আছে।

যুক্তি — কেন এটা state ধরে রাখে: ধরুন S=0, R=0 (দুইটাই নিষ্ক্রিয়), আর বর্তমানে Q=1, Q'=0। প্রথম NOR gate: input (R=0, Q'=0)NOR(0,0)=1Q=1 (নিজেকেই বজায় রাখছে)। দ্বিতীয় NOR gate: input (S=0, Q=1)NOR(0,1)=0Q'=0 (নিজেকেই বজায় রাখছে)। কোনো ইনপুট বদল ছাড়াই সার্কিট নিজের আগের আউটপুট বজায় রাখছে — এটাই memory-র জন্ম।

SRফলাফল
00Hold — আগের Q বজায় থাকে
01Reset — Q=0
10Set — Q=1
11নিষিদ্ধ (নিচে দেখুন)

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 E

E=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:

D Flip-Flop = দুইটা D Latch, বিপরীত Enable-এ
  1. Master latchEnable = CLK — CLK LOW থাকাকালীন transparent, input গ্রহণ করে
  2. Slave latchEnable = CLK' — CLK HIGH থাকাকালীন transparent, master-এর output গ্রহণ করে
  3. ফলাফল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 উল্টে দেওয়া) হিসেবে সংজ্ঞায়িত করা হয়।

JKফলাফল
00Hold
01Reset (Q=0)
10Set (Q=1)
11Toggle (Q = আগের Q’)

T flip-flop — JK-এর সরলীকরণ, J আর K কে একসাথে জুড়ে দিলে (T = J = K): T=0 হলে Hold, T=1 হলে Toggle। এটাই সবচেয়ে সরল “memory + change” element, আর পরের লেসনে counter-এর একমাত্র building block।

Qnext=TQ(T=1 হলে flip, T=0 হলে অপরিবর্তিত)Q_{next} = T \oplus Q \quad \text{(T=1 হলে flip, T=0 হলে অপরিবর্তিত)}

নিজে চালিয়ে দেখুন

EXPERIMENT

Logisim-এ SR latch-এর forbidden state নিজে দেখুন

Logisim Evolution বা Digital· ১৫ মিনিট

১. দুইটা 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-এও একটা অনির্ধারিত/দোদুল্যমান অবস্থা দেখায়, যা তাত্ত্বিক আলোচনার বাস্তব প্রমাণ।

নিজে বানান

BUILD IT

D Latch থেকে Master-Slave D Flip-Flop

Logisim / Digital · ●●●○○
  1. প্রথমে একটা D latch বানান (SR latch + S=D·E, R=D̄·E লজিক)
  2. দুইটা D latch chain করুন — প্রথমটার Enable = CLK, দ্বিতীয়টার Enable = CLK প্রতিসম (inverted)
  3. CLK-কে ধীরে toggle করে (manual clock) verify করুন output শুধু rising edge-এই বদলায়
  4. CLK HIGH অবস্থায় D বদলে দেখুন output তৎক্ষণাৎ বদলায় কি না (বদলানো উচিত না — এটাই edge-triggered আচরণের প্রমাণ)
  5. বিল্ট-ইন 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-এর ইনপুট-আউটপুট হিসাব করে দেখান।

প্রয়োগ

প্রথম NOR gate (যা Q দেয়): input (R=0, Q'=1)NOR(0,1) = 0Q = 0

দ্বিতীয় NOR gate (যা Q' দেয়): input (S=0, Q=0)NOR(0,0) = 1Q' = 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 সতর্কতা ছাড়াই?”

যুক্তি

না — 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-এর মান কী হবে (৩টা মান তালিকাবদ্ধ করুন)?

প্রয়োগ

Qnext=TQcurrentQ_{next} = T \oplus Q_{current}

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-স্তরের বাস্তবায়ন