ความรู้พื้นฐานเกี่ยวกับไอซีลอจิกประเภท "แลตช์" (Latches)#

Keywords: Digital Logic Gate ICs, Latches


Latches#

"แลตช์" (Latch) เป็นวงจรอิเล็กทรอนิกส์ในกลุ่มวงจรลอจิก (Logic Ciruit) การทำงานของแลตช์ จะถูกกระตุ้นด้วยระดับแรงดันหรือค่าลอจิกของสัญญาณควบคุม (Level-Sensitive หรือ Level-Triggered) แบ่งเป็นสองกรณีคือ ทำงานเมื่อสัญญาณควบคุม มีลอจิกเป็น L (Low) หรือ H (High) อย่างใดอย่างหนึ่ง

"ฟลิปฟลอป" (Flip-Flop) เป็นวงจรอิเล็กทรอนิกส์ในกลุ่มวงจรลอจิกอีกประเภทหนึ่งที่มีความแตกต่างจากแลตช์ กล่าวคือ การทำงานของฟลิปฟลอปจะถูกกระตุ้นด้วยการเปลี่ยนแปลงระดับลอจิก (Logic-Level Transition) ของสัญญาณควบคุม (Edge-Triggered) ซึ่งโดยทั่วไปก็คือสัญญาณนาฬิกา (Clock Signal) แบ่งเป็นสองกรณีคือ ขอบขาขึ้น (Rising or Positive Edge) หรือ ขอบขาลง (Falling or Negative Edge) อย่างใดอย่างหนึ่ง

แลตช์ และ ฟลิปฟลอป แต่ละตัว สามารถเก็บข้อมูลขนาดหนึ่งบิตได้ ดังนั้นจึงมีค่าลอจิกเป็น L (0) หรือ H (1) และมีการเปลี่ยนสถานะลอจิกได้ระหว่างสองสถานะดังกล่าว

ในบทความนี้จะกล่าวถึง หลักการทำงานของแลตช์ ซึ่งจำแนกออกได้หลายประเภท เช่น

  • "ดี-แลตช์" (D Latch หรือ เรียกว่า Transparent Latch)
    • มีขาอินพุต (Enable)
    • มีขาเอาต์พุต และ (Inverted Q)
  • "เอส-อาร์-แลตช์" (S-R Latch)
    • มีขาอินพุต (Set) และ (Reset)
    • มีขาเอาต์พุต และ
  • "เจ-เค-แลตช์" (J-K Latch)
    • มีขาอินพุต (Set) และ (Reset)
    • มีขาเอาต์พุต และ

SR Latches#

ถัดไปเป็นการอธิบายหลักการทำงานของวงจร S-R Latch และสามารถสร้างได้ง่ายโดยใช้ลอจิกเกตพื้นฐานอย่างเช่น NAND2 หรือ NOR2 ตามผังวงจรในรูปต่อไปนี้

รูป: ไดอะแกรมของวงจร "แลตช์" ที่สร้างด้วยลอจิกเกต NOR2 หรือ NAND2 อย่างละ 2 ตัว

การทำงานของวงจรแลตช์ที่สร้างจากลอจิกเกต NOR2 จำนวน 2 ตัว นำมาต่อไขว้กัน (Cross-Coupled) ตามรูปข้างบน (ซ้ายมือ) เป็นดังนี้

  • ถ้า และ จะทำให้เอาต์พุต และ หรือ การรีเซตค่า
  • ถ้า และ จะทำให้เอาต์พุต และ หรือ การเซตค่า
  • ถ้า และ จะไม่ทำให้เอาต์พุตทั้งสองเปลี่ยนแปลงค่าลอจิก และคงสถานะเดิมไว้ ดังนั้นจึงกล่าวได้ว่า สัญญาณ และ ในกรณีนี้ ทำงานแบบ Active-High
  • และ ห้ามมีค่าเป็น พร้อมกัน ในกรณีนี้ จะทำให้เอาต์พุต ซึ่งไม่ถูกต้อง เพราะว่าขา และ จะต้องมีค่าลอจิกตรงข้ามกันเสมอ
Function
0 0 No Change
0 1 0 1 Reset
1 0 1 0 Set
1 1 0 0 Invalid

การทำงานของวงจรแลตช์ที่สร้างจากลอจิกเกต NAND2 จำนวน 2 ตัว นำมาต่อไขว้กัน ตามรูปข้างบน (ขวามือ) เป็นดังนี้

  • ถ้า และ จะทำให้เอาต์พุต และ หรือ การรีเซตค่า (ดังนั้นจึงกล่าวได้ว่า ทำงานแบบ Active-Low)
  • ถ้า และ จะทำให้เอาต์พุต และ หรือ การเซตค่า (ดังนั้นจึงกล่าวได้ว่า ทำงานแบบ Active-Low)
  • ถ้า และ (สัญญาณทั้งสองไม่อยู่ในสถานะ "แอคทีฟ") จะไม่ทำให้เอาต์พุตทั้งสองเปลี่ยนแปลงค่าลอจิก และคงสถานะเดิมไว้ ดังนั้นจึงกล่าวได้ว่า สัญญาณ และ จะทำงานแบบ Active-Low
  • และ ห้ามมีค่าเป็น (หรือ "แอคทีฟ") พร้อมกัน ในกรณีนี้ จะทำให้เอาต์พุต ซึ่งไม่ถูกต้อง เพราะว่าขา และ จะต้องมีค่าลอจิกตรงข้ามกันเสมอ
Function
0 0 1 1 Invalid / Toggle
0 1 1 0 Set
1 0 0 0 Reset
1 1 No Change

ถ้านำวงจร NAND2-based S-R Latch มาต่อวงจรเพิ่ม โดยใช้ NAND2 อีกสองตัว ตามรูปต่อไปนี้ ก็จะได้วงจร Gated S-R Latch ที่มีขา (Enable) เป็นอินพุตควบคุม และ มี กับ เป็นขาอินพุตที่ทำงานแบบ Active-High วงจรนี้จะทำให้งานได้ ("แอคทีฟ") เมื่อขา แต่ถ้า จะไม่ทำให้สถานะ หรือเอาต์พุตของแลตช์เปลี่ยนแปลง (ไม่ทำงาน)

รูป: ไดอะแกรมของวงจร Gated S-R Latch (มีสองกรณีที่แตกต่างกัน)

Function
0 x x No Change
1 0 0 No Change
1 0 1 0 1 Reset
1 1 0 1 0 Set
1 1 1 0 0 Invalid / Toggle

x = Don't care

ลองมาดูตัวอย่างการเขียนโค้ด Verilog สำหรับ S-R Latch และสามารถกำหนดพารามิเตอร์ในเชิงเวลาของลอจิกเกต เช่น การหน่วงเวลา (Inertial Delay) ของลอจิกเกตแบบ NAND2

File: sr_latch.v

`timescale 1ns / 1ps

module sr_latch #(
    parameter t_pd = 1.0
)(
    input wire S,
    input wire R,
    input wire E,
    output wire Q,
    output wire QB
);
    wire SB;
    wire RB;
    wire Q_i;
    wire QB_i;

    // Continuous assignments with (inertial) delays
    assign #(t_pd) SB = ~(S & E); // NAND2
    assign #(t_pd) RB = ~(R & E); // NAND2
    assign #(t_pd) Q_i  = ~(SB & QB_i); // NAND2
    assign #(t_pd) QB_i = ~(RB & Q_i);  // NAND2

    assign Q  = Q_i;
    assign QB = QB_i;
endmodule

และตัวอย่างโค้ด Verilog Testbench

File: sr_latch_tb.v

`timescale 1ns/1ps

module sr_latch_tb;
    // Test inputs and outputs
    reg t_S, t_R, t_E;
    wire t_Q, t_QB;

    sr_latch #( .t_pd(1) ) dut (
        .S(t_S),
        .R(t_R),
        .E(t_E),
        .Q(t_Q),
        .QB(t_QB)
    );

    reg [2:0] bits;

    initial begin
        $dumpfile("waveform.vcd");
        $dumpvars(0, sr_latch_tb);
        t_E <= 0; t_S <=0; t_R <= 0;
        force dut.SB   = 1;
        force dut.RB   = 0;
        force dut.Q_i  = 0;
        force dut.QB_i = 1;
        #2
        release dut.Q_i;
        release dut.QB_i;
        release dut.SB;
        release dut.RB;

        for (integer i=0; i < 16; i=i+1) begin
           bits = $unsigned(i);
           t_E  = bits[2];
           t_S  = bits[1];
           t_R  = bits[0];
           #20; // Wait for 20 time units
        end
        #20;
        $finish; // End simulation
    end

endmodule

หากให้ Icarus Verilog Simulator ใน Ubuntu Linux ก็ทำคำสั่งต่อไปนี้

$ iverilog -g 2005 -Wall sr_latch_tb.v sr_latch.v -o sr_latch_tb
$ vvp sr_latch_tb

และสามารถใช้โปรแกรม GTKWave ดูรูปคลื่นสัญญาณจากไฟล์เอาต์พุต waveform.vcd

รูป: ตัวอย่างคลื่นสัญญาณที่ได้จากการจำลองการทำงานสำหรับ SR Latch

 


JK-Type Latches#

ถ้านำ NAND2-based S-R Latch มาต่อลอจิกเกต NAND2 เพิ่ม ในรูปแบบต่อไปนี้ ก็จะได้แลตช์ในแบบที่เรียกว่า J-K ซึ่งจะเห็นได้ว่า มีการนำเอาต์พุต และ ไปใช้เป็นสัญญาณป้อนกลับ (Feedback) และตั้งชื่ออินพุต 2 ขา ให้เป็น J และ K ตามลำดับ

รูป: ไดอะแกรมของวงจร J-K Latch

Function
0 0 Q No Change
0 1 0 1 Reset
1 0 1 0 Set
1 1 1 1 Invalid / Toggle

จากตารางฟังก์ชันการทำงาน แลตช์มีการทำงานในลักษณะนี้

  • ถ้า และ จะไม่มีการเปลี่ยนแปลงค่าของเอาต์พุต
  • ถ้า และ จะทำให้เกิดการรีเซตค่าของเอาต์พุต
  • ถ้า และ จะทำให้เกิดการเซตค่าของเอาต์พุต
  • ถ้า และ จะทำให้เกิดกรณีที่เอาต์พุตทั้งสองมีสถานะลอจิกเหมือนกัน ซึ่งไม่ถูกต้อง

ตัวอย่างการเขียนโค้ด Verilog สำหรับ J-K Latch

File: jk_latch.v, jk_latch_tb.v

`timescale 1ns/1ps

module jk_latch #(
    parameter t_pd = 1
)(
    input wire  J,
    input wire  K,
    output wire Q,
    output wire QB
);
    wire SB, RB;
    wire Q_i, QB_i;

    assign #(t_pd) SB   = ~(J & QB_i);  // NAND2
    assign #(t_pd) RB   = ~(K & Q_i);   // NAND2
    assign #(t_pd) Q_i  = ~(SB & QB_i); // NAND2
    assign #(t_pd) QB_i = ~(RB & Q_i);  // NAND2

    assign Q  = Q_i;
    assign QB = QB_i;
endmodule

รูป: ตัวอย่างคลื่นสัญญาณที่ได้จากการจำลองการทำงานสำหรับ JK Latch

 


D-Type Latches#

หากนำวงจร S-R Latch ซึ่งแบ่งเป็น 2 กรณีคือ NAND2-based และ NOR2-based S-R Latch มาดัดแปลงโดยใช้ลอจิกเกตมาต่อเพิ่ม ก็จะทำให้ได้วงจรแลตช์ที่เรียกว่า Transparent Latch หรือ D Latch ตามผังวงจรในรูปต่อไปนี้

รูป: ไดอะแกรมของวงจร D Latch

ทั้งสองวงจรให้ผลเหมือนกัน และมีฟังก์ชันการทำงานเป็นไปตามตารางต่อไปนี้

Function
0 x No Change
1 0 0 1 Transparent
1 1 1 0 Transparent

หรือกล่าวได้ว่า การทำงานของวงจร D Latch ในลักษณะนี้เป็นแบบ High-Level Sensitive

  • ถ้าสัญญาณควบคุม เป็น ค่าลอจิกของเอาต์พุตจะไม่เปลี่ยนแปลง
  • ถ้าสัญญาณควบคุม เป็น ค่าลอจิกของเอาต์พุตเปลี่ยนแปลงได้ตามค่าอินพุต

 

การสร้าง Transparent Latch ยังมีรูปแบบอื่นอีก เช่น การใช้ NOT Gate และ Transmission Gate อย่างละ 2 ตัว ตามตัวอย่างผังวงจรดังนี้

วงจร Transmission Gate (TG) หนึ่งตัว ประกอบด้วยทรานซิสเตอร์ MOSFET ที่เป็นชนิด NMOS และ PMOS หนึ่งคู่นำมาต่อขนานกัน เพื่อทำหน้าที่เป็นสวิตช์ไฟฟ้าที่โปรแกรมหรือควบคุมได้

ในรูปวงจรแลตช์มี TG จำนวน 2 ตัว ที่ทำงานเป็นสวิตช์เปิดปิด และแต่ละตัวจะทำงาน ("แอคทีฟ") สลับกัน และมี และ เป็นสัญญาณควบคุม ลอจิกเกต NOT จำนวน 2 ตัว ที่นำมาต่อกันตามรูปวงจร จะทำหน้าที่เก็บสถานะลอจิกของแลตช์

รูป: ไดอะแกรมของวงจร D Latch

ลองมาดูตัวอย่างการเขียนโค้ด Verilog สำหรับ D Latch

File: d_latch.v

module d_latch (
    input wire D,
    input wire E,
    output reg Q,
    output reg QB
);
    // Initialize the value of Q and QB.
    initial begin
       Q  <= 0;
       QB <= 1;
    end

    // Procedural nonblocking assignment
    always @(*) begin
      if (E) begin
        Q  <=  D;
        QB <= ~D;
      end
    end

endmodule

และตัวอย่างโค้ด Verilog Testbench

File: d_latch_tb.v

`timescale 1ns/1ps

module d_latch_tb;
    // Test inputs and outputs
    reg t_D, t_E;
    wire t_Q, t_QB;

    d_latch dut (
        .D(t_D),
        .E(t_E),
        .Q(t_Q),
        .QB(t_QB)
    );

    initial begin
        $dumpfile("waveform.vcd");
        $dumpvars(0, d_latch_tb);
        for (integer i=0; i < 100; i=i+1) begin
           t_D  = $random;
           t_E  = $random;
           #10; // Wait for 10 time units
        end
        #20;
        $finish; // End simulation
    end

endmodule

รูป: ตัวอย่างคลื่นสัญญาณที่ได้จากการจำลองการทำงานสำหรับ D Latch

 


74HC/HCT373 Latches#

ไอซีลอจิกมาตรฐานที่มีวงจรแลตช์อยู่ภายใน มีอยู่หลายเบอร์ให้เลือกใช้งาน ลองมาดูตัวอย่างไอซี 74HC/HCT323 (Octal D-type Latch + 3-State Output) ของบริษัท NXP / Nexperia

ภายในไอซีตัวนี้ มีวงจรแลตช์แบบ Transparent จำนวน 8 ตัว

  • มีขา สำหรับอินพุต และมีขา สำหรับเอาต์พุต
  • แต่ละตัวมีขา (Latch Enable) เป็นสัญญาณควบคุมที่ใช้งานร่วมกัน ทำงานแบบ Active-High ดังนั้นถ้า จะทำให้แลตช์แต่ละตัวอยู่ในโหมด Transparent ค่า จะเป็นไปตาม แต่ถ้า จะทำให้แลตช์แต่ละตัวจะคงสถานะเดิมไว้
  • ในส่วนที่เป็นเอาต์พุตของแลตช์แต่ละตัว จะเป็นแบบ Tri-state คือ มีสถานะลอจิก หรือ หรือ (High Impedance) ควบคุมการทำงานโดยขาอินพุต (Output Enable, Active-Low)
  • ถ้า ขาเอาต์พุต จะมีสถานะเป็น (ปิดการทำงานของเอาต์พุต ดังนั้นสถานะลอจิกของเอาต์พุตจะไม่เป็น และ )
  • แต่ถ้า ขาเอาต์พุต จะมีค่าลอจิกภายในของแลตช์แต่ละตัว

รูป: ข้อมูลบางส่วนจากเอกสาร Datasheet สำหรับไอซี 74HC/HCT323 (Source: NXP/Nexperia)

พารามิเตอร์ในเชิงเวลา (Timing Parameters) ที่เกี่ยวข้องกับการทำงานของไอซีและแลตช์ภายในมีดังนี้

  • และ สำหรับ : เมื่อแลตช์อยู่ในโหมด Transparent ถ้าสัญญาณอินพุต เปลี่ยนสถานะลอจิก หรือ จะทำให้เอาต์พุต เปลี่ยนตาม แต่มีความล่าช้าหรือการหน่วงเวลาเกิดขึ้น (Propagation Delay: )
  • สำหรับสัญญาณ : ความกว้างพัลส์ของสัญญาณ จะต้องไม่น้อยกว่าที่กำหนดไว้โดยผู้ผลิต
  • และ สำหรับสัญญาณ : ระยะเวลาในการเปลี่ยนสถานะลอจิก หรือ ซึ่งหมายถึง ระยะเวลาที่ต้องใช้ในการเปลี่ยนระดับแรงดันไฟฟ้าที่ขาเอาต์พุตระหว่างระดับ กับ ตามลำดับ
  • และ : ระยะเวลาอย่างน้อยที่สัญญาณอินพุต จะต้องคงที่ก่อนและหลังการเปลี่ยนแปลงของสัญญาณ จาก (เรียกว่า Setup Time และ Hold Time ของแลตช์)

รูป: ไดอะแกรมในเชิงเวลาสำหรับการทำงานของไอซี 74HC/HCT323 (Source: NXP/Nexperia)

 


กล่าวสรุป#

บทความนี้ได้นำเสนอเนื้อหาเกี่ยวกับวงจรลอจิกที่เรียกว่า แลตช์ (Latch) และได้อธิบายหลักการทำงานรวมถึงพารามิเตอร์ในเชิงเวลาของวงจรแลตช์ อีกทั้งได้นำเสนอตัวอย่างการเขียนโค้ด Verilog สำหรับการจำลองการทำงานของแลตช์

 


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2023-08-26 | Last Updated: 2023-09-01