IV. GIỚI THIỆU VỀ MÔ HÌNH HÀNH VI
5. CÁC PHÁT BIỂU KHỐI
Các khối là cơ cấu từng phần trong VHDL – cho phép người thiết kế các khối trong mô hình.
Ví dụ nếu bạn thiết kế CPU thì có thể chia ra thành nhiều khối như khối ALU, khối bank thanh ghi và các khối khác.
Mỗi khối có thể khai báo các tín hiệu cục bộ, kiểu dữ liệu, hằng số, … Bất kỳ đối tượng nào – mà nó có thể được khai báo trong phần khai báo kiến trúc – thì có thể được khai báo trong phần khai báo khối.
Ví dụ 2-9: dùng các phát biểu khôái:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
package bit32 IS
TYPE tw32 IS ARRAY ( 31 downto 0 ) OF std_logic;
END bit32;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE WORK.bit32.ALL;
ENTITY cpu IS
PORT (clk, interrupt: IN STD_LOGIC;
addr: OUT tw32;
data: INOUT tw32;);
END cpu;
ARCHITECTURE cpu_blk OF cpu IS SIGNAL ibus, dbus: tw32;
BEGIN
ALU: BLOCK
SIGNAL qbus: tw32;
BEGIN
-- alu behavior stataments
END BLOCK ALU;
REG8: BLOCK
SIGNAL zbus: tw32;
BEGIN
REG1: BLOCK
SIGNAL qbus: tw32;
BEGIN
-- REG1 behavior stataments
END BLOCK REG1;
-- more REG8 stataments
END BLOCK REG8;
END cpu_blk;
Thực thể cpu có khai báo thực thể ngoài cùng trong mô hình (mô hình cho ví dụ này chưa hoàn chỉnh). Thực thể cpu khai báo 4 port – dùng cho giao tiếp mô hình. Các port clk và interrupt là cỏc port ngừ vào, addr là port ngừ ra và data là port hai chiều inout. Tất cả cỏc port này được nhỡn thấy ở bất kỳ khối nào, được khai bỏo trong kiến trỳc cho thực thể này. Cỏc port ngừ vào cú thể đọc và cỏc port ngừ ra cú thể được gỏn giỏ trị.
Các tín hiệu ibus và dbus là các tín hiệu cục bộ được khai báo trong kiến trúc cpu_blk. Các tín hiệu này là cục bộ đối với kiến trúc cpu_blk và do đó các khối bên ngoài không được truy xuất các tín hiệu này.
Tuy nhiên, bất kỳ khối nằm nào bên trong kiến trúc đó đều có thể truy xuất các tín hiệu này.
Các khối có cấp mức độ thấp thì có thể truy xuất đến các tín hiệu có cấp mức độ cao hơn, nhưng
các khối có cấp mức độ cao hơn thì không thể truy xuất đến các tín hiệu cục bộ của khối cấp thấp hôn.
Tín hiệu qbus được khai báo trong phần khai báo khối của khối ALU. Tín hiệu này là tín hiệu cục bộ cho khối ALU và các khối bên ngoài không thể truy xuất. Tất cả các phát biểu nằm bên trong khối ALU có thể truy xuất qbus, nhưng các phát biểu bên ngoài khối ALU thì không thể duứng qbus.
Tương tự, tín hiệu zbus cho khối REG8. Khối REG1 nằm bên trong khối REG8 có thể truy xuất tín hiệu zbus và tất cả các phát biểu khác trong khối REG8 cũng có thể truy xuất tín hiệu zbus.
Trong phần khai báo của khối REG1 còn khai báo một tín hiệu khác gọi là qbus. Tín hiệu này có cùng tên với tín hiệu qbus được khai báo trong khối ALU – điều này có gây ra xung đột gì không ? Đối với chương trình chương trình biên dịch thì hai tín hiệu này là độc lập. Hai tín hiệu này được khai báo trong hai vùng khác nhau và chỉ có hiệu lực cho vùng đó.
Một trường hợp khác lồng vào nhau như sau:
BLK1: BLOCK
SIGNAL qbus: tw32;
BEGIN
BLK2: BLOCK
SIGNAL qbus: tw32;
BEGIN
-- blk2 stataments
END BLOCK BLK2;
-- blk1 stataments END BLOCK BLK1;
Trong ví dụ này, tín hiệu qbus được khai báo trong 2 khối. Cấu trúc lồng vào nhau trong mô hình này là một khối có chứa một khối khác.
Khối BLK2 truy xuất 2 tín hiệu được gọi là qbus: tín hiệu qbus thứ nhất khai báo trong BLK2 và tín hiệu qbus thứ 2 khai báo trong BLK1. Khối BLK1 là cha của khối BLK2. Tuy nhiên, khối BLK2 xem tín hiệu qbus nằm trong chính nó, nhưng tín hiệu qbus của khối BLK1 sẽ bị ghi đè bởi khai báo cùng tên của tín hiệu khối BLK2.
Tín hiệu qbus từ BLK1 có thể được nhìn thấy bên trong khối BLK2, nếu tên của tín hiệu qbus được bổ sung thêm bằng tên của khối. Cụ thể cho ví dụ ở trên, để truy xuất tín hiệu qbus từ khoỏi BLK1 thỡ duứng BLK1.qbus.
Như đã đề cập ở trên, các khối chứa các vùng của mô hình bên trong nó. Nhưng các khối là duy nhất bởi vì một khối có thể chứa các port và các generic. Điều này cho phép người thiết kế ánh xạ lại các tín hiệu và các generic bên ngoài đến các tín hiệu và generic nằm bên trong khối.
Nhưng tại sao người thiết kế muốn làm điều này.
Dung lượng của các port và các generic trong một khối cho phép người thiết kế dùng lại các khối đã viết cho mục đích khác trong thiết kế mới.
Giả sử ta muốn cải tiến thiết kế CPU và cần mở rộng thêm chức năng cho khối ALU, và ta giả sử rằng một người thiết kế khác có khối ALU mới có thể thực hiện được các chức năng mà ta
cần thì vấn đề chỉ còn là hiệu chỉnh lại tên của các port và các generic cho tương thích với khối mới là xong. Phải ánh xạ các tên của tín hiệu và các thông số generic trong thiết kế đang cải tiến với các port và các generic đã xây dựng của khối ALU mới.
Ví dụ 2-10: minh hoạ cho sự cải tiến:
package math IS
TYPE tw32 IS ARRAY ( 31 downto 0 ) OF std_logic;
FUNCTIOB tw_add(a,b; tw32) RETURN tw32;
FUNCTIOB tw_sub(a,b; tw32) RETURN tw32;
END math;
USE WORK.math.ALL;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY cpu IS
PORT (clk, interrupt: IN STD_LOGIC;
addr: OUT tw32;
cont : IN INTEGER;
data: INOUT tw32);
END cpu;
ARCHITECTURE cpu_blk OF cpu IS SIGNAL ibus, dbus: tw32;
BEGIN
ALU: BLOCK
PORT (abus, bbus: IN tw32;
D_out: OUT tw32;
ctbus: IN INTEGER);
PORT MAP (abus => ibus, bbus => dbus, d_out => data, ctbus => cont);
SIGNAL qbus: tw32;
BEGIN
D_out <= tw_add (abus, bbus) WHEN ctbus = 0 ELSE
tw_add (abus, bbus) WHEN ctbus = 1 ELSE
abus;
END BLOCK ALU;
END cpu_blk;
Về cơ bản mô hình này giống như mô hình đã trình bày ngoại trừ port và các phát biểu ánh xạ port trong phần khai báo khối ALU. Phát biểu port khai báo số lượng được dùng cho khối, hướng của port và loại dữ liệu của port. Phát biểu ánh xạ port sẽ ánh xạ port mới với các tín hiệu hoặc các port tồn tại bên ngoài khối. Port abus được ánh xạ cho tín hiệu cục bộ ibus của kiến trúc CPU_BLK, port bbus được ánh xạ cho dbus. Các port d_out và ctbus được ánh xạ cho các port bên ngoài của thực thể.
Ánh xạ có nghĩa là kết nối giữa port và tín hiệu bên ngoài chẳng hạn như khi có một sự thay đổi giá trị trên một tín hiệu nối đến 1 port thì port sẽ thay đổi sang giá trị mới. Nếu sự thay đổi xảy ra trong tín hiệu ibus thì giá trị mới của ibus được truyền vào khối ALU và port abus sẽ có giá trị mới. Tương tự cho tất cả các port.
Các khối có bảo vệ
Các phát biểu khối có khối hành vi lồng vào bên trong được xem như những khối có bảo vệ.
Một khối có bảo vệ chứa một biểu thức bảo vệ – có thể cho phép và không cho phép các driver beân trong khoái.
Biểu thức bảo vệ là biểu thức đại số boolean: nếu bằng true thì các driver bên trong khối được phép và nếu bằng false thì các driver bị cấm.
Chúng ta sẽ khảo sát ví dụ 2-11:
Ví dụ 2-11: có khối bảo vệ LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY latch IS
PORT (d, clk: IN STD_LOGIC;
q, qb: OUT STD_LOGIC);
END latch;
ARCHITECTURE latch_guard OF latch IS BEGIN
G1: BLOCK (clk = „1‟) BEGIN
q <= GUARDED d AFTER 5 ns;
qb <= GUARDED NOT (d) AFTER 7 ns;
END BLOCK G1;
END latch_guard;
Mô hình này minh họa cách thức mô hình mạch chốt có thể được viết dùng khối có bảo vệ.
Thực thể khai báo 4 port cần thiết cho mạch chốt và chỉ có một phát biểu trong kiến trúc. Phát biểu chính là phát biểu khối có bảo vệ.
Phát biểu khối có bảo vệ giống như phát biểu khối bình thường, ngoại trừ biểu thức bảo vệ nằm sau từ khoá BLOCK. Biểu thức bảo vệ trong vệ trong ví dụ này là (clk=’1’). Đây là biểu thức luận lý và trả về kết quả là true khi giá trị của clk bằng ‘1’ và sẽ có giá trị là false khi clk có giá trị khác.
Khi biểu thức bảo vệ là true thì tất cả driver của các phát biểu gán tín hiệu bảo vệ được phép hoặc được mở. Khi biểu thức bảo vệ là false thì tất cả các driver của các phát biểu gán tín hiệu bảo vệ bị cấm hoặc bị tắt.
Có 2 phát biểu gán tín hiệu bảo vệ trong mô hình: phát biểu thứ nhất là gán giá trị q và câu lệnh gán còn lại là gán giá trị qb. Phát biểu gán tín hiệu có bảo vệ được nhận ra bằng từ khoá GUARDED nằm giữa ‚<=‛ và thành phần của biểu thức.
Khi port clk của thực thể có giá trị là ‘1’ thì biểu thức bảo vệ có giá trị là true và khi giá trị của ngừ vào d sẽ xuất hiện ở ngừ ra q sau khoảng thời gian trể 7ns.
Khi port clk cú giỏ trị là ‘0’ hoặc bất kỳ giỏ trị nào khỏc hợp lệ của kiểu dữ liệu thỡ ngừ ra q và qb chuyển sang tắt và giỏ trị ngừ ra của tớn hiệu được xỏc định bởi giỏ trị được gỏn cho một giỏ trị mặc định bởi hàm phân giải. Khi clk không bằng ‘1’ thì các driver được xây dựng cho các lệnh gán tín hiệu q và qb trong kiến trúc sẽ chuyển sang tắt. Các driver không tham gia vào giá trị tổng theồ cuỷa tớn hieọu.
Gán tín hiệu có thể được bảo vệ bằng cách dùng từ khoá GUARDED. Tín hiệu mới được khai báo hoàn toàn trong khối khi khối có biểu thức bảo vệ. Tín hiệu này được gọi là GUARD.
Giá trị của nó là giá trị của biểu thức bảo vệ. Tín hiệu này có thể được dùng để các xử lý khác xảy ra.
Các khối rất tiện lợi để chia nhỏ thiết kế thành các khối nhỏ hơn, các đơn vị dễ quản lý hơn.
Chúng cho phép người thiết kế sự mềm dẻo để xây dựng những thiết kế lớn từ những khối nhỏ hơn và cung cấp phương pháp thuận tiện cho điều khiển các driver đối với tín hiệu.
6. TểM TẮT
Cách gán tín hiệu là dạng cơ bản nhất của mô hình hành vi.
Phát biểu gán tín hiệu có thể được lựa chọn tuỳ vào điều kiện.
Phát biểu gán tín hiệu có thể chứa thời gian trể.
VHDL chứa trì hoãn trể quán tính và trì hoãn truyền.
Các điểm thời gian mô phỏng delta dùng để các sự kiện hoạt động đúng thời gian.
Các driver cho một tín hiệu được xây dựng bởi các phát biểu gán tín hiệu.
Generic được dùng để truyền dữ liệu cho thực thể.
Các phát biểu khối cho phép xây dựng nhóm trong cùng một thực thể.
Các phát biểu khối bảo vệ cho phép khả năng tắt các driver trong một khối.