Register Transfer Logic (RTL) là ngôn ngữ mô tả luồng dữ liệu giữa các thanh ghi và cách áp dụng các phép toán logic và toán học lên dữ liệu. Kỹ sư sử dụng thiết kế RTL để mô tả các khối chức năng, từ đó xác định hành vi của một linh kiện rời rạc được sử dụng để thực hiện một chức năng cụ thể. Mỗi khối chức năng có một mô tả về các thanh ghi trong khối, được gọi là mạch tuần tự, và một mạch tổ hợp chứa phép toán logic cho khối chức năng. Họ cũng sử dụng Ngôn ngữ Mô tả Phần cứng (HDL) để mô tả cách các khối chức năng được kết nối để xác định luồng dữ liệu qua mạch.
Sức mạnh của thiết kế RTL nằm ở cách nó chia một hệ thống phức tạp thành các khối tương đối đơn giản được biểu diễn bằng mã HDL. Dưới đây là một vài khái niệm cơ bản quan trọng để hiểu cách sử dụng thiết kế RTL.
Thanh ghi (Registers)
Trong thiết kế RTL, một phần tử phần cứng có thể lưu trữ một lượng dữ liệu nhất định được gọi là thanh ghi. Chúng thường được triển khai dưới dạng D flip-flops. Giá trị của một thanh ghi có thể được đọc như đầu vào của một phép toán logic hoặc có thể được đặt làm đầu ra của một phép toán. Đặc trưng cách dữ liệu chảy giữa các thanh ghi và cách dữ liệu bị thay đổi bởi một phép toán là mục đích cơ bản của thiết kế RTL.
Ngôn ngữ Mô tả Phần cứng (HDL)
Phần quan trọng nhất của thiết kế RTL là mã mô tả hành vi của mạch. HDL là một ngôn ngữ đặc tả trông rất giống một ngôn ngữ lập trình, với các biến, lệnh gọi hàm, câu lệnh logic như if-then-else và CASE, câu lệnh Boolean và toán học. Tuy nhiên, HDL được thiết kế đặc biệt để mô tả hành vi và cấu trúc của các mạch điện tử, thường là mạch tích hợp. Một điều khiến HDL khác biệt với ngôn ngữ lập trình là khái niệm về thời gian được bao gồm trong ngôn ngữ để các hoạt động có thể được kích hoạt bởi xung nhịp trong mạch.
Điều này được thực hiện thông qua việc sử dụng một biến xác định giá trị của xung nhịp kỹ thuật số trong mạch, như trong ví dụ VHDL đơn giản sau đây về một bộ đảo ngược, trong đó đầu ra (Q) được đặt thành giá trị đầu vào (D) khi giá trị xung nhịp, clk, chuyển từ trạng thái thấp sang trạng thái cao (cạnh tăng):
D
process(clk) begin if rising_edge(clk) then Q end if; end process;
VHDL (Very High-Speed Integrated Circuit Hardware Description Language), là một ngôn ngữ dài dòng, kiểu mạnh với cú pháp không giống ngôn ngữ C. Nó là HDL được ưa thích để mô tả các thiết kế hệ thống phức tạp hơn.
Verilog hoặc phiên bản mở rộng của nó, SystemVerilog, là một HDL phổ biến khác. Nó ngắn gọn hơn, kiểu yếu và linh hoạt hơn, và cú pháp của nó trông giống mã C. Vì dễ học và tạo mô tả, các kỹ sư thích nó khi bắt đầu hoặc khi mạch của họ không quá phức tạp. IEEE định nghĩa cả Verilog và VHDL là tiêu chuẩn công nghiệp.
Dưới đây là một ví dụ đơn giản về cổng AND trong cả hai ngôn ngữ. Một cổng AND có hai đầu vào và một đầu ra. Nếu cả hai đầu vào đều bằng 1, đầu ra là 1. Nếu chúng không bằng nhau hoặc nếu cả hai đều được đặt thành 0, đầu ra là 0.
Phép toán logic
Có hai loại phép toán trong thiết kế RTL. Đầu tiên, các phép toán logic thực hiện đánh giá bit và sửa đổi dữ liệu được lưu trữ trong các thanh ghi. Các phép toán logic như AND, OR, NOT, XOR và shift được tạo bằng cách xác định hành vi logic trong HDL. Ví dụ trên cho thấy cách AND có thể được biểu diễn trong VHDL và Verilog. Các phép toán logic đại diện cho các cổng logic trong phần cứng.
Phép toán số học
Loại phép toán thứ hai trong thiết kế RTL là phép toán số học. Chúng lấy dữ liệu trong các thanh ghi và cộng, trừ, nhân và chia. Chúng được biểu diễn trong HDL bằng các toán tử toán học tiêu chuẩn. Ví dụ, cộng hai số trong VHDL sẽ sử dụng dòng:
rst
— trong đó inp1 và inp2 là hai thanh ghi đầu vào và rst được gán cho thanh ghi đầu ra. Các phép toán số học trong RTL đại diện cho các phần tử vật lý chuyên dụng như bộ cộng, bộ trừ, bộ nhân và bộ chia.
Hành động đồng bộ và không đồng bộ
Thiết kế RTL có thể thể hiện luồng dữ liệu theo cách đồng bộ hoặc không đồng bộ. Đối với đồng bộ, một chương trình con được thực thi hoặc kích hoạt bởi đầu vào xung nhịp hệ thống cho hàm. Đối với không đồng bộ, chương trình con được thực thi khi giá trị của một hoặc nhiều cổng đầu vào thay đổi theo một cách cụ thể. Điều này được thực hiện bằng cách kiểm tra các giá trị đầu vào của đầu vào xung nhịp hoặc các đầu vào không phải xung nhịp để xem liệu chúng có thay đổi bằng câu lệnh if hay không.