• 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

    Vi mạch và Ứng dụng

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

    Vi mạch và Ứng dụng

Thứ Bảy, 16 tháng 9, 2017

[Basic Knowledge][Bài 2] Hướng dẫn phân tích thiết kế lõi IP step-by-step - Tìm tín hiệu giao tiếp giữa các khối chức năng

Bạn đang muốn bắt tay vào thiết kế một lõi IP (IP core) nhưng không biết bắt đầu từ đâu? Bài viết này là một phần trong chuỗi bài viết hướng dẫn bạn đi từng bước để có thể thiết kế được một lõi IP hoàn chỉnh. Phương pháp được sử dụng ở đây là top-down, phân tích từ tổng quan đến chi tiết. Ví dụ được trình bày là một thiết kế CPU cơ bản (simple CPU).

Trong bài 1 chúng ta đã thực hiện qua 2 trong 5 bước phân tích thiết kế một lõi IP. Trong bài 2, chúng ta sẽ thực hiện phân tích chi tiết từng mạch nguyên lý của một lõi IP để tạo ra bản thiết kế hoàn chỉnh.

1. Lý thuyết về phân tích chi tiết thiết kế
1.1 Hướng dẫn

Phân tích chi tiết là bước mô tả cụ thể mạch nguyên lý, cấu trúc, hoạt động và tín hiệu giao tiếp của từng khối chức năng đã được phân tích trong bước phân tích tổng quan.

Mục đích của phân tích chi tiết là tạo ra bản mô tả chi tiết của tất cả các thành phần thiết kế. Bản mô tả này sẽ được sử dụng để viết RTL code cho thiết kế. Mức độ chi tiết của bản mô tả là phải đủ để một kỹ sư khác, người không thực hiện bản thiết kế này, có thể vẫn mô tả được RTL code mà không cần hiểu rõ chi tiết thiết kế.
    Cách thức thực hiện gồm 2 bước chính:
    1. Xác định các tín hiệu giao tiếp (chân, port) giữa các khối để cụ thể hóa từng tín hiệu giao tiếp với tên tín hiệu, chức năng, độ rộng, mức tích cực.
    2. Phân tích chi tiết từng ngõ ra của từng khối theo các tín hiệu ngõ vào. Bước này là tìm mối liên hệ giữa ngõ ra với các tín hiệu ngõ vào.
    Xác định các tín hiệu giao tiếp (chân, port) giữa các khối

    Sau khi phân chia khối chức năng trong bước "phân tích tổng quan", hai thông tin quan trọng có được là:
    1. Chức năng cơ bản của một khối.
    2. Mối liên hệ cơ bản giữa các khối cho biết khối nào cần nối đến khối nào và để làm gì?
    Ví dụ, quay lại ví dụ về CPU 8 bit SCPU, khối PC là khối có chức năng tính toán giá trị PC truy xuất bộ nhớ chương trình. Trong khi đó, khối memory chính là bộ nhớ chương trình nên khối PC cần được kết nối đến khối memory để cung cấp thông tin địa chỉ truy xuất bộ nhớ.

    Tuy nhiên, sơ đồ khối chưa cung cấp cụ thể số số lượng và chức năng các tín hiệu giao tiếp cần phải có nên trước khi phân tích mạch nguyên lý cho một khối, các tín hiệu giao tiếp này cần được xác định.

    Việc xác định tín hiệu giao tiếp giữa các khối căn cứ chính dựa trên chức năng cơ bản của khối. Hai vấn đề cần được giải đáp khi xác định các tín hiệu giao tiêp giữa các khối là "Thông tin cần phải có để thực hiện chức năng là gì?" và "thông tin này lấy từ đâu?".

    Tên một tín hiệu nên được đặt như sau:
    <tên khối nguồn>_<chức năng>_<*>
    Trong đó:
    • Tên khối nguồn: là ký hiệu viết tắt hoặc tên của khối tạo ra tín hiệu này. Nhờ thông tin này, chúng ta sẽ biết tín hiệu này được tạo ra ở đâu. Ví dụ: dc - decode, ex - execute, fectch,....
    • Chức năng: ký hiệu viết tắt thể gợi nhớ chức năng của. Ví dụ: wr - write, rd - read, ....
    • *: kí hiệu cung cấp thông tin khác. Ví dụ: n - tích cực mức thấp, reg - tín hiệu là ngõ ra FF, ...
    Phân tích chi tiết từng ngõ ra của từng khối


    Một phân tích chi tiết có thể sử dụng nhiều hình thức thể hiện khác nhau như:
    • Mạch nguyên lý chi tiết tới mức cổng (Logic gate schematic)
    • Máy trạng thái hữu hạn FSM (Finite State Machine)
    • Bảng sự thật (Truth table)
    • Biểu thức (expression)
    • Sơ đồ định thời (Timing diagram)
    • Đoạn văn (Description text)
    **Chú ý: Việc phân tich thiết kế nói chung và phân tích chi tiết nói riêng không đảm bảo đúng 100% ngay từ đầu mà trong quá trình thực hiện công việc này có thể phải lặp lại nhiều lần để sửa lỗi và hoàn thiện thiết kế. Tuy nhiên, việc phân tích càng kỹ và chi tiết sẽ giúp việc chỉnh sửa thiết kế dễ dàng và nhanh chóng hơn khi có vấn đề phát sinh.

    1.2 Minh họa các hình thức thể hiện khác nhau khi phân tích chi tiết

    Để minh họa các hình thức thể hiện khi phân tích chi tiết, chúng ta thực hiện ví dụ đơn giản là "Thiết kế bộ phát hiện số chẵn bit 1 trong chuỗi dữ liệu nối tiếp đồng bộ theo xung clock". Bộ này tên E1_CHK có các tín hiệu giao tiếp như sau:
    1. clk: xung clock đồng bộ
    2. rst_n: tín hiệu reset đồng bộ tích cực mức 0
    3. s_in: dữ liệu ngõ vào nối tiếp đồng bộ theo clk
    4. chk_even: tín hiệu báo phát hiện số bit 1 là chẵn, tích cực mức 1

    Hình 1. Sơ đồ tín hiệu giao tiếp của bộ phát hiện số chẵn bit 1
    Biểu diễn mạch nguyên lý của E1_CH như sau:
    Hình 2. Mạch nguyên lý của bộ phát hiện số chẵn bit 1
    Sau khi reset, có 0 số bit 1, chk_even=1. Cứ mỗi lần phát hiện 1 bit 1 thì chk_even sẽ đảo giá trị vì số bit 1 sẽ đổi từ chẵn qua lẻ hoặc từ lẻ qua chẵn xen kẽ

    Biểu diễn dưới dạng FSM như sau:
    Hình 3. FSM phát hiện số bit 1 chẵn
    FSM chỉ có 2 trạng thái EVEN và ODD được chuyển qua lại khi ngõ vào s_in=1. Tín hiệu chk_even=1 khi FSM trong trạng thái EVEN.

    Biểu diễn dưới dạng bảng sự thật như sau:


    Hình 4. Bảng sự thật của thiết kế E1_CHK
    Bảng sự thật mô tả hoạt động của E1_CHK theo cạnh clk và các giá trị ngõ vào. "No change" nghĩa là giá trị chk_even giữ nguyên giá trị mà nó đang giữ trước đó.

    Biểu diễn dưới dạng một sơ đồ định thời như sau:
    Hình 5. Một sơ đồ định thời của thiết kế E1_CHK


    Sơ đồ định thời mô tả các trường hợp:
    • Bắt đầu tại thời điểm 0, chưa có xung clk, giá trị các tín hiệu là don't care. Ngõ vào rst_n và s_in không ảnh hưởng đến ngõ ra. Ngõ ra chk_even mang giá trị tùy định, không biết trước mức logic.
    • Tại thời điểm 1, cạnh xung clock đầu tiên, rst_n=0, không quan tâm giá trị s_in, ngõ ra chk_even được reset về "1"
    • Tại thời điểm 2, rst_n=1, lúc này s_in được xét đến và s_in=0, ngõ ra chk_even không thay đổi giá trị
    • Tại thời điểm 3, rst_n=1, s_in=1, ngõ ra chk_even từ "1" chuyển sang "0"
    • Tại thời điểm 4, rst_n=1, s_in=0, ngõ ra chk_even giữ gí trị "0" trước đó
    • Tại thời điểm 5, rst_n=1, s_in=1, ngõ ra chk_even từ "0" chuyển sang "1"
    • Tại thời điểm 6, rst_n=1, s_in=1, ngõ ra chk_even từ "1" chuyển sang "0"
    Với mô tả định thời trên, chúng ta thấy ngõ ra chk_even đảo giá trị mỗi khi s_in=1 và không đang reset, rst_n=1.

    Mô tả bằng biểu thức là cách dùng biểu thức Boolean hoặc biểu thức đại số (cộng, trừ, nhân, chia, ...) để mô tả các phần mạch tổ hợp. Một mô tả bằng biểu thức của E1_CHK như sau:

    chk_even_next = /rst_n + rst_n./s_in.chk_even + rst_n.s_in./chk_even

    Hình 6. Mô tả phần mạch tổ hợp của E1_CHK bằng biểu thức
    Biểu thức trên đây được được suy ra từ bảng sự thật sau sử dụng phương pháp tổng các tích SOP (Sum of Product).
    Hình 7. Bảng sự thật để suy ra biểu thức chk_even_next

    Mạch nguyên lý tương đương của biểu diễn biểu thức trên như sau:
    Hình 8. Mạch nguyên lý tương đương của biểu thức hình 6

    Mô tả bằng đoạn văn (description text) là cách dùng câu văn mô tả từng điều kiện, trường hợp hoạt động của thiết kế. Cách này chỉ nên áp dụng để chú thích cho những trường hợp cần được chú ý đặc biệt để nhấn mạnh hoặc một thiết kế nhỏ. Đối với các thiết kế phức tạp, việc chỉ sử dụng câu chữ để mô tả một bản thiết kế sẽ không trực quan, thậm chí khó hiểu. Với ví dụ trên, một cách mô tả bằng text như sau:
    • Nếu không có xung clk, giá trị các tín hiệu là don't care (không quan tâm đến mức logic của các tín hiệu
    • Thiết kế hoạt động theo cạnh lên xung clock
    • Tại cạnh lên xung clock, nếu rst_n=0, ngõ ra chk_even luôn được reset về "1"
    • Tại cạnh lên xung clock, nếu rst_n=1, s_in=0 ngõ ra chk_even giữ nguyên giá trị trước đó
    • Tại cạnh lên xung clock, nếu rst_n=1, s_in=1 ngõ ra chk_even sẽ đảo giá trị.
    Trong tất cả các cách thể hiện trên, việc mô tả mạch bằng mạch nguyên lý và FSM được sử dụng nhiều vì cách thể hiện trực quan và dễ dàng cho việc mô tả RTL code sau này. Khi mô phỏng và kiểm tra, việc debug thiết kế cũng trở nên dễ hơn.
    Mô tả bừng sơ đồ định thời thường dùng để mô tả hoạt động của các giao tiếp hoặc minh họa hoạt động của một số tín hiệu yêu cầu đặt biệt về định thời.
    Mô tả bằng bẳng sự thật cũng hay sử dụng trong trường hợp mạch đơn giản và số đầu vào ít. Nếu số đầu vào quá nhiều, khoảng hơn 10 input, thì biểu diễn bảng sự thật hoặc biểu thức sẽ phức tạp và khó đọc hiểu.
    Mô tả bằng đoạn văn thì thường dùng để chú thích các trường hợp đặc biệt. Ví dụ, trong một thiết kế, tất cả các thanh ghi được reset đều có giá trị 0 nhưng một vài thanh ghi đặc biệt được reset đến 1 giá trị khác 0 thì việc chú thích thêm là cần thiết để lưu ý.

    2. Phân tích chi tiết cho ví dụ CPU 8 bit SCPU
    Trước khi tham khảo phần phân tích chi tiết cho CPU 8 bit, bạn đọc đọc cần lưu ý là thiết kế này sẽ được thực hiện sẽ áp dụng đúng như các bước hướng dẫn để thực hiện. Nghĩa là, tác giả thực hiện như thế nào thì sẽ mô tả chính xác lại như vậy và không đưa ngay một kết quả đúng hoàn toàn ngay từ đầu. Sau bước này, chúng ta còn thực hiện mô tả RTL code và mô phỏng cơ bản để kiểm tra để sửa những lỗi phát sinh nếu có. Mục đích, bạn đọc có thể tham khảo cách làm, đánh giá và áp dụng.

    Ở bài trước, chúng ta đã phân tích sơ đồ khối cho thiết kế SCPU như hình sau. Công việc tiếp theo là từng bước chi tiết hóa sơ đồ nguyên lý và mô tả cho từng khối chức năng trong sơ đồ này.

    Hình 9. Sơ đồ khối lõi CPU 8 bit SCPU
    Cấu trúc từng lênh như sau:
    Hình 10. Cấu trúc các lệnh của CPU 8 bit SCPU
    Tuy đã có sơ đồ khối và cấu trúc mã lệnh nhưng việc bắt đầu từ đâu cũng sẽ là khó trả lời đối với các bạn mới bắt đầu. Chúng ta có 3 khối Fetch, Decoder và Execute. Như đã trình bày, đầu tiên, các tín hiệu giao tiếp cơ bản giữa các khối cần được xác định. Sau đó, cấu trúc chi tiết từng khối sẽ được phân tích. Tuy nhiên ở đây, hai vấn đề sau sẽ được tìm hiểu trước:
    1. Giao tiếp bộ nhớ, đọc và ghi, memory như thế nào?
    2. Các lệnh hoạt động như thế nào khi đi qua từng khối Fetch, Decoder, Execute?
    Bạn có thể thắc mắc, tạo sao biết tìm hiểu hai vấn đề trên trước mà không bắt tay vô phân tích luôn từng khối Fetch, Decoder và Execute như đã hướng dẫn? Câu trả lời là bạn có thể bắt tay luôn vào phân tích mà không cần tìm hiểu trước hai phần trên. Trong quá trình phân tích bạn cũng sẽ đụng phải hai vấn đề trên và lúc đó, bạn sẽ bắt đầu giải quyết nó. Bạn có thể nhận thấy, việc bắt đầu phân tích từ đâu? như thế nào? là khác nhau tùy vào kinh nghiệm và cách nhìn vấn đề của mỗi người thiết kế. Một điểm chung duy nhất giữa những người thiết kế là tìm cách đáp ứng tốt nhất yêu cầu đặt ra.

    2.1 Phân tích phần giao tiếp với bộ nhớ

    Đầu tiên, chúng ta xác định xem lệnh được lưu trong bộ nhớ như thế nào? Trong thiết kế này, chúng ta sử dụng bộ nhớ có dung lượng 256 byte, mỗi ô nhớ là 8 bit. Trong khi đó, mã lệnh có độ dài 16 bit. Như vậy, một mã lệnh sẽ được chia làm 2 phần là 8 bit MSB (bit 15 đến 8) và 8 bit LSB (bit 7 đến 0) để lưu trong 2 ô nhớ.
    Quan sát mã lệnh, các bạn sẽ thấy có 2 nhóm lệnh là nhóm có IMM và nhóm không có IMM. Nhóm có IMM làm nhóm bắt buộc phải dùng 2 ô nhớ liên tiếp nhau để lưu mã lệnh. Nhóm không có IMM thì chỉ cần 1 ô nhớ để lưu 8 bit MSB vì 8 bit LSB không sử dụng.
    Hình 11. Cách lưu mã lệnh trong bộ nhớ
    Giả sử rằng bộ nhớ hoạt động trong 1 chu kỳ xung clock clk. Nghĩa là, khi một lệnh đọc/ghi được đưa đến bộ nhớ ở một cạnh lên xung clock thì ngay cạnh lên xung clock tiếp theo bộ nhớ đã thực hiện xong.
    Hình 12. Sơ đồ tín hiệu giao tiếp và định thời của bộ nhớ
    Lưu ý, đây chỉ là một ví dụ về mô hình bộ nhớ sẽ sử dụng. Bạn hoàn toàn có thể sử dụng mô hình bộ nhớ khác. Tuy nhiên, việc thay đổi memory có thể ảnh hưởng đến cấu trúc chi tiết từng khối.

    2.2 Phân tích hoạt động của các lệnh

    Đối với CPU việc phân tích hoạt động của từng lệnh nhằm mục đích trả lời các câu hỏi sau:
    1. Lệnh sẽ được xử lý như thế nào trong CPU?
    2. Lệnh sẽ tác động đến phần nào trong CPU?
    3. Lệnh đó hoạt động trong mấy chu kỳ xung clock?
    Trong thiết kế CPU, việc tìm hiểu này gọi là là phân tích đường dữ liệu (datapath) của từng lệnh. Như đã trình bày ở trên, chúng ta có 2 nhóm lệnh chính là nhóm có IMM (2 byte) và nhóm không có IMM (1 byte). Nhóm 2 byte phải đọc bộ nhớ 2 lần mới thực thi xong một lệnh. Nhóm 1 byte chỉ cần đọc bộ nhớ 1 lần nên nhóm 2 byte sẽ tốn nhiều chu kỳ xung clock clk hơn để thực hiện 1 lệnh.
    Hình 13. Bảng phân tích chu kỳ hoạt động của từng lện
    Chu kỳ hoạt động của các lệnh như sau:
    1. Chu kỳ 1: Các lệnh được fetch vào thanh ghi lệnh IR. Đồng thời PC tăng một đơn vị chỉ đến ô nhớ tiếp theo. Chu kỳ này áp dụng cho tất cả các lệnh. Khối FETCH hoạt động trong chu kỳ này.
      1. Lệnh NOP là lệnh không thực thi tác vụ nào sẽ được kết thúc trong chu kỳ này.
    2. Chu kỳ 2: Lệnh đã có trong IR được giải mã để tạo ra các tín hiệu điều khiển, khối DECODER hoạt động. Đồng thời:
      1. Lệnh được thực thi nếu là lệnh 1 byte, khối EXCUTE hoạt động
      2. Đọc bộ nhớ lưu giá trị IMM vào thanh ghi DR nếu là lệnh 2 byte
    3. Chu kỳ 3: Thực thi lệnh 2 byte cập nhật giá trị PC mới, khối FETCH hoạt động vì khối này chứa PC.
    2.3 Phân tích các tín hiệu giao tiếp cơ bản giữa các khối

    Việc hiểu rõ giao tiếp bộ nhớ và hoạt động từng lệnh sẽ giúp việc phân tích các tín hiệu giao tiếp dễ dàng hơn. Để xác định tín hiệu giao tiếp, chúng ta lần lượt tìm tín hiệu ngõ vào của từng khối bằng cách trả lời 2 câu hỏi sau:
    1. Chức năng này cần thông tin nào?
    2. Thông tin được lấy từ đâu?
    Chúng ta chỉ cần tập trung xác định tín hiệu ngõ vào. Tín hiệu ngõ ra của một khối chính là tín hiệu ngõ vào mà khối khác yêu cầu.
    Quy định chung, các tín hiệu điều khiển đều tích cực mức 1 trừ khi có chú thích khác.
    Ở thiết kế này, chúng ta có 3 khối chính FETCH, DECODER và EXECUTE. Chúng ta sẽ thực hiện lần lượt cho từng khối theo thứ tự đã liệt kê. Lưu ý, bạn có thể bắt đầu với bất kỳ khối nào, không cần phải theo thứ tự này.

    Tìm tín hiệu ngõ vào khối FETCH

    Khối FETCH chứa các khối con là MEMORY, PC, DR và IR. Các chức năng chính của khối này là:
    1. Tính toán PC
    2. Truy cập MEMORY
    3. Cập nhật DR
    4. Cập nhật IR
    Với chức năng tính toán PC, chúng ta sẽ thực hiện như sau:
      1. Chức năng "tính toán PC" cần thông tin nào?
        1. PC là một thanh ghi => Cần xung clock clk
        2. PC cần reset về đầu chương trình để chạy => Cần tín hiệu reset
        3. PC cần được cập nhật giá trị => Cần tín hiệu cho biết khi nào PC cập nhật giá trị
        4. PC sẽ cập nhật giá trị giá trị như sau:
          1. PC tự tăng giá trị lên 1 đơn vị => không cần tín hiệu ngoài
          2. PC có thể lấy giá trị từ IMM được lưu trong thanh ghi DR ở các lệnh JEQ, JNE, JGT, JLT, JMP => DR chứa trong FETCH nên không cần tín hiệu ngoài
        5. Do PC nhận 2 đầu vào, tự tăng hoặc từ DR, nên cần có tín hiệu để chọn giá trị PC sẽ được cập nhật
      2. Thông tin trên lấy từ đâu?
        1. Xung clock clk: Được cấp từ ngoài CPU
        2. Tín hiệu reset rst_n: Được cấp từ ngoài CPU
        3. Tín hiệu cập nhật PC: Được cấp từ khối DECODER vì khối này giải mã lệnh sẽ biết lệnh đó là lệnh nào và thực hiện mấy chu kỳ => đặt tên dc_load_pc
        4. Tín hiệu lựa chọn giá trị PC sẽ được cập nhật: Được cấp từ khối DECODER vì khối này giải mã lệnh sẽ biết lệnh đó là lệnh nào => đặt tên dc_imm
      Với chức năng truy cập MEMORY, chúng ta thực hiện như sau:
      1. Chức năng "truy cập MEMORY" cân thông tin nào?
        1. MEMORY là bộ nhớ đồng bộ => cần xung clock clk
        2. MEMORY cần thông tin truy cập là đọc hay ghi => tín tín hiệu điều khiển các năng đọc/ghi
        3. MEMORY cần địa chỉ truy cập có thể là
          1. PC => không cần tín hiệu ngoài
          2. IMM được lưu trong DR đối với lệnh LI => không cần tín hiệu ngoài
          3. Địa chỉ lưu trong 1 ô nhớ của MEMORY đối với lệnh LWR, SWR, LWI hoặc SWI => cần giá trị thanh ghi Rs đối với lệnh LWR và SWR
        4. Do địa chỉ MEMORY có thể là 1 trong 3 giá trị trên nên cần tín hiệu lựa chọn giá trị đúng
        5. MEMORY cần bus dữ liệu ghi => tín hiệu bus dữ liệu ghi
      2. Thông tin trên lấy từ đâu?
        1. Xung clock clk
        2. Tín hiệu điều khiển đọc/ghi: Được cấp từ khối DECODER vì khối này giải mã lệnh sẽ biết lệnh nào đọc hay ghi bộ nhớ => đặt tên dc_mem_wr. Nếu tín hiệu này bằng 1 sẽ là tác vụ ghi MEMORY và ngược lại là đọc MEMORY
        3. Địa chỉ của MEMORY => Chỉ có giá trị thanh ghi Rs là tín hiệu ngoài cần lấy từ khối DECODER, dặt tên là dc_rs[7:0]
        4. Tín hiệu lựa chọn giá trị địa chỉ => Được cấp từ khối DECODER vì khối này giải mã lệnh sẽ biết lệnh ghi/đọc lấy giá trị địa chỉ từ đâu => đặt tên là dc_addr_sel[1:0]. Tín hiệu 2 bit vì có 3 giá trị cần được xác định
        5. Bus dữ liệu ghi => Lấy từ DECODER vì chỉ có 2 lệnh ghi vào MEMORY là SWR và SWI đều lấy giá trị Rd để ghi vào MEMORY => đặt tên là dc_rd[7:0]
      Tương tự, với chức năng cập nhật DR và IR, cả 2 chức năng này đều lấy giá trị từ MEMORY và cần một tín hiệu điều khiển để biết khi nào cập nhật IR và khi nào cập nhật DR:
      1. Tín hiệu điều khiển cập nhật giá trị IR lấy từ DECODER dc_load_ir
      2. Tín hiệu điều khiển cập nhật giá trị DR lấy từ DECODER dc_load_dr
      Hình 14. Các tín hiệu giao tiếp sau khi tìm tín hiệu ngõ vào của khối FETCH
      Tìm tín hiệu ngõ vào khối DECODER


      DECODER là khối có chức năng:
      1. Giải mã lệnh và tạo tín hiệu điều khiển các khối khác
      2. Chứa các thanh ghi R0, R1, R2 và R3
      Các bạn hãy thực hiện tương tự để tìm các tín hiệu ngõ vào. Ở đây, các tín hiệu chỉ được mô tả lại chức năng:
      1. Xung clock clk
      2. Tín hiệu reset rst_n tích cực mức thấp
      3. fetch_ir[7:0] mã lệnh lấy từ khối FETCH
      4. fetch_dr[7:0] là giá trị IMM lấy từ thanh ghi DR, khối DECODER sử dụng giá trị này để nạp cho các thanh ghi R0, R1, R2, R3 ở lệnh LI
      5. ex_dout[7:0] giá trị tính toán từ khối EXECUTE để cập nhật giá trị các thanh ghi R0, R1, R2 hoặc R3 ở lệnh AND, OR, ADD, SUB, LWR, MOV, LWI, LI.
      6. fetch_mem_dout[7:0] giá trị đọc MEMORYlấy từ khối FETCH vì lệnh LWI và LWR dữ liệu đọc từ MEMORY được lấy và lưu vào thanh ghi Rd
      Hình 15. Các tín hiệu giao tiếp sau khi tìm tín hiệu ngõ vào cho khối DECODER
      Tìm tín hiệu ngõ vào khối EXECUTE

      Khối EXECUTE thực hiện chức năng chính là tính toán số học và tạo kết quả cập nhật cho các thanh ghi R0, R1, R2 và R3. Các tín hiệu ngõ vào mà khối EXECUTE cần là:
      1. dc_rs[7:0] Giá trị thanh ghi Rs trong các lệnh tính toán
      2. dc_rd[7:0] Giá trị thanh ghi Rd trong các lệnh tính toán
      3. dc_op[1:0] Để lựa chọn phép toán sẽ thực thi là AND, OR, ADD hay SUB
      Hình 16. Sơ đồ tín hiệu giao tiếp giữa các khối sau khi tìm các tín hiệu ngõ vào cho khối EXECUTE
      Đến đây, chúng ta kết thúc bước tìm tín hiệu giao tiếp giữa các khối chức năng, một bước của phân tích chi tiết thiết kế. Bước tiếp theo sẽ là phân tích chi tiết từng khối dựa trên các tín hiệu giao tiếp trên.

      ** Mọi ý kiến đóng góp và trao đổi giúp các bài viết được hoàn thiện và chính xác hơn, bạn đọc có thể comment dưới bài viết hoặc email.