• 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ứ Ba, 25 tháng 7, 2017

[Tool] Các phần mềm mã nguồn mở phục vụ thiết kế vi mạch

Bài này liệt kê và giới thiệu các phần mềm mã nguồn mở để các bạn có thể cài đặt và thử nghiêm, phục vụ công tác nghiên cứu và học tập (Bài viết sẽ được cập nhật thường xuyên các tool hữu ích).

1. gnucap

Loại phần mềm: Mô phỏng mạch

Mô tả: gnucap là chương trình mô phỏng cả mạch số và mạch tương tự (mixed-signal). Phần mềm thực thi dc phi tuyến, các phân tích tức thời, phân tích ac tuyến tính tại một điểm xử lý. Phần mềm cũng bao gồm các mô hình MOSFET tương thích SPICE, diode và BJT.

Link cài đặt và tham khảo:
  • http://ftp.gnu.org/gnu/gnucap/
  • http://gnucap.org/dokuwiki/doku.php?id=gnucap:start
  • http://www.gnu.org/software/gnucap/gnucap-man.pdf
  • https://www.johannes-bauer.com/electronics/gnucap/
  • https://directory.fsf.org/wiki/Gnucap
  • http://thoughtmountain.com/gnucap_demo.html
2. ngspice

Loại phần mềm: Mô phỏng mạch

Mô tả: ngspice là trình mô phỏng mạch mixed-signal và mixed-level. Mã nguồn của phần mềm này dựa trên 3 gói phần mềm mã nguồn mở là Spice3f5, Cider1b1 và Xspice.

Link cài đặt và tham khảo:
  • http://ngspice.sourceforge.net/index.html
  • http://www.ngspice.com/
ngspice

3. Qucs

Loại phần mềm: Mô phỏng mạch

Mô tả Qucs, viết tắt của Quite Universal Circuit Simulator, là một rình mô phỏng mạch tích hợp. Phân mềm cho phép thực hiện một mạch với giao diện đồ họa và mô phỏng tín hiệu lớn, tín hiệu nhỏ và nhiễu trong mạch.

Link cài đặt và tham khảo:
  • http://qucs.sourceforge.net/
Giao diện Qucs
3. IRSIM

Loại phần mềm: Mô phỏng mạch

Mô tả: IRSIM là trình mô phỏng mạch mức switch. Nó coi các transistor như các switch. Nó sử dụng hằng số RC để dự đoán thời gian tương đối của các sự kiện. 

Link download và tham khảo:
  • http://opencircuitdesign.com/irsim/download.html
  • http://opencircuitdesign.com/irsim/
HIển thị đồ họa analyzer trong IRSIM
4. Icarus Verilog

Loại phần mềm: Mô phỏng và tổng hợp

Mô tả: Icarus Verilog là phần mềm mô phỏng và tổng hợp tương thích với RTL code Verilog IEEE-1364.

Link download và tham khảo:
  • http://mac.softpedia.com/get/Math-Scientific/Icarus-Verilog.shtml
  • http://iverilog.icarus.com/
  • http://courses.cecs.anu.edu.au/courses/ENGN3213/Documents/VERILOG/iverilog_NOOR.pdf
  • http://www.swarthmore.edu/NatSci/mzucker1/e15/iverilog-instructions.html
5. Verilator

Loại phần mềm: Mô phỏng

Mô tả: Verilator được giới thiệu là phần mềm mô phỏng miễn phí Verilog HDL nhanh nhất. Nó có thể biên dịch được code Verilog khả tổng hợp, một số PSL, SystemVerrilog và các assertion tổng hợp trong C++ hoặc System C. Phần mềm được viết để sử dụng cho các dự án lớn cần tốc độ mô phỏng nhanh.

Link download và tham khảo:
  • https://www.veripool.org/wiki/verilator/Installing
  • http://www.lowrisc.org/docs/untether-v0.2/verilator/
6. GHDL

Loại phần mềm: Biên dịch (compiler) và mô phỏng

Mô tả: GHDL là từ viết tắt của G Hardware Design Language. GHDL là một trình biên dịch VHDL, khồng phải là một trình tổng hợp (synthesis) tạo ra file netlist. Tuy gọi là trình biên dịch vì GHDL biên dịch RTL code viết bằng VHDL thành mã máy sử dụng gcc mà không thông quan ngôn ngữ trung gian như C hay C++ nên có thời gian biên dịch và phân tích nhanh hơn. Bạn có thể biên dịch thiết kế cùng với testbench để tạo ra file VCD và có thể sử dụng các phần mềm khác để xem dạng sóng như GTKwave.

Link download và tham khảo:

  • http://ghdl.free.fr/
  • https://www.youtube.com/watch?v=vLQqhN8cBo0
GHDL

7. ChipVault


Loại phần mềm: Biên dịch và tổng hợp

Mô tả: Là một chương trình phát triển chip trên ngôn ngữ VHDL và Verilog. ChipVault hiển thị thiết kế theo cấu trúc thứ bậc  ChipVault cung cấp chuỗi thực hiện các tác vụ từ dưới lên như khởi chạy các trình biên dịch RTL, tổng hợp, tạo khối và instance, và hỗ trợ kiểm soát thiết kế.

Link download và tham khảo:

  • http://freecode.com/projects/chipvault
  • http://chipvault.sourceforge.net/
ChipVault
8. GTKwave


Loại phần mềm: Xem dạng sóng

Mô tả: Là một chương trình đọc được các định dạng file  LXT, LXT2, VZT, FST, GHW và VCD/EVCD để hiển thị.

Link download và tham khảo:

  • http://gtkwave.sourceforge.net/
  • http://iverilog.wikia.com/wiki/GTKWAVE
  • http://www.ic.unicamp.br/~ducatte/mc542/Docs/gtkwave.pdf
GTKwave

8. Gwave

Loại phần mềm: Xem dạng sóng

Mô tả: Gwave là phần mềm đọc dữ liệu tương tự như ngõ ra của trình mô phỏng Spice. Gwave đọc các file "raw" của các phần mềm spice2G6, spice3F5 hoặc ngspice.

Link download và tham khảo:

  • http://gwave.sourceforge.net/
  • https://sourceforge.net/projects/gwave/

Gwave
9. Alliance

Loại phần mềm: Thực thi đầy đủ luồng thiết kế trên ngôn ngữ VHDL (biên dịch, mô phỏng, tổng hợp, tạo macro-cell, Place and Route, ...)

Mô tả: Alliance là một bộ công cụ CAD miễn phí và các thư viện có sẵn cho thiết kế VLSI. Nó bao gồm trình biên dịch VHDL và trình mô phỏng, các công cụ tổng hợp logic, Place and Route. Bộ thư viện CMOS được cung cấp sẵn. Alliance là kết quả nỗ lực trong mười hai năm của khoa SoC, phòng thí nghiệm LIP6, Đại học Pierre & Marie Curie (Paris VI, Pháp). Alliance đã được sử dụng cho các dự án vi xử lý superscalar StaCS có mật độ 875000 transistor và sự án chip Router IEEE Gigabit HSL có mật độ 400000.

Alliance là phần mềm miễn phí. Các tập tin nhị phân, mã nguồn và các thư viện cell được miễn phí theo license GNU (GNU General Public License). Bạn có thể sử dụng gói phần mềm ngay cả đối với thiết kế thương mại mà không có bất kỳ khoản phí.

Link download và tham khảo (nếu là trang web tiếng Pháp, bạn hãy chuyển sang chế độ tiếng Anh để tham khảo):
  • https://www-soc.lip6.fr/en/team-cian/softwares/alliance/
  • https://github.com/clothbot/Alliance-VLSI-CAD-System
  • ftp://ftp.gwdg.de/pub/misc/opencores/cores/usbhost/alliance.shtml
  • https://ashwith.wordpress.com/2011/02/07/vhdl-in-alliance-behavioral-simulations/
Alliance
10. Electric

Loại phần mềm: Thiết kế mạch số, analog, layout và nhiều thứ hay ho khác

Mô tả: Electric là phần mềm mã nguồn mở cho phép thực hiện nhiều dạng thiết kế mạch khác nhau. Một số khả năng của tool này là Custom IC Layout, thiết kế mạch số/tương tự dạng schematic, tổng hợp biên dịch VHDL, Verilog, ... Rất nhiều dự án nghiên cứu đã dùng phần mềm này (tham khảo link sau: http://www.staticfreesoft.com/electricGallery.html)

Bảng tổng hợp các thành phần của Electric

Link download và tham khảo:

  • http://www.staticfreesoft.com/
Electric
11. Magic

Loại phần mềm: Layout

Mô tả: Magic là một công cụ layout VLSI được viết bởi John Ousterhout năm 1980 tại Berkeley, hiện nay nó nổi tiếng cho việc viết ngôn ngữ TCL. Magic được dùng phổ biến ở các trường đại học và các công ty nhỏ. Magic vẫn dùng rộng rãi như một công cụ trung gian giúp layout dễ dàng nhất, trước khi dùng các công cụ thương mại để thiết kế sản phẩm.
Magic phiên bản 8.1 là phiên bản chính thức phát hành hiện tại .

Link download và tham khảo:

  • http://opencircuitdesign.com/magic/index.html
Magic





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

[Verilog] Các cách mô tả một mạch tổ hợp với ngôn ngữ Verilog

Nội dung bài này đưa ra các cách khác nhau có thể sử dụng để mô tả một mạch tổ hợp sử dụng Verilog HDL.

Mạch tổ hợp hình 1 sẽ được sử dụng để minh họa các cách khác nhau được sử dụng để cùng mô tả một mạch tổ hợp. Mạch này là mạch tạo ngõ ra GS cho bộ mã hóa ưu tiên 8 bit. Xem thêm bài "Làm thế nào để mô tả mạch tổ hợp bằng ngôn ngữ Verilog" để biết thêm chi tiết.

Hình 1. Mạch tổ hợp tạo ngõ ra GS (Group Select) cho bộ mã hóa ưu tiên 8 bit

1. Sử dụng phát biểu assign

Phát biểu assign là một trong những từ khóa được sử dụng phổ biến hàng đầu trong ngôn ngữ Verilog HDL để mô tả mạch tổ hợp. Thông qua việc kết hợp với các toán tử khác, phát biểu assign  trở nên linh hoạt trong việc mô tả loại mạch này.
Hình 2. Các toán tử trong ngôn ngữ Verilog
Với mạch hình 1, chúng ta có thể mô tả bằng assign như sau:

assign GS   = Ein? (|D[7:0]): 0;

Cũng có thể chia mô tả trên thành mạch OR và mạch MUX riêng để có cách mô tả tương đương như sau:

assign GS      = Ein? or_out: 0;
assign or_out = |D[7:0];
Mạch MUX có thể thay thế tương đương với một cổng AND như sau:

assign GS   = Ein & (|D[7:0]);
2. Sử dụng cấu trúc always

Cấu trúc always cũng là một trong những cấu trúc có tần suất sử dụng nhiều nhất. Có thể sử dụng thay thế tương đương cho phát biểu assign trong mô tả mạch tổ hợp. Nó có thể kết hợp thêm với các phát biểu điều kiện (if-else-if), phát biểu case (case/casez/casex), ... làm RTL code trở nên dễ đọc và hiểu hơn.

Việc thay thế tương đương giữa always và assign như sau:

always @ (*) begin
  GS   = Ein & (|D[7:0]);
end

hoặc

always @ (*) begin
  GS      = Ein? or_out: 0;
  or_out  = |D[7:0];
end
hoặc

always @ (*) begin
  GS   = Ein & (|D[7:0]);
end

Tuy nhiên cần lưu ý, kiểu dữ liệu của GS và or_out trong phát biểu assign và cấu trúc always là khác nhau. Sử dụng assign, chúng được khai báo kiểu wire. Sử dụng always, chúng được khai báo kiểu reg.

Sử dụng always kết hợp với if-else-if:

always @ (*) begin
  if (Ein) GS = |D[7:0];
  else GS = 0;
end
Sử dụng always kết hợp với case:

always @ (*) begin
  case (Ein)
    1'b1: GS = |D[7:0];
default: GS = 0;
  endcase
end
3. Sử dụng function

Từ khóa function là một dạng khác so với assign và always. Mạch được mô tả bởi function sẽ không được tổng hợp nếu không được gọi. Việc sử dụng function cần 2 bước:
  1. Tạo (khai báo) function là để tạo một mô tả mạch chức năng
  2. Gọi function là để sử dụng hoặc tạo ra mạch chức năng mong muốn khi chạy mô phỏng hoặc tổng hợp. Function được gọi thông qua các phát biểu khác như assign hay always.
Đối với mạch hình 1, chúng ta có thể tạo function như sau:


function group_select;
  input enable;
  input [7:0] data_in;

  group_select   = enable & (|data_in[7:0]);
endfunction
hoặc:
function group_select;
  input enable;
  input [7:0] data_in;

  if (enable) group_select = |data_in[7:0];
  else group_select = 0;
endfunction

Để sử dụng function đã tạo ra, việc gọi function có thể thực hiện như sau:

assign GS = group_select(Ein, D[7:0]);

hoặc:
always @ (*) begin
  GS = group_select(Ein, D[7:0]);
end
Tuy nhiên, function sử dụng chủ yếu cho việc mô tả các mạch có cấu trúc cố định nhưng mạch này được sử dụng lặp lại nhiều lần trong một thiết kế. Điều này được minh họa trên mạch tạo Q[2:0] trong bộ mã hóa ưu tiên 8 bit.

Hình 3. Mạch tạo ngõ ra trong bộ mã hóa ưu tiên 8 bit
Mạch này sử dụng nhiều bộ MUX 2 ngõ vào, mỗi ngõ vào 3 bit. Bộ MUX này được tạo bằng function như sau:
function [2:0] mux2;
  input sel;
  input [2:0] in1;
  input [2:0] in2;

  mux2 = sel? in1: in2;
endfunction
Mạch hình 3 sẽ được mô tả bằng cách gọi function trên như sau:
assign Q[2:0]     = mux2(Ein,  out_7,  3'b000);
assign out_7[2:0] = mux2(D[7], 3'b111, out_6);
assign out_6[2:0] = mux2(D[6], 3'b110, out_5);
assign out_5[2:0] = mux2(D[5], 3'b101, out_4);
assign out_4[2:0] = mux2(D[4], 3'b100, out_3);
assign out_3[2:0] = mux2(D[3], 3'b011, out_2);
assign out_2[2:0] = mux2(D[2], 3'b010, out_1);
assign out_1[2:0] = mux2(D[1], 3'b001, 3'b000);

4. Sử dụng các thành phần xây dựng sẵn

Những thành phần xây dựng sẵn trong Verilog, gọi là built-in primitive, chứa các cổng được xây dựng sẵn, gọi là built-in gate. Các cổng xây dựng sẵn này được gọi và sử dụng tương tự như việc gọi một module có sẵn.

Hình 4. Các cổng xây dựng sẵn (built-in gate) có thể tổng hợp được trong Verilog 
Để mô tả một mạch tổ hợp bằng cách sử dụng các cổng này thì tất cả các ngõ ra cần phải đưa về dạng biểu thức boolean hoặc các mạch nguyên lý phải ở dưới dạng các cổng cơ bản như liệt kê trong hình 4.
Như đã trình bày, MUX trong mạch hình 1 có thể thay bằng cổng AND như hình sau.

Hình 5. Mạch nguyên lý tương đương của hình 1
Như vậy GS có thể được mô tả bằng các built-in gate như sau:
and and_gate (GS, Ein, or_out);
or  or_gate  (or_out, D[7], D[6], D[5], D[4], D[3], D[2], D[1], D[0]);
Chú ý, and và or là loại built-in gate có n ngõ vào.

5. Sử dụng các standard cell của thư viện tổng hợp

Thư viện tổng hợp sẽ chứa các cell chuẩn (standard cell) được sử dụng để biên dịch RTL code thành file netlist. File netlist chứa kết nối của các cell chuẩn của thư viện.

Ở đây, tôi sử dụng thư viện cell chuẩn 180um của TSMC để minh họa, các bạn có thể tìm và download dễ dàng tài liệu mô tả về thư viện này "TSMC 0.18µm Process 1.8-Volt SAGE-XTM Standard Cell Library Databook".

Các họ cell được chọn để mô tả cho mạch hình 1 là  MX2, OR4 và OR2. Gọi là họ cell vì mỗi tên này đại diện cho một nhóm cell có cùng chức năng nhưng có khả năng lái tải ngõ ra (Driver strength) khác nhau.

Hình 5. Các họ cell chuẩn được chọn để mô tả RTL code
Mạch hình 1 sẽ được biến đổi thành mạch dưới đây để có thể sử dụng các họ cell đã nói.

Hình 7. Biến đổi lại mạch nguyên lý hình 1
RTL code của GS sử dụng các cell chuẩn như sau:
MX2X2 mux_gate  (.Y(GS), .S0(Ein), .A(1'b0), .B(or_out));
OR2X2 or2_gate  (.Y.(or_out), .A(or4_1), .B(or4_2));
OR4X2 or4_gate1 (.Y(or4_1), .A(D[7]), .B(D[6]), .C(D[5]), .D(D[4]));
OR4X2 or4_gate2 (.Y(or4_2), .A(D[3]), .B(D[2]), .C(D[1]), .D(D[0]));
Chú ý, nếu sử dụng cách này RTL code sẽ chỉ tổng hợp được trên thư viện cố định có chứa các cell đã chọn. Việc mô phỏng chức năng (function) mạch ở mức RTL code độc lập với thư viện tổng hợp cũng thể thực hiện được.

6. Cách mô tả tổng hợp

Cách mô tả tổng hợp là sử dụng kết hợp linh hoạt các cách đã trình bày trên đây để tạo ra một RTL code đúng chức năng yêu cầu, tổng hợp được, dễ đọc và dễ debug.

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.