2.2. Ngôn ngữ mô tả phần cứng VHDL
2.2.2. Cấu trúc chương trình VHDL
Các miêu tả VHDL bao gồm các đơn vị thiết kế cơ bản và các đơn vị thiết kế thứ cấp. Các đơn vị thiết kế cơ bản là các Entity và các Package. Các đơn vị thiết kế thứ cấp là Architecture và Package Body. Các đơn vị thiết kế thứ cấp luôn có một mối quan hệ tới một đơn vị thiết kế cơ bản. Các thư viện là các tập hợp của các đơn vị thiết kế sơ cấp và thứ cấp. Một thiết kế điển hình thường chứa đựng một hoặc nhiều thư viện khác nhau.
Trước khi bắt đầu nghiên cứu ngôn ngữ VHDL, chúng ta hãy cùng tìm hiểu một số thuật ngữ cơ bản sẽ xuất hiện thường xuyên trong giáo trình. Các thuật ngữ sẽ được trình bày dưới dạng tiếng Anh nguyên gốc.
Entity –Thực thể: Tất cả các thiết kế được thể hiện dưới dạng các Entity. Một Entity có thể được coi như một khối cơ bản trong một thiết kế. Mức độ cao nhất của thiết kế được đại diện bởi thực thể mức đỉnh (top-level entity). Nếu một thiết kế có cấu trúc bậc thì một mô tả mức đỉnh sẽ bao hàm nhiều mô tả mức thấp hơn. Các mô tả mức thấp hơn này sẽ là các Entity mức thấp hơn nằm trong Entity mức đỉnh.
Architecture – Kiến trúc: Các Entity mà có thể mô phỏng thì đều có một mô tả Architecture. Architecture mô tả hành vi của Entity. Một Entity có thể có nhiều Architecture. Một Architecture có thể là ở dạng mô tả hành vi (behaviour), trong khi Architecture khác được mô tả ở dạng cấu trúc (structure).
Configuration – Cấu hình: Một phát biểu Configuration được sử dụng để gắn một khối thành phần đơn (một instance của một component) tới một cặp entity- architecture. Một Configuration có thể được xem như một danh sách các thành phần cho một thiết kế. Nó mô tả hàng vi nào được sử dụng cho mỗi thực thể, giống như
việc một danh sách các phần sẽ mô tả phần nào sẽ được sử dụng cho mỗi phần tương ứng trong thiết kế.
Package – Bó: một Package là một tập hợp của các kiểu dữ liệu, các chương trình con mã được sử dụng thường xuyên trong thiết kế. Có thể coi nó như các hộp công cụ chức đựng các công cụ được sử dụng để xây dựng thiết kế.
Driver – nguồn điều khiển: Là một nguồn tín hiệu gắn vào một tín hiệu. Nếu một tín hiệu bị điều khiển bởi 2 nguồn, thì khi cả hai nguồn ở chế độ hoạt động, tín hiệu sẽ có hai nguồn điều khiển.
Bus – Trong thiết kế phần cứng, thuật ngữ bus được sử dụng để mô tả một nhóm các đường tín hiệu có chức năng giống nhau hoặc một phương thức truyền thông nào đó. Trong VHDL, một bus là một kiểu tín hiệu đặc biệt mà driver của nó có thể ở trạng thái tắt.
Attribute – Thuộc tính: Một Attribute là một dữ liệu được gắn với các đối tượng VHDL hoặc là dữ liệu được định nghĩa trước về các đối tượng VHDL. Ví dụ như khả năng tải của một bộ đệm, hay nhiệt độ làm việc tối đa của một linh kiện,…
Generic – Thuật ngữ sử dụng cho một tham số chuyển thông tin tới một entity.
Ví dụ, nếu một entity là một cổng logic, với một giữ chậm lên và xuống, các giá trị cho thời gian giữ chậm lên và xuống có thể được chuyển vào bên trong entity bằng các generic.
Process – Tiến trình. Một process là một đơn vị thực thi cơ bản trong VHDL.
Toàn bộ quá trình hoạt động mà được thực hiện trong mô phỏng một miêu tả VHDL được phân tách ra trong một hoặc nhiều process.
Sau đây chúng ta sẽ đi vào nghiên cứu chi tiết cấu trúc của ngông ngữ VHDL.
2.2.2.1. Entity - Thực thể
Một Entity chứa đựng thông tin về tên, các cổng và các thông tin liên quan đến nó. Tất cả các thiết kế được tạo ra bằng cách sử dụng một hoặc nhiều Entity.
Một ví dụ đơn giản về một Entity:
ENTITY mux IS
PORT ( a, b, c, d : IN BIT;
s0, s1 : IN BIT;
x, : OUT BIT);
END mux;
Từ khoá ENTITY cho thấy rằng đây là bắt đầu của một phát biểu Entity. Tên của Entity là mux (bộ ghép). Entity mux có 6 cổng vào và một cổng ra. 4 cổng dữ liệu đầu vào (a,b,c,d), 2 cổng vào thực hiện chức năng chọn cho bộ ghép (s0 và s1), và cổng ra x, tất cả đều có kiểu dữ liệu dạng BIT.
Entity mô tả giao diện với thế giới bên ngoài. Nó xác định số các cổng, hướng các cổng và kiểu của các cổng.
2.2.2.2. Architecture - Kiến trúc
Architecture mô tả chức năng nằm bên dưới của một Entity và chứa đựng các phát biểu mô hình hoá hành vi của Entity. Một Architecture bất kỳ luôn gắn với một Entity để mô tả hành vi của Entity đó. Dưới đây là một ví dụ về Architecture của một bộ đếm sử dụng Entity mux.
ARCHITECTURE dataflow OF mux IS SIGNAL select : INTEGER;
BEGIN
select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE 1 WHEN s0 = ‘1’ AND s1 = ‘0’ ELSE
2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE 3;
x <= a AFTER 0.5 NS WHEN select = 0 ELSE b AFTER 0.5 NS WHEN select = 1 ELSE c AFTER 0.5 NS WHEN select = 2 ELSE d AFTER 0.5 NS;
END dataflow;
Từ khoá Architecture chỉ ra điểm bắt đầu cho các phát biểu mô tả kiến trúc của một Entity. Kiến trúc có tên là dataflow. Entity được mô tả là mux.
Lí do cho sự gắn kết giữa Architecture và Entity là một Entity thì có thể có một hoặc nhiều Architecture mô tả cho hành vi của nó. Ví dụ một Architecture có thể là một mô tả hành vi, trong khi Architecture khác có thể là một mô tả cấu trúc.
Đoạn giữa từ khoá Architecture và từ khoá begin là nơi các tín hiệu cục bộ và các Component (thành phần) được khai báo cho sử dụng bên trong Entity.
Toàn bộ các phát biểu giữa begin và end được gọi là các phát biểu đồng thời, bởi vì tất cả các phát biểu này được thực hiện cùng một lúc trong quá trình thực thi.
2.2.2.3. Gán tín hiệu đồng thời
Trong các ngôn ngữ lập trình điển hình như C hay C++, mỗi một phát biểu gán được thực hiện một cách tuần tự theo một thứ tự đã xác định. Thứ tự thực thi được xác định bởi thứ tự của các phát biểu trong file nguồn. Trong kiến trúc của VHDL, không có một thứ tự xác định cho các phát biểu gán. Thứ tự thực thi đơn thuần được xác định bởi các sự kiện xảy đến tác động vào các tín hiệu mà có ảnh hưởng tới các phát biểu gán đó, trong trường hợp này, tín hiệu tác động được coi là nhạy cảm đối với phát biểu gán (sensitivity). Ví dụ, xem xét phát biểu gán đầu tiên trong ví dụ trên:
select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE 1 WHEN s0 = ‘1’ AND s1 = ‘0’ ELSE
2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE 3;
Một phép gán tín hiệu được thực hiện bằng toán tử <=. Tín hiệu select sẽ được gán giá trị tuỳ thuộc vào giá trị của s0 và s1. Phát biểu này sẽ được thực thi bất cứ khi nào có một sự kiện xảy ra trên s0 hoặc s1. Một sự kiện xảy ra trên một tín hiệu chính là sự thay đổi giá trị của tín hiệu đó. Một phát biểu gán tín hiệu được gọi là bị ảnh hưởng bởi sự thay đổi của bất cứ tín hiệu nào nằm bên phải dấu gán <=. Phép gán tín hiệu trên được gọi là bị ảnh hưởng bởi s0 và s1. Các phép gán tín hiệu khác trong kiến trúc dataflow chịu ảnh hưởng bởi tín hiệu select.
2.2.2.4. Định thời các sự kiện
Phép gán tín hiệu x không xảy ra ngay lập tức. Mỗi giá trị được gán cho x chứa một mệnh đề AFTER. Cơ chế giữ chậm phép gán một giá trị mới được gọi là định thời cho một sự kiện.
2.2.2.5. Phát biểu đồng thời
Phép gán đầu tiên là phát biểu duy nhất được thực hiện khi có sự kiện xảy ra trên cổng s0 và s1. Phát biểu gán tín hiệu thứ hai không được thực thi trừ khi có một sự kiện trên tín hiệu select hoặc các cổng vào a, b, c, d.
Hai phát biểu gán tín hiệu trong kiến trúc dataflow hình thành một mô hình hành vi, hay một kiến trúc cho Entity mux. Kiến trúc dataflow không chứa đựng một cấu trúc (structure) nào. Không có một component nào được đặt trong kiến trúc này, cũng không có một bậc thấp hơn nữa trong kiến trúc. Một kiến trúc như vậy thường được coi như một “cuống lá”, một cách nói hình tượng cho vị trí thấp nhất trong một kiến trúc hình cây (có thứ bậc) của một thiết kế.
2.2.2.6. Thiết kế có cấu trúc
Có một cách khác để viết thiết kế mux, đó là sử dụng các thành phần nhỏ hơn, thực hiện các nhiệm vụ nhỏ hơn, kết hợp lại để thực hiện chức năng của mô hình mux. Với một mô hình đơn giản như bộ ghép 4 đầu vào mà chúng ta đang sử dụng, một miêu tả ở mức độ cổng logic đơn giản có thể được tạo ra để cho thấy các component sẽ được mô tả và sử dụng như thế nào. Kién trúc dưới đây được mô tả ở dạng có cấu trúc và thực hiện chức năng bộ mux.
ARCHITECTURE netlist OF mux IS COMPONENT andgate
PORT(a, b, c : IN bit; c : OUT BIT);
END COMPONENT;
COMPONENT inverter
PORT(in1 : IN BIT; x : OUT BIT);
END COMPONENT;
COMPONENT orgate
PORT(a, b, c, d : IN bit; x : OUT BIT);
END COMPONENT;
SIGNAL s0_inv, s1_inv, x1, x2, x3, x4 : BIT;
BEGIN
U1 : inverter(s0, s0_inv);
U2 : inverter(s1, s1_inv);
U3 : andgate(a, s0_inv, s1_inv, x1);
U4 : andgate(b, s0, s1_inv, x2);
U5 : andgate(c, s0_inv, s1, x3);
U6 : andgate(d, s0, s1, x4);
U7 : orgate(x2 => b, x1 => a, x4 => d, x3 => c, x => x);
END netlist;
Mô tả này sử dụng một số các component đơn giản để mô hình hoá hành vi của bộ mux. Trong đó có 1 bộ “đảo” (inverter), 1 bộ “và” (andgate) và 1 bộ “hoặc”
(orgate). Các component được khai báo trong phần khai báo của Architecture, nằm giữa phát biểu Architecture và từ khoá begin.
Các tín hiệu cục bộ được sử dụng để kết nối các component với nhau để hình thành mô tả kiến trúc. Các tín hiệu này được khai báo sử dụng khai báo signal.
Vùng phát biểu kiến trúc được đặt ngay sau từ khoá begin. Mỗi component có thể được dùng 1 hay nhiều lần (gọi là các instant) trong kiến trúc. Trong ví dụ trên, bộ inverter được sử dụng 2 lần (2 instant), bộ andgate có 4 instant và orgate được sử dụng 1 lần.
Có hai cách biểu diễn phép nối các tín hiệu cục bộ với các cổng vào/ra của các component. ở u1 đến u6, các tín hiệu cục bộ được gán thẳng vào các vị trí cổng của các component, trong U7, các phép nối tín hiệu được biểu diễn rõ ràng hơn sử dụng dấu nối tín hiệu “=>”.
2.2.2.7. Hành vi tuần tự
Vẫn còn một cách khác để mô tả chức năng của bộ mux bằng VHDL. Cách thứ ba này là sử dụng một phát biểu process để mô tả như dưới đây.
ARCHITECTURE sequential OF mux IS (a, b, c, d, s0, s1 )
VARIABLE sel : INTEGER;
BEGIN
IF s0 = ‘0’ and s1 = ‘0’ THEN sel := 0;
ELSIF s0 = ‘1’ and s1 = ‘0’ THEN sel := 1;
ELSIF s0 = ‘0’ and s1 = ‘0’ THEN sel := 2;
ELSE sel := 3;
END IF;
CASE sel IS
WHEN 0 => x <= a;
WHEN 1 => x <= b;
WHEN 2 => x <= c;
WHEN OTHERS =>x <= d;
END CASE;
END PROCESS;
END sequential;
Kiến trúc này chỉ có một phát biểu gọi là phát biểu process (tiến trình). Nó được bắt đầu với từ khoá process và kết thúc với từ khoá end process. Toàn bộ các phát biểu bên trong hai từ khoá này được coi như là các phần của phát biểu process.
2.2.2.8. Các phát biểu tiến trình Phát biểu process bao gồm các phần:
- Danh sách sensitivity (tín hiệu tác động): danh sách các tín hiệu mà khởi tạo quá trình thực thi của process.
- Phần khai báo: nằm giữa phần khai báo danh sách sensitivity và từ khoá begin. Các biến cục bộ trong process sẽ được khai báo ở đây.
- Phần phát biểu process: Nằm giữa từ khoá begin và từ khoá end process.
Đây là các phát biểu tuần tự, được thực thi lần lượt giống như các ngôn ngữ lập trình truyền thống như C.
2.2.2.9. Các phát biểu cấu hình
Một Entity có thể có nhiều hơn một kiến trúc. Vấn đề là kiến trúc nào sẽ được sử dụng trong một mô phỏng cho trước. Phát biểu Configuration sẽ giải quyết vấn đề này.
Xét ví dụ dưới đây:
CONFIGURATION muxcon1 OF mux IS FOR netlist
FOR U1,U2 :
inverter USE ENTITY WORK.myinv(version1);
END FOR;
FOR U3,U4,U5,U6 : andgate USE ENTITY WORK.myand(version1);
END FOR;
FOR U7 : orgate USE ENTITY WORK.myor(version1);
END FOR;
END FOR;
END muxcon1;
Giải thích:
Đây là một configuration (cấu hình) có tên là muxcon1 cho entity mux. Entity này sử dụng kiến trúc có tên là netlist. Trong kiến trúc netlist này, các component U1 và U2 là các bộ đảo (inverter) có tên là myinv với kiến trúc version1, được gọi ra từ thư viện work. Các component U3 đến U6 là các bộ và (and) có tên là myand với kiến trúc version1, được gọi ra từ thư viện work. Component U7 là một bộ hoặc (or) có tên là myor với kiến trúc version1, được gọi ra từ thư viện work.