Mạch điện tử số có thể được mô tả bằng VHDL bằng một trong ba phong cách: mô tả theo hành vi, mô tả theo cấu trúc và mô tả theo luồng dữ liệu. Bài viết này chỉ ra cách thực hiện cùng một mạch số theo ba phong cách mô tả kể trên.
Ví dụ thiết kế: Thiết kế bộ cộng nhị phân hai bit theo ba phong cách mô tả gồm: mô tả theo hành vi, mô tả theo cấu trúc, mô tả theo luồng dữ liệu.
Hình 1‑1. Giao diện vào ra của bộ cộng full-adder.
Bảng 1‑1. Bảng sự thật cho bộ cộng full-adder
Input | Output | ||||
a | b | cin | Cout | Sum | |
0 | 0 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | 1 | |
0 | 1 | 0 | 0 | 1 | |
1 | 1 | 0 | 1 | 0 | |
0 | 0 | 1 | 0 | 1 | |
1 | 0 | 1 | 1 | 0 | |
0 | 1 | 1 | 1 | 0 | |
1 | 1 | 1 | 1 | 1 |
1. Mô tả theo hành vi
Rút gọn bảng sự thật mô tả bộ cộng nhị phân hai bit full-adder trong Bảng 1‑1 thành bảng Bảng 5‑2. Mã nguồn mô tả hoạt động của bộ cộng full-adder theo phong cách mô tả hành vi dựa trên Bảng 1‑2 được chỉ ra trong Bảng 1‑3.
Bảng 1‑2. Bảng sự thật cho bộ cộng Look-ahead carry full-adder
a | b | Cout | Sum |
0 | 0 | 0 | cin |
0 | 1 | cin | c’in |
1 | 0 | cin | c’in |
1 | 1 | 1 | cin |
Bảng 1‑3. Mã nguồn mô tả bộ cộng full-adder theo phong cách mô tả hành vi
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY fulladder_bev IS PORT ( a,b : IN std_logic; cin : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END fulladder_bev; ARCHITECTURE architecture_fulladder_bev OF fulladder_bev IS BEGIN –Statements are here adding_proc: PROCESS (a, b, cin) BEGIN IF (a=b) then cout <= a; sum <= cin; ELSE cout <= cin; sum <= not cin; END IF; END PROCESS; END architecture_fulladder_bev; |
Bảng 1‑4. Mã nguồn testbench cho bộ cộng full-adder theo phong cách mô tả hành vi
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY FullAdder_tb IS END FullAdder_tb; ARCHITECTURE FullAdder_tb_architecture OF FullAdder_tb IS — Component declaration of the tested unit COMPONENT Fulladder_bev PORT( a,b : IN std_logic; cin : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END COMPONENT; — Stimulus signals – signals mapped to the input and inout ports of tested entity SIGNAL test_vector: STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL Sum, Cout : STD_LOGIC; BEGIN UUT : Fulladder_bev PORT MAP ( A => test_vector(0), B => test_vector(1), Cin => test_vector(2), Sum => Sum, Cout => Cout); Testing: PROCESS BEGIN test_vector <= “000”; WAIT FOR 10 ns; test_vector <= “001”; WAIT FOR 10 ns; test_vector <= “010”; WAIT FOR 10 ns; test_vector <= “011”; WAIT FOR 10 ns; test_vector <= “100”; WAIT FOR 10 ns; test_vector <= “101”; WAIT FOR 10 ns; test_vector <= “110”; WAIT FOR 10 ns; test_vector <= “111”; WAIT FOR 10 ns; END PROCESS; END FullAdder_tb_architecture; |
2. Mô tả theo cấu trúc
Đầu tiên thiết kế bộ cộng Half-adder sau đó dùng hai bộ cộng half-adder để xây dựng bộ cộng full-adder như cấu trúc chỉ ra trong Hình 1‑2.
Hình 1‑2. Cấu trúc bộ full-adder theo bộ cộng half-adder.
Bảng 1‑5. Mã nguồn mô tả bộ cộng Half-adder.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
— halfadder.vhd
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY halfadder IS PORT ( a,b : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END halfadder; ARCHITECTURE architecture_halfadder OF halfadder IS BEGIN –Statements are here sum <= A XOR B; cout <= A AND B; END architecture_halfadder; |
Bảng 1‑6 chỉ ra cách mô tả bộ cộng full-adder theo hai bộ cộng hald-adder.
Bảng 1‑6. Mã nguồn mô tả bộ cộng full-adder theo phong cách mô tả cấu trúc.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
— fulladder_str.vhd
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY fulladder_str IS PORT ( a,b : IN std_logic; cin : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END fulladder_str; ARCHITECTURE architecture_fulladder_str OF fulladder_str IS COMPONENT halfadder PORT ( a,b : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END COMPONENT; Signal T0, T1, T2 : STD_LOGIC; BEGIN –Statements are here Hadder1: halfadder PORT MAP (a, b, T0, T1); Hadder2: halfadder PORT MAP (T0, Cin, sum, T2); Cout <= T1 OR T2; END architecture_fulladder_str; |
3. Mô tả theo luồng dữ liệu
Hình 1‑3. Cấu trúc luồng dữ liệu của bộ cộng full-adder.
Hình 1‑3 chỉ ra luồng dữ liệu từ lối vào tới lối ra qua đó tín hiệu lối vào được biến đổi qua trình tự một số bước để tạo ra tín hiệu lối ra. Đầu tiên tín hiệu A và B được dùng để tạo ra tín hiệu T0 và T1, sau đó các tín hiệu kết hợp với tín hiệu Cin để tạo ra tín hiệu T2, Sum và cuối cùng là Cin. Mã nguồn mô tả bộ cộng full-adder theo phong cách mô tả luồng dữ liệu được chỉ ra trong Bảng 1‑7.
Bảng 1‑7. Mã nguồn mô tả bộ cộng full-adder theo luồng dữ liệu.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY fulladder_dfl IS PORT ( a,b : IN std_logic; cin : IN std_logic; sum : OUT std_logic; cout : OUT std_logic); END fulladder_dfl; ARCHITECTURE architecture_fulladder_dfl OF fulladder_dfl IS Signal T0, T1, T2 : STD_LOGIC; BEGIN –Statements are here T0 <= A XOR B; T1 <= A AND B; SUM <= Cin XOR T0; T2 <= Cin AND T0; Cout <= T1 OR T2; END architecture_fulladder_dfl; |
Video trình bày quá trình mô phỏng bộ cộng full-adder bằng ModelSIM