Đề tài Thiết kế mạch bằng VHDL - Lê Tuấn Anh
Mục lục
Trang
Mục lục - 1 -
Danh mục hình: - 3 -
Danh mục bảng: - 5 -
Chương 1: Giới thiệu - 6 -
1.1. Giới thiệu về VHDL - 6 -
1.2. Giới thiệu công nghệ (và ứng dụng) thiết kế mạch bằng VHDL. - 7 -
1.2.1 Ứng dụng của công nghệ thiết kế mạch bằng VHDL - 7 -
1.2.2 Quy trinh thiết kế mạch bằng VHDL. - 7 -
1.2.3. Công cụ EDA. - 8 -
1.2.4. Chuyển mã VHDL vào mạch. - 9 -
Chương 2. Cấu trúc mã - 12 -
2.1. Các đơn vị VHDL cơ bản. - 12 -
2.2. Khai báo Library. - 12 -
2.3. Entity ( thực thể). - 14 -
2.4. ARCHITECTURE ( cấu trúc). - 14 -
2.5. Các ví dụ mở đầu. - 17 -
Chương 3: Kiểu dữ liệu - 20 -
3.1. Các kiểu dữ liệu tiền định nghĩa. - 20 -
3.2. Các kiểu dữ liệu người dùng định nghĩa. - 23 -
3.3. Các kiểu con (Subtypes). - 23 -
3.4. Mảng (Arrays). - 24 -
3.5. Mảng cổng ( Port Array). - 27 -
3.6. Kiểu bản ghi (Records). - 28 -
3.7. Kiểu dữ liệu có dấu và không dấu ( Signed and Unsigned). - 28 -
3.8. Chuyển đổi dữ liệu. - 29 -
3.9. Tóm tắt. - 31 -
3.10. Các ví dụ. - 31 -
Chương 4: Toán tử và thuộc tính. - 36 -
4.1. Toán tử. - 36 -
4.1.1 Toán tử gán. - 36 -
4.1.2 Toán tử Logic. - 36 -
4.1.3 Toán tử toán học. - 36 -
4.1.4 Toán tử so sánh. - 37 -
4.1.5 Toán tử dịch. - 37 -
4.2. Thuộc tính. - 37 -
4.1.1. Thuộc tính dữ liệu. - 37 -
4.1.2. Thuộc tính tín hiệu. - 38 -
4.3. Thuộc tính được định nghĩa bởi người dùng. - 38 -
4.4. Chồng toán tử. - 38 -
4.5. GENERIC. - 39 -
4.6. Ví dụ. - 39 -
Chương 5: Mã song song - 44 -
5.1. Song song và tuần tự. - 44 -
5.1.1. Mạch tổ hợp và mạch dãy. - 44 -
5.1.2. Mã song song và mã tuần tự. - 44 -
5.2. Sử dụng các toán tử. - 45 -
5.3. Mệnh đề WHEN. - 46 -
5.4. GENERATE. - 52 -
5.5. BLOCK. - 53 -
5.5.1. Simple BLOCK - 53 -
5.5.2. Guarded BLOCK - 54 -
Chương 6: Mã tuần tự - 56 -
6.1. PROCESS - 56 -
6.2. Signals và Variables. - 57 -
6.3. IF. - 57 -
6.4. WAIT. - 59 -
6.5. CASE. - 62 -
6.6. LOOP. - 66 -
6.7. Bad Clocking. - 71 -
6.8. Sử dụng mã tuần tự để thiết kế các mạch tổ hợp. - 73 -
Chương 7: Signal và Variable - 76 -
7.1. CONSTANT. - 76 -
7.2. SIGNAL. - 76 -
7.3. VARIABLE - 78 -
7.4. Số thanh ghi. - 84 -
Chương 8: Máy trạng thái - 93 -
8.1. Giới thiệu. - 93 -
8.2. Thiết kế theo kiểu 1 (thiết kế theo mô hình may moore). - 94 -
8.3. Thiết kế kiểu 2. - 100 -
8.4. Kiểu mã hoá: từ nhị phân sang Onehot. - 110 -
Chương 9: Thiết kế thêm các mạch - 112 -
9.1. Barrel Shifter. - 112 -
9.2. Bộ so sánh không dấu và có dấu. - 114 -
9.3. Bộ cộng Carry Ripple và bộ cộng Carry Look Ahead. - 116 -
9.4. Bộ chia dấu chấm tĩnh. - 120 -
9.5. Bộ điều khiển máy bán hàng. - 123 -
9.6. Bộ nhận dữ liệu nối tiếp. - 126 -
9.7. Bộ chuyển song song thành nối tiếp. - 128 -
9.8. Trò chơi trên led 7 thanh. - 129 -
9.9. Bộ phát tín hiệu. - 132 -
9.10. Thiết kế bộ nhớ. - 134 -
Tài liệu tham khảo: - 140 -
Phân công công việc: - 140 -
thanh IS CONSTANT time1: INTEGER := 4; -- Gia tri thuc te hien thi la 80 CONSTANT time2: INTEGER := 2; -- Gia tri thuc te hien thi is 30 TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa); SIGNAL present_state, next_state: STATES; SIGNAL count: INTEGER RANGE 0 TO 5; SIGNAL flip: BIT; BEGIN ------- Phan mach day cua arc : ------------ PROCESS (clk, stop) BEGIN IF (stop='1') THEN present_state <= a; ELSIF (clk'EVENT AND clk='1') THEN IF ((flip='1' AND count=time1) OR (flip='0' AND count=time2)) THEN count <= 0; present_state <= next_state; ELSE count <= count + 1; END IF; END IF; END PROCESS; ------- Phan mach to hop: ------------ PROCESS (present_state) BEGIN CASE present_state IS WHEN a => dout <= "1000000"; -- Decimal 64 flip<='1'; next_state <= ab; WHEN ab => dout <= "1100000"; -- Decimal 96 flip<='0'; next_state <= b; WHEN b => dout <= "0100000"; -- Decimal 32 flip<='1'; next_state <= bc; WHEN bc => dout <= "0110000"; -- Decimal 48 flip<='0'; next_state <= c; WHEN c => dout <= "0010000"; -- Decimal 16 flip<='1'; next_state <= cd; WHEN cd => dout <= "0011000"; -- Decimal 24 flip<='0'; next_state <= d; WHEN d => dout <= "0001000"; -- Decimal 8 flip<='1'; next_state <= de; WHEN de => dout <= "0001100"; -- Decimal 12 flip<='0'; next_state <= e; WHEN e => dout <= "0000100"; -- Decimal 4 flip<='1'; next_state <= ef; WHEN ef => dout <= "0000110"; -- Decimal 6 flip<='0'; next_state <= f; WHEN f => dout <= "0000010"; -- Decimal 2 flip<='1'; next_state <= fa; WHEN fa => dout <= "1000010"; -- Decimal 66 flip<='0'; next_state <= a; END CASE; END PROCESS; END arc; -------------------------------------------------------- Kết quả mô phỏng: Hình 9.19. Kết quả mô phỏng cho trò chơi trên SSD 9.9. Bộ phát tín hiệu. Từ một tín hiệu clock, chúng ta mong muốn thu được một tín hiệu có dang sóng như trong hình 9.20. Với bài toán loại này, chúng ta có thể sử dụng phương pháp FSM hoặc phương pháp truyền thống. Cả 2 phương pháp đều được chúng ta trình bày dưới đây: Phương pháp FSM: Hình 9.20 Hình dạng sóng cần phát Tín hiệu của hình 9.20 có thể được mô hình như một FSM 8 trạng thái. Sử dụng bộ đếm từ 0 đến 7. Chúng ta có thể thiết lập một sóng bằng ‘0’ khi biến đếm = ‘0’ (ở xung thứ nhất) và bằng 1 khi biến đếm = ‘1’ (xung thứ hai),vvnhư trong hình 9.20. Để thực thi được bộ tạo sóng này thì yêu cầu 4 flip-flop: trong đó có 3 cái để lưu trữ số đếm (3 bit), một cái để lưu trữ sóng (1 bit ). Để thiết kế bộ tạo sóng này, chúng ta thiết kế theo kiểu 2, cụ thể sẽ như sau: ----------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------------------- ENTITY Bo_phat_tin_hieu IS PORT (clk: IN STD_LOGIC; wave: OUT STD_LOGIC); END Bo_phat_tin_hieu; ----------------------------------------------------- ARCHITECTURE arc OF Bo_phat_tin_hieu IS TYPE states IS (zero, one, two, three, four, five, six, seven); SIGNAL present_state, next_state: STATES; SIGNAL temp: STD_LOGIC; BEGIN --- Phan mach day: --- PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN present_state <= next_state; wave <= temp; END IF; END PROCESS; --- Phan mach to hop: --- PROCESS (present_state) BEGIN CASE present_state IS WHEN zero => temp<='0'; next_state <= one; WHEN one => temp<='1'; next_state <= two; WHEN two => temp<='0'; next_state <= three; WHEN three => temp<='1'; next_state <= four; WHEN four => temp<='1'; next_state <= five; WHEN five => temp<='1'; next_state <= six; WHEN six => temp<='0'; next_state <= seven; WHEN seven => temp<='0'; next_state <= zero; END CASE; END PROCESS; END arc; ----------------------------------------------------- Kết quả mô phỏng: Hình 9.2.1. Kết quả mô phỏng tạo sóng Phương pháp truyền thống: Chúng ta thiết kế bộ phát tín hiệu theo phương pháp truyền thống với câu lệnh IF như sau: --------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------- ENTITY Bo_phat_tin_hieu2 IS PORT (clk: IN BIT; wave: OUT BIT); END Bo_phat_tin_hieu2; --------------------------------------- ARCHITECTURE arc OF Bo_phat_tin_hieu2 IS BEGIN PROCESS VARIABLE count: INTEGER RANGE 0 TO 7; BEGIN WAIT UNTIL (clk'EVENT AND clk='1'); CASE count IS WHEN 0 => wave <= '0'; WHEN 1 => wave <= '1'; WHEN 2 => wave <= '0'; WHEN 3 => wave <= '1'; WHEN 4 => wave <= '1'; WHEN 5 => wave <= '1'; WHEN 6 => wave <= '0'; WHEN 7 => wave <= '0'; END CASE; if count = 7 then count := 0; else count := count + 1; end if ; END PROCESS; END arc; --------------------------------------- Kết quả mô phỏng: Hình 9.22. Kết quả mô phỏng tạo sóng theo phương pháp truyền thống 9.10. Thiết kế bộ nhớ. Trong đoạn này, chúng ta sẽ thiết kế các mạch bộ nhớ sau: + ROM + RAM với bus dữ liệu vào ra tách rời. + ROM với bus dữ liệu vào ra hai chiều ROM (Read Only Memory): Bộ nhớ chỉ đọc và ghi: Sơ đồ của ROM được chỉ ra trong hình 9.23. Vì ROM là bộ nhớ chỉ đọc, không có tín hiệu clock, chân cho phép ghi, nó chỉ có tín hiệu vào bus địa chỉ và tín hiệu ra là bus dữ liệu. Hình 9.23.Sơ đồ của ROM Mã thiết kế ROM như sau: --------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------------- ENTITY rom IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 8); -- # of words in the memory PORT ( addr: IN INTEGER RANGE 0 TO words-1; data: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END rom; --------------------------------------------------- ARCHITECTURE rom OF rom IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); CONSTANT memory: vector_array := ( "00000000", "00000010", "00000100", "00001000", "00010000", "00100000", "01000000", "10000000"); BEGIN data <= memory(addr); END rom; --------------------------------------------------- Kết quả mô phỏng: Hình 9.24. Kết quả mô phỏng thiết kế ROM RAM với đường bus vào ra riêng biệt: Sơ đồ của RAM với đường bus vào ra riêng biệt được thể hiện trong hình 9.25 Hình 9.25. RAM với đường dữ liệu tách rời Như chúng ta thấy trên hình, RAM có các bus dư liệu vào data_in, bus dữ liệu ra data_out, bus địa chỉ, tín hiệu clk và tín hiệu cho phép đọc/ghi. Khi tín hiệu cho phép ghi/đọc được xác nhận là ghi thì tại mỗi xung lên tiếp theo của clk thì dữ liệu đầu vào (data_in) phải được lưu trữ tại vị trí addr, và dữ liệu ra phải được đọc từ địa chỉ addr. Mã thiết kế RAM sẽ như sau: ------------------------------------------------------------------------------------------ library IEEE; use IEEE.STD_LOGIC_1164.all; --------------------------------------------------- ENTITY ram IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 16); -- # of words in the -------- memory---------- PORT ( wr_ena, clk: IN STD_LOGIC; addr: IN INTEGER RANGE 0 TO words-1; data_in: IN STD_LOGIC_VECTOR (bits-1 DOWNTO 0); data_out: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ram; --------------------------------------------------- ARCHITECTURE ram OF ram IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); SIGNAL memory: vector_array; BEGIN PROCESS (clk, wr_ena) BEGIN IF (wr_ena='1') THEN IF (clk'EVENT AND clk='1') THEN memory(addr) <= data_in; END IF; END IF; END PROCESS; data_out <= memory(addr); END ram; --------------------------------------------------- Kết quả mô phỏng: Hình 9.26. Kết quả mô phỏng RAM có đương dữ liệu vào ra khác nhau. RAM với đường bus song song: Sơ đồ của RAM với đường bus song song được thể hiện trong hình 9.27. Dữ liệu được ghi vào RAM hay được đọc từ RAM thực hiện trên cùng 1 đường bus. Hình 9.27. RAM với đường dữ liệu chung Mã thiết kế sẽ như sau: ------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------- ENTITY ramc IS GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 16); -- # of words in the -- memory PORT ( clk, wr_ena: IN STD_LOGIC; addr: IN INTEGER RANGE 0 TO words-1; bidir: INOUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ramc; ------------------------------------------------- ARCHITECTURE arc OF ramc IS TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); SIGNAL memory: vector_array; BEGIN PROCESS (clk, wr_ena) BEGIN IF (wr_ena='0') THEN bidir <= memory(addr); ELSE bidir 'Z'); IF (clk'EVENT AND clk='1') THEN memory(addr) <= bidir; END IF; END IF; END PROCESS; END arc; ------------------------------------------------- Kết luận Ngày này việc ứng dụng VHDL trong việc thiết kế mạch và chíp ngày cang nhiều. Công nghệ này đang là xu hướng của thời đại, đơn giản vì nó không chỉ tiêu tốn ít về tiền bạc mà nó còn giúp cho chúng ta đơn giản trong việc thiết kế phần cứng. Trên đây, chúng ta đã trình bày một cách khái quát về phương pháp thiết kế các mạch. Những mạch cơ bản nhất đã được chúng ta thiết kế một cách chi tiêt, hoàn thiện. Đây là cơ sở cho những thiết kế lơn hơn về phần cứng, để thiết kế các ứng dụng cho các FPGA, ASIC. Tài liệu tham khảo: Circuit design with VHDL , Voilnei A.Pedroni VHDL language. The vhdl – cookbook , Peter J.Ashedo Thiết kế mạch bằng máy tính, Nguyễn Linh Giang .. Phân công công việc: Nguyễn Ngọc Linh: Chương 2,3 Nguyễn Quốc Việt: Chương 4,5 Nghiêm Kim Phương: Chương 6,7 Lê Tuấn Anh: Chương 8, 9, giới thiệu, tổng kết
File đính kèm:
- de_tai_thiet_ke_mach_bang_vhdl_le_tuan_anh.doc
- VHDL-Tieng-Viet.pdf