Bài giảng môn Điện - Điện tử - Các thiết bị logic lập trình được

Tài liệu Bài giảng môn Điện - Điện tử - Các thiết bị logic lập trình được: Các thiết bị logic lập trình được CÁC THIẾT BỊ LOGIC LẬP TRÌNH ĐƯỢC Trong chương này chúng ta tìm hiểu về PLD (Programmable Logic Device - Thiết bị logic lập trình được) và ứng dụng của chúng trong việc thiết kế hệ tổ hợp và hệ tuần tự. Trước hết chúng ta xem lại về bộ nhớ bán dẫn và xem PLD được xếp trong nhóm nào. Nhắc lại về bộ nhớ bán dẫn Bộ nhớ bán dẫn được chia ra làm hai loại chính: bộ nhớ bảng (table memory) và bộ nhớ hàm (function memory). Với các bộ nhớ bảng, địa chỉ A được định nghĩa trong dãy: 0 ≤ A ≤ m = 2N – 1 Với độ rộng từ của địa chỉ (address word width) là N (N = 5...22...), giá trị của N phụ thuộc vào kích thước bộ nhớ. Có thể cất dữ liệu ở m địa chỉ của 2N địa chỉ. Độ rộng từ dữ liệu (data word width) là n = 1..8..16...32... bit. Phân loại các bộ nhớ bán dẫn thường dùng với: RAM - Random Access Memory (bộ nhớ truy cập ngẫu nhiên...

pdf46 trang | Chia sẻ: ntt139 | Lượt xem: 1871 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng môn Điện - Điện tử - Các thiết bị logic lập trình được, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Các thiết bị logic lập trình được CÁC THIẾT BỊ LOGIC LẬP TRÌNH ĐƯỢC Trong chương này chúng ta tìm hiểu về PLD (Programmable Logic Device - Thiết bị logic lập trình được) và ứng dụng của chúng trong việc thiết kế hệ tổ hợp và hệ tuần tự. Trước hết chúng ta xem lại về bộ nhớ bán dẫn và xem PLD được xếp trong nhóm nào. Nhắc lại về bộ nhớ bán dẫn Bộ nhớ bán dẫn được chia ra làm hai loại chính: bộ nhớ bảng (table memory) và bộ nhớ hàm (function memory). Với các bộ nhớ bảng, địa chỉ A được định nghĩa trong dãy: 0 ≤ A ≤ m = 2N – 1 Với độ rộng từ của địa chỉ (address word width) là N (N = 5...22...), giá trị của N phụ thuộc vào kích thước bộ nhớ. Có thể cất dữ liệu ở m địa chỉ của 2N địa chỉ. Độ rộng từ dữ liệu (data word width) là n = 1..8..16...32... bit. Phân loại các bộ nhớ bán dẫn thường dùng với: RAM - Random Access Memory (bộ nhớ truy cập ngẫu nhiên) ROM - Read Only Memory 7 Bộ nhớ bán dẫn Bộ nhớ bảng Bộ nhớ hàm RAM ROM Tĩnh Động MROM PROM EPROM EEPROM PLD PLA PAL LCA EPLD PEEL GAL PPLA EPLPAL EEPPAL Chương 1 M - Mask Programmed (được lập trình bằng che mặt nạ) P - Programmable (lập trình được, khả lập trình) EP - Erasable and Programmable (xóa được và lập trình được) EEP - Electrically Erasable and Programmable (xóa và lập trình bằng điện) PLD - Programmable Logic Device (thiết bị logic lập trình được, thiết bị khả lập trình) PLA - Programmable Logic Array (mảng logic lập trình được) PAL - Programmable Array Logic (logic mảng lập trình được) LCA - Logic Cell Array (mảng tế bào logic) Dung lượng bộ nhớ K được xác định bit (K = m.n với n là độ rộng từ dữ liệu; m là số đường địa chỉ) và cũng theo byte (K/8) cho các độ rộng từ dữ liệu 8 hay 16 bit. Ví dụ: N = 3 (bit địa chỉ) và n = 2 (bit dữ liệu). Hình 1.1 Một bảng để ghi ROM Các bộ nhớ hàm chứa các hàm logic thay vì là các bảng. Mỗi hàm của bảng chân trị có thể được biểu diễn bằng hàm logic. Viết dưới dạng tích chuẩn thì hàm logic của biến d0 ở hình 1.1 là: d0 = a2’a1’a0’d00 + a2’a1’a0d10 + ..... + a2 a1 a0 d70 = m0d00 + m1d10 +....+ m7d70 (với mi là minterm thứ i) Nếu có ít di0 = 1 thì dùng bộ nhớ hàm tiện lợi hơn. 8 0 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 d01 d00 d11 d10 d21 d20 d31 d30 d41 d40 d51 d50 d61 d60 d71 d70 D0 D1 D2 D3 D4 D5 D6 D7 a2 a1 a0 d1 d0 A D Các thiết bị logic lập trình được Các thiết bị lập trình được PLD (Programmable Logic Device) PLD là tên gọi tổng quát của một IC số mà người ta có thể lập trình được nó để cho nhiều loại hàm logic khác nhau. Nó là một chip LSI chứa một cấu trúc mạch có qui luật ("regular"), cho phép người thiết kế làm cho thích ứng với một ứng dụng cụ thể. Cấu trúc mạch “regular” trong PLD thông thường là một dãy (array - dãy, mảng) hình chữ nhật các ô nhớ đồng dạng (identical cell) có thể lập trình từng ô được. Các thiết kế dùng PLD thường nhỏ hơn và nhanh hơn các tương đương SSI/MSI và chúng thường cũng rẻ hơn. Và một điều quan trọng là các PLD làm đơn giản hóa công việc của người thiết kế logic. Một PLD tương đương với một mạch SSI/MSI lớn hơn có thể thường được viết bằng “một” chương trình đơn giản, và có thể dễ dàng sửa lỗi hoặc cải tiến tính năng. 1.1 ROM - THIẾT KẾ HỆ TỔ HỢP VÀ HỆ TUẦN TỰ DÙNG ROM 1.1.1 ROM (Read-Only Memory) ROM là một mạch tổ hợp có m ngõ vào và n ngõ ra (H.1.2). Các ngõ vào được gọi là các ngõ vào địa chỉ (address inputs) và thường được đặt tên là A0, A1,..., Am–1. Các ngõ ra được gọi là các ngõ ra dữ liệu (data outputs) và thường được đặt tên là D0, D1,..., Dn–1. A0 D0 A1 D1 A2 D2 Am-2 Dn-2 Am-1 Dn-1 Ngõ vào địa chỉ (m đường) Ngõ ra dữ liệu (n đường) Hình 1.2 Cấu trúc cơ bản của ROM 2m×n 9 Chương 1 ROM chứa bảng chân trị của một hàm logic tổ hợp m ngõ vào, n ngõ ra. Ví dụ bảng 1.1 là bảng chân trị của hàm tổ hợp 3 ngõ vào, 4 ngõ ra; có thể chứa nó trong ROM 23×4 (8×4). Bỏ qua các trì hoãn thời gian, các ngõ ra dữ liệu của ROM ở mọi lúc là các bit ra của hàng trong bảng chân trị được chọn bởi các ngõ vào địa chỉ. Bảng 1.1 Bảng chân trị của hàm logic tổ hợp 3 ngõ vào, 4 ngõ ra Chú ý: - Có thể dùng ROM như bất cứ phần tử logic tổ hợp nào. - ROM là bộ nhớ không bốc hơi (nonvolatile memory) vì nội dung của nó vẫn giữ được ngay cả khi không cấp điện. 1.1.2 Dùng ROM cho các hàm logic tổ hợp “ngẫu nhiên” Bảng 1.1 thật sự là bảng chân trị của bộ giải mã 2 sang 4 với điều khiển cực tính ngõ ra, hàm này có thể xây dựng bằng các cổng như ở hình 1.3. 10 A2 A0A1 D3 D2 D1 D0 Inputs Outputs 0 00 1 1 1 0 0 10 1 1 0 1 0 01 1 0 1 1 0 11 1 1 1 1 1 00 0 0 0 1 1 10 0 0 1 0 1 01 0 1 0 0 1 11 1 0 0 0 I0 ( )A0 I1 ( )A1 POL ( )A2 Y0 (D )0 Y1 (D )1 Y2 (D )2 Y3 (D )3 Các thiết bị logic lập trình được Hình 1.3 Bộ giải mã 2 sang 4 với điều khiển cực tính giá trị ra Như vậy ta có hai cách để xây dựng bộ giải mã: với các cổng rời, hoặc với ROM 8×4 mà chứa bảng chân trị như ở hình 1.4. Hình 1.4 Kết nối để xây dựng bộ giải mã 2 sang 4 dùng ROM 8×4 chứa bảng 1.1 (tích số) Chú ý: - Vấn đề hoán vị các cột bit trong bảng chân trị của hàm cần ghi ROM. - Khi dùng ROM để chứa một bảng chân trị cho trước, các tín hiệu xuất và nhập đọc từ phải sang trái trong bảng chân trị thường được gán vào các ngõ vào địa chỉ và ngõ ra dữ liệu của ROM với các nhóm theo thứ tự tăng dần. Ví dụ: Dùng ROM để thực hiện hàm nhân nhị phân không dấu cho 2 số 4 bit với nhau. Nếu dùng mạch rời ta dùng các IC 74284 và 74285, còn dùng ROM thì sử dụng ROM 28×8 (256×8) với kết nối như ở hình 1.5. 11 A0 D0 A1 D1 A2 D2 D3 Y0 Y1 Y2 Y3 I0 I1 POL 8 4 ROM× Chương 1 A0 D0 A1 D1 A2 D2 D3 P0 P1 P2 P3 256 8 ROM× Y0 Y1 Y2 Y3 X0 X1 X2 X3 P4 P5 P6 P7 A3 A4 A5 A6 A7 D4 D5 D6 D7 Multiplicand (số bị nhân) Multiplier (số nhân) Product (tích số) Hình 1.5 Kết nối thực hiện nhân nhị phân không dấu dùng ROM 256×8 Nội dung ghi cho ROM (dạng file văn bản hex) như sau: Địa chỉ Tích số của 1×2 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 20: 00 02 04 06 08 0A 0C 0E 10 12 14 16 18 1A 1C 1E 30: 00 03 06 09 0C 0F 12 15 18 1B 1E 21 24 27 2A 2D 40: 00 04 08 0C 12 18 1E 23 28 2D 32 37 3C 41 46 4B 50: 00 05 0A 0F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 60: 00 06 0C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A 70: 00 07 0E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69 80: 00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 90: 00 09 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87 A0: 00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 B0: 00 0B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 C0: 00 0C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4 D0: 00 0D 1A 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3 E0: 00 0E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2 F0: 00 0F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 Người đọc thử thiết kế nhân hai số BCD dùng ROM với cách tương tự? 1.1.3 Cấu trúc nội của ROM 12 Các thiết bị logic lập trình được Cơ chế các ROM dùng để lưu trữ thông tin thì thay đổi với các công nghệ ROM khác nhau. Trong phần lớn các ROM, sự xuất hiện hoặc vắng mặt của một diode hay transistor phân biệt giữa 0 và 1. Hình 1.6 là một sơ đồ ROM 8×4 tự tạo dùng bộ giải mã TTL và các diode. Mỗi đường ra bộ giải mã được gọi là đường từ (word line) bởi vì nó chọn một hàng hoặc một từ của bảng chứa trong ROM. Mỗi đường thẳng đứng trong hình 1.6 được gọi là đường bit (bit line) bởi vì nó tương ứng với 1 bit ra của ROM. 1 A0 0 A1 1 A2 1 2 3 4 5 6 R 74 138× G1 G2A G2B A B C Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 +5V R 14 15 12 13 10 11 7 9 ROW0_L cao ROW1_L cao ROW2_L cao ROW3_L cao ROW4_L cao ROW5_L cao ROW6_L cao ROW7_L cao cao D0_L 1 2 thấp D1_L 3 4 cao D2_L 5 6 cao D3_L 9 8 U2 U2 U2 U2 D0 D1 D2 D3 74HC14 +5V Hình 1.6 ROM 8×4 đơn giản Nhận xét: Có diode thì tương ứng ngõ ra ở mức 0; còn không có diode thì ngõ ra tương ứng ở mức 1. Các MOS ROM thường dùng transistor thay vì diode ở mỗi vị trí mà bit sẽ được lưu trữ. Hình 1.7 cho thấy ý tưởng cơ bản này: 13 Chương 1 VDD RCác ngõ ra tích cực cao Các ngõ vào địa chỉ Mạch giải mã Dữ liệu đếm các bộ đệm ra đảo Các đường bit tích cực thấp và ở mức thấp (LOW) nếu có transistor Hình 1.7 Các transistor MOS dùng làm các phần tử lưu trữ trong ROM Chú ý: Đôi lúc người ta vẽ đơn giản hơn Mạch giải mã Phần tử chuyển mạch swicthing element( ) Đường từ (word line) Đường từ (word line) Giải mã 2 chiều Ví dụ: ROM 128×1 14 Các thiết bị logic lập trình được 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Mạch giải mã 3 sang 8 0 1 2 3 4 5 6 7 A4 A5 A6 0 1 2 +5V R A0 A1 A2 A3 S0 S1 S2 S3 Mạch dồn kênh 16 sang 1 Y D0 Hình 1.8 Cấu trúc của ROM 128×1 dùng giải mã hai chiều Ngoài việc giảm tính phức tạp việc giải mã, việc giải mã hai chiều có một thuận lợi khác là: nó dẫn đến một chip có kích thước vật lý gần vuông, điều này quan trọng cho chế tạo và đóng gói (packaging) IC. Trong các ROM có nhiều ngõ ra dữ liệu, các dãy lưu trữ tương ứng với mỗi ngõ ra dữ liệu có thể được làm hẹp hơn để đạt được bố trí chip gần với hình vuông hơn. Ví dụ hình 1.9 cho thấy bố trí có thể có của ROM 32K×8. 15 Chương 1 A6 A7 A8 A9 A10 A11 A12 A13 A14 A0 A1 A2 A3 A4 A5 Mạch giải mã 9 sang 512 D7 D6 D5 D4 D3 D2 D1 D0 Mảng 512 64× Mảng 512 64× Bộ dồn kênh 64 sang 1 Bộ dồn kênh 64 sang 1 Hình 1.9 Bố trí có thể có của ROM 32K×8 1.1.4 Các kiểu ROM thương mại Bảng 1.2 Các kiểu ROM thương mại Kiểu Công nghệ Chu kỳ đọc Chu kỳ ghi Chú thích Mask ROM NMOS, CMOS 25-500ns 4 tuần Ghi 1 lần; công suất thấp Mask ROM Bipolar <100ns 4 tuần Ghi 1 lần; công suất cao, mật độ thấp PROM Bipolar <100ns 5 phút Ghi 1 lần; công suất cao, không có mặt nạ EPROM NMOS, CMOS 25-500ns 5 phút Dừng lại được; công suất thấp EEPROM NMOS 50-500ns 10ms/byte Giới hạn là 10000ghi/vị trí Chú ý là số liệu trong bảng 1.2 chỉ mang tính chất tham khảo vì giá trị của chu kỳ đọc/ghi sẽ thay đổi theo công nghệ chế tạo bộ nhớ. Các ROM thông dụng nhất là các EPROM: 2764, 27128, 27256 và 27512 với các ký hiệu logic ở hình 1.10. 16 Các thiết bị logic lập trình được 8K 8× 2764 VCC VIH 1 27 10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 VPP PGM A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CS OE O0 O1 O2 O3 O4 O5 O6 O7 11 12 13 15 16 17 18 19 16K 8× 27128 VCC VIH 1 27 10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 VPP PGM A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CS OE O0 O1 O2 O3 O4 O5 O6 O7 11 12 13 15 16 17 18 19 26 A13 16K 8× 27256 VCC 1 10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 VPP A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CS OE O0 O1 O2 O3 O4 O5 O6 O7 11 12 13 15 16 17 18 19 27 A1326 16K 8× 27512 10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 VPP A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CS OE O0 O1 O2 O3 O4 O5 O6 O7 11 12 13 15 16 17 18 19 27 A13 26 1 A14A14 Hình 1.10 Các ký hiệu logic cho các EPROM chuẩn với dạng DIP 28 chân Chú ý: - Nhãn Vcc phải nối với +5volt - Nhãn VIH phải nối với tín hiệu logic HIGH hợp lệ - Chân có nhãn Vpp dùng để đưa vào điện áp lập trình. Bảng 1.3 Các ví dụ EPROM Dung lượng Tổ chức Kiểu Nhà sản xuất Công suất làm việc typical Thời gian truy cập tối đa Số chân CMOS 16Kbit (VDD =5V,f=fmax) 2KX8 Cy7C291 Cy,Ws 250mW 35ns 24 64Kbit 8Kx8 8Kx8 4Kx16 27C64 27HC64 WS57C65 Ti, Fu, Na, Am At, Cy, Ws Ws 100mW 300mW 300mW 150ns 45ns 55ns 28 28 40 128Kbit 16Kx8 16Kx8 27C128 Cy7C251 Ti, Fu, Am Cy, Ws 150mW 400mW 150ns 45ns 28 28 256Kbit 32Kx8 32Kx8 36Kx8 27C256 27HC256 27C202 Ti, At, Fu, Hi, Mi, Ne, Na. At, Cy, Ws. In, Ws 150mW 350mW 500mW 150ns 55 ns 55ns 28 28 40 Các nhà sản xuất: Am = AMD, At = Atmel, Cy = Cypress, Fu = Fujitsu, Hi = Hitachi, In = Intel Mi = Mitsubishi, Na = National, Ne = NEC, Ti = Texas Instr, To = Toshiba, Ws = Wafer scale 17 Chương 1 Bảng 1.4 Các ví dụ về EEPROM Dung lượng Tổ chức Kiểu Nhà sản xuất Công suất làm việc tiêu biểu Thời gian truy cập tối đa Số chân CMOS 16Kbit 16Kbit (VDD =5V,f=fmax) 2KX8 28C16 2Kx8 28HC16 At, Se, Xi At 100mW 300mW 200ns 35ns 24 24 64Kbit 8Kx8 8Kx8 28C64 28HC64 At, Se, Xi At 120mW 280mW 200ns 45ns 28 28 256Kbit 32Kx8 32Kx8 28C256 28HC256 At, Se, Xi At 150mW 350mW 200ns 70ns 28 28 1Mbit 1Mbit 128Kx8 64Kx16 28C010 28C1024 At, Se, Xi At 300mW 400mW 300ns 150ns 32 40 Bảng 1.5 So sánh RAM & ROM theo hiệu suất ghi và đọc RAM ROM MROM PROM EPROM EEPROM Ghi: - Số lần - Thời gian bất kỳ 10 - 200ns 1 lần nhiều tháng 1 lần nhiều phút ... 100 lần nhiều phút 104... 106 lần nhiều ms Đọc: - Số lần - Thời gian bất kỳ 10 - 200ns bất kỳ ≅ 100ns bất kỳ 100 - 300ns bất kỳ 30 - 300ns bất kỳ 30 - 300ms 1.1.5 Các ngõ vào điều khiển và định thì ROM Các ngõ ra của ROM thường phải được nối vào một bus ba trạng thái ở đó các thiết bị khác có thể lái bus ở các thời điểm khác. Do đó, phần lớn các chip ROM thương mại có các ngõ ra dữ liệu 3 trạng thái và một ngõ điều khiển “output enable” (OE - cho phép xuất) để cho phép các ngõ ra. Nhiều ứng dụng ROM, đặc biệt là lưu trữ chương trình có nhiều ROM được nối vào 1 bus, ở đó mỗi lần chỉ có 1 ROM lái bus. Phần lớn các ROM có ngõ vào chip select (CS - chọn chip) để làm đơn giản việc thiết kế các hệ thống như vậy. Ngoài OE ra, còn phải cần có CS để cho phép các ngõ ra ba trạng thái. Tuy nhiên trong nhiều ROM, CS cũng làm việc như ngõ vào cắt nguồn cấp điện (power-down input); khi CS ở mức bù (ví dụ /CS 18 Các thiết bị logic lập trình được = 0 chọn, thì bù là /CS = 1) thì không cấp nguồn cho các decoder nội, các driver và các multiplexer của ROM. Ở chế độ chờ này (standby mode) 1 ROM tiêu biểu tiêu thụ ít hơn 10% công suất được dùng trong chế độ hoạt động (active mode). Hình 1.11 chỉ các ngõ vào CS và OE được sử dụng như thế nào ở bên trong 1 ROM tiêu biểu. A0 A1 Am-1 Am Am+1 An-1 CS_L CE_L Db-1 Db-2 D0 Giải mã hàng Mở nguồn Mở nguồn Mảng bộ nhớ Mở nguồn Giải mã cột Hình 1.11 Cấu trúc ROM nội và tác dụng của các ngõ vào điều khiển tAA tOZ tOE tOZ tOE tOH max(t ,t )AA ACS≥ tAA ADDR CL_L OE_L DATA ổn định tACS ổn định ổn định hợp lệ hợp lệ hợp lệ Hình 1.12 Định thì ROM 19 Chương 1 với: tAA (Access time from address) - thời gian truy xuất từ địa chỉ của ROM là trì hoãn truyền từ lúc địa chỉ vào ổn định đến khi dữ liệu ra ổn định. Khi người thiết kế nói dùng ROM 200ns thì 200 ns để chỉ tham số này. tACS (Access time from chip select) - trì hoãn truyền từ lúc có xác nhận CS đến khi dữ liệu ra hợp lệ. Trong một số chip, tACS > tAA. tOE (Output enable time) (thường tOE < tAA,ACS) là trì hoãn truyền từ lúc OE và CS được xác nhận cho đến khi các mạch lái ba trạng thái ở ngõ ra trong trạng thái tổng trở cao (hi-Z). Tùy theo các ngõ vào địa chỉ ổn định đủ lâu, dữ liệu ra có thể hợp lệ hoặc không ở thời điểm này! tOZ (Output-disable time) - trì hoãn truyền từ lúc OE hay CS bị bù cho đến khi các mạch lái ba trạng thái ở ngõ ra đã vào trạng thái Hi-Z. tOH (Output hold time) - độ dài thời gian mà các ngõ ra giữ hợp lệ sau khi thay đổi các ngõ vào địa chỉ hoặc sau khi lấy bù /OE hay /CS. 1.1.6 Thiết kế hệ tuần tự dùng ROM Ta có thể thiết kế dễ dàng một hệ tuần tự dùng ROM và các Flip-Flop. Ta có mô hình tổng quát của hệ tuần tự (mạng mealy) dùng các D-FF có xung nhịp: Phần tổ hợp của hệ tuần tự có thể dùng ROM để thực hiện các hàm ra (Z1, Z2,..., Zn) và các hàm trạng thái kế (Q1+, Q2+,..., Qk+). Trạng thái của hệ được chứa trong một thanh ghi (tạo bằng các D F/F và đưa hồi tiếp về ngõ vào của ROM. Như vậy hệ tuần tự mealy với m input, n output và k biến trạng thái có thể được cài đặt bằng k D F/F và ROM với (m+k) input (nghĩa là 2m+k từ [word]) và (n+k) output. Người ta thích dùng D F/F hơn J-K F/F vì sử dụng các F/F với hai ngõ vào sẽ cần phải tăng số ngõ ra ở ROM. Còn việc các phương trình vào của D F/F tổng quát thì cần nhiều cổng hơn các phương trình J-K thì không còn ý nghĩa ở đây vì kích thước của ROM chỉ phụ thuộc vào số các ngõ vào và ngõ ra và không phụ thuộc vào độ phức tạp của các phương trình được cài đặt. 20 Các thiết bị logic lập trình được D1 CK D2 CK Dk CK X1 X2 Xm Mạng tổ hợp Q1 Q2 Qk Q1 Q2 Qk Q1 Q2 Qk + + + Z1 Z2 Zn Hình 1.13 Mô hình tổng quát cho mạng Mealy dùng các D F/F có xung nhịp Ví dụ: Thiết kế bộ (chuyển) đổi mã từ BCD sang quá 3. Ngõ vào và ra là nối tiếp với LSB đi trước. Ta có bảng sau: X input (BCD) Y Output (excess-3) t3 t2 t1 t0 t3 t2 t1 t0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 Bảng trên liệt kê các input và output mong muốn tại các thời điểm t0, t1, t2 và t3. 21 Chương 1 Trước hết ta thành lập bảng trạng thái (bảng 1.6) và sau đó sẽ rút gọn bảng dùng so các hàng giống nhau thì gom lại. Khi so các hàng chứa dấu gạch ngang (đây là trường hợp "don't care" thì dấu gạch ngang sẽ khớp với bất cứ trạng thái nào hoặc với bất kỳ giá trị ra nào. Bằng cách so khớp các hàng theo cách này, ta có H≡I≡J≡K≡L và M≡N≡P. Sau khi khử I, J, K, L, N và P, ta thấy E≡F≡G và bảng được thu gọn thành 7 hàng (bảng 1.7). Bảng 1.6 Bảng trạng thái của bộ chuyển đổi mã Thời điểm Chuỗi vào nhận được (LSB được nhận đầu tiên) Trạng thái hiện tại Trạng thái kế X=0 1 Giá trị ra hiện tại (Z) X=0 1 t0 reset A B C 1 0 t1 0 1 B C D F E G 1 0 0 1 t2 00 01 10 11 D E F G H L I M J N K P 0 1 1 0 1 0 1 0 t3 000 001 010 011 100 101 110 111 H I J K L M N P A A A A A - A - A - A - A - A - 0 1 0 1 0 - 0 - 0 - 1 - 1 - 1 - Bảng 1.7 Bảng trạng thái được rút gọn của bộ chuyển đổi mã Thời gian Trạng thái hiện tại Trạng thái kế X=0 1 Giá trị ra hiện tại (Z) X=0 1 t0 A B C 1 0 t1 B C D E E G 1 0 0 1 t2 D E H H H M 0 1 1 0 t3 H M A A A - 0 1 1 - Người ta có thể dùng một cách khác để suy ra bảng 1-6 bằng cách bắt đầu bằng giản đồ trạng thái. Giản đồ trạng thái (H.1.14) 22 Các thiết bị logic lập trình được có dạng hình cây. Mỗi đường bắt đầu trạng thái reset biểu diễn 1 trong 10 chuỗi vào có thể có. Hình 1.14 Giản đồ trạng thái của bộ chuyển đổi mã Thiết kế không dùng ROM Cần có ba flipflop để cài đặt bảng thu gọn vì có 7 trạng thái. Mỗi trạng thái phải được gán vào một kết hợp duy nhất các trạng thái flipflop. Ta có bảng gán trạng thái và bảng chuyển trạng thái ở hình 1.15. Thời gian Trạng thái hiện tại Q1+ Q2+ Q3+ Q1Q2Q3 X = 0 1 Z t0 A 000 010 011 0 1 t1 B C 010 101 100 011 100 100 1 0 0 1 t2 D E 101 111 111 100 111 110 0 1 1 0 t3 H M 111 000 000 110 000 --- 0 1 1 - Hình 1.15 Bảng gán trạng thái và bảng chuyển trạng thái cho các flip-flop Dùng các J-K flipflop, và sau khi lập các bảng Karnaugh và rút gọn (xem phụ lục), ta có: 23 A B D F 0/1 1/0 C E G 0/0 1/1 H L 0/0 1/1 J N 0/1 1/0 I M 0/1 1/0 K P 0/1 1/0 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 Reset t0 t1 t2 t3 Chương 1 J1 = K1 = Q2 J3 = X' Q1' Q2' + X' Q1 Q'2 + XQ'1 Q'2 J2 = K2 = 1 K3 = Q2 và Z = X' Q3' + XQ3 Kết quả có mạch sau: Hình 1.16 Bộ chuyển đổi mãõ Thiết kế dùng ROM Hình 1.17 Cài đặt mạng tuần tự dùng ROM Ta sẽ cài đặt bộ chuyển đổi mã này dùng ROM và các D F/F. Ta có bảng trạng thái của bộ chuyển đổi được ghi lại ở bảng 1.8a. Vì có 7 trạng thái, nên cần 3 D F/F. Như vậy cần ROM có 4 input 24 K1 CK J1 Q1 , Q1 K2 CK J2 Q2 , Q2 Q2 1 K3 CK J3 Q3 , Q3 Q2 Clock Q3 X , Q X , Z Q1 , Q2X , Q2 Q1 ,X, Q2 , Q1 ,X, D1 CK Q1 + Z Q1 D2 CK Q2 + Q2 D3 CK Q3 + Q3 X ROM 16 Words X4 bits clock Các thiết bị logic lập trình được (24 word) và 4 output như ở hình 1.17. Dùng gán nhị phân trực tiếp, ta có thể xây dựng bảng chuyển trạng thái (bảng 1.8b) cho trạng thái kế của các F/F như là hàm của trạng thái hiện tại và input. Vì ta đang dùng các D flipflop, D1=Q1+, D2=Q2+, và D3=Q3+. Bảng chân trị cho ROM ở bảng 1.8c, xây dựng được dễ dàng từ bảng chuyển trạng thái. Như vậy các output của ROM (Z,D1,D2,D3) là các hàm của các input của ROM (X,Q1,Q2,Q3). Ta có mạch kết quả ở hình 1.17. Bảng 1.8 c) Bảng chân trị X Q1 Q2 Q3 Z D1 D2 D3 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 X X X X 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 X X X X 1 1 1 1 X X X X 25 a) Bảng trạng thái Trạng thái hiện tại Trạng thái kế Giá trị ra hiện ra (Z) X = 0 1 X = 0 1 A B C 1 0 C E E 0 1 B D E 1 0 D H H 0 1 E H M 1 0 H A A 0 1 M A 1 -- b) Bảng chuyển trạng thái Q Q Q1 2 3 X = 0 X = 0 X = 1 A 001 010 1 0 C 100 100 0 1 B 011 100 1 0 D 101 101 0 1 E 101 110 1 0 H 000 000 0 1 M 000 1 -- Q Q Q1 2 3 + + + Z X = 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 Các thiết bị logic lập trình được 1.2 PLD TỔ HỢP (Combinational PLD) 1.2.1 Dãy logic lập trình được (PLA) PLA thực hiện cùng chức năng cơ bản như ROM. Một PLA với n input và m output (H.1.18) có thể cài đặt m hàm của n biến. Tổ chức nội của PLA thì khác với tổ chức ROM. Mảng các cổng AND Mảng các cổng OR m ngõ ra n ngõ vào inputs p số hạng tích Hình 1.18 Cấu trúc PLA (PLA n×m với p số hạng tích) Ví dụ: Tổ chức nội của PLA 3×2 với 4 số hạng tích: 1 2 3 4 AB AC BC ABC C C B B A A F1 F2 A B C 0 1 Hình 1.19 PLA với 3 ngõ vào, 4 số hạng tích và 2 ngõ ra 25 Chương 1 Bảng PLA của PLA ở trên: Ngõ vào Ngõ ra (T) (C) Số hạng tích A B C F1 F2 AB’ 1 1 0 — 1 — AC 2 1 — 1 1 1 BC 3 — 1 1 — 1 A’BC’ 4 0 1 0 1 — Mỗi hàng trong bảng PLA biểu diễn một số hạng tích tổng quát. Do đó zero, một hoặc nhiều hàng có thể được chọn bởi mỗi kết hợp các giá trị vào. Có hai loại PLA: PLA lập trình mặt nạ và PLA lập trình trường (field-programmable). - PLA lập trình được mặt nạ (mask-programmable) thì được lập trình lúc chế tạo ra (tương tự PROM). - PLA lập trình trường có các nối kết cầu chì (fusible link) có thể làm đứt để lưu trữ các mẫu trong các dãy AND và OR. Một FPLA (Field Programmable Logic Array) tiêu biểu có 16 input, 48 số hạng tích và 8 output. Chú ý: Khi số biến vào nhỏ, thì tổng quát là ROM kinh tế hơn dùng PLA. Tuy nhiên khi số biến vào lớn, PLA thường cho giải pháp kinh tế hơn ROM. Ví dụ: Để cài đặt 8 hàm theo 16 biến sẽ cần ROM có 65536 word (8 bit) → có thể dùng nhiều ROM nhỏ hơn. Nhưng với cùng chức năng như 8 hàm của 16 biến trên có thể cài đặt dùng một PLA miễn là tổng số các số hạng tích là nhỏ. Nếu cần nhiều số hạng hơn thì có thể OR lại các output của nhiều PLA. 26 Các thiết bị logic lập trình được ... ... A A B B A A B B. . . = 0 p + p + p + p ...1 2 3 4 p1 p2 p3 p4 ... A A B B p1 p2 p3 p4 ... không cầu chì cầu chì còn nguyên cầu chì còn nguyên cầu chì đứt cầu chì đứt Kết nối cố định ở nhà máy Kết nối lập trình được Biểu diễn được đơn giản hóa Kết nối bị đứt (sau khi lập trình) Biểu diễn được đơn giản hóa Cổng AND nhiều ngõ vào Không vẽ các điện trở kéo lên (pull-up) Cổng OR nhiều ngõ vào Không vẽ các điện trở kéo xuống (pull-down) Các số hạng vào Cầu chì còn nguyên X được đặt bên trong cổng AND cũng biểu diễn các cầu chì còn nguyên Cầu chì còn nguyên X được đặt bên trong cổng OR cũng biểu diễn các cầu chì còn nguyên Các số hạng vào Tất cả các cầu chì đứt 1 (Do các điện trở kéo lên) Các số hạng vào Tất cả các cầu chì đứt 0 (Do các điện trở kéo xuống) Hình 1.20 Quy ước một số ký hiệu kết nối trong PLD 1.2.2 Logic dãy lập trình được (PAL - Programmable Array Logic) PAL là trường hợp đặc biệt của PLA mà trong đó dãy AND lập trình được và dãy OR là cố định. Cấu trúc cơ bản của PAL thì giống như PLA ở hình 1-18. Bởi vì chỉ có dãy AND là lập trình được, do đó PAL ít mắc tiền hơn các PLA tổng quát hơn, và dễ lập trình PAL hơn. Vì lý do này, các nhà thiết kế logic thường sử dụng các PAL để thay thế các cổng logic khi phải cài đặt nhiều hàm. Xem hình 1.21 cho thấy một đoạn PAL. 27 Chương 1 F1 F4 F5 F8 l1 l2 Output Hình 1.21a Chưa lập trình l l l1 2 1 + l 2 , , l1 l2 Hình 1.21 Một đoạn PAL - b) Được lập trình Chú ý: Ngõ ra không đảo Ngõ ra đảo A B C ABC A B C ABC Phần lớn các nhà sản xuất PAL có chỉ ra thiết kế nội của PAL ở ký hiệu tên của nó. Ví dụ: PAL 16L8B4 Với 16 là số ngõ vào; L chỉ cấu trúc ra (tích cực thấp); 8 là số ngõ ra; B là tốc độ và 4 để chỉ tiêu tán công suất. - Với cấu trúc ra, ví dụ như: H: (high) chỉ ngõ ra tích cực cao (acitve high) 28 Các thiết bị logic lập trình được L: (low) chỉ ngõ ra tích cực thấp (active low) C: (complement) chỉ ngõ ra có cả hai đường tích cực cao và thấp. - Tốc độ: không có gì chỉ chuẩn; A - tốc độ cao; B - tốc độ rất cao; và D - tốc độ cực cao. - Tiêu tán công suất: để trống chỉ đầy đủ; 2 chỉ 1/2; 4 chỉ 1/4. OE CLK D Q Q OE CLK D Q Q VCC VCC Ngõ ra thanh ghi tích cực thấp Ngõ ra thanh ghi tích cực cao I/O tổ hợp tích cực thấp I /O tổ hợp tích cực cao Ngõ ra tổ hợp tích cực thấp Ngõ ra tổ hợp tích cực cao Hình 1.22 Ví dụ một số cấu trúc ngõ ra Ví dụ: 10H8, 12H6, 18L4, 20L2, 16C1, 20C1. Ví dụ: Ký hiệu logic truyền thống cho PAL 16L8. 29 Chương 1 Xem thêm sơ đồ logic của PAL14L4 VÀ PAL12H6 ở phần phụ lục. Khi thiết kế với PAL, ta phải đơn giản hóa các phương trình logic của ta và cố đưa chúng khớp vào 1 (hoặc nhiều) các PAL khả dụng, không giống như các PLA tổng quát hơn, các số hạng AND không thể chia sẻ cho hai hay nhiều cổng OR. Với một kiểu PAL cho trước, số số hạng AND (tích) đưa vào mỗi cổng OR ra là cố định và bị giới hạn. Nếu số số hạng AND trong hàm được đơn giản là quá lớn thì có thể chọn PAL có nhiều ngõ vào cổng hơn và ít ngõ ra hơn. Ví dụ: dùng PAL thiết kế mạch đổi 1 số nhị phân 4 bit sang số hex và xuất mã ASCII 7 bit cho số hex. Input W X Y Z 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 ... ... Số hex Mã ASCII cho số mã hex A6 A4A5 A3 A2 A0A1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 ... ... 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 W X Y Z A6 A5 A4 A3 A2 A1 A0 B a) b) PAL0 1 9 A F Hình 1.23 Bộ chuyển đổi nhị phân sang ASCII a) Bảng chân trị; b) Sơ đồ kết nối với PAL Chú ý: Vì A5 = A4 và A6 = A4' nên chỉ cần dùng PAL tạo ra 5 hàm của 4 biến (H.1.23b). Để viết được bảng PAL ta phải rút gọn các hàm ra. Bằng cách dùng các bảng Karnaugh ta có kết quả sau: A4 = W’ + X’Y’ (gom các ô 1 kế cận) A4’ = WX + WY (gom các ô 0 kế cận) A3 = WX’Y’ A3’ = W’ + X + Y A2 = W’X + XZ + XY A2’ = X’ + WY’Z’ A1 = WXY’Z’ + YZ + W’Y A1’ = W’Y’ + Y’Z + X’Y’ + WYZ’ A0 = W’Z + X’Y’Z + WXZ’ + WYZ’ 30 Các thiết bị logic lập trình được A0’ = W’Z’ + WYZ + WXZ + X’Y’Z’ Sau đó tìm các PAL thích hợp để cài đặt các hàm trên. Sau khi tìm kiếm ta chọn được PAL 12H6, có một ngõ ra không dùng. Ta có thể viết lại phương trình cho A2 như sau: A2 = W’X + (XZ + XY) = W’X + B với B = XZ + XY Rồi ta có thể sử dụng ngõ ra thêm để tạo ra B và nối B vào một trong các ngõ vào như được chỉ trong hình 1.23b. Với cách này, ta có thể tạo ra tất cả 5 hàm với một PAL không cần thêm logic khác. 1.2.3 Thiết kế hệ tuần tự dùng PLA Ta cũng có thể cài đặt các hệ tuần tự dùng PLA và các flipflop theo cách tương tự như dùng ROM và các flipflop. Tuy nhiên trong trường hợp các PLA, phép gán trạng thái có thể quan trọng vì sử dụng phép gán tốt có thể giảm được số các số hạng tích cần có và từ đó giảm được kích thước của PLA. Ví dụ: Xét cài đặt bảng trạng thái của bảng 1.8a (ở phần 1.1.6) dùng một PLA và D flipflop. Cấu hình mạch thì giống như hình 1.17, ngoại trừ là ta thay thế ROM bằng 1 PLA với kích thước thích hợp. Sử dụng phép gán nhị phân trực tiếp dẫn đến bảng chân trị được cho ở bảng 1.8c. Ta có thể chứa bảng này trong 1 PLA có 4 ngõ vào, 13 số hạng tích và 4 ngõ ra, nhưng nó sẽ không cho thuận lợi hơn so với giải pháp ROM đã bàn ở phần trước. Nếu sử dụng phép gán trạng thái ở hình 1.15, phương trình ra và các phương trình vào D flipflop được suy từ các bảng trong phần thiết kế không dùng ROM ở 1.16 là: D1 = Q1Q2’ + Q1’Q2 D2 = Q2’ D3 = Q2’Q3 + X’Q1Q2’ + XQ1’Q2’ + X’Q1’Q2Q3’ Z = X’Q3’ + XQ3 Bảng PLA tương ứng với các phương trình này ở bảng 1.9. Để cài đặt bảng này cần 1 PLA có 4 ngõ vào, 9 số hạng tích và 4 ngõ ra. Khi số ngõ vào nhỏ (như trong ví dụ này) tổng quát thì 31 Chương 1 giải pháp ROM kinh tế hơn giải pháp PLA; tuy nhiên khi số biến vào lớn, PLA lại tốt hơn. Bảng 1.9 X Q1 Q2 Q3 Z D1 D2 D3 - 1 0 - 0 1 0 0 - 0 1 - 0 1 0 0 - - 0 - 0 0 1 0 - - 0 1 0 0 0 1 0 1 0 - 0 0 0 1 1 0 0 - 0 0 0 1 0 0 1 0 0 0 0 1 0 - - 0 1 0 0 0 1 - - 1 1 0 0 0 Kế đến ta kiểm tra lại hoạt động của mạch, ban đầu giả sử rằng X = 0 và Q1Q2Q3 = 000. Giá trị này chọn các hàng - -0- và 0 - - 0 trong bảng 1.9, vì vậy Z=1 và D1D2D3 = 010. Nếu giá trị vào kế là X = 1 thì hàng -01- được chọn, vì vậy Z = 0 và D1D2D3 = 100. Sau xung nhịp, Q1Q2Q3 = 100. Theo cách này ta có thể kiểm tra lại theo bảng chuyển trạng thái ở hình 1.15. 1.2.4 Thiết kế hệ tuần tự dùng PAL Dùng các PAL tổ hợp, cách thiết kế tương tự như với PLA nhưng phải chú ý rút gọn hàm ra. 1.3 PLD TUẦN TỰ (sequential PLD) Phần lớn các thiết kế số cần các flipflop, do đó người ta thiết kế thêm các PLD có chứa các flipflop. Các PLD như vậy thường được gọi là PLD có thanh ghi (registered PLD) hay PLD tuần tự (sequential PLD), thường thì thanh ghi được ra từ các D flipflop. Hình 1.24 cho thấy một đoạn của PAL tuần tự. D flipflop được lái từ một cổng OR mà cổng này có hai ngõ vào lấy từ cổng AND. Ngõ ra flipflop được đưa hồi tiếp về dãy AND có thể được nối vào A, A’, B, B’, Q hay Q’. Các dấu X trên sơ đồ chỉ sự cài đặt phương trình trạng thái kế: Q+ = D = A’BQ’ + AB’Q 32 Các thiết bị logic lập trình được Ngõ ra flipflop được nối vào một bộ đệm đảo ba trạng thái mà được cho phép khi EN = 1. ClockA A’ B B’ Q’ Q A B D Q Q’ EN Bộ đệm ra đảo 3 trạng thái Mảng AND lậrp trình được Q’ Q Hình 1.24 Một đoạn của PAL tuần tự Với cổng đảo ba trạng thái như sau: C X Y X Y C X Y C 0 0 0 1 1 0 1 1 Hi-Z 1 0 Hi-Z Output disabled Hình 1.25 Cổng đảo ba trạng thái Bảng 1.10 chỉ các đặc tính của một số PAL tuần tự thông dụng. Mỗi PAL này chứa một thanh ghi có từ 4 đến 10D flipflop. 6 PAL đầu trong bảng tương tự với 16R4 (16R4 có một dãy cổng AND với 16 ngõ vào, và có 4D flipflop). Bảng 1.10 Đặc tính của các PAL tuần tự Kiểu Số ngõ vào (trực tiếp + hồi tiếp +I/O) Số ngõ vào (flip-flop +I/O) Số cổng AND trên cổng OR 16R4 8 + 4 + 4 4 + 4 8 16R6 8 + 6 +2 6 + 2 8 16R8 8 + 8 + 0 8 + 0 8 20R4 12 + 4 + 4 4 + 4 8 20R6 12 + 6 + 2 6 + 2 8 20R8 12 + 8 + 0 8 + 0 8 20X4 10 + 4 + 6 4 + 6 3/2* 33 Chương 1 20X8 10 + 8 + 2 8 + 2 3/2 20X10 10 + 10 + 0 10 + 0 -/2 Ghi chu ù: *3 với các ngõ ra tổ hợp, 2 cho các ngõ vào D flipflop. Ba PAL cuối trong bảng 1.10 chỉ các “XOR PAL”. XOR PAL có một cổng XOR lái mỗi ngõ vào D flipflop như ở hình 1.26. Trong các PAL này, mỗi cổng XOR được lái bằng hai cổng OR và mỗi cổng OR được lái bằng hai cổng AND. Các ngõ ra flipflop có thể được hồi tiếp về các ngõ vào của cổgn AND như trong các PAL có thanh ghi khác. Dạng tổng quát của phương trình trạng thái kế cho mỗi flipflop trong XOR PAL là: Q+ = D = ( P1 + P2) ⊕ (P3 + P4) CLK EN D Q Q’ P1 P2 P3 P4 Hình 1.26 Một đoạn của XOR PAL Để minh họa sử dụng các XOR PAL, ta sẽ thiết kế một bộ đếm nhị phân 4 bit đếm lên/đếm xuống với ba ngõ vào điều khiển: U, D, và L (U = Up = đếm lên; D = Down = đếm xuống; L = Load = nạp). Khi U = 1, bộ đếm được tăng thêm 1, khi D=1 bộ đếm bị giảm đi 1, và khi L = 1 bộ đếm được nạp dữ liệu song song từ các ngõ vào dữ liệu của nó (Di). 34 Các thiết bị logic lập trình được Bảng 1.11 chỉ các trạng thái kế của bộ đếm cho U = 1 và cho D = 1. Ta sẽ giả sử rằng U = D = 1 không xảy ra. Bảng 1.11 Bộ đếm lên/đếm xuống Q3 Q2 Q1 Q0 Q3 + U = 1 Q2 + Q1 + Q0 + Q3 + D = 1 Q2 + Q1 + Q0 + 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 Trước hết ta sẽ suy ra các phương trình trạng thái kế cho bộ đếm lên. Bộ đếm này sẽ tăng thêm 1 mỗi lần có xung nhịp khi U = 1, và nó sẽ giữ nguyên trạng thái khi U = 0. Trong mọi hàng Q0 ≠ Q0+, vì vậy flipflop Q0 phải thay đổi trạng thái ở mọi xung nhịp khi U = 1. Vì lẽ đó: +0Q = Q0 ⊕ U Ta nhận thấy Q1 thay đổi (nghĩa là Q1 ≠ +1Q ) chỉ nếu Q0 = 1. Do đó 35 Chương 1 + 1Q = Q1 ⊕ UQ0 Q2 thay đổi chỉ trong các hàng 3 (0011), 7, 11 và 15; chỉ khi Q1 = Q0 = 1. Do đó + 2Q = Q2 ⊕ UQ1Q0 Cuối cùng Q3 thay đổi trạng thái chỉ trong những hàng mà Q2 = Q1 = Q0 = 1; do đó: 01233 QQUQQQ ⊕= + Tương tự, bằng cách quan sát bảng 1.11, ta có thể suy ra các phương trình cho bộ đếm xuống mà giảm đi 1 ở mỗi xung nhịp khi D = 1: ;00 DQQ ⊕= + ;,011 DQQQ ⊕= + ;,0 , 122 QDQQQ ⊕= + ;,0 , 1 , 233 QQDQQQ ⊕= + Chú ý, Q1 thay đổi trạng thái chỉ khi Q0 = 0; Q2 thay đổi trạng thái chỉ khi Q1 = Q0 = 0... Tổng quát, để sử dụng “XOR PAL”, ta phải biểu diễn trạng thái kế của Qi ở dạng +iQ = Qi ⊕ Fi như trong các phương trình ở trên. Người ta tìm các Fi bằng phương pháp quan sát hoặc rút gọn bằng bảng Karnaugh. Tiếp tục thiết kế bộ đếm lên-xuống với các ngõ vào điều khiển U, D và L. Trước hết xét trường hợp khi U = D = 0. Khi L = 1, bộ đếm được nạp song song từ các ngõ vào dữ liệu của nó (Di), và khi L = 0, trạng thái bộ đếm giữ không đổi. Như vậy phương trình trạng thái kế cho mỗi flipflop là + iQ = LDi + L’Qi (i = 0,1,2,3) Ta sẽ kết hợp các phương trình khi xét cả U, D và L, giả sử là L = 1 ảnh hưởng trên cả U = 1 hay D = 1, và U = D = 1 không bao giờ xảy ra. Nếu ta bắt đầu bằng phương trình +0Q = Q0 ⊕ U, thay Q0 bằng LD0 + L’Q0 và thay U bằng (U + D), ta được +0Q = (LD0 + L’Q0) ⊕ (UL’ + DL’). Phương trình này cho kết quả đúng khi L = 0 và U hoặc D là 1. Để bảo đảm L = 1 ảnh hưởng ưu tiên hơn đếm 36 Các thiết bị logic lập trình được lên hay xuống, ta phải nhân U và D cho L’, các phương trình còn lại cũng làm tương tự, ta có: = + 0Q (LD0 + L’Q0) ⊕ (UL’ + DL’) = + 1Q (LD1 + L’Q1) ⊕ (UL’Q0 + DL’Q0’) = + 2Q (LD2 + L’Q2) ⊕ (UL’Q0Q1 + DL’Q0’Q1’) = + 3Q (LD3 + L’Q3) ⊕ (UL’Q0Q1Q2 + DL’Q0’Q1’Q2’) Khi L = D = 0, các phương trình này rút gọn về trường hợp chỉ đếm lên, và khi L = U = 0, các phương trình rút gọn về trường hợp chỉ đếm xuống. Các phương trình tổng hợp ở trên thích hợp để cài đặt bằng các XOR PAL. 1.4 CÁC PLD TUẦN TỰ KHÁC Khi công nghệ IC đã được cải tiến, nhiều loại PLD khác ra đời. Các PLD mới dựa trên những mở rộng của khái niệm PAL hoặc dựa trên các dãy cổng. 22V10 là 1 PLD rất linh hoạt mà có thể dùng nó để cài đặt các mạng tổ hợp và tuần tự (V = versatile = linh hoạt/linh động). Nó có 12 chân dành riêng cho nhập và 10 chân có thể lập trình hoặc làm ngõ vào hoặc ngõ ra. Nó chứa 10D flipflop và cổng OR. Số cổng AND đưa vào mỗi cổng OR từ 8 đến 16. Mỗi cổng OR lái một “tế bào vĩ môlogic xuất” (output logic macrocell). Mỗi macrocell (tế bào vĩ mô) chứa 1D flipflop. Các flipflop có cùng xung nhịp, một ngõ vào reset chung bất đồng bộ AR (Asynchronous Reset) và một ngõ vào đặt trước chung đồng bộ SP (Synchronous Preset). Hình 1.28 cho thấy chi tiết của 1 macrocell xuất của 22V10. Các kết nối đến các chân ra có thể điều khiển được bằng cách lập 37 Chương 1 trình macrocell này. Các ngõ vào điều khiển MUX xuất S1 và S0 chọn 1 trong các ngõ vào dữ liệu. Ví dụ: S1S0 = 10 chọn ngõ vào dữ liệu 2. Khi cầu chì F1 đứt (S1 = 1), flipflop bị bỏ qua và ngõ ra từ cổng OR. Ngõ ra cổng OR cũng được hồi tiếp về để có thể dùng như một ngõ vào của dãy cổng AND. 38 Các thiết bị logic lập trình được 1 C LK /l o R es et 8 O ut pu t M ac ro Lo gi c C el l I/O 0 10 O ut pu t M ac ro Lo gi c C el l I/O 1 12 O ut pu t M ac ro Lo gi c C el l I/O 2 14 O ut pu t M ac ro Lo gi c C el l I/O 3 16 O ut pu t M ac ro Lo gi c C el l I/O 4 16 O ut pu t M ac ro Lo gi c C el l I/O 5 14 O ut pu t M ac ro Lo gi c C el l I/O 6 12 O ut pu t M ac ro Lo gi c C el l I/O 7 10 O ut pu t M ac ro Lo gi c C el l I/O 8 8 O ut pu t M ac ro Lo gi c C el l I/O 9 11 l 1 -l 11 P re se t P ro gr am m ab le A N D A rr ay (4 4 13 2) × Hình 1.27 Sơ đồ khối của 22V10 39 Chương 1 2 3 MUX chọn ngõ ra 1 S1 S0 Kết nối lập trình được D Q Q AR SP CK 0 MUX 1S1 0 I/On 2 3 1 S1 S0 D Q Q AR SP CK 0 MUX 1S1 0 I/On a) b) MUX chọn ngõ ra Hình 1.28 Macrocell xuất a) Các cầu chì còn nguyên (S1 = S0 = 0); b) Các cầu chì đứt (S1 = S0 = 1) Nếu F1 còn nguyên (S1 = 0), thì ngõ ra flipflop được nối vào chân ngõ ra và nó cũng được hồi tiếp về để có thể dùng nó làm ngõ vào cổng AND. Khi cầu chì F0 cho đứt (nổ) (S0 = 1), ngõ ra không bị đảo để nó tác động mức cao. Khi F0 còn nguyên (S0 = 0), ngõ ra bị đảo nên nó tác động mức thấp. Chân ngõ ra được lái bằng một bộ đệm đảo ba trạng thái. Khi ngõ ra bộ đệm ở trạng thái tổng trở cao, cổng OR và flipflop không nối với chân ngõ ra (xuất) và chân này có thể dùng làm ngõ vào. Các đường đứt nét ở hình 40 Các thiết bị logic lập trình được 1.24a chỉ đường đi qua macrocell xuất khi cả hai cầu chì còn nguyên, và các đường đứt nét ở hình 1.24b chỉ đường đi khi cả hai cầu chì đứt. Chú ý là ở trường hợp thứ nhất, ngõ ra Q của flipflop bị đảo bởi bộ đệm ngõ ra, và trường hợp thứ hai, ngõ ra cổng OR bị đảo hai lần do đó không có đảo. Ví dụ: Dùng 22V10 để thiết kế bộ điều khiển đèn giao thông cho giao lộ của đường A và đường B. Mỗi đường có các cảm biến để phát hiện sự xuất hiện xe cộ đến gần hoặc dừng ở giao lộ. Sa = 1 nghĩa là xe cộ đang tiến đến đường A, và Sb = 1 nghĩa là xe cộ đang tiến đến đường B. Đường A là đường chính và sẽ có đèn xanh cho đến khi có một xe hơi chạy đến B. Rồi đèn thay đổi và B có đèn xanh. Vừa hết 50 giây, các đèn sẽ thay đổi về như cũ trừ khi có một xe trên đường B và không có xe ở A, trong trường hợp này chu kỳ B được mở rộng thêm 10 giây. Khi A xanh, nó giữ xanh tối thiểu 60 giây, và rồi các đèn thay đổi chỉ khi xe tiến đến B. Hình 1.29 chỉ các nối kết bên ngoài của bộ điều khiển. Có ba ngõ ra (Ga, Ya, và Ra) lái các đèn xanh, vàng và đỏ ở đường A. Ba đường khác (Gb, Yb, và Rb) lái các đèn xanh, vàng và đỏ tương ứng ở đường B. Clock PAL22V10 Ga Ya Ra Gb Yb Rb Ga Sb Hình 1.29 Sơ đồ khối của bộ điều khiển đèn giao thông Hình 1.30 chỉ giản đồ trạng thái Moore của bộ điều khiển. Vì mục đích định thì, hệ tuần tự này được lái bằng xung nhịp có chu kỳ 10 giây. Như vậy sự thay đổi trạng thái có thể xảy ra hầu như ở mọi 10 giây. Để đơn giản hóa giản đồ, ta dùng ký hiệu sau: GaRb trong một trạng thái có nghĩa là Ga = Rb = 1 và tất cả các 41 Chương 1 biến ra khác là 0. Sa’Sb ở 1 cung có nghĩa là Sa = 0 và Sb = 1 sẽ gây ra chuyển trạng thái theo cung đó khi có xung nhịp. Một cung không có nhãn có nghĩa là chuyển trạng thái sẽ xảy ra khi có xung nhịp xảy ra, độc lập với các biến vào. Như vậy đèn A xanh sẽ sáng trong 6 chu kỳ xung nhịp (60 giây) và đổi sang vàng nếu có một xe đang đợi ở đường B. S0 GaRb S1 GaRb S2 GaRb S3 GaRb S4 GaRb S5 GaRb Sb’ S11 RaGb S10 RaGb S9 RaGb S8 RaGb S7 RaGb S12 GaYb S6 YaRb Sa’Sb (Sa + Sb’) Sb Hình 1.30 Giản đồ trạng thái của bộ điều khiển đèn giao thông. Bảng 1.12 Bảng trạng thái của bộ điều khiển đèn giao thông SaSb 00 01 10 11 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S1 S2 S3 S4 S5 S5 S7 S8 S9 S10 S11 S12 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S0 S1 S2 S3 S4 S5 S5 S7 S8 S9 S10 S11 S12 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S0 1 1 1 1 1 1 0 0 0 0 0 0 0 Ga Ya Ra Gb Yb Rb 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 {Ra, Yb} {Ra, Gb} {Ya, Rb} {Green A, Red B} 42 Các thiết bị logic lập trình được Bảng 1.12 cho ta thấy bảng trạng thái của bộ điều khiển. Ta sẽ cài đặt bảng dùng 4D flipflop với các ngõ vào D1, D2, D3, D4 và các ngõ ra Q1, Q2, Q3, Q4. Dùng phép gán trạng thái nhị phân trực tiếp, ta suy ra được các phương trình sau: D1 = Q1Q2’ + Q2Q3Q4 D2 = Q1’Q2’Q3Q4 + SaQ1Q3Q4 + Sb’Q1Q3Q4 + Q1’Q2Q4’ + Q1’Q2Q3’ D3 = Q3Q4’ + SbQ3’Q4 + Sa’Q3’Q4 + Q2’Q3’Q4 + Sa’SbQ1Q4 D4 = Sa’SbQ1Q3 + Q2’Q4’ + Q1’Q4’ + SaSb’Q2Q3’Q4 Ga = Q1’Q3’ + Q1’Q2’ Ya = Q2Q3Q4’ Ra = Q1 + Q2Q3Q4 Gb = Q1Q2’ + Q2Q3Q4 Yb = Q1Q2 Rb = Q1’Q2’ + Q1Q4’ + Q1’Q3’ Vì tất cả các phương trình này có ít hơn 8 số hạng AND, ta dễ dàng sử dụng 22V10 cho thiết kế này. Nếu một số phương trình có quá nhiều số hạng mà không khớp với 22V10 thì sẽ cần thử các phép gán trạng thái khác. Nếu cài đặt bộ điều khiển dùng các JK flipflop và các cổng, 4 flipflop và 34 cổng sẽ cần cho gán trạng thái nhị phân trực tiếp. Các flipflop và các cổng này cần khoảng 11 IC loại SSI, so với giải pháp 22V10 chỉ cần một IC thì nhỏ hơn, tiết kiệm năng lượng hơn và tin cậy hơn. 1.5 CPLD VÀ FPGA 1.5.1 CPLD (Complex PLD - Thiết bị logic lập-trình-được phức tạp) Các thiết bị PLA và PAL hữu dụng để cài đặt nhiều mạch số nhỏ. Mỗi thiết bị có thể được dùng để cài đặt các mạch mà không phải có thêm chip nào cả. Tuy nhiên các chip này bị giới hạn bởi kích thước của nó (thường tổng số ngõ vào và ra không quá 32). Như vậy để cài đặt những mạch cần nhiều ngõ vào và nhiều ngõ ra 43 Chương 1 thì người ta có thể dùng nhiều PLA (hay PAL) hoặc sử dụng loại chip mạnh hơn được gọi là CPLD có nhiều ngõ vào và nhiều ngõ ra. Khối giống PAL Các đường nối kết Khối giống PAL K hối /O I K hối /O I Khối giống PAL Khối giống PAL K ho ái /OI K ho ái /OI Hình 1.31 Cấu trúc của một CPLD Một CPLD gồm nhiều khối mạch trên một chip với các khối nối dây bên trong kết nối với các khối mạch. Mỗi khối mạch tương tự với một PLA hay PAL; ta sẽ gọi các khối này là các khối giống PAL (PAL - like blocks). Ví dụ của một CPLD được cho ở hình 1.31. Nó gồm có 4 khối giống PAL được nối vào tập các dây kết nối (interconnection wires). Mỗi khối giống PAL cũng được nối vào một mạch nhỏ gọi là khối nhập/xuất (I/O block). Hình 1.32 cho thấy ví dụ về cấu trúc nối dây và các kết nối với một khối giống PAL trong một CPLD. Khối giống PAL gồm ba macrocell (các CPLD thật tiêu biểu có khoảng 16 macrocell trong một khối giống PAL), mỗi macrocell gồm có một cổng OR 4 ngõ vào (CPLD thật thường cung cấp 5 đến 20 ngõ vào cho cổng OR). Ngõ ra cổng OR được nối vào cổng logic khác (cổng XOR). Flipflop 44 Các thiết bị logic lập trình được dùng để lưu trữ giá trị ra được tạo bởi cổng OR. Mỗi bộ đệm ba trạng thái được nối vào một chân của gói CPLD. D Q D Q D Q Khối giống PAL Khối giống PAL Hình 1.32 Một phần của CPLD trong hình 1.31 Các CPLD thương mại có kích thước từ chỉ hai khối giống PAL đến 100 khối giống PAL. Một khi CPLD được lập trình (qua programmer hoặc máy tính thông qua JTAG) thì nó sẽ giữ trạng thái được lập trình đó ngay cả khi không mất nguồn. Tính chất này được gọi là lập trình nonvolatile. Ví dụ, CPLD của altera là MAX7000, 8000; của xilinx là XC9500... 45 Chương 1 Hình 1.33 cho thấy cấu trúc của một macrocell của Altera MAX7000, khối PIA là mảng kết nối khả lập trình (Programmable Interconnect Array). PIA Ma trận chọn số hạng tích Set Xung nhịp mảng Kết nối khối mảng logic cục bộ Xóa chung đến PIA S D Q R State Xung nhịp chung Các ngõ vào từ những macrocells khác trong khối mảng logic Hình 1.33 Một macrocell của Altera MAX7000 1.5.2 FPGA (Field-Programmable Gate Array - Mảng cổng lập trình được theo miền) Để tính toán mức độ tích hợp người ta thường dùng đơn vị cổng tương đương (nghĩa là cổng NAND hai ngõ vào), khi đó CPLD có mỗi macrocell biểu diễn khoảng 20 cổng tương đương và một PAL tiêu biểu với 8 macrocell có thể dùng để thực hiện mạch cần có 160 cổng. Với CPLD có 1000 macrocell có thể cài đặt các mạch lên đến khoảng 20.000 cổng tương đương. Theo các tiêu chuẩn hiện đại thì một mạch logic với 20 000 cổng thì không lớn. Để cài đặt các mạch lớn hơn người ta thường dùng một loại chip khác có dung lượng logic lớn hơn, đó là FPGA. Các FPGA khác hoàn toàn với các CPLD vì FPGA không chứa các mặt phẳng AND và OR, mà FPGA cung cấp các khối logic (logic block = CLB) để cài đặt các hàm mong muốn. Cấu trúc tổng quát 46 Các thiết bị logic lập trình được của FPGA được minh họa trong hình 2.22. Nó chứa ba loại tài nguyên chính: các khối logic, các khối I/O để nối với các chân của package, và những dây nối và các khóa. Khối /O I Khối /O I K hối /O I K ho ái /O I Hình 1.34 Cấu trúc tổng quát của một FPGA Các khối logic được sắp xếp theo mảng hai chiều, và các dây nối được tổ chức thành các kênh dẫn (routing channels) dọc và ngang giữa các hàng và cột của các khối logic. Những kênh dẫn chứa các dây dẫn và các khóa lập trình được cho phép nối kết các khối logic theo nhiều cách. Các FPGA có thể được dùng để cài đặt các mạch logic có hơn vài trăm ngàn cổng tương đương. Ví dụ với Altera có FLEX 10K và xilinx có XC4000. Mỗi khối logic trong FPGA tiêu biểu có một số nhỏ các ngõ vào và một ngõ ra. Có nhiều loại khối logic. Khối logic thường được sử dụng nhiều là bảng tra LUT (lookup table), nó chứa các tế bào lưu trữ (storage cell) dùng để cài đặt các hàm logic nhỏ. Mỗi tế bào có khả năng giữ một giá trị logic 0 hay 1. Giá trị lưu trữ để 47 Chương 1 tạo ra giá trị ra của tế bào lưu trữ. Người ta có thể tạo ra các LUT có nhiều kích cỡ, mà cỡ của nó được định nghĩa bằng số ngõ vào. Hình 1.35a cho thấy cấu trúc của LUT nhỏ, nó có hai ngõ vào x1 và x2 và một ngõ ra f. Nó có thể được dùng cài đặt bất cứ một hàm 2 biến nào. Bởi vì một bảng chân trị 2 biến có 4 hàng và LUT này có 4 tế bào lưu trữ. Một cell tương ứng với giá trị ra của mỗi hàng của bảng chân trị. Hai biến vào x1 và x2 được dùng làm các ngõ vào cho của ba bộ dồn kênh mà phụ thuộc vào việc định giá trị x1 và x2, chọn nội dung của một trong 4 cell lưu trữ làm giá trị ra của LUT. x1 x2 0/1 0/1 0/1 0/1 f x1 x2 f1 0 0 1 0 0 0 1 1 0 1 1 1 x1 x2 1 0 0 1 f1 a) b) c) Hình 1.35 LUT hai ngõ vào a) Mạch LUT hai ngõ vào; b) f1 = x1’x2’ + x1x2; c) Các nội dung cell x1 x2 x3 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 f Hình 1.36 LUT ba ngõ vào Một ví dụ khác về LUT cho ở hình 1.36 là LUT ba ngõ vào. Thực tế thì các FPGA còn có các mạch thêm kết hợp với ngõ ra của 48 Các thiết bị logic lập trình được LUT để tăng tính năng mạch, ví dụ như trong hình 1.36 cho thấy người ta thêm fliflop vào khối logic FPGA, fliflop này dùng để lưu trữ giá trị ngõ vào D của nó dưới điều khiển của ngõ vào clock. Với mạch logic được thực hiện bằng FPGA thì mỗi mạch logic trong mạch này phải đủ nhỏ để vừa khớp trong một khối logic. Thực tế thì mạch của người sử dụng được tự động chuyển sang dạng được yêu cầu bằng các công cụ CAD. Flip-flop D Q Clock LUT ln1 ln2 ln3 Chọn Xuất Hình 1.37 Thêm fliflop vào khối logic FPGA Khi cài đặt mạch bằng FPGA thì các khối logic được lập trình để thực hiện các hàm cần thiết và các kênh dẫn được lập trình để thực hiện kết nối cần thiết giữa các khối logic. Các tế bào lưu trữ trong FPGA là volatile (bốc hơi), có nghĩa là chúng mất nội dung lưu trữ của chúng khi mất nguồn điện. Do đó FPGA phải được lập trình lại mỗi khi cấp nguồn điện. Thường người ta sẽ dùng một chip bộ nhớ nhỏ để lưu trữ dữ liệu thường xuyên (dạng nonvolatile như PROM) gắn chung với mạch sử dụng FPGA. Các tế bào lưu trữ sẽ được nạp tự động từ PROM khi có nguồn điện đưa vào chip. Một FPGA nhỏ đã được lập trình để cài đặt các mạch được mô tả trong hình 2.26. FPGA có hai LUT hai ngõ vào và có 4 dây dẫn trong mỗi kênh dẫn. Các khóa nối dây lập-trình-được được chỉ bởi X. 49 Chương 1 Các bảng chân trị được lập trình vào các khối logic trong hàng phía trên của FPGA tương ứng với các hàm f1 = x1x2 và f2 = x2’x3. Khối logic bên dưới phía tay phải của hình vẽ được lập trình để tạo ra f = f1 + f2 = x1x2 + x2’x3. x3 x1 x2 x1 x2 f2 0 0 0 1 x3 x2 f2 0 1 0 0 f2 f1 f 0 1 1 1 f Hình 1.38 Một phần của FPGA được lập trình 50 Các thiết bị logic lập trình được S D Q Q2 C1 C2 C3C4 CFBBộ chọn State E R State S D Q E R G Q2 F G1 G2 G3 G4 F1 F2 F3 F4 Bảng tra cứu Bảng tra cứu Bảng tra cứu Hình 1.39 Ví dụ khối logic (CLB) của xilinx XC4000 1.5.3 Chọn lựa giữa CPLD và FPGA Việc chọn lựa CPLD hay FPGA sẽ phụ thuộc vào đặc tính và yêu cầu của thiết kế. Tóm tắt của đặc tính CPLD và FPGA được cho trong bảng 1.13. Bảng 1.13 CPLD và FPGA CPLD FPGA Kiến trúc Giống PAL Giống mảng cổng Mật độ tích hợp Thấp đến trung bình (12 x 22V10 hoặc hơn) Trung bình đến cao (đến 1 triệu cổng hoặc hơn) Tốc độ Nhanh, đoán trước được Tùy theo ứng dụng Kết nối Crossbar Routing Tiêu tán công suất Cao Trung bình 51

Các file đính kèm theo tài liệu này:

  • pdftailieu.pdf