Ai cũng biết rằng điện có thể làm vật chuyển động. Nhìn thoáng qua một căn nhà nào đó cũng thấy được sự đa dạng của vật dụng dùng động cơ điện nào là đồng hồ, quạt, máy xử lý thực phẩm và bất cứ thứ gì quay đĩa. Điện cũng điều khiển rung động của loa, tai nghe cả đeo và nhét tai, phát nhạc và âm thanh từ nhiều thiết bị. Và thậm chí nếu đang đậu ngoài kia không phải là xe hơi điện thì vẫn có một động cơ điện chịu trách nhiệm khởi động bộ máy dùng nhiên liệu hoá thạch cổ.
Nhưng có lẽ phương thức đẹp đẽ và đơn giản nhất mà điện làm vật chuyển động được minh hoạ bằng một loại thiết bị mà dần nhanh chóng biến mất và thay thế bởi những thiết bị điện khác. Tôi đang ám chỉ tới những chiếc chuông rung và chuông điện màu nhiệm đầy tính "retro".
Xem xét rơle được mắc như sau với công tắc và pin:
Rơle, công tắc, pin đơn giản
Nếu bạn thấy hơi lạ thì không phải do tưởng tượng vậy. Ta vẫn chưa thấy rơle nào được nối như này mà. Thường một rơle được nối sao cho đầu vào tách riêng với đầu ra. Ở đây thì chúng gộp lại làm một mạch lớn.
Nếu bạn đóng công tắc, mạch kín:
Điện chạy qua mạch
Mạch kín khiến cho nam châm điện kéo thanh động xuống:
Thanh động bị kéo xuống
Nhưng khi điểm chạm thay đổi, mạch không còn kín nữa nên nam châm điện bị mất từ tính và thanh động lại trở về vị trí cũ:
Thanh chạm trở về vị trí cũ
Và lại làm mạch kín. Chừng nào công tắc còn đóng thanh kim loại vẫn tiếp tục lên xuống - luân phiên đóng và mở mạch - gần như là đang tạo ra một âm thanh lặp lại (và khá khó chịu). Nếu thanh chạm phát ra tiếng kêu kèn kẹt nó là một chuông rung. Nếu bạn gắn một chiếc búa nhỏ vào nó và để gần một nắp chuông kim loại, bạn sẽ được một chiếc chuông điện.
Bạn có thể chọn từ rất nhiều cách để nối rơle này thành chuông rung. Dưới đây là một cách khác dùng nguồn điện thông thường với kí hiệu nối đất:
Chuông rung bằng điện áp và nối đất
Vẽ cách này có thể bạn sẽ nhận ra inverter từ Chương 8 ở trang 79. Mạch còn có thể vẽ đơn giản hơn nữa:
Mạch đơn giản hơn
Như bạn đã biết đầu ra của inverter là 1 nếu đầu vào là 0 và là 0 nếu đầu vào là 1. Đóng công tắc trên mạch này lại làm cho rơle hoặc transistor trong inverter luân phiên đóng mở. Bạn cũng có thể nối inverter mà không có công tắc để cho nó chạy liên tục:
Mạch không có công tắc
Hình vẽ này trông như đang minh hoạ một mâu thuẫn logic vì đầu ra của inverter đáng lẽ phải ngược với đầu vào nhưng ở đây đầu ra cũng là đầu vào! Tuy nhiên hãy nhớ là bất kể inverter được tạo ra từ rơle, hay ống chân không hay transistor thì nó luôn cần một khoảng thời gian ngắn để chuyển từ trạng thái này sang trạng thái khác. Thậm chí nếu đầu vào có giống với đầu ra thì đầu ra sẽ sớm đổi, trở thành đảo của đầu vào và tất nhiên đầu vào thay đổi rồi cứ lặp lại như thế.
Đầu ra của mạch này là gì? Chà, đầu ra này nhanh chóng luân phiên giữa có điện áp và không có điện áp. Hoặc ta có thể nói, đầu ra nhanh chóng luân phiên giữa 0 và 1.
Mạch này được gọi là mạch dao động. Về bản chất nó khác hoàn toàn với bất kì thứ gì bạn gặp tới giờ. Tất cả những mạch trước đây thay đổi trạng thái chỉ khi có sự can thiệp của con người đóng hoặc mở công tắc. Mạch dao động không cần con người; nó đơn giản là tự chạy.
Tất nhiên, mạch dao động tự nó trông không hữu dụng lắm. Nhưng bạn sẽ thấy ở cuối chương này và trong vài chương tiếp theo rằng một mạch như này nối với những mạch khác là một thành phần thiết yếu của tự động. Tất cả máy tính có một loại mạch dao động nào đó làm cho những thứ khác di chuyển đồng bộ. (Tuy nhiên mạch dao động trong máy tính thực tinh vi hơn, gồm các tinh thể thạch anh được nối theo một cách mà chúng rung động rất đồng đều và rất nhanh.)
Đầu ra của mạch dao động luân phiên giữa 0 và 1. Một cách phổ biến để kí hiệu tính chất này là bằng sơ đồ như sau:
Tất cả điều này thật ra đang nói với ta rằng khi thời gian trôi qua đầu ra của mạch dao động đều đặn luân phiên giữa 0 và 1. Vì lí do đó mà mạch dao động đôi khi được gọi là clock (đồng hồ hoặc xung nhịp) vì bằng cách đếm số lần dao động bạn có thể nói ra được thời gian (đại loại).
Mạch dao động chạy nhanh như nào? Bao nhiêu lần trong một giây đầu ra luân phiên giữa 0 và 1? Điều đó rõ ràng phụ thuộc vào cách mạch dao động được tạo ra. Người ta có thể dễ dàng tưởng tượng ra một rơle to lớn cồng kềnh gõ lên xuống chậm chạp và một rơle nhỏ nhẹ rung động cực nhanh. Mạch dao động transistor có thể rung hàng triệu hoặc hàng tỉ lần trên giây.
Một chu trình dao động được xác định là khoảng thời gian trong đó đầu ra của mạch dao động thay đổi và rồi trở lại như cũ:
Thời gian cần cho một chu trình được gọi là chu kì dao động. Hãy giả sử rằng ta đang xem xét một mạch dao động cụ thể có chu kì là 0,02 giây. Trục hoành có thể được thêm nhãn theo giây bắt đầu từ thời gian nào đó biểu thị là 0:
Tần số dao động là 1 chia cho chu kì. Trong ví dụ này nếu chu kì dao động là 0,02 giây thì tần số dao động là 1 ÷ 0,02 hay 50 chu trình (vòng) trên giây. 50 lần trên giây, đầu ra của mạch dao động thay đổi qua lại.
Chu trình trên giây là một thuật ngữ khá dễ hiểu, giống với kilo mét trên giờ hay pound trên inch vuông (psi). Nhưng chu trình trên giây không còn được dùng nhiều nữa rồi. Để tưởng nhớ tới Heinrich Rudolph Hertz (1857-1894) là người đầu tiên truyền và nhận sóng vô tuyến, từ hertz (héc) giờ được dùng thay thế. Nó được dùng lần đầu ở Đức vào những năm 1920 và sau đó lan rộng sang các quốc gia khác trong những thập kỉ tiếp theo.
Do đo, ta có thể nói mạch dao động của ta có tần số 50 héc hay (cho gọn) 50 Hz.
Tất nhiên là ta chỉ đang đoán tốc độ của một mạch dao động nào đó thôi. Tới cuối chương này chúng ta sẽ có thể tạo ra thứ thực sự đo được tốc độ dao động.
Để bắt đầu nỗ lực này, hãy cùng xem xét một cặp cổng NOR nối theo một cách cụ thể. Bạn hãy nhớ lại đầu ra của một cổng NOR có điện áp chỉ khi cả 2 đầu vào không có điện áp nào:
Đây là mạch với 2 cổng NOR, 2 công tắc và 1 bóng đèn:
Mạch chốt
Chú ý cách nối vòng vèo kì lạ: Đầu ra của cổng NOR bên trái là đầu vào cho cổng NOR bên phải, và đầu ra của cổng NOR đó lại là đầu vào cho cổng NOR đầu tiên. Đây là một dạng phản hồi (feedback). Thật ra y chang trong mạch dao động, đầu ra vòng ngược lại để thành đầu vào. Tính chất này sẽ là đặc điểm của hầu hết các mạch xuất hiện trong chương.
Có một quy tắc đơn giản khi dùng mạch này: Bạn có thể đóng một trong hai công tắc trên hoặc dưới nhưng không phải cả hai cùng lúc. Cuộc thảo luận sau đây dựa vào quy tắc này.
Ở trạng thái ban đầu, dòng điện duy nhất chạy trong mạch này là từ đầu ra của cổng NOR trái. Đó là bởi cả 2 đầu vào của cổng là 0. Giờ đóng công tắc trên. Đầu ra từ cổng NOR trái thành 0 có nghĩa là đầu ra từ cổng NOR phải thành 1 và đèn sáng:
Đóng công tắc trên
Phép màu xuất hiện khi bạn mở công tắc trên. Vì đầu ra của một cổng NOR là 0 nếu có một đầu vào là 1, đầu ra của cổng NOR trái vẫn vậy và đèn vẫn sáng:
Mở công tắc trên
Nhìn lạ phải không? Cả hai công tắc đều mở - giống với hình vẽ ban đầu - nhưng giờ bóng đèn lại sáng. Tình huống này khác hẳn với bất cứ điều gì bạn thấy trước giờ. Thường thì đầu ra của một mạch phụ thuộc hoàn toàn vào đầu vào. Nhưng có vẻ như không đúng lắm ở đây. Hơn nữa lúc này bạn có thể đóng mở công tắc trên mà đèn vẫn sáng. Công tắc đó không còn ảnh hưởng gì tới mạch nữa vì đầu ra của cổng NOR trái vẫn là 0.
Giờ hãy đóng công tắc dưới. Vì một đầu vào của cổng NOR bên phải giờ là 1 nên đầu ra thành 0 và bóng đèn vụt tắt. Đầu ra của cổng NOR trái trở thành 1:
Đóng công tắc dưới
Giờ bạn có thể mở công tắc dưới và đèn vẫn tắt:
Mở công tắc dưới
Ta quay lại điểm bắt đầu. Bây giờ bạn có thể đóng mở công tắc dưới mà không ảnh hưởng gì tới bóng đèn. Tóm lại:
Đóng công tắc trên thắp sáng bóng đèn và nó vẫn sáng khi công tắc đó mở.
Đóng công tắc dưới làm tắt bóng đèn và nó vẫn tắt khi công tắc đó mở.
Sự kì lạ của mạch này là đôi lúc khi cả hai công tắc mở thì đèn sáng và lúc khác hai công tắc vẫn mở nhưng đèn lại tắt. Ta có thể nói rằng mạch này có hai trạng thái bền vững khi hai công tắc cùng mở. Mạch như vậy được gọi là flip-flop, một từ cũng được dùng cho dép đi biển và chiến thuật của các chính trị gia. Flip-flop bắt đầu từ năm 1918 với công trình của các nhà vật lý vô tuyến người Anh William Henry Eccles (1875-1966) và F.W. Jordan (1881-1941). Mạch flip-flop có khả năng lưu giữ thông tin. Nó biết "ghi nhớ". Dù nó chỉ nhớ được mỗi việc công tắc nào vừa mới được đóng, nhưng điều đó lại mang ý nghĩa cực kỳ quan trọng. Nếu bạn tình cờ bắt gặp một mạch flip-flop như vậy và thấy đèn đang sáng, bạn có thể suy ra ngay rằng công tắc phía trên vừa được đóng; còn nếu đèn tắt, thì công tắc phía dưới mới là cái vừa được đóng.
Flip-flop rất giống với bập bênh. Một cái bập bênh có hai trạng thái bền, không bao giờ ở lâu trong trạng thái lơ lửng. Chỉ cần nhìn qua là bạn có thể chỉ ra bên nào vừa mới được đẩy xuống
Mặc dù chưa rõ ràng lắm nhưng flip-flop là một công cụ thiết yếu. Nó thêm lưu trữ vào mạch để có lịch sử xảy ra trước đó. Thử tưởng tượng bạn muốn đếm nhưng không nhớ được gì cả. Bạn sẽ không biết được đã đếm tới đâu và số tiếp theo là gì! Tương tự, một mạch đếm (mà tôi sẽ cho bạn xem ở cuối chương) cũng cần có flip-flop.
Flip-flop xuất hiện trong nhiều loại đồ vật khác nhau. Cái bạn mới thấy là đơn giản nhất và được gọi là flip-flop R-S (hay Reset-Set). Hai cổng NOR thường được vẽ và đặt tên như trong sơ đồ sau để nó trông đối xứng:
Flip-flop R-S
Đầu ra mà ta dùng cho bóng đèn theo truyền thống được gọi là Q. Hơn nữa, có một đầu ra thứ hai gọi là Q̄ (đọc là Q bar) ngược với Q. Nếu Q là 0 thì Q̄ là 1 và ngược lại. Hai đầu vào tên là S cho set (đặt) và R cho reset (đặt lại). Bạn có thể tưởng tượng những động từ này như là "đặt Q thành 1" và "đặt lại Q thành 0". Khi S là 1 (tương đương với đóng công tắc trên ở sơ đồ trước đó) Q thành 1 và Q̄ thành 0. Khi R là 1 (tương đương với đóng công tắc dưới ở sơ đồ trước) Q thành 0 và Q̄ thành 1. Khi cả 2 đầu vào là 0 đầu ra biểu thị liệu Q mới đặt hay đặt lại. Những kết quả này được tổng hợp trong bảng sau:
+-----------+-----------+
| Đầu Vào | Đầu Ra |
+-----+-----+-----+-----+
| S | R | Q | Q̄ |
+-----+-----+-----+-----+
| 1 | 0 | 1 | 0 |
+-----+-----+-----+-----+
| 0 | 1 | 0 | 1 |
+-----+-----+-----+-----+
| 0 | 0 | Q | Q̄ |
+-----+-----+-----+-----+
| 1 | 1 | Cấm |
+-----------+-----------+
Đây được gọi là bảng chức năng hay bảng logic hoặc bảng chân trị. Nó thể hiện đầu ra là kết quả của một tập hợp đầu vào cụ thể. Vì chỉ có 2 đầu vào cho flip-flop R-S nên số tổ hợp đầu vào là 4 tương ứng với 4 hàng bên dưới tiêu đề bảng.
Chú ý hàng thứ 2 từ dưới lên khi S và R đều là 0: Đầu ra được biểu thị là Q và Q̄ có nghĩa là đầu ra Q và Q̄ giữ nguyên như trước khi cả 2 đầu vào S và R thành 0. Hàng cuối cùng của bảng chi ra rằng để cả 2 đầu vào S và R là 1 bị cấm hoặc không được phép. Không có nghĩa là bạn bị bắt vì làm vậy, mà vì nếu cả 2 đầu vào là 1 trong mạch này thì cả 2 đầu ra đều là 0 điều này vi phạm định nghĩa Q̄ phải ngược với Q. Nếu bạn đang thiết kế mạch điện dùng flip-flop R-S bạn sẽ muốn tránh tình huống cả 2 đầu vào S và R đều là 1.
Flip-flop R-S thường được vẽ là một hộp nhỏ có 2 đầu vào và 2 đầu ra với nhãn như sau:
+-------------+
-------| R Q |-------
| |
-------| S Q̄ |-------
+-------------+
Flip-flop R-S chắc hẳn là ví dụ thú vị đầu tiên mô phỏng khả năng "nhớ" đầu vào nào có điện áp sau cùng. Tuy nhiên thứ hoá ra lại hữu ích hơn là một mạch nhớ được tín hiệu cụ thể là 0 hay 1 tại một thời điểm nhất định.
Hãy cùng xem xem một mạch như vậy hoạt động thế nào trước khi ta thực sự tạo ra nó. Nó sẽ có 2 đầu vào. Hãy gọi một đầu là Data. Như tất cả tín hiệu điện tử, đầu vào Data có thể là 0 hoặc 1. Hãy gọi đầu còn lại Hold That Bit (Giữ Bit đó lại), là tín hiệu điện tương đương với một người nói "Giữ suy nghĩ đó lại". Thường thì tín hiệu Hold That Bit là 0, khi đó tín hiệu Data không có tác dụng lên mạch. Khi Hold That Bit là 1, mạch phản ánh giá trị của tín hiệu Data. Tín hiệu Hold That Bit sau đó có thể trở về 0, khi đó mạch nhớ giá trị cuối cùng của tín hiệu Data. Bất kì thay đổi nào của tín hiệu Data đều không ảnh hưởng mạch.
Nói cách khác, ta muốn một mạch có bảng chức năng sau:
+-----------+-----------+---------+
| Đầu vào | Đầu ra |
+-----------+-----------+---------+
| Data | HTB | Q |
+-----------+-----------+---------+
| 0 | 1 | 0 |
+-----------+-----------+---------+
| 1 | 1 | 1 |
+-----------+-----------+---------+
| 0 | 0 | Q |
+-----------+-----------+---------+
| 1 | 0 | Q |
+-----------+-----------+---------+
Trong hai trường hợp đầu tiên, khi tín hiệu Hold That Bit là 1, đầu ra Q giống với đầu vào Data. Trong hai trường hợp tiếp theo, khi tín hiệu Hold That Bit là 0, đầu ra Q như cũ dẫu cho đầu vào Data ra sao. Bảng chức năng có thể đơn giản hơn chút ít, như sau:
+-----------+-----------+---------+
| Đầu vào | Đầu ra |
+-----------+-----------+---------+
| Data | HTB | Q |
+-----------+-----------+---------+
| 0 | 1 | 0 |
+-----------+-----------+---------+
| 1 | 1 | 1 |
+-----------+-----------+---------+
| X | 0 | Q |
+-----------+-----------+---------+
X nghĩa là "kệ". Không cần biết đầu vào Data là gì vì nếu đầu vào Hold That Bit là 0, đầu ra Q giống như trước.
Triển khai tín hiệu Hold That Bit dựa trên flip-flop R-S trước đó yêu cầu ta thêm 2 cổng AND ở phía đầu vào như trong sơ đồ sau:
R-S + Hold That Bit
Đầu vào Data không có ở đây, tôi biết chứ nhưng đừng lo tôi sẽ sửa lại sớm thôi.
Nhớ lại là đầu ra của cổng AND là 1 chỉ khi cả 2 đầu vào là 1, có nghĩa là đầu vào Set và Reset không ảnh hưởng tới mạch trừ khi Hold That Bit là 1.
Mạch bắt đầu với giá trị Q và và giá trị ngược của Q̄. Trong sơ đồ này, đầu ra Q là 0 và đầu ra Q̄ là 1. Chừng nào tín hiệu Hold That Bit là 0 thì tín hiệu Set không ảnh hưởng tới đầu ra:
Set: 1
Tương tự, tín hiệu Reset không ảnh hưởng:
Reset: 1
Chỉ khi nào tín hiệu Hold That Bit là 1 thì mạch này mới hoạt động như flip-flop R-S trước đây:
Hold That Bit: 1
Nó hoạt động như một flip-flop R-S bình thường vì giờ đầu ra của cổng AND trên giống với tín hiệu Reset và đầu ra của cổng AND dưới cũng giống với tín hiệu Set.
Nhưng ta vẫn chưa đạt được mục đích. Ta chỉ muốn 2 đầu, không phải 3. Làm sao đây?
Nếu bạn nhớ lại bảng chức năng gốc của flip-flop R-S, trường hợp mà Set và Reset đều là 1 bị cấm, nên ta muốn tránh nó. Mặt khác, việc để cả Set và Reset cùng bằng 0 cũng chẳng mấy tác dụng, vì khi đó mạch chỉ đơn giản là đứng yên, không thay đổi gì cả. Chúng ta có thể điều khiển việc "giữ nguyên" này thông qua tín hiệu Hold That Bit về mức 0. Điều này dẫn đến một kết luận logic: Mạch sẽ hoạt động hợp lý nhất khi Set và Reset luôn ở trạng thái đối lập nhau. Nghĩa là: nếu Set là 1 thì Reset phải là 0; và ngược lại, nếu Set là 0 thì Reset phải là 1.
Hãy cùng làm hai thay đổi cho mạch này. Đầu vào Set và Reset có thể được thay bằng một đầu vào Data. Tương tự với đầu vào Set trước đó. Tín hiệu Data này có thể được đảo để thay thế tín hiệu Reset.
Thay đổi thứ hai là cho tín hiệu Hold That Bit một cái tên cổ truyền hơn, đó là Clock. Trông có vẻ hơi lạ vì nó không phải là đồng hồ thật, nhưng bạn sẽ sớm thấy là đôi khi nó cũng có thuộc tính giống đồng hồ, có nghĩa là nó có thể tíc tắc qua lại giữa 0 và 1 đều đặn. Nhưng giờ thì, đầu vào Clock đơn giản chỉ biểu thị khi nào đầu vào Data được lưu lại.
Đây là mạch đã sửa lại. Đầu vào Data thay cho đầu vào Set ở cổng AND dưới, trong khi inverter đảo tín hiệu đó để thay cho đầu vào Reset ở cổng AND trên:
Thay đầu vào Data
Lại lần nữa, ta bắt đầu với cả 2 đầu vào đặt là 0. Đầu vào Q là 0, có nghĩa Q̄ là 1. Chừng nào đầu vào Clock là 0, đầu vào Data không ảnh hưởng lên mạch:
Data: 1, Clock: 0
Nhưng khi Clock thành 1, mạch phản ánh giá trị đầu vào Data:
Data: 1, Clock: 1
Đầu ra Q giờ giống với đầu vào Data và Q̄ ngược lại. Giờ Clock có thể quay trở lại là 0:
Data: 1, Clock: 0
Mạch giờ nhớ giá trị của Data khi Clock trước đó là 1, bất kể Data có thay đổi đi nữa. Tín hiệu Data có thể, ví dụ, trở lại là 0 mà không ảnh hưởng gì tới đầu ra:
Data: 0, Clock: 0
Mạch này được gọi là flip-flop D kích mức. D viết tắt của Data. Kích mức nghĩa là flip-flop lưu giá trị của đầu vào Data khi đầu vào Clock ở tại một mức nhất định, trong trường hợp này là 1. (Ta sẽ sớm gặp những flip-flop kích mức khác nữa.)
Trong bảng chức năng này, Data có thể được viết tắt là D và Clock là Clk:
+-----------+-----------+-----------+-----------+
| Đầu vào | Đầu ra |
+-----------+-----------+-----------+-----------+
| D | Clk | Q | Q̄ |
+-----------+-----------+-----------+-----------+
| 0 | 1 | 0 | 1 |
+-----------+-----------+-----------+-----------+
| 1 | 1 | 1 | 0 |
+-----------+-----------+-----------+-----------+
| X | 0 | Q | Q̄ |
+-----------+-----------+-----------+-----------+
Mạch này cũng được biết với tên gọi là chốt D kích mức, và thuật ngữ đó có nghĩa đơn giản là mạch bắt lấy một bit dữ liệu và giữ nó lại để dùng sau. Mạch này cũng có thể được nhắc tới như là bộ nhớ 1-bit. Tôi sẽ mô phỏng trong Chương 19 cách nối một đống flip-flop này lại để được bộ nhớ bit và byte.
Còn bây giờ, hãy thử lưu lại chỉ 1 byte dữ liệu. Bạn có thể ráp 8 flip-flop D kích mức với tất cả đầu vào Clock gộp làm một tín hiệu. Đây là thành quả:
| | | | | | | | |
v v v v v v v v |
+-----------------------------------------------+ |
| D7 D6 D5 D4 D3 D2 D1 D0 | |
| Chốt 8-Bit | <---Clk
| Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 |
+-----------------------------------------------+
| | | | | | | |
v v v v v v v v
Chốt này một lần có thể lưu được 1 byte. 8 đầu vào bên trên đặt tên từ D0 tới D7, và 8 đầu ra phía dưới từ Q0 tới Q7. Khi tín hiệu Clock là 1, toàn bộ giá trị 8 bit ở đầu vào D được chuyển tới đầu ra Q. Khi tín hiệu Clock trở lại 0, giá trị 8 bit đó vẫn giữ nguyên cho tới khi tín hiệu Clock tiếp theo là 1. Đầu ra Q̄ từ mỗi chốt bị bỏ qua.
Chốt 8 bit cũng có thể được vẽ với 8 đầu vào Data và 8 đầu ra Q nhóm lại thành một luồng dữ liệu, như dưới đây:
Về cuối Chương 14, 8 bộ cộng 1 bit cũng được đem nối lại để cộng nguyên byte:
|| 8 || 8 |
|| || |
vv vv |
A7...A0 B7...B0 |
+-------------------------------+ |
| | |
+----| CO Bộ cộng 8-Bit CI | <----+
| | |
| +-------------------------------+
| S7...S0
| ||
v || 8
vv
Trong chương đó, 8 đầu vào A và 8 đầu vào B được nối với công tắc, đầu vào CI (Carry In) được nối đất, và 8 đầu ra S (Sum) và đầu ra CO (Carry Out) được nối với bóng đèn. (Bạn có thể xem mô phỏng để nhớ lại)
Chốt và bộ cộng có thể được dùng làm khối mô-đun để lắp mạch điện phức tạp hơn. Ví dụ, nó có thể lưu đầu ra của bộ cộng 8 bit vào chốt 8 bit. Cũng có thể thay một trong những dãy 8 công tắc với một chốt 8 bit để cho đầu ra của chốt là một đầu vào cho bộ cộng. Dưới đây là thứ kết hợp 2 ý tưởng này lại để tạo ra thứ mà ta có thể gọi là "máy cộng tích luỹ" dùng để giữ một tổng đang tính của nhiều số:
Tám công tắc
+----------++ ||
| || || 8
| vv vv
| +-------------------------+
| | A B |
| | Bộ cộng 8-Bit CI |---------+
| | S | |
| +-------------------------+ Đất
| ||
| || 8
| vv
| +-------------------------+ V (Nguồn)
| | D | |
| | Chốt 8-Bit Clk|<---/ ---+
| | Q | Cộng
| +-------------------------+
| ||
+-----------------+|
||
vv
Tám bóng đèn
Chú ý công tắc tên Cộng điều khiển đầu vào Clock của chốt.
Ngoài việc giảm một nửa số công tắc, cấu hình này cho phép bạn cộng nhiều hơn hai số mà không nhập lại các kết quả trung gian. Đầu ra của chốt bắt đầu với toàn số 0, cũng chính là đầu vào A cho bộ cộng. Bạn nhập vào số đầu tiên và bật tắt nút Cộng - đóng công tắc rồi mở nó ra. Số đó được chốt lưu lại và xuất hiện trong bóng đèn. Rồi bạn nhập số thứ hai và lại bật tắt nút Cộng. Số nhập vào bằng công tắc được cộng vào tổng trước đó và nó xuất hiện trên bóng đèn. Cứ tiếp tục nhập nhiều số như vậy bật tắt công tắc Cộng.
Nhưng không may, nó lại không hoàn toàn hoạt động như bạn mong đợi. Nó có thể chạy được đấy nếu bạn tạo bộ cộng từ các rơle chậm và bạn có thể bật tắt công tắc Cộng rất nhanh để lưu kết quả của bộ cộng vào chốt. Nhưng khi công tắc Cộng bị đóng bất cứ thay đổi nào với đầu vào Data của chốt sẽ đi ngay qua đầu ra Q và rồi ngược trở lại bộ cộng, nơi giá trị sẽ được cộng vào công tắc và tổng sẽ đi ngược vào trong chốt và chạy vòng lại lần nữa.
Đây được gọi là "vòng lặp vô tận". Nó xảy ra vì flip-flop D mà ta thiết kế được kích mức. Đầu vào Clock phải thay đổi mức từ 0 tới 1 để cho giá trị đầu vào Data được lưu vào chốt. Nhưng trong khoảng thời gian đầu vào Clock là 1, đầu vào Data có thể thay đổi và những thay đổi đó sẽ được phản ánh vào giá trị của đầu ra.
Với vài ứng dụng, một đầu vào Clock kích mức thường khá đủ. Nhưng với bộ cộng tích luỹ thì không. Với nó, ta không muốn chốt cho phép dữ liệu chạy qua bất cứ khi nào đầu vào Clock là 1. Được ưu thích hơn là một chốt lưu dữ liệu ngay khoảng khắc Clock thay đổi từ 0 sang 1 (hoặc luân phiên từ 1 sang 0). Sự chuyển đổi này được gọi là cạnh (edge) vì đó là hình dạng của nó trên đồ thị:
Sự thay đổi từ 0 sang 1 đôi khi được gọi là bước chuyển lên hoặc cạnh lên và chuyển đổi từ 1 sang 0 là bước chuyển xuống hoặc cạnh xuống.
Flip-flop kích mức trước đó chốt dữ liệu khi đầu vào Clock là 1. Tương quan với một flip-flop kích cạnh lên nhốt dữ liệu chỉ khi Clock tạo ra một xung từ 0 sang 1. Như với flip-flop kích mức, khi đầu vào Clock là 0, bất cứ thay đổi nào với đầu vào Data đều không ảnh hưởng đầu ra. Khác biệt trong flip-flop cạnh lên là thay đổi với đầu vào Data cũng không ảnh hưởng tới đầu ra khi đầu vào Clock là 1. Đầu vào Data ảnh hưởng đầu ra chỉ ngay tại thời điểm Clock thay đổi từ 0 sang 1.
Ý tưởng này không giống với bất cứ thứ gì đã gặp trước đây, nên nó hơi khó để triển khai. Nhưng có một mẹo như này: Một flip-flop D kích cạnh được tạo từ 2 giai đoạn flip-flop D kích mức, nối lại như sau:
Nối 2 flip-flop D kích mức
Ý tưởng ở đây là đầu vào Clock điều khiển cả giai đoạn đầu và giai đoạn sau. Nhưng chú ý là clock bị đảo ở giai đoạn đầu. Nghĩa là giai đoạn đầu này hoạt động chính xác như flip-flop D ngoại trừ đầu vào Data được lưu khi Clock là 0. Đầu ra của giai đoạn đầu là đầu vào cho giai đoạn sau, và chúng được lưu lại khi Clock là 1. Kết quả cuối cùng đó là đầu vào Data được lưu chỉ khi Clock thay đổi từ 0 sang 1.
Hãy cùng nhìn kỹ hơn. Ở đây flip-flop ở trạng thái nghỉ với cả 2 đầu vào Data và Clock là 0 và đầu ra Q là 0:
Trạng thái nghỉ
Giờ đổi đầu vào Data thành 1:
Data: 1, Clock: 0
Flip-flop giai đoạn đầu thay đổi vì đầu vào Clock đảo là 1. Nhưng giai đoạn sau vẫn không đổi vì đầu vào Clock không đảo là 0. Giờ đổi đầu vào Clock sang 1:
Data: 1, Clock: 1
Nó khiến giai đoạn sau thay đổi, và đầu ra Q chuyển thành 1. Sự khác biệt ở đây là đầu vào Data giờ có thể đổi (như chuyển thành 0) mà không ảnh hưởng đầu ra Q:
Data: 0, Clock: 1
Đầu ra Q và Q̄ có thể thay đổi chỉ vào thời điểm đầu vào Clock chuyển từ 0 sang 1.
Bảng chức năng của flip-flop D kích cạnh cần một kí hiệu mới, đó là một mũi tên hướng lên (↑). Kí hiệu này biểu thị một tín hiệu đang chuyển từ 0 sang 1:
+-----------+-----------+-----------+-----------+
| Đầu vào | Đầu ra |
+-----------+-----------+-----------+-----------+
| D | Clk | Q | Q̄ |
+-----------+-----------+-----------+-----------+
| 0 | ↑ | 0 | 1 |
+-----------+-----------+-----------+-----------+
| 1 | ↑ | 1 | 0 |
+-----------+-----------+-----------+-----------+
| X | 0 | Q | Q̄ |
+-----------+-----------+-----------+-----------+
Mũi tên hướng lên chỉ ra rằng đầu ra Q trở thành giống với đầu vào Data khi Clock tạo ra một thay đổi lên, đó là chuyển đổi từ 0 sang 1. Flip-flop có sơ đồ như này:
Góc nhọn nhỏ phía đầu vào Clk biểu thị flip-flop được kích cạnh. Tương tự, một bộ mới gồm 8 flip-flop kích cạnh có thể được kí hiệu với một góc nhọn nhỏ phía đầu vào Clock:
Tám công tắc
|| |+------------------------+
|| 8 || 8 |
vv vv |
+--- A ------ B -+ |
| | |
+---CI Bộ cộng 8 Bit | |
| | | |
Đất +----- Sum ------+ |
|| |
|| 8 |
vv |
+------- D -------+ V (nguồn) |
| | | |
| Chốt 8-Bit Clk<| <---/ --+ |
| | Cộng |
+------- Q -------+ |
|| |
|+------------------------------+
|| 8
vv
Tám bóng đèn
Bộ cộng tích luỹ này không xử lý tín hiệu Carry Out tốt lắm. Nếu cộng 2 số quá 255, Carry Out bị bỏ qua, và bóng đèn sẽ hiện một tổng ít hơn kết quả đúng. Một giải pháp khả thi là làm bộ cộng và chốt đều rộng cỡ 16 bit, hoặc ít nhất rộng hơn tổng lớn nhất mà bạn sẽ gặp. Nhưng hãy hoãn việc xử lý vấn đề đó lại đã.
Một vấn đề khác là không có cách nào dọn dẹp bộ cộng để bắt đầu tính tổng mới. Nhưng có một cách gián tiếp để thực hiện. Trong chương trước bạn đã học về phần bù 1 và bù 2, và bạn có thể dùng những khái niệm này: Ví dụ tổng đang tính là 10110001, nhập vào phần bù 1 (01001110) trên công tắc và cộng sẽ được tổng là 11111111. Rồi chỉ việc nhập 00000001 vào công tắc và cộng lại. Giờ tất cả bóng đèn sẽ tắt và bộ cộng được dọn dẹp.
Tiếp theo hãy khám phá một kiểu mạch khác dùng flip-flop D kích cạnh. Bạn sẽ nhớ lại mạch dao động được tạo từ đầu chương này. Đầu ra của mạch dao động luân phiên giữa 0 và 1:
Mạch dao động
Hãy nối đầu ra của mạch dao động với đầu vào Clock của flip-flop D kích cạch. Và hãy nối đầu ra Q̄ với đầu vào D:
Nối mạch dao động với flip-flop D kích cạnh
Đầu ra của flip-flop là đầu vào của chính nó. Nó là phản hồi dựa trên phản hồi! (Trong thực tiễn, có thể xuất hiện vấn đề. Mạch dao động được tạo nên từ rơle hoặc các phần tử khoá khác có thể dao động nhanh nhất có thể. Đầu ra của mạch dao động được nối với phần tử tạo nên flip-flop. Những phần tử khác này có thể không có khả năng theo kịp tốc độ của mạch dao động. Để tránh nó, hãy cho rằng mạch dao động chậm hơn nhiều so với flip-flop được dùng đâu đó trong những mạch này.)
Bắt đầu với đầu vào Clock là 0 và đầu ra Q là 0. Có nghĩa là đầu ra Q̄ là 1, được nối với đầu vào D:
+-----------+-----------+-----------+-----------+
| Đầu vào | Đầu ra |
+-----------+-----------+-----------+-----------+
| D | Clk | Q | Q̄ |
+-----------+-----------+-----------+-----------+
| 1 | 0 | 0 | 1 |
+-----------+-----------+-----------+-----------+
Khi đầu vào Clock thay đổi từ 0 sang 1, đầu ra Q sẽ thành giống với đầu vào D:
+-----------+-----------+-----------+-----------+
| Đầu vào | Đầu ra |
+-----------+-----------+-----------+-----------+
| D | Clk | Q | Q̄ |
+-----------+-----------+-----------+-----------+
| 1 | 0 | 0 | 1 |
+-----------+-----------+-----------+-----------+
| 1 | ↑ | 1 | 0 |
+-----------+-----------+-----------+-----------+
Đầu vào Clock giờ là 1. Nhưng vì đầu ra Q̄ thay đổi thành 0, đầu vào D cũng sẽ thay đổi thành 0:
+-----------+-----------+-----------+-----------+
| Đầu vào | Đầu ra |
+-----------+-----------+-----------+-----------+
| D | Clk | Q | Q̄ |
+-----------+-----------+-----------+-----------+
| 1 | 0 | 0 | 1 |
+-----------+-----------+-----------+-----------+
| 1 | ↑ | 1 | 0 |
+-----------+-----------+-----------+-----------+
| 0 | 1 | 1 | 0 |
+-----------+-----------+-----------+-----------+
Đầu vào Clock đổi lại thành 0 mà không ảnh hưởng đầu ra:
Điều xảy ra ở đây có thể tóm gọn rất đơn giản: Cứ mỗi khi đầu vào Clock (Xung nhịp) chuyển từ 0 sang 1, thì đầu ra Q lại thay đổi trạng thái—nếu đang là 0 sẽ thành 1, và nếu đang là 1 sẽ thành 0. Cục diện sẽ rõ ràng hơn nếu chúng ta nhìn vào biểu đồ thời gian:
Khi đầu vào Clock chuyển từ 0 lên 1, giá trị của D (bằng với Q̄) được chốt và chuyển sang đầu ra Q, như thế nó cũng thay đổi Q̄ lẫn D cho dịch chuyển tiếp theo của đầu vào Clock từ 0 sang 1.
Trước đó tôi có nói rằng tốc độ mà một tín hiệu dao động giữa 0 và 1 được gọi là tần số và được đo bằng Héc (viết tắt là Hz), tương đương với số chu trình trên giây. Nếu tần số của mạch dao động là 20 Hz (có nghĩa là 20 chu trình trên giây), tần số của đầu ra Q bằng một nửa là 10 Hz. Vì lí do này, mạch như vậy - trong đó đầu ra Q̄ được đưa trở lại đầu vào Data của flip-flop - cũng được biết là một bộ chia tần số.
Tất nhiên đầu ra từ bộ chia tần số có thể là đầu vào Clock của một bộ chia tần số khác để chia tần số đó một lần nữa. Dưới đây là sự sắp đặt của chỉ 3 flip-flop theo thác, nhưng dãy này có thể mở rộng tiếp:
Flip-flop nối theo thác
Hãy nhìn vào bốn tín hiệu tôi đặt tên ở bên trên sơ đồ đó:
Tôi phải thừa nhận rằng mình đã bắt đầu và dừng biểu đồ này tại một điểm vừa đúng lúc, nhưng không có gì không thành thật về nó cả: Mạch này sẽ lặp lại mẫu hình này mãi mãi. Nhưng bạn có nhận ra điều gì quen thuộc về nó không?
Tôi sẽ cho bạn một gợi ý. Hãy đánh dấu những tín hiệu này với 0 và 1:
Bạn nhìn ra chưa? Thử xoay biểu đồ một góc 90 độ theo chiều kim đồng hồ, và đọc những số 4 bit theo hàng ngang. Mỗi số tương đương với số thập phân từ 0 tới 15:
Do đó, mạch này không làm gì khác ngoài đếm số nhị phân, và nếu ta thêm vào càng nhiều flip-flop ta càng đếm được nhiều số hơn. Tôi đã chỉ ra trong Chương 10 là hệ quả của việc tăng số nhị phân, mỗi cột chữ số luân phiên giữa 0 và 1 với tần số bằng một nửa của cột bên tay phải. Bộ đếm nhại lại điều này. Tại mỗi bước chuyển lên của tín hiệu Clock đầu ra của bộ đếm được nói là tăng - đó là tăng thêm 1.
Hãy mắc 8 flip-flop lại và đặt vào trong một cái hộp:
+-----------------------------------------------+
| |
| Mạch đếm sóng 8-Bit Clk<|<-----
| Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 |
+-----------------------------------------------+
| | | | | | | |
v v v v v v v v
Mạch này được gọi là mạch đếm sóng vì đầu ra của mỗi flip-flop thành đầu vào Clock của flip-flop tiếp theo. Gợn sóng thay đổi qua các giai đoạn liên tiếp, và flip-flop ở cuối có thể bị trễ một chút khi thay đổi. Những mạch đếm tinh vi hơn thì đồng bộ, có nghĩa là đầu ra thay đổi cùng lúc.
Tôi đặt tên đầu ra từ Q0 tới Q7. Chúng được sắp đặt sao cho đầu ra từ flip-flop đầu tiên trong chuỗi (Q0) ở xa nhất bên phải. Do đó, nếu bạn nối bóng đèn vào những đầu ra này, bạn có thể đọc được một số 8-bit.
Tôi đã nhắc trước đó trong chương này là ta sẽ khám phá ra cách xác định tần số của mạch dao động. Thế là đủ rồi. Nếu bạn nối một mạch dao động với đầu vào Clock của mạch đếm 8 bit, mạch đếm sẽ cho bạn biết bao nhiêu chu trình mạch dao động đã đi qua. Khi tổng đến 11111111 (255 trong thập phân), nó quay trở lại 00000000. (Điều này đôi khi gọi là hồi hoặc quấn.) Có lẽ cách dễ nhất để xác định tần số mạch dao động là nối 8 bóng đèn với đầu ra của mạch đếm 8 bit này. Giờ đợi tới khi tất cả đầu ra là 0 (đó là khi không có bóng đèn nào sáng) và bắt đầu bấm giờ. Dừng lại khi tất cả đèn tắt hết lần nữa. Đó là thời gian cần cho 256 chu trình mạch dao động. Cho là 10 giây đi. Tần số của mạch dao động khi đó sẽ là 256 ÷ 10, hay 25,6 Hz.
Trong thực tế, mạch dao động được tạo từ các tinh thể thạch anh rung nhanh hơn so với này nhiều, bắt đầu ở đầu thấp là 32.000 Hz (hay 32 kilo héc hay kHz), lên đến một triệu chu trình trên giây (1 mega héc hay MHz) và hơn nữa, và thậm chí chạm đến một tỉ chu trình trên giây (1 giga héc hay GHz).
Một loại mạch dao động thạch anh phổ biến có tần số 32.768 Hz. Đây không phải là một số ngẫu nhiên! Khi mà một đầu vào một chuỗi bộ chia tần số, nó trở thành 16.384 Hz rồi 8192 Hz, 4096 Hz, 2048 Hz, 1024 Hz, 512 Hz, 256 Hz, 128 Hz, 64 Hz, 32 Hz, 16 Hz, 8 Hz, 4 Hz, 2 Hz và 1 Hz, tới đây nó có thể đếm giây trong một đồng hồ điện tử.
Một vấn đề thực tiễn với mạch đếm sóng là chúng không phải lúc nào cũng bắt đầu tại 0. Khi có điện, đầu ra Q của vài flip-flop riêng lẻ có thể là 1 hoặc 0. Một cải tiến phổ biến cho flip-flop là tín hiệu Clear đặt đầu ra Q thành 0 bất kể đầu vào Data hay Clock có như nào.
Với flip-flop D kích mức đơn giản hơn, bổ sung đầu vào Clear khá dễ vì chỉ cần thêm một cổng OR. Đầu vào Clear lúc bình thường là 0. Nhưng khi là 1, đầu ra Q trở thành 0 như dưới đây:
Clear: 1, Clock: 0, Data: 0
Tín hiệu này ép Q thành 0 dù cho những tín hiệu đầu vào khác là gì, do đó dọn dẹp flip-flop.
Với flip-flop kích cạnh, tín hiệu Clear phức tạp hơn, và nếu phải thêm một tín hiệu Clear, ta có thể cũng cần xét đến việc thêm một tín hiệu Preset nữa. Trong khi tín hiệu Clear đặt đầu ra Q là 0 mặc kệ đầu vào Data và Clock, Preset đặt Q thành 1. Nếu bạn đang tạo một đồng hồ điện tử, những tín hiệu Clear và Preset này sẽ hữu ích để cài đặt thời gian ban đầu cho đồng hồ.
Dưới đây là flip-flop D kích cạnh với preset và clear được tạo hoàn toàn từ sáu cổng NOR 3 đầu vào kèm một inverter. Ở đây, đối xứng bù đắp cho vẻ phức tạp:
Flip-flop D kích cạnh với Preset và Clear
Đầu vào Preset và Clear ghi đè đầu vào Clock và Data. Bình thường những đầu vào Preset và Clear này đều là 0. Khi đầu vào Preset là 1, Q thành 1 và Q̄ thành 0. Khi đầu vào Clear là 1, Q thành 0 và Q̄ thành 1. (Như đầu vào Set và Reset của flip-flop R-S, Preset và Clear không nên đồng thời là 1.) Mặt khác, hành vi này giống một flip-flop D kích cạnh bình thường:
+-----+-----+-----+-----+-----+-----+
| Đầu vào | Đầu ra |
+-----+-----+-----+-----+-----+-----+
| Pre | Clr | D | Clk | Q | Q̄ |
+-----+-----+-----+-----+-----+-----+
| 1 | 0 | X | X | 1 | 0 |
+-----+-----+-----+-----+-----+-----+
| 0 | 1 | X | X | 0 | 1 |
+-----+-----+-----+-----+-----+-----+
| 0 | 0 | 0 | ↑ | 0 | 1 |
+-----+-----+-----+-----+-----+-----+
| 0 | 0 | 1 | ↑ | 1 | 0 |
+-----+-----+-----+-----+-----+-----+
| 0 | 0 | X | 0 | Q | Q̄ |
+-----+-----+-----+-----+-----+-----+
Sơ đồ cho flip-flop D kích cạnh với preset và clear trông như này:
Trong Chương 15, tôi đã mô tả vài vi mạch trong họ có tên là TTL (transistor-transistor logic). Nếu bạn đang làm việc với TTL và bạn cần một trong những flip-flop này, bạn không cần tạo nó từ cổng. Chip 7474 được mô tả là "Flip-Flop D Kích Cạnh Lên Kép với Preset và Clear", và dưới đây là cách nó xuất hiện trong Sổ tay TTL cho Kĩ Sư Thiết kế:
Chip 7474
Giờ ta đã dạy được rơle điện báo và transistor làm cộng, trừ và đếm trong số nhị phân. Ta cũng đã thấy flip-flop có thể lưu bit và byte như thế nào. Đây là bước đầu tiên trên con đường xây dựng một thành phần thiết yếu của máy tính có tên là memory.
Nhưng trước đó hãy giải lao chút đã.
27
Open to Work
Looking for a Fullstack Ruby on Rails developer?
I am open to new remote/hybrid opportunities and contract work.