Đề 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 -

 

doc141 trang | Chuyên mục: Logic Mờ và Ứng Dụng | Chia sẻ: tuando | Lượt xem: 391 | Lượt tải: 0download
Tóm tắt nội dung Đề tài Thiết kế mạch bằng VHDL - Lê Tuấn Anh, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • docde_tai_thiet_ke_mach_bang_vhdl_le_tuan_anh.doc
  • pdfVHDL-Tieng-Viet.pdf