END IF; END PROCESS;

Một phần của tài liệu Thiết kế vi mạch bằng VHDL (Trang 59 - 62)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu Thiết kế vi mạch bằng VHDL (Trang 59 - 62)