y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ALU;
END IF; END PROCESS;
WAIT ON, trong cỏch xử lý khỏc, nhận nhiều tớn hiệu. PROCESS được đặt giữ cho đến khi bất kỳ tớn hiệu nào thay đổi. PROCESS sẽ tiếp tục thực hiện bất kỳ khi nào một thay đổi trong rst hoặc clk xuất hiện.
Vớ dụ:
Thanh ghi 8 bit với tớn hiệu reset khụng đồng bộ
PROCESSBEGIN BEGIN
WAIT ON clk, rst; IF (rst='1') THEN
output <= "00000000";
ELSIF (clk'EVENT AND clk='1') THEN output <= input;
END IF;END PROCESS; END PROCESS;
WAIT FOR chỉ dựng để mụ phỏng. Vớ dụ: WAIT FOR 5ns;
Vớ dụ 6.4a:
DFF với tớn hiệu reset khụng đồng bộ
rst d clk q ns 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 Hỡnh 6.4a.1. Kết quả mụ phỏng library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF is Port(d,clk,rst:in std_logic; q:out std_logic); end DFF; architecture DFF of DFF is begin process begin wait on rst,clk;
if (rst='1') then q <= '0';
elsif (clk'Event and clk='1') then q <= d; end if; end process; end DFF; Vớ dụ 6.4b: Bộ đếm một chữ số thập phõn 0 → 9 → 0 clk digit ns 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 0 1 2 3 4 5 6 7 8 9 Hỡnh 6.4b.1. Kết quả mụ phỏng LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY counter IS PORT (clk : IN STD_LOGIC;
digit : OUT INTEGER RANGE 0 TO 9); END counter;
ARCHITECTURE counter OF counter IS BEGIN
PROCESS -- no sensitivity list
VARIABLE temp : INTEGER RANGE 0 TO 10; BEGIN
WAIT UNTIL (clk'EVENT AND clk='1'); temp := temp + 1; IF (temp=10) THEN temp := 0; END IF; digit <= temp; END PROCESS; END counter; 6.5. CASE.
CASE là lệnh duy nhất cho mó tuần tự (đi kốm với IF, LOOP, và WAIT).
Cỳ phỏp:
CASE identifier IS
WHEN value => assignments; WHEN value => assignments; ...
Vớ dụ:
CASE control IS
WHEN "00" => x<=a; y<=b; WHEN "01" => x<=b; y<=c;
WHEN OTHERS => x<="0000"; y<="ZZZZ"; END CASE;
Lệnh CASE (tuần tự) tương tự với WHEN (kết hợp). Tất cả sự hoỏn vị đều phải được kiểm tra, vỡ vậy từ khoỏ OTHERS rất hữu ớch. Từ khoỏ quan trọng khỏc là NULL (bản sao của UNAFFECTED), nờn được sử dụng khi khụng cú hoạt động nào thay thế. Vớ dụ: WHEN OTHERS => NULL;. Tuy nhiờn, CASE cho phộp nhiều phộp gỏn với mỗi điều kiện kiểm tra, trong khi WHEN chỉ cho phộp một.
Giống như trong trường hợp của WHEN, ở đõy “WHEN value” cú thể cú 3 dạng:
WHEN value -- single value
WHEN value1 to value2 -- range, for enumerated data types -- only
WHEN value1 | value2 |... -- value1 or value2 or ...
WHEN CASE
Kiểu lệnh Đồng thời Tuần tự
Sử dụng Chỉ ngoài PROCESS, FUNCTION, hoặc PROCEDURE Chỉ trong PROCESS, FUNCTION, hoặc PROCEDURE Tất cả sự hoỏn vị phải
được kiểm tra
Cú với
WITH/SELECT/WHEN Cú Số phộp gỏn lớn nhất
cho mỗi kiểm tra 1 Bất kỳ
Từ khoỏ khụng kớch hoạt
UNAFFECTED NULL
Bảng 6.1. So sỏnh giữa WHEN và CASE Vớ dụ:
Với WHEN:
WITH sel SELECT
x <= a WHEN "000",b WHEN "001", b WHEN "001", c WHEN "010", UNAFFECTED WHEN OTHERS;
Với CASE:
WHEN "000" => x<=a; WHEN "001" => x<=b; WHEN "010" => x<=c; WHEN OTHERS => NULL; END CASE;
Vớ dụ:
Bộ dồn kờnh MUX 4-1
Với IF:
IF (sel="00") THEN x<=a; ELSIF (sel="01") THEN x<=b; ELSIF (sel="10") THEN x<=c; ELSE x<=d; Với CASE: CASE sel IS WHEN "00" => x<=a; WHEN "01" => x<=b; WHEN "10" => x<=c; WHEN OTHERS => x<=d; END CASE; Vớ dụ 6.5a:
DFF với tớn hiệu reset khụng đồng bộ
rst d clk q ns 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 Hỡnh 6.5a.1. Kết quả mụ phỏng
LIBRARY ieee; -- Unnecessary declaration, -- because USE ieee.std_logic_1164.all; -- BIT was used instead of