• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Thứ Bảy, 22 tháng 7, 2017

[Verilog] Làm thế nào để mô tả mạch tổ hợp bằng ngôn ngữ Verilog

Nội dung bài này hướng dẫn các cách mô tả mạch tổ hợp bằng ngôn ngữ mô tả phần cứng Verilog. Mạch dùng để minh họa là bộ mã hóa ưu tiên 8 bit trong chip MC14532B của hãng ON Semiconductor.

1. Phân tích cấu trúc mạch mã hóa ưu tiên 8 bit của MC14532B

Chip mã hóa ưu tiên 8 bit là một chip số có sơ đồ chân chip và bảng sự thật của chip mã hóa ưu tiên như hình 1.

Hình 1. Sơ đồ chân và bảng sự thật của chip mã hóa ưu tiên 8 bit
Trong đó:
  • Ein (Input Enable) là tín hiệu cho phép các ngõ vào D0 đến D7 hoạt động
    • Ein = 0 thì D0 đến D7 không tác động đến ngõ ra. Tất cả các ngõ ra là 0
    • Ein = 1 thì D0 đến D7 tác động đến ngõ ra với thứ tự ưu tiên từ D7 đến D0
  • GS (Group Select) là ngõ ra sẽ tích cực mức 1 khi Ein=1 và một trong các ngõ vào từ D0 đến D7 bằng 1.
  • Q0 đến Q2 thể hiện giá trị của ngõ vào đang tích cực và có mức ưu tiên cao nhất. Ví dụ: D6=1 và D3=1 thì Q2,Q1,Q0=110 vì D7 có mức ưu tiên cao hơn D3
  • Eout (Output Enable)
    • Eout=1 khi Ein=1 và không có ngõ vào nào từ D0 đến D7 tích cực
    • Eout=0 trong tất cả các trường hợp khác
Hình 2 minh họa dạng sóng khi hoạt động của bộ mã hóa ưu tiên 8 bit MC14532B. Bỏ qua các ký hiệu định thời (timing) trong hình 2, bạn đọc sẽ hình dung rõ về đáp ứng của các ngõ ra theo các giá trị ngõ vào.

Hình 2. Dạng sóng (waveform) của MC14532B
Mạch nguyên lý của bộ mã hóa ưu tiên này có thể được thể hiện bằng nhiều dạng khác nhau. Hình 3 là một dạng mạch nguyên lý cho chức năng của bộ mã hóa ưu tiên 8 bit trong chip MC14532B.

Hình 3. Mạch nguyên lý của MC14532B

Từ bảng sự thật, áp dụng phương pháp tổng các tích SOP (Sum of Product) có thể tìm được biểu thức rút gọn của từng tín hiệu (chân) ngõ ra theo các ngõ vào. SOP là lấy tổng (ký hiệu là "+") của các tổ hợp tích (ký hiệu là ".") ngõ vào. Chú ý, dấu "/" là ký hiệu "bù" hoặc "đảo".

Biểu thức GS:

GS = Ein.D7 + Ein./D7.D6 + Ein./D7./D6.D5 + Ein./D7./D6./D5.D4 + Ein./D7./D6./D5./D4.D3 + Ein./D7./D6./D5./D4./D3.D2 + Ein./D7./D6./D5./D4./D3./D2.D1 + Ein./D7./D6./D5./D4./D3./D2./D1.D0

Đặt Ein làm nhân tử chung và áp dụng quy tắc A +/A.B = A + B, biểu thức GS được rút gọn thành:

GS = Ein.(D7+D6+D5+D4+D3+D2+D1+D0)

Biểu thức Q2:

Q2 = Ein.D7 + Ein./D7.D6 + Ein./D7./D6.D5 + Ein./D7./D6./D5.D4

Rút gọn thành:

Q2 = Ein(D7+D6+D5+D4)

Biểu thức Q1:

Q1 = Ein.D7 + Ein./D7.D6 + Ein./D7./D6./D5./D4.D3 + Ein./D7./D6./D5./D4./D3.D2

Rút gọn thành:

Q1 = Ein(D7+D6+/D5./D4.D3+/D5./D4.D2)

Biểu thức Q0:

Q0 = Ein.D7 + Ein./D7./D6.D5 + Ein./D7./D6./D5./D4.D3 + Ein./D7./D6./D5./D4./D3./D2.D1

Rút gọn thành:
Q0 = Ein.(D7 + /D6.D5 + /D6./D4.D3 + /D6./D4./D2.D1)

Biểu thức Eout:

Eout = Ein./D7./D6./D5./D4./D3./D2./D1./D0

Trong datasheet của MC14532B cũng đưa ra mạch thực tế của chip này như hình 4.
Hình 4. Sơ đồ mạch thực tế của MC14532B
2. Mô tả mạch mã hóa ưu tiên 8 bit bằng Verilog

2.1 Mô tả một module

Tất cả các chức năng của MC14532B như đã trình bày sẽ được mô tả trong một module, hoặc gọi là một block, như sau:

module MC14532B (Ein, D, GS, Q, Eout);
//Input
input   Ein;
input   [7:0] D;
//Output
output       GS;
output [2:0] Q;
output       Eout;
      //Output Type
//Module body

endmodule

Việc dùng ngôn ngữ Verilog mô tả chức năng của MC14532B và đặt ở phần thân module (module body) sẽ được thực hiện thông qua mạch nguyên lý, biểu thức các ngõ ra và sơ đồ mạch thực tế đã trình bày ở phần trên.

Lưu ý, phần mô tả kiểu dữ liệu ngõ ra (output type) sẽ tùy vào việc sử dụng phát biểu nào để mô tả tín hiệu mà khai báo thích hợp.

2.2 Mô tả thân module theo hình 3

//Output type
wire       GS;
wire [2:0] Q;
wire       Eout;
//Module body
assign GS   = Ein? (|D[7:0]): 0;
assign Eout = Ein & ~|D[7:0];
assign Q[2:0] = Ein? (D[7]? 3'b111
                : (D[6]? 3'b110
: (D[5]? 3'b101
: (D[4]? 3'b100
: (D[3]? 3'b011
: (D[2]? 3'b010
: (D[1]? 3'b001
: 3'b000)))))))
                : 3'b000;
Hoặc như sau (chú ý kiểu dữ liệu của Q[2:0] có thay đổi):

//Output type
wire GS;
reg [2:0] Q;
wire Eout;
//Module body
assign GS = Ein? (|D[7:0]): 0;
assign Eout = Ein & ~|D[7:0];
always @ (*) begin
if (Ein) begin
casez (D[7:0])
8'b1???????: Q[2:0] = 3'b111;
8'b01??????: Q[2:0] = 3'b110;
8'b001?????: Q[2:0] = 3'b101;
8'b0001????: Q[2:0] = 3'b100;
8'b00001???: Q[2:0] = 3'b011;
8'b000001??: Q[2:0] = 3'b010;
8'b0000001?: Q[2:0] = 3'b001;
default: Q[2:0] = 3'b000;
endcase
end
else begin
Q[2:0] = 3'b000;
end 
end
2.2 Mô tả thân module theo các biểu thức ngõ ra

//Output type
wire       GS;
wire [2:0] Q;
wire       Eout;
//Module body
assign GS   = Ein & (|D[7:0]);
assign Q[2] = Ein & (|D[7:4]);
assign Q[1] = Ein & (|D[7:6] | (~D[5] & ~D[4] & D[3]) | (~D[5] & ~D[4] & D[2]));
assign Q[0] = Ein & (D[7] | (~D[6] & D[5]) | (~D[6] & ~D[4] & D[3]) | (~D[6] & ~D[4] & ~D[2] & D[1]));
assign Eout = Ein & ~D[7] & ~D[6] & ~D[5] & ~D[4] & ~D[3] & ~D[2] & ~D[1] & ~D[0];
2.3 Mô tả thân module như mạch hình 4

(Phần này dành cho bạn đọc tự thực hiện)

2.4 Sự tương ứng giữa RTL code và mạch nguyên lý

Các hình sau đây minh họa sự tương ứng giữa RTL code và mạch nguyên lý. Nó sẽ giúp bạn hình dung ra mỗi dòng RTL code sẽ tương đương việc mô tả phần mạch nào. Mục này tôi chỉ minh họa cho hình 3.







2.5 Nhận xét

Tất cả các cách mô tả theo mạch nguyên lý hình 3, biểu thức các ngõ ra hay mạch hình 4 đều thực hiện được đúng chức năng của bộ mã hóa ưu tiên 8 bit như mong muốn. Việc lựa chọn cách mô tả nào cho đơn giản và dễ thực hiện là tùy bạn quyết định.


[Basic Knowledge] Khái niệm cơ bản về vi mạch và phân loại


1. Vi mạch là gì?

Mạch tích hợp (Integrated circuit), viết tắt là IC, còn được gọi là vi mạch hoặc chip là những linh kiện điện tử có lõi làm bằng vật liệu bán dẫn. Vật liệu bán dẫn có rất nhiều loại nhưng phổ biến là Silicon (Si) và Germanium (Ge). Hiểu đơn giản, vi mạch là mạch điện tử rất nhỏ được đóng gói thành một linh kiện hoàn chỉnh. 

Hình 1. Vi mạch là mạch điện tử rất nhỏ được đóng gói thành một linh kiện hoàn chỉnh

Cấu tạo cơ bản của một vi mạch (chip) gồm có vỏ chip (cover), lõi (core) và chân (pin).

Hình 2. Cấu tạo cơ bản của vi mạch
Lõi (CORE hoặc DIE) vi mạch là mạch điện gồm các thành phần thụ động hoặc tích cực hoặc cả hai. Các thành phần thụ động gồm có điện trở, tụ điện, cuộn cảm. Các thành phần tích cực gồm có diodes, transistor, NMOS, PMOS,... Cụm từ "thiết kế vi mạch" được ngầm hiểu là thiết kế phần lõi vi mạch thông qua các công cụ phần mềm chuyên dụng. Việc chế tạo phần lõi và sản xuất ra chip thuộc về nhà máy chế tạo chip.

Chân chip (PIN hoặc LEAD) là vật liệu dẫn điện được kết nối đến lõi thông qua các dây dẫn điện, gọi là BOND WIRE. Các dây này thường làm bằng vàng.

Vỏ là thành phần bao bọc và cố định lõi, dây dẫn và các chân, được làm bằng vật liệu cách điện như nhựa, gốm, thủy tinh,...
Hình 3. Bên trong một vi mạch
Xem thêm các hình ảnh bên trong một số chip ở link: http://diephotos.blogspot.com/

2. Phân loại vi mạch

Vi mạch có thể được phân làm nhiều loại khác nhau dựa trên các đặc điểm về cấu trúc, chức năng hay mật độ tích hợp.

Một cách phân loại phổ biến dựa trên mật độ tích hợp là dựa vào số lượng transistor hoặc CMOS hoặc số cổng (gate) có trong vi mạch để chia thành các nhóm như sau:
  • Vi mạch mật độ tích hợp thấp SSI (Small Scale Integration) là những vi mạch chứa khoảng từ vài đến vài chục transistor.
    • Ví dụ như các chip 74151 (Multiplexer), 7404 (cổng đảo),  ...
  • Vi mạch mật độ tích hợp trung bình MSI (Medium Scale Integration) là những vi mạch chứa khoảng vài trăm transistor
    • Ví dụ như các chip 54157 (multiplexer) chứa khoảng 100 transistor
  • Vi mạch mật độ tích hợp cao LSI (Large Scale Integration) là những vi mạch chứa khoảng vài nghìn transistor
    • Ví dụ như chip Intel 4004 chưa khoảng 2300 transistor, Intel 8008 khoảng 3500 transistor
  • Vi mạch mật độ tích hợp rất cao VLSI (Very Large Scale Integration) là những vi mạch chứa khoảng vài chục nghìn transistor trở lên
    • Ví dụ như chip 8088 chưa khoảng 29000 transistor, Motorola 68000 chứa khoảng 68000 transistor, ARM 1 chứa khoảng 25000 transistor
  • Vi mạch mật độ tích siêu cao ULSI (Ultra Large Scale Integration) là những vi mạch chứa khoảng vài triệu transistor.
    • Ví dụ như chip Pentium I, II và III đời đầu khoảng vài triệu transistor, ...
  • Vi mạch mật độ tích hợp cực cao GSI (Giant Scale Integration) là những vi mạch chứa khoảng vài trăm triệu transistor hoặc hơn.
    • Ví dụ các dòng Dual-core của Intel, AND K8/K10, ... dùng cho máy tính cá nhân PC hoặc các dòng đa nhân dùng cho các điện thoại thông minh như A7 của Apple có số lượng transistor khoảng 1 tỷ với 2 nhân ARM64, ...
Hình 4. Phân loại vi mạch theo số lượng transistor và số cổng

Hình 5. Phân loại vi mạch theo số lượng cổng


Cách phân chia trên không có một ranh giới rõ ràng và chỉ mang tính tương đối. Hiện nay, các vi mạch chứa hàng trăm triệu và hàng tỷ transistor đã ra đời như các vi xử lý core  i5, core i7, chip SnapDragon 8 nhân của Qualcomm, các vi xử lý dùng cho các máy chủ.

Thông số về số lượng transistor và cổng trong một vi mạch cũng không phải lúc nào cũng được công bố rỗng rãi nên việc xác định vi mạch đó thuộc loại LSI, VLSI, ULSI, ... chỉ là mang tính phỏng đoán nên thuật ngữ VLSI được sử dụng phổ biến để gọi các loại vi mạch có mật độ tích hợp cao nói chung.

Một cách phân loại phổ biến thứ 2 là dựa trên loại tín hiệu mà vi mạch đó có thể xử lý là tín hiệu số (digital) hay tín hiệu tương tự (analog). Theo cách phân loại này, vi mạch được chia làm 3 nhóm là:
  • Vi mạch số (Digital IC) xử lý các tín hiệu rời rạc dựa trên mức logic, 0 và 1, hoặc cạnh chuyển của tín hiệu, cạnh lên và cạnh xuống. Các vi mạch điển hình là các vi mạch cổng logic như AND, OR, đảo, các mạch đếm, MUX, ... Các thành phần chính của vi mạch này là các cổng logic, Flip-Flop, Latch, ...
  • Vi mạch tương tự (Analog IC) xử lý các tín hiệu liên tục dựa trên thuộc tính tần số, điện áp, dòng điện, của tín hiệu ... Các thành phần chính là các transistor, điện trở, tụ điện, cuộn cảm, ... Các chip điển hình là mạch khuếch đại thuật toán OP-AMP, chip ổn áp,...
  • Vi mạch tín hiệu hỗ hợp (Mixed-signal IC) là chip tích hợp cả thành phần xử lý tín hiệu số và tín hiệu tương tự ví dụ như chip vi điều khiển MCU có tích hợp các bộ chuyển đổi tín hiệu tương tự/số ADC
Hình 6. Vi mạch số 74HC245 của NXP
 
Hình 7. Vi mạch tương tự OPAMP OPA2188 của TI


Hình 8 là một vi mạch tín hiệu hỗ hợp dùng trong thẻ RFID, một loại thẻ thông minh không tiếp xúc giao tiếp không dây. Trong chip này, thành phần số là DIGITAL CONTROL UNIT, thành phần xử lý tín hiệu tương tự gồm có RF INTERFACE, FIELD DETECTION và khối bộ nhớ EEPROM.
Hình 8. Sơ đồ khối vi mạch mixed-signal NTAG213F dùng cho thẻ RFID của NXP 



Chủ Nhật, 16 tháng 7, 2017

[Asynchronous Design][Thiết kế bất đồng bộ][Bài 5] Phần tử C Muller và lý thuyết chỉ thị


1. Lý thuyết chỉ thị

Trong mạch đồng bộ, vai trò của xung clock là xác định các điểm trong từng khoảng thời gian mà tại đó các tín hiệu ổn định và hợp lệ để có thể lấy giá trị và sử dụng. Điểm này là tại cạnh tích cực của xung clock (cạnh lên hoặc cạnh xuống. Trước và sau cạnh tích cực này các tín hiệu buộc phải ổn định. Thời gian ổn định trước cạnh tích cực là setup time. Thời gian sau cạnh tích cực là hold time. Hai khoảng thời gian này tạo nên một cửa sổ định thời (timing window). Ngoài cửa sổ định thời tín hiệu có thể thay đổi giá trị nhiều lần hoặc không ổn định.

Hình 1. Timing trong mạch đồng bộ
Trong mạch bất đồng bộ, việc không sử dụng xung clock làm cho các tín hiệu có thể phải giữ ổn định (stable) trong toàn bộ thời gian.  Mỗi lần tín hiệu thay đổi đều phải có ý nghĩa. Tức là giá trị tín hiệu trước và sau khi thay đổi đều là những giá trị hợp lệ. Vì vậy, các nguy hiểm (hazard) và chạy đua (race) cần phải tránh. Nguy hiểm ở đây có thể là xung nháy (glitch). Glitch là trạng thái tín hiệu không mong muốn và thường thể hiện dưới dạng 1 xung có độ rộng rất nhỏ trên tín hiệu. Chạy đua có thể sinh ra các trạng thái không mong muốn của tín hiệu khi độ trễ trên các tín hiệu không giống nhau.

Các mạch bất đồng bộ là tổ hợp của các cổng logic thường có một hoặc nhiều đường hồi tiếp (feedback loop). Khi ngõ ra một cổng thay đổi nó có thể làm ngõ ra các cổng khác thay đổi theo đến một giá tị phù hợp. Hình 2 là một ví dụ về mạch nguyên lý cho khối CTL trong mô hình mạch bất đồng bộ từng trình bày ở bài 1 - đồng bộ theo xung clock và giao thức bắt tay. Hoạt động của mạch hình 2 như sau:


  1. Khởi động các tín hiệu đều bằng 0 và ck = 0
  2. Khi req_i = 1, ngõ ra cổng AND 1 bằng 1:
    1. req_o = 1 để yêu cầu tầng tiếp theo
    2. ack_o = 1 để xác nhận với tầng đã phát req_i
    3. ck = 1 để yêu cầu thanh ghi chốt dữ liệu từ tầng trước
  3. Khi ack_i = 1, ngõ ra cổng AND 1 bằng 0, ngõ ra ck = req_o = ack_o chỉ bằng 0 khi req_i đã kéo xuống 1.
Nhưng ở đây, việc giải thích chức năng của mạch (b) không phải là mục đích chính mà chỉ nhằm minh họa một cách trực quan về những nguy hiểm có thể xảy ra trên các ngõ ra req_o, ack_o và ck khi áp dụng vào mô hình pipeline (a).

Hình 2. Một sơ độ nguyên lý (b) của mạch điều khiển bất đồng bộ CTL cho mô hình pipeline (a)
Xem xét một cổng OR đơn thuần sử dụng trong mạch hình 2, nếu ngõ ra y chuyển trạng thái từ 1 sang 0 thì chắc chắn cả 2 ngõ vào đều bằng 0, nếu ngõ ra y chuyển trạng thái từ 0 sang 1 thì không thể kết luận giá trị của 2 ngõ vào là bao nhiêu. Chúng ta nói rằng cổng OR chỉ thị (indicate) hoặc xác nhận (acknowledge)  khi cả hai ngõ vào bằng 0. Tương tự, cổng AND chỉ thị khi cả hai ngõ vào bằng 1.

Hình 3. Cổng OR chỉ thị hoặc xác nhận khi 2 ngõ vào bằng 0
Khi các tín hiệu ngõ vào thay đổi trạng thái mà không được chỉ thị hoặc xác nhận bởi sự chuyển đổi ở ngõ ra thì  đó là nguồn hazard cần phải tránh. Mạch càng phức tạp thì việc kiểm soát các nguy hiểm và chạy đua càng khó. Vì vậy, cần có những lý thuyết và phương pháp để kiểm soát các thiết kế như trên một cách hiệu quả.

Khái niệm chỉ thị (indication) hoặc xác nhận (acknowledgement) có vai trò quan trọng trong thiết kế các mạch bất đồng bộ.

Một mạch tốt hơn dùng cho việc chỉ thị này là phần tử C muller.

2. Phần tử C Muller

Phần tử C Muller (Muller C-element) còn được gọi bằng nhiều tên khác như cổng C (C gate), Flip-flop trễ (Hysteresis Flip-flop), hoặc Flip-flop trùng nhau (coincident Flip-flop), mạch an toàn 2 tay (two-hand safety circuit) là một phần tử số được sử dụng rộng rãi trong thiết kế mạch bất đồng bộ. Phần tử này được mô tả bởi nhà toán học và khoa học máy tính người Mỹ David E. Muller.

Hình 3. Ký hiệu, mạch mức MOS và các cách biểu diễn phần tử C
Phần tử C là một thành phần giữ trạng thái có:
  • Ngõ ra bằng 0 khi cả hai ngõ vào là 0
  • Ngõ ra bằng 1 khi cả hai ngõ vào là 1
  • Ngõ ra không thay đổi giá trị khi ngõ vào là 01 hoặc 10
Như vậy, phần tử C chỉ thị khi cả 2 ngõ vào bằng 1 hoặc cả 2 ngõ vào bằng 0.

3. Đường ống Muller (Muller Pipeline) 

Hình 4 là một mạch được xây dựng bằng phần tử C và cổng đảo thay thế cho mạch nguyên lý hình 2.


Hình 4. Mạch CTL sử dụng phần tử C và cổng đảo

Hình 5 là mạch pipeline của CTL sử dụng mạch hình 4. Mô hình này là Muller pipeline hoặc phân bố Muller (Muller distributor). Sự mở rộng hoặc biến đổi mạch này được sử dụng trong phần lớn các mạch đồng bộ khác. Hoạt động của pipeline này như sau:
  1. Sau khi tất cả các phần tử C được khởi động về 0 thì quá trình bắt tay req/ack bắt đầu từ phía ngoài cùng bên trái (Left).
  2. Xét phần tử C thứ i, nó chỉ lấy giá trị 1 từ Req = C[i-1] của tầng trước nó khi Ack = C[i+1] tầng sau nó là 0. Tương tự, nó chỉ lấy giá trị 0 từ Req (đồng thời là C[i-1]) của tầng trước nó khi Ack (đồng thời là C[i+1]) tầng sau nó là 1. Điều này có được là nhờ thuộc tính chỉ thị khi cả 2 ngõ vào cùng bằng 1 hoặc cùng bằng 0 của phần tử C.

Hình 4. Muller Pipeline hoặc Muller Distributor
Xem dạng sóng bên dưới hình 4, các bắt tay trên mỗi giao tiếp Req/Ack sẽ lan truyền trong đường ống Muller từ bên trái (Left) qua bên phải (Right). Định thời tại mỗi giao tiếp bắt tay có thể khác nhau nhưng phần tử C đảm bảo việc chỉ thị khi C[i] chuyển trạng thái từ 1 qua 0 hoặc từ 0 qua 1. Điều này đảm bảo tính toàn vẹn của các hoạt động bắt tay được lan truyền. Nếu Req được phát từ bên trái đã lan truyền đến cuối pipeline, tức bên phải, mà không nhận được đáp ứng Ack từ bên phải thì pipeline lúc này sẽ bị đầy. Hành vi này giống như hoạt động của một FIFO.

Tốc độ lan truyền trong đường ống Muller phụ thuộc vào đỗ trễ thực tế của mạch.

Một số điểm đáng chú ý của mạch này như sau:
  1. Đơn giản và có thể ứng dụng được cho cả giao thức bắt tay 2 pha hoặc 4 pha tùy vào việc biến đổi các tín hiệu giao tiếp cho phù hợp
  2. Có thể đảo định nghĩa cực của các tín hiệu, thay vì sử dụng tích cực mức cao (logic 1) thì có thể sử dụng tích cực mức thấp (logic 0) như hình 5
  3. Mạch hoạt động chính mà không phụ thuộc vào độ trễ các cổng và dây dẫn. Đường ống Muller được được nói là "không nhạy trễ" (delay-insensitive)
Hình 5. Có thể đảo cực tín hiệu ở mạch Muller pipeline
 
Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.





Thứ Hai, 10 tháng 7, 2017

[CANFD][Controller Area Network][Bài 5] CANFD - Sự khác nhau giữa CAN FD và CAN 2.0 - phần 5

1. Vấn đề đồng bộ trong CAN FD

CAN FD có các quy định về đồng bộ cứng (hard synchronization), tái đồng bộ (Resynchronous), lỗi pha (Phase error) tương tự như CAN 2.0. Bên cạnh đó CAN FD cũng quy định thêm một số điểm khác biệt về vấn đề này.

Ở độ rộng bước tái đồng bộ RJW (Resynchronous Jump Width), nó còn được ký hiệu là SJW, RJW quy định cho pha phân xử và pha dữ liệu là khác nhau:
  • Pha phân xử, RJW được lập trình trong khoảng từ 1 đến min (16, Phase_seg1(N)).
  • Pha phân xử, RJW được lập trình trong khoảng từ 1 đến min(4, Phase_seg1(D)) -> như chuẩn CAN 2.0
Các quy định về sự đồng bộ (Synchronization Rules) cũng có những khác biệt như sau:
  1. Giống CAN 2.0
  2. Giống CAN 2.0
  3. Cả CAN FD và CAN 2.0 đều quy định đồng bộ cứng được áp dụng khi xuất hiện cạnh chuyển từ recessive sang dominant ở vùng Bus Idle. Nhưng CAN FD quy định thêm, điều này còn áp dụng ở vùng Suspend Transmission (xem khoảng liên khung), ở bit thứ 2 hoặc bit thứ 3 của vùng Intermission. Đồng bộ cứng còn được áp dụng tại cạnh chuyển từ recessive sang dominant khi chuyển từ bit EDL thành bit r0 trong khung truyền định dạng CAN FD
  4. Giống CAN 2.0
  5. Một bộ truyền sẽ không thực thi tái đồng bộ trong khi truyền pha dữ liệu trong khung truyền CAN FD (Quy đình này thêm vào và dành riêng cho CAN FD)
2. Dung sai của bộ dao động

Bộ dao động ở đây là nguồn xung clock được cấp cho CAN controller sử dụng tính toán thời gian bit cho các khung truyền. Dung sai là độ sai số cho phép của bộ dao động để đảm bảo mỗi Node có thể hoạt động chính xác nhất.

CAN FD quy định rõ ràng vấn đề này hơn so với CAN 2.0. Cụ thể, dung sai df cho một bộ dao động tần số fosc sẽ quanh tần số danh định fnom như sau:

 (1-df).fnom <= fosc <= (1+df).fnom

nhưng phụ thuộc vào tỷ lệ của Phase_seg1, Phase_seg2, SJW và thời gian bit. Dung sai df tối đa được định nghĩa bởi 5 điều kiện trong đó điều kiện I và II đã được áp dụng cho chuẩn CAN 2.0. Đối với CAN FD, tất cả 5 điều kiện đều phải được áp dụng.
Hình 1. Những điều kiện ràng buộc giá trị dung sai bộ dao động

Ở đây, N là ký hiệu chỉ thông số thuộc cấu hình tốc độ bit danh định và D là ký hiệu chỉ thông số thuộc cấu hình tốc độ bit dữ liệu. Nguyên tắc rất đơn giản, tất cae các thông số cấu hình thời gian bit cần được tính toán bằng các điều kiện ràng buộc trên để chọn bộ dao động có dung sai phù hợp cấu hình. Hoặc khi đã có nguồn dao động và dung sai cụ thể của nó thì việc cấu hình thời gian bit và các thông số khác phải đáp ứng theo dung sai đó.

Cần lưu ý, SJW không được lớn hơn giá trị của Phase_seg1 và Phase_seg2. Đoạn Prop_seg có thể được sử dụng cho các đoạn Phase_seg1 và Phase_seg2. Tổ hợp cấu hình Prop_seg(N)=1 và Phase_seg1(N)=Phase_seg2(N)=SJW(N) cho phép dung sai lớn nhất lên đến 1.58%. Đây cũng là dung sai cho phép trong xử lý của CAN 2.0. Việc tổ hợp Prop_seg khi nó chỉ chiếm 10% thời gian 1 bit là không thích hợp cho các thời gian bit ngắn. Nó có thể được sử dụng cho tốc độ tối đa là 125 kbit/s, tương ứng với thời gian bit là 8 us, với độ dài bus 40 m. Thời gian bit danh định này có thể tổ hợp với một thời gian dữ liệu ngắn hơn.

3. Bù trễ Transceiver

Bù trễ cho CAN transceiver là một khái niệm không có trong CAN 2.0.

Ở CAN FD, nếu không có cơ chế bù trễ, khi một Node là bộ truyền, nó có thể không giám sát được (không nhận được) giá trị bit do chính nó truyền ra tại điểm lấy mẫu (Sample point) như hình 2. Điều này sẽ giới hạn tốc độ của pha dữ liệu, thời gian bit của pha này không được phép quá ngắn dẫn đến tốc độ bit không được phép quá cao.
Hình 2. Trễ trên Transceiver làm giới hạn tốc độ truyền dữ liệu

Các Node CAN FD sẽ hỗ trợ tùy chọn thực thi cơ chế bù trễ cho Transceiver để sử dụng cho các ứng dụng cần thời gian bit trong pha dữ liệu ngắn hơn giới hạn thời gian được quy định trong thời gian trễ của Transceiver.

Cơ chế bù trễ sẽ định nghĩa một điểm lấy mẫu thứ 2 (Secondary Sample Point). Điểm lấy mẫu này được sử dụng để so sánh giá trị bit được truyền ra so với bit được nhận vào theo thứ tự để kiểm tra lỗi bit. Cơ chế này chỉ sử dụng cho bộ truyền và trong pha dữ liệu của khung định dạng CAN FD. Khi sử dụng cơ chế này, bộ truyền sẽ không quan tâm đến giá trị bit ở vị trí lấy mẫu thông thường (Sample point).

Độ trễ bù được ký hiệu là TRV_DELAY. Nó được đo trong từng khung truyền tại cạnh chuyển từ bit EDL sang bit r0 bằng cách đo khoảng cách giữa cạnh bit truyền ra trên TX và cạnh bit nhận được trên RX của CAN controller. Giá trị đo được tính theo đơn vị TQ và sẽ được làm tròn xuống đến số nguyên gần nhất.

Vị trí của điểm lấy mẫu thứ hai sẽ được tính từ điểm lấy mẫu thông thường cộng bù thêm TRV_DELAY, ví dụ như nửa thời gian của 1 bit. Và nó có thể nằm sau điểm cuối của bit truyền.
Hình 3. Bù trễ transceiver trong CAN FD

Nếu một lỗi bit (BIT ERROR) được phát hiện tại điểm lấy mẫu thứ 2, bộ truyền sẽ đáp ứng lại lỗi bit này này ở điểm lấy mẫu (sample point) tiếp theo.


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Chủ Nhật, 9 tháng 7, 2017

[CANFD][Controller Area Network][Bài 4] CANFD - Sự khác nhau giữa CAN FD và CAN 2.0 - phần 4

CAN FD hỗ trợ hai tốc độ bit trong một khung truyền là tốc độ bit danh định (Nominal Bit Rate) dùng cho pha phân xử và tốc độ bit dữ liệu (Data Bit Rate) dùng cho pha dữ liệu. Phần này sẽ phân tích rõ hiện tượng chuyển đổi giữa hai tốc độ bit này trong giao thức CAN FD.
Hình 1. Pha phân xử và pha dữ liệu trong khung yêu cầu (trên) và khung dữ liệu (dưới)

Việc tốc độ bit có bị chuyển đổi hay không phụ thuộc vào giá trị bit BRS (Bit Rate Switch).
  • BRS = 1 là có chuyển đổi
  • BRS = 0 là không chuyển đổi

Có hai điểm chuyển tốc độ bit là tại vị trí bit BRS và vị trí bit CRC delimiter. Tốc độ bit sẽ được chuyển đổi ngay sau điểm lấy mẫu (sample point) của 2 bit này. Điều này làm cho 2 bit này mang cùng lúc 2 cấu hình tốc độ bit khác nhau. Tổng độ dài của 2 bit này sẽ bằng độ dài 1 bit thuộc cấu hình thời gian bit danh định (Nominal Bit Time) và một bit thuộc cấu hình thời gian bit dữ liệu (Data Bit Time).

Trong trường hợp phát hiện lỗi, Node phải truyền khung báo lỗi nhưng khung này theo tốc độ bit danh định (Nominal Bit Rate). Nếu Node đang truyền trong pha dữ liệu thì nó phải chuyển đổi từ tốc độ bit dữ liệu sang tốc độ bit danh định để phát khung báo lỗi nhưng thời điểm chuyển đổi là sau điểm lấy mẫu của bit hiện tại một khoảng thời gian bằng thời gian xử lý thông tin (Information Processing Time - IPT).

Ví dụ, thời gian bit danh định được cấu hình dựa trên m(N) = 2, đây là hệ số tính độ dài TQ(N). Thời gian các đoạn trong 1 bit gồm:
  • Prop_seg(N)     = 6 TQ
  • Phase_seg1(N)  = 4 TQ
  • Phase_seg2(N)  = 4 TQ
Thời gian dữ liệu được cấu hình dựa trên hệ số m(D) = 1 và có độ dài các đoạn trong 1 bit như sau:
  • Prop_seg(D)     = 1 TQ
  • Phase_seg1(D)  = 4 TQ
  • Phase_seg2(D)  = 4 TQ
Hình 2. Ví dụ về thời gian bit danh định và thời gian bit dữ liệu
Với cấu hình trên, thời gian của bit BRS và CRC Delimiter được thể hiện như sau:
  • Bit BRS: trước điểm lấy mẫu theo cấu hình tốc độ bit danh định, sau điểm lấy mẫu theo tốc độ bit dữ liệu
  • Bit CRC Delimiter: trước điểm lấy mẫu theo cấu hình tốc độ bit dữ liệu, sau điểm lấy mẫu theo tốc độ bit danh định

Hình 3. Độ dài bit BRS và CRC Delimiter

Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

[Asynchronous Design][Thiết kế bất đồng bộ][Bài 4] Giao thức dual-rail 2 pha trong thiết kế bất đồng bộ




Giao thức dual-rail 4 pha cũng tồn tại các nhược điểm như giao thức bundled-data 4 pha là xuất hiện nhiều sự kiện chuyển trạng thái, từ logic 0 sang logic 1 hoặc từ logic 1 sang logic 0, trên các tín hiệu làm cho thời gian truyền dữ liệu lâu và gây tiêu hao năng lượng lớn khi mạch hoạt động.

Giao thức dula-rail 2 pha sẽ khắc phục nhược điểm này khi sử dụng các sự kiện tín hiệu để xác định giá trị của một bit. Nguyên tắc cơ bản:
  • Bit mang giá trị logic 1 hoặc TRUE nếu xuất hiện sự kiện tín hiệu chuyển trạng thái, từ 0 sang 1 hoặc từ 1 sang 0, trên dây d.t
  • Bit mang giá trị logic 0 hoặc TRUE nếu xuất hiện sự kiện tín hiệu chuyển trạng thái, từ 0 sang 1 hoặc từ 1 sang 0, trên dây d.f
  • Một từ mã được xác định đã nhận bởi Receiver thông qua sự kiện tín hiệu của ack
Trong một kênh N bit, một từ mã được xác định khi xuất hiện sự kiện tín hiệu trên d.t hoặc d.f ở tất cả các bit, nghĩa là phải có N sự kiện tín hiệu xuất hiện thì một từ mã mới được xác định và Receiver mới đáp ứng bằng 1 cạnh ack.

Ví dụ về hoạt động của một kênh giao thức dual-rail 2 pha có 2 bit dữ liệu như hình 1. Một từ mã được xác định khi xuất hiện sự kiện tín hiệu ở cả trên bit 0 và bit 1.
  1. Sender gửi các bit thông tin nhưng thông tin chỉ được chấp nhân ở Recceiver khi tất cả bit 0 và bit 1 xuất hiện cạnh chuyển
  2. Receiver chuyển trạng thái ack để báo đã nhận thông tin và Sender có thể gửi thông tin mới

Hình 1. Minh họa một kênh giao thức dual-rail có 2 bit dữ liệu
So với giao thức dual-rail 4 pha thì giao thức dual-rail 2 pha giảm tối thiểu một nửa thời gian truyền dữ liệu và một nửa số lượng chuyển trạng thái trên các tín hiệu khi xét trong cùng điều kiện hoạt động như cùng số bit dữ liệu cần truyền và cùng độ trễ trên các đường dây.

Nhận xét, bốn giao thức phổ biến nhất đã giới thiệu trong bài này và các bài viết:

Việc mã hóa 1 bit bằng 2 dây như trong giao thức dual-rail giống như mã hóa one-hot của 1 bit, còn được gọi là giao thức 1-of-2. Mở rộng hơn, giao thức có thể là 1-of-N với ý nghĩa N dây (tín hiệu) mã hóa số lượng bit là log2(N). Ví dụ, giao thức 1-of-4 dùng 4 dây để mã hóa 2 bit theo kiểu one-hot như bảng sau:

Hình 2. Giá trị tín hiệu và trạng thái của giao thức 1-of-4 theo one-hot

Tổ hợp các tùy chọn, chúng ta có thể có nhiều giải pháp khác nhau để lựa chọn giao thức phù hợp như sau:

(2 pha, 4 pha)x(bundled-data, dual-rail, 1-of-n, ...)x(push, pull)

Giao thức sử dụng mã hóa 1-of-n là một phần của mã hóa m-of-n có thể được sử dụng với m là số tín hiệu phải tích cực trong n tín hiệu (dây) khi truyền một thông tin. Ví dụ về mã hóa 2-of-7, tích cực 2 tín hiệu trong 7 tín hiệu cho một lần truyền giá trị dữ liệu 4 bit.

Hình 3. Mã hóa 2-of-7
Trong mã hóa 2-of-7, hai đường dây tích cực sẽ tương đương với 1 giá trị 4 bit.

Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.


Thứ Bảy, 8 tháng 7, 2017

[Asynchronous Design][Thiết kế bất đồng bộ][Bài 3] Giao thức dual-rail 4 pha trong thiết kế bất đồng bộ


1. Giao thức bundled-data phụ thuộc vào độ trễ giữa các tín hiệu

Các giao thức bundled-data, như trình bày trong bài 2, đều cần có sự ràng buộc phù hợp về độ trễ giữa các tín hiệu. Thứ tự xuất hiện của các sự kiện tín hiệu là điều kiện quan trọng đảm bảo cho giao thức hoạt động đúng. Ví dụ, xét trên một kênh đẩy (push channel), Sender cần đưa một dữ liệu hợp lệ và ổn định trước khi tích cực tín hiệu req. Thứ tự này phải được giữ khi gửi đến Receiver và phải được đảm bảo khi thực thi mạch ở mức vật lý (tổng hợp và layout). Một số giải pháp có thể thực hiện để đảm bảo điều này là:

  1. Điều chỉnh trong quá trình sắp xếp và định tuyến (placement and rounting) các dây dẫn của tín hiệu, ví dụ như thực hiện việc đi dây các tín hiệu trong 1 kênh như một bó tín hiệu.
  2. Đặt một giới hạn an toàn tại đầu cuối Sender
  3. Chèn hoặc/và thay đổi kích thước các buffer sau layout bằng các phần mềm tổng hợp và layout
Hình 1. Thứ tự các sự kiện tín hiệu phải được đảm bảo khi truyền từ Sender đến Receiver

Một giải pháp khác là có thể sử dụng các giao thức phức tạp, tinh vi hơn các giao thức bundled-data để tránh phụ thuộc vào độ trễ trên kênh giao tiếp.

2. Giao thức dual-rail 4 pha

Giao thức này mã hóa tín hiệu req bên trong các tín hiệu dữ liệu và sử dụng 2 dây cho một bit thông tin được truyền. Về bản chất, giao thức 4 pha này sử dụng 2 dây (tín hiệu) để biểu diễn 1 bit:
  • Dây d.t biểu diễn logic 1 hoặc giá trị TRUE
  • Dây d.f biểu diễn logic 0 hoặc giá trị FALSE
Các trạng thái hoạt động tương ứng với giá trị trên tín hiệu d.t và d.f là:
  • Trạng thái Empty, ký hiệu E khi d.t = 0 và d.f = 0
  • Trạng thái Valid0, ký hiệu 0 khi d.t = 0 và d.f = 1
  • Trạng thái Valid1, ký hiệu 1 khi d.t = 1 và d.f = 0
  • Trạng thái không sử dụng và bị cấm khi d.t = 1 và d.f = 1
Nếu bus DATA/req có N bit dữ liệu cần phát song song thì số lượng tín hiệu kết nối giữa Sender và Receiver là 2N.

    Hình 2. Giao thức dual-rail 4 pha loại kênh kéo (push channel)

    Xét hoạt động truyền dữ liệu của 1 bit như hình 3 để hiểu rõ một bit được biểu diễn bởi 2 tín hiệu như thế nào? làm thế nào tín hiệu req được tích hợp với tín hiệu dữ liệu? Các bước hoạt động của giao thức như sau:

    1. Đang ở trạng thái E, Sender tích cực tín hiệu d.t nếu muốn gửi bit 1 hoặc d.f nếu muốn gửi bit 0, để yêu cầu Receiver nhận dữ liệu
    2. Receiver tích cực ack để báo cho Sender biết đã nhận dữ liệu
    3. Sender đưa tín hiệu d.t hoặc d.f về lại logic 0 và bit trở lại trạng thái E
    4. Receiver thôi tích cực tín hiệu ack và Sender có thể bắt đầu gửi giá trị bit tiếp theo

    Hình 3. Truyền 1 bit dữ liệu với giao thức dual-rail 4 pha
    Như vậy:
    1. Logic 0 và logic 1 được truyền trên 2 dây (tín hiêu) độc lập nên gọi là dual-rail, nó khác với giao thức bundled-data đã trình bày ở bài 2, giao thức này còn được biết đến với tên single-rail
    2. Khi d.t hoặc d.f tích cực thì nó vừa mang thông tin giá trị của bit, giá trị 1 hoặc giá trị 0, vừa có ý nghĩa yêu cầu Receiver nhận dữ liệu. Đây chính là cách tích hợp tín hiệu req vào tín hiệu dữ liệu
    3. Giao thức cũng hoạt động theo 4 bước nên gọi là 4 pha
    Chú ý đến trạng thái hoạt động của bit, trạng thái E luôn xen giữa hai lần gửi giá trị, điều này đảm bảo chỉ một tín hiệu d.t hoặc d.f tích cực trong 1 thời điểm, nên hoạt động của giao thức không phụ thuộc vào độ trễ trên đường dây kết nối giữa Sender và Receiver như giao thức bundled-data.

    Xét trên 1 bus có N bit thông tin song song, tương đương với 2N tín hiệu kết nối, giữa Sender và Receiver thì:
    • Giá trị trên bus chỉ hợp lệ (valid) khi tất cả các bit đều valid (valid0 hoặc valid1). Receiver chỉ đáp ứng ack khi phát hiện tất cả các bit đã hợp lệ
    • Bus chỉ Empty khi tất cả các bit đều empty. Receiver chỉ kéo ack xuống mức thấp khi phát hiện tất cả các bit đều trong trạng thái E.
    Nhìn theo một cách khác, một cặp {x.f, x.t} gọi là một từ mã (codeword). Mỗi từ mà sẽ có một ý nghĩa khác nhau như đã trình bày phía trên:
    • {x.f, x.t} = {0, 0} gọi là rỗng (empty) hoặc khoảng đệm (spacer) hoặc không dữ liệu (no data) hoặc không giá trị (NULL)
    • {x.f, x.t} = {1, 0} gọi là dữ liệu hợp lệ (valid data) logic 0
    • {x.f, x.t} = {0, 1} gọi là dữ liệu hợp lệ (valid data) logic 1
    • {x.f, x.t} = {1, 1} không được sử dụng. Như vậy, việc chuyển từ một từ một từ mã valid này sang một từ mã valid khác là không được chấp nhận
    Hình 4. Hoạt động gửi từ mã trên kênh của giao thức dual-rail 4 pha

    Từ mã dual-rail là một loại từ mã đơn giản trong các loại từ mã không nhạy trễ (delay-insensitive), nghĩa là không bị ảnh hưởng bởi độ trễ trên đường dây. Nó có một số thuộc tính ưu điểm như sau:
    • Bất kỳ tổ hợp nào của các từ mã dual-rail là một từ mã dual-rail. Mỗi bit được biểu diễn bằng 1 từ mã dual-rail, nhiều bit sẽ tạo ra tổ hợp từ mã dual-rail và nó cũng là một từ mã dual-rail
    • Với N bit cho trước, tập tất cả các giá trị của từ mã được chia thành 3 nhóm riêng biệt:
      • Từ mã rỗng (empty codeword) khi tất cả N từ mã trong tập đều bằng {0,0}
      • Từ mã trung gian (intermediate codeword) khi một số từ mã trong tập ở trạng thái rỗng {0,0} còn một số khác thì ở trạng thái hợp lệ, {1,0} hoặc {0,1}
      • Từ mã hợp lệ (valid codeword) khi tất cả các từ mã trong tập đều hợp lệ. Từ mã hợp lệ có 2^N giá trị khác nhau
    Hình 5 minh họa hoạt động trên kênh có N bit thông tin. Chú ý, một Receiver có gặp một chuỗi nhiều từ mã trung gian khi một tổ hợp các từ mã chuyển từ trạng thái rỗng sang trạng thái valid hoặc ngược lại nhưng nó đều không đáp ứng cho các từ mã trung gian này. Nghĩa là tín hiệu ack không thay đổi trạng thái trong khi các từ mã trung gian xuất hiện.

    Hình 5. Minh họa hoạt động trên kênh có N bit
    Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.

    Thứ Năm, 6 tháng 7, 2017

    [Asynchronous Design][Thiết kế bất đồng bộ][Bài 2] Giao thức bắt tay bundled-data trong thiết kế mạch bất đồng bộ


    1. Mô hình luồng dữ liệu (data flow) trong mạch bất đồng bộ

    Như đã đề cập ở bài 1 về việc sử dụng giao thức bắt tay trong thiết kế bất đồng bộ để thay thế cho thiết kế đồng bộ sử dụng xung clock khi sự tổng hợp để cân bằng các kết nối xung clock không đạt kết quả như mong muốn.

    Trước khi đi sâu vào các giao thức bắt tay ở những bài tiếp theo, chúng ta quy định việc nhìn mô hình thiết kế bắt tay bất đồng bộ như hình 1.

    Hình 1. Mô hình handshake channel

    1. Xem các tín hiệu bắt tay và dữ liệu kết nối giữa hai thanh ghi là một kênh bắt tay (handshake channel) hoặc một liên kết bắt tay (handshake link), được gọi tắt là channel hoặc link. Như vậy, một kênh bắt tay bao gồm cả đường dữ liệu và đường điều khiển bắt tay.
    2. Các dữ liệu lưu trữ trong các thanh ghi là các token được gắn các giá trị dữ liệu, gọi là token dữ liệu hoặc gọi tắt là token. Dữ liệu này có thể được thay đổi khi các token đi qua các mạch tổ hợp.
    3. Xem các mạch tổ hợp, như CL3 hay CL4 trong hình minh họa, không tác động gì đến việc bắt tay giữa các thanh ghi. Một mạch tổ hợp thu vào một token trên mỗi link ngõ vào, thực thi tính toán và phát một token trên mỗi link ngõ ra.
    Khi xem xét theo mô hình này, một mạch bất đồng bộ chỉ đơn giản là một cấu trúc dữ liệu tĩnh. Để mô hình này xử lý chính xác thì các token lan truyền trong mạch không bị mất, nó không vượt qua một token khác (nghĩa là phải theo thứ tự xử lý) và các token mới tương tự không được phép xuất hiện ở bất cứ nơi nào khác. Một luật đơn giản để đảm bảo cho các yêu cầu nàylà:

    Một thanh ghi có thể lấy và lưu trữ một token mới từ thanh ghi trước nó nếu thanh ghi phía sau nó đã lấy và lưu dữ liệu mà nó đang giữ. Hoạt động của các thanh ghi trước và thanh ghi sau được liên kết với thanh ghi hiện tại bằng các tín hiệu yêu cầu (request - req) và xác nhận (acknowledge - ack).

    Việc chuyển dữ liệu giữa các thanh ghi trong mạch sẽ tuân theo quy luật này. Các thanh ghi có thể có giá trị giống nhau nhưng một thanh ghi đã bị lấy đi dữ liệu của mình thì dữ liệu của nó trở thành dữ liệu cũ và có thể bị ghi đè bởi dữ liệu mới. Việc bắt tay liên kết giữa các thanh ghi đảm bảo một token luôn được chuyển giao một cách chính xác. Tóm lại, mục này chỉ nói về mô hình mạch sẽ trình bày ở những bài tiếp theo của nội dung thiết kế bất đồng bộ. Có 2 điểm bạn cần nắm là:

    1. Hiểu về kênh bắt tay (handshake channel) và mô hình token
    2. Các mạch tổ hợp không biến đổi các điều khiển bắt tay (handshaking) mà chỉ chuyển tiếp chúng

    2. Các giao thức dữ liệu đóng gói (bundled-data)

    Thuật ngữ dữ liệu đóng gói (bundled-data) được hiểu là có các tín hiệu req và ack riêng biệt đi kèm với các tín hiệu dữ liệu như hình 2. Các tín hiệu này sử dụng mức logic thông thường để biểu diễn thông tin.
    Hình 2. Kênh dữ liệu đóng gói gồm một tín hiệu req, một tín hiệu ack và một bus dữ liệu

    Hình 3 minh họa giao thức dữ liệu đóng gói 4 pha (4-phase bundled-data). Nó được gọi là 4 pha vì nó có 4 hoạt động khác nhau để truyền dữ liệu:

    1. Sender phát dữ liệu và tích cực tín hiệu req mức cao
    2. Receiver lấy dữ liệu và tích cực tín hiệu ack mức cao để báo đã lấy được dữ liệu của Sender
    3. Sender đáp ứng lại bằng cách kéo req xuống mức thấp và từ lúc này dữ liệu trên bus DATA không còn được đảm bảo tính hợp lệ, nghĩa là đây có thể là dữ liệu ngẫu nhiên và Receiver không được phép lấy
    4. Receiver phát hiện req mức thấp thì cũng kéo ack xuống mức thấp và Sender có thể bắt đầu một quá trình truyền dữ liệu mới
    Hình 3. Giao thức dữ liệu đóng gói 4 pha


    Giao thức này còn được biết với tên giao thức bắt tay 4 pha hoặc giao thức bắt tay 4 bước. Giao thức này khá quen thuộc và phổ biến nhưng có điểm bất lợi là các tín hiệu chuyển trạng thái quá nhiều làm mất thời gian và tốn năng lượng. Để hoàn thành một lần bắt tay truyền dữ liệu tín hiệu req chuyển trạng thái 2 lần và tín hiệu ack chuyển trạng thái 2 lần. Một giao thức khác hạn chế được điều này là giao thức 2 pha.

    Hình 4 minh họa giao thức dữ liệu đóng gói 2 pha (2-phase bundled-data). Ở đây thông tin trên tín hiệu req và ack được mã hóa bằng sự chuyển đổi tín hiệu trên đường dây và không có sự khác biệt giữa việc chuyển từ 0 sang 1 hay 1 sang 0, cả hai sự chuyển đổi này đều gọi là sự kiện tín hiệu (signal event). Hoạt động của giao thức 2 pha gồm:

    1. Sender phát dữ liệu và gửi một sự kiện tín hiệu, là sự chuyển mức logic từ 0 sang 1 hoặc 1 sang 0, xuất hiện trên req.
    2. Receiver nhận dữ liệu và đáp ứng lại bằng 1 sự kiện chuyển tín hiệu, sự chuyển mức từ 0 sang 1 hoặc 1 sang 0, trên tín hiệu ack. Lúc này, Sender có thể tiếp tục phát dữ liệu mới.

    Hình 4. Giao thức dữ liệu đóng gói 2 pha
    Có thể nhận thấy, giao thức 2 pha cho tốc độ chuyển dữ liệu giữa Sender và Receiver nhanh hơn, tận dụng được triệt để mỗi lần chuyển trạng thái (mức logic) của hai tín hiệu điều khiển req và ack. Xét về số lần chuyển trạng thái trên req và ack, giao thức 2 pha có số lần chuyển trạng thái ít hơn một nửa so với giao thức 4 pha khi truyền cùng một số lượng dữ liệu như nhau. Tuy nhiên, việc thực hiện mạch giao thức 2 pha trên thực tế phức tạp hơn giao thức 4 pha.

    Thuật ngữ bundled-data đôi khi còn được gọi bằng cái tên khác là single-rail. Giao thức bắt tay 4 pha (4-phase handshaking) hay báo hiệu 4 pha (4-phase signaling) còn được gọi là Return-to-Zero Signaling (RTZ signaling) hoặc báo hiệu mức (level signaling). Giao thức bắt tay 2 pha còn được gọi là Non-return-to-zero signaling hoặc báo hiệu chuyển tiếp (transition signaling).

    Trong các giao thức đã trình bày Sender là bộ khởi động việc truyền dữ liệu trên một kênh và được gọi là kênh đẩy (push channel). Receiver là thành phần có thể yêu cầu dữ liệu mới từ Sender, mà không phải thụ động chờ Sender nữa, gọi là bộ kéo (pull channel).  Trong trường hợp này, Receiver sẽ tích cực tín hiệu req để yêu cầu nhận dữ liệu khi cần, Sender sẽ tích cực tín hiệu ack để báo cho Receiver khi có dữ liệu hợp lệ.

    Hình 5. Kênh đẩy và kênh kéo
    Ngoài ra, có một số biến thể khác của dạng giao thức đã trình bày như sau:

    1. Kênh không có dữ liệu: Loại này chỉ sử dụng các tín hiệu bắt tay nên có thể dùng cho việc đồng bộ
    2. Kênh có truyền thông tin dữ liệu theo cả hai chiều: loại này thường dùng cho giao tiếp bộ nhớ chỉ đọc (read-only memory). Với bộ nhớ này, địa chỉ được đóng gói (bundled) với req để gửi đến bộ nhớ, còn dữ liệu được đóng gói với ack được phát ra từ bộ nhớ.


    Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.

    Chủ Nhật, 2 tháng 7, 2017

    [Asynchronous Design][Thiết kế bất đồng bộ][Bài 1] Đồng bộ clock và giao thức bắt tay

    1. Đồng bộ theo xung clock

    Hình 1 biểu diễn một mạch đồng bộ (synchronous circuit). Đây là một mạch có cấu trúc pipeline đơn giản sử dụng một xung clock chung là CLK. Người thiết kế sẽ tập trung chủ yếu đến việc xử lý dữ liệu và sự lan truyền dữ liệu giữa các thanh ghi.

    Hình 1. Một thiết kế đồng bộ cơ bản

    Ví dụ, người thiết kế sẽ biểu diễn giá trị được lưu vào thanh ghi R3, khi xuất hiện xung nhịp clock, bằng một mạch tổ hợp CL3 (Combination Logic) có ngõ vào là giá trị của thanh ghi R2, giá trị này đã được lưu trong R2 ở xung nhịp clock trước đó. Sau khi cụ thể các mạch logic CL3 và CL4, người thiết kế có thể dùng ngôn ngữ mô tả phần cứng như Verilog hay VHDL để mô tả (viết code hoặc coding) cho cấu trúc hình 1 và dùng các phần mềm tổng hợp (synthessis tool) để tổng hợp cấu trúc này trên thư viện công nghệ cụ thể. Đây là cách nhìn mức cao của một thiết kế với xung nhịp clock. Như vậy, người thiết kế mức này tập trung chủ yếu vào việc dữ liệu mong muốn sẽ được chốt vào các thanh ghi khi cạch tích cực của xung clock xuất hiện. Cạnh tích cực có thể là cạch lên hoặc cạnh xuống được sử dụng bởi thanh ghi.

    Một thiết kế ASIC ngày nay chứa một số lượng rất lớn các kết nối của tín hiệu clock và các tín hiệu clock này có thể có thêm cổng tắt/mở gọi là gated clock. Ở mức thiết kế vật lý (physical design), để điều khiển và tối thiểu hóa hiện tượng lệch (skew) giữa các tín hiệu clock (hình 2) cung cấp đến các thanh ghi thì các bộ đệm clock sẽ được chèn thêm. Hình 3 minh họa việc chèn thêm các bộ đệm để cân bằng các kết nối của tín hiệu clock đến các thanh ghi.

    Hình 2. Hiện tượng lệch (skew) clock giữa các kết nối tín hiệu xung clock
    Hình 3. Minh họa việc điều khiển và cần bằng giữa các kết nối xung clock

    Việc đảm bảo những ràng buộc (constraint) về định thời của setup time và hold time quanh cạnh tích cực của clock là nhiệm vụ không dễ dàng. Quá trình chèn bộ đệm và tái tổng hợp được thực hiện trong các phần mềm thương mại hiện tại có thể không đạt kết quả như mong muốn hoặc nếu đạt kết quả thì nó dựa trên các mô hình trễ (delay model) mà các mô hình này có thể không chính xác như mong muốn.

    2. Bắt tay (handshacking) trong thiết kế bất đồng bộ

    Thiết kế bất đồng bộ (asynchronous design) có thể được thay thế để giải quyết vấn đề trên. Trong một thiết kế bất đồng bộ, tín hiệu clock được thay thế bằng một số dạng bắt tay giữa các thanh ghi kế cận. Hình 4 minh họa một dạng bắt tay cơ bản sử dụng một tín hiệu yêu cầu (request - req) và một tín hiệu xác nhận (acknowledge - ack).

    Hình 4. Minh họa việc thay thế tín hiệu clock chung bằng dạng bắt tay trong thiết kế bất đồng bộ
    Mô hình này khác với mô hình mạch đồng bộ ở chỗ không sử dụng chung một xung clock mà mỗi thanh ghi có một xung clock riêng chỉ cấp cho thanh ghi hoạt động khi cần thiết dựa trên sự điều khiển của các mạch bắt tay. Ví dụ, R1 tích cực req yêu cầu R2 lấy dữ liệu đang chứa trong nó, R2 được cấp clock để lấy dữ liệu từ R1. Sau đó, mạch bắt tay của R2 tích cực ack báo lại cho mạch bắt tay ở R1 và tắt clock của R2.

    Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.