MODULE 4: VHDL – VIẾT “BẢN VẼ” CHO PHẦN CỨNG
Chào bạn! Chúng ta đã biết cách xây dựng “vỏ” (Entity) và “ruột” (Architecture) cho một khối mạch điện ở bài trước. Tuy nhiên, để các thành phần này kết nối và trao đổi thông tin với nhau, chúng ta cần chọn đúng “loại vật liệu” dẫn điện. Trong VHDL, đó chính là các Kiểu dữ liệu.
1. Giới thiệu
Chào mừng bạn đến với bài học về các kiểu dữ liệu trong VHDL. Trong ngôn ngữ lập trình phần mềm như C hay Python, kiểu dữ liệu (int, float, char) dùng để báo cho máy tính biết cần dành bao nhiêu ô nhớ. Nhưng trong thiết kế FPGA, đặc biệt là với chip Artix-7 XC7A100T, kiểu dữ liệu mang một ý nghĩa vật lý hoàn toàn khác: Nó quyết định số lượng dây dẫn điện.
Nếu bạn chọn kiểu dữ liệu là một bit, bạn đang tạo ra 1 sợi dây đồng đơn lẻ. Nếu bạn chọn một “vector”, bạn đang tạo ra một dải băng gồm nhiều sợi dây chạy song song. Bài học này sẽ giúp bạn làm chủ các kiểu dữ liệu tiêu chuẩn công nghiệp như std_logic và std_logic_vector. Việc hiểu rõ chúng là điều kiện tiên quyết để bạn điều khiển cùng lúc 8 đèn LED hay đọc dữ liệu từ 8 công tắc Switch trên bo mạch AIOT-ARTIX7. Hãy nhớ rằng: trong FPGA, dữ liệu không chỉ là con số, nó là dòng điện chạy trên các “xa lộ” dây dẫn mà bạn thiết kế.
2. Nội dung chính
2.1. std_logic: “Một sợi dây đơn lẻ”
Đây là kiểu dữ liệu cơ bản nhất trong thiết kế vi mạch hiện đại. Thay vì chỉ có 0 và 1, std_logic cung cấp cho bạn nhiều trạng thái thực tế hơn của dòng điện để mô phỏng chính xác các tình huống trong mạch điện tử.
Các trạng thái phổ biến nhất:
- ‘1’: Mức cao (Có điện – 3.3V trên bo mạch Artix-7).
- ‘0’: Mức thấp (Không điện – 0V/Nối đất).
- ‘Z’: Trở kháng cao (High Impedance – Dây bị ngắt kết nối hoàn toàn, giống như nhấc đầu dây ra khỏi mạch).
- ‘X’: Không xác định (Unknown – Xảy ra khi có 2 nguồn điện cùng đẩy vào 1 sợi dây, cực kỳ nguy hiểm cho chip).
Ví dụ đời sống: Hãy nghĩ về một chiếc bóng đèn duy nhất trong nhà. Nó chỉ có thể Sáng (‘1’) hoặc Tắt (‘0’).
2.2. std_logic_vector: “Dải băng dây dẫn (Bus)”
Khi bạn muốn xử lý nhiều bit cùng lúc (ví dụ số nhị phân 8-bit), việc khai báo từng sợi dây đơn lẻ sẽ rất mất thời gian và khó quản lý. std_logic_vector cho phép bạn gom chúng lại thành một bó (Bus).
- Cú pháp:
std_logic_vector(7 downto 0) có nghĩa là một bó gồm 8 sợi dây, được đánh số từ 7 xuống 0.
- Gắn với bo AIOT-ARTIX7: Bo mạch của chúng ta có 8 Switch và 8 LED. Thay vì khai báo 8 cái tên riêng lẻ, chúng ta khai báo một vector để quản lý tập trung:
SW : in std_logic_vector(7 downto 0);LED : out std_logic_vector(7 downto 0);
- Tư duy song song: Khi bạn gán giá trị cho một vector, cả 8 sợi dây sẽ đổi trạng thái cùng một lúc. Đây chính là sức mạnh của xử lý băng thông lớn trong FPGA.

Shared bus in FPGA (arbiter + peripheral bus)
2.3. Quy tắc viết mã (Syntax) cần nhớ
Để Vivado hiểu đúng ý định thiết kế của bạn, hãy tuân thủ nghiêm ngặt quy tắc sử dụng dấu nháy:
- Dùng nháy đơn ‘ ‘ cho 1 bit: Ví dụ:
LED(0) <= '1'; (Chỉ bật duy nhất đèn số 0).
- Dùng nháy kép ” ” cho một chuỗi bit: Ví dụ:
LED <= "10101010"; (Bật các đèn xen kẽ trên dãy 8 LED).
- Hexadecimal (Số thập lục phân): Khi số lượng dây dẫn quá nhiều (ví dụ 32 bit), bạn có thể viết tắt bằng chữ X:
Dữ_liệu <= X"FF"; (Tương đương với chuỗi 8 bit toàn mức ‘1’).
2.4. Phân biệt “downto” và “to”
Cách bạn khai báo hướng đánh số các bit sẽ ảnh hưởng đến cách hiểu về trọng số của con số:
- (7 downto 0): Bit số 7 nằm bên trái (thường là bit trọng số lớn nhất – MSB). Đây là chuẩn phổ biến nhất trong thiết kế phần cứng chuyên nghiệp.
- (0 to 7): Bit số 0 nằm bên trái. Cách này ít dùng hơn, thường chỉ xuất hiện trong một số giao thức truyền thông cụ thể.
Lời khuyên: Hãy luôn ưu tiên sử dụng downto để tránh nhầm lẫn khi thực hiện các phép toán nhị phân sau này.
3. Tổng kết
- std_logic: Đại diện cho 1 dây dẫn vật lý đơn lẻ với các trạng thái thực tế (0, 1, Z, X).
- std_logic_vector: Đại diện cho một xe buýt (Bus) dữ liệu gồm nhiều dây chạy song song đồng thời.
- Tính vật lý: Khai báo kiểu dữ liệu càng lớn thì chip Artix-7 càng tốn nhiều dây nối và tài nguyên tài nguyên phần cứng bên trong.
- Ứng dụng trên AIOT-ARTIX7: Sử dụng vector giúp bạn điều khiển toàn bộ dãy LED hoặc đọc trạng thái của toàn bộ dãy Switch chỉ bằng một dòng mã mô tả duy nhất.
Kiểm tra kiến thức
Hãy cùng kiểm tra lại kiến thức về cách chọn “vật liệu” dây dẫn trong thiết kế VHDL.
- Câu 1: Kiểu dữ liệu nào dùng để đại diện cho một sợi dây điện đơn lẻ trong VHDL?
A. integer
B. std_logic_vector
C. std_logic
D. boolean
Xem đáp án & Giải thích
Đáp án đúng: C
Giải thích: std_logic là đơn vị dữ liệu cơ bản nhất, tương ứng với 1 bit thông tin hoặc 1 dây dẫn vật lý duy nhất.
- Câu 2: Trạng thái ‘Z’ trong kiểu dữ liệu std_logic có nghĩa là gì?
A. Mạch bị chập điện.
B. Trạng thái trở kháng cao (ngắt kết nối vật lý).
C. Trạng thái ngủ đông của chip Artix-7.
D. Mức điện áp trung bình.
Xem đáp án & Giải thích
Đáp án đúng: B
Giải thích: ‘Z’ (High Impedance) đại diện cho trạng thái lơ lửng, cực kỳ quan trọng khi thiết kế các đường bus chung dùng Tri-state buffer.
- Câu 3: Để khai báo một bó dây dẫn gồm 8 bit để điều khiển 8 đèn LED trên bo AIOT-ARTIX7, cách viết nào sau đây là chuẩn nhất?
A. LED : out std_logic(8);
B. LED : out std_logic_vector(7 downto 0);
C. LED : out bit_vector(1 to 8);
D. LED : out array(8) of std_logic;
Xem đáp án & Giải thích
Đáp án đúng: B
Giải thích: Sử dụng std_logic_vector với dải chỉ số từ 7 downto 0 là tiêu chuẩn công nghiệp để quản lý dữ liệu 8-bit.
- Câu 4: Cách viết nào sau đây là đúng quy pháp khi gán giá trị cho một vector 4-bit?
A. Data <= ‘1010’;
B. Data <= 1010;
C. Data <= “1010”;
D. Data <= {1,0,1,0};
Xem đáp án & Giải thích
Đáp án đúng: C
Giải thích: Trong VHDL, hằng số vector (chuỗi bit) bắt buộc phải nằm trong dấu nháy kép “”, còn hằng số 1 bit nằm trong nháy đơn ”.
- Câu 5: Tại sao trong FPGA chúng ta có thể thay đổi giá trị của 1000 bit cùng một lúc (song song)?
A. Vì chip Artix-7 có phần mềm xử lý rất nhanh.
B. Vì mỗi bit được đại diện bởi một dây dẫn vật lý riêng biệt, cho phép dòng điện chạy qua tất cả chúng đồng thời.
C. Vì hệ nhị phân rất đơn giản.
D. Vì chúng ta sử dụng kiểu dữ liệu integer.
Xem đáp án & Giải thích
Đáp án đúng: B
Giải thích: Đây chính là bản chất “phần cứng” của FPGA: tính song song dựa trên các đường dẫn vật lý độc lập tồn tại đồng thời.
“Chúc mừng bạn đã nắm vững cách chọn ‘vật liệu’ cho bản thiết kế của mình! Bài học tiếp theo sẽ hướng dẫn bạn cách ‘đổ dòng điện’ vào các dây dẫn này thông qua các lệnh gán đồng thời.”