You are currently viewing Ba phong cách mô tả mạch điện tử số bằng VHDL

Ba phong cách mô tả mạch điện tử số bằng VHDL

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.

Bộ cộng Full-adder

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.

Cấu trúc bộ cộng full-adder

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

Luồng dữ liệu bộ cộng full-adder

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

Nguyễn Kiêm Hùng

Hung K. Nguyen studied “Electronic Engineering” in both his bachelor’s and master’s degrees at the Vietnam National University, Hanoi, Vietnam. He received the bachelor’s degree in 2003. After receiving his bachelor’s degree, He worked as an internship in the Research Center of Electronics and Telecommunications. In 2006, He received the master’s degree in electronic engineering from VNU University of Engineering and Technology (VNU-UET). Before pursuing his Ph.D’s degree, He worked as a researcher at the Laboratory for Smart Integrated Systems in VNU University of Engineering and Technology for two years. In 2008, He went to Southeast University, Nanjing, China to get his Ph.D degree. He received the Ph.D. degree in Microelectronics and Solid State Electronics from Southeast University in 2013. After got his Ph.D’s degree, He returned to VNU University of Engineering and Technology to continue his research in VLSI design. He works currently as an assistant professor and senior researcher at VNU Key Laboratory for Smart Integrated Systems. His research interests mainly include multimedia processing, reconfigurable computing, and SoC designs.

Trả lời