Luận văn - Kỹ thuật PLD và ASIC

Bài tập 4-5:Thiết kế 4 flip flopD gồm 4 ngõ vào D, 4 ngõ ra Q và 4 ngõ ra QD, dùng chung 1 CLK. Bài tập 4-6:Thiết kế 8 flip flop T gồm 8 ngõ vào T,8 ngõ ra Q và 8 ngõ ra QD, dùng chung CLK. Bài tập 4-7:Thiết kế thanh ghi dịch giống như IC 74164. Bài tập 4-8:Thiết kế thanh ghi dịch giống như IC 47194. Bài tập 4-9:Thiết kế mạch điều khiển đèn giao thông với xanh_1, vàng_1, Đỏ_1, xanh_2, vàng_2, đỏ_2. Cho xanh sáng 15 giây, vàng sáng 5 giây và đỏ sáng 20 giây. Bài tập 4-10:Thiết kế mạch điều khiển đèn 8 led đơn với yêu cầu như sau: điểm sáng chạy từ phải sang trái và từ trái sang phải theo xung clock và có 1 chân cho phép E tích cực mức 0. Bài tập 4-11:Thiết kế mạch có chức năng giống như IC 4017. Bài tập 4-12:Thiết kế mạch có chức năng giống như IC 4017 nhưng gồm có 20 ngõ ra. Bài tập 4-13:Thiết kế mạch có chức năng giống như IC 4017 nhưng gồm 2 con: một con đếm hàng đơn vị và một con đếm hàng chục. Bài tập 4-14:Thiết kế mạch đếm nhị phân 4 bit – đếm xuống. Bài tập 4-15:Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR. Bài tập 4-16:Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR. Có thêm chức năng đặt trước số đếm như IC 74193. Bài tập 4-17:Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 1 led 7 đoạn từ 0 đến F tương ứng với số thập lục phân. Bài tập 4-18:Thiết kế mạch đếm BCD – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có mộttín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 1 led 7 đoạn. Bài tập 4-19:Thiết kế mạch đếm BCD từ 00 đến 99 – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếmlên, UD = 1 thì đếm xuống), có mộttín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 2 led 7 đoạn – không dùng quét.

pdf173 trang | Chia sẻ: aloso | Lượt xem: 3400 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Luận văn - Kỹ thuật PLD và ASIC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nh con sự tự do thay đổi các hoạt động bên trong của các chương trình con mà không ảnh hưởng đến bất kỳ thiết kế nào sử dụng chương trình con đó. Ví dụ 2-69 khai báo chương trình con như sau: Ví dụ 2-69: PACKAGE cluspack IS TYPE nineval IS (Z0, Z1, ZX, R0, R1, RX, F0, F1, FX); TYPE t_cluster IS ARRAY (0 TO 15) OF nineval; TYPE t_clus_vec IS ARRAY (natural range ) OF t_cluster; FUNCTION resolve_cluster (s : t_clus_vec) RETURN t_cluster; SUSTYPE t_wclus IS resolve_cluster t_cluster; CONSTANT undriven: t_wclus; END cluspack; Simpo PDF Merge and Split Unregistered Version - Chương 2. Ngôn ngữ lập trình VHDL SPKT – Nguyễn Đình Phú 124 Kỹ thuật PLD và ASIC Khai báo chương trình con cho resolve_cluster chỉ định tên của chương trình con, các đối số bất kỳ của chương trình con, các kiểu và các loại của các đối số và trả về kiểu nếu chương trình con là một hàm. Khai báo này có thể được sử dụng để biên dịch bất kỳ mô hình nào dự định sử dụng chương trình con mà chưa có thân chương trình con thực sự được chỉ định. Thân chương trình con phải hiện hữu trước khi trình mô phỏng được xây dựng. Thân của gói: Mục đích chính của thân của gói là định nghĩa các giá trị cho các hằng trì hoãn và chỉ định các thân chương trình con cho bất kỳ khai báo chương trình con nào từ khai báo gói. Tuy nhiên thân gói cũng có thể chứa các khai báo sau: – Khai báo chương trình con. – Thân chương trình con. – Khai báo kiểu, kiểu con. – Khai báo hằng, khai báo này điền vào giá trị của hằng trì hoãn. – Khai báo tập tin. – Khai báo bí danh. – Mệnh đề USE. Tất cả các khai báo trong thân của gói – ngoại trừ khai báo hằng mà chúng chỉ định giá trị của hằng trì hoãn và khai báo thân chương trình con – là cục bộ đối với thân của gói. Chúng ta hãy khảo sát thân của gói cho khai báo gói đã được đề cập ở phần trước. Ví dụ 2-70: PACKAGE BODY cluspack IS CONSTANT undriven: t_wclus:= (ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX, ZX,); FUNCTION resolve_cluster (s : t_clus_vec) RETURN t_cluster IS VARIABLE result : t_cluster; VARIABLE driver_count : integer; BEGIN IF S’LENGTH = 0 THEN RETURN undriven; END IF; FOR i IN S’RANGE LOOP IF S(i) /= undriven THEN driver_count := driver_count + 1; IF driver_count = 1 THEN result := s(i); ELSE result := undriven; ASSERT FALSE REPORT “multiple drivers detected” SEVERITY ERROR; END IF; END IF; END LOOP ; RETURN result; END resolve_cluster ; END cluspack; Simpo PDF Merge and Split Unregistered Version - Chương 2. Ngôn ngữ lập trình VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 125 Phát biểu thân của gói tương tự như khai báo gói ngoại trừ từ khóa BODY theo sau PACKAGE. Tuy nhiên các nội dung của hai đơn vị thiết kế này rất khác nhau. Thân gói cho ví dụ này chỉ chứa hai mục: giá trị hằng trì hoãn của hằng trì hoãn undriven và thân chương trình con của chương trình con resolve_cluster. Ta hãy lưu ý đến cách thức mà đặc tả giá trị hằng trì hoãn tương thích với khai báo hằng trì hoãn trong khai báo gói và thân chương trình con tương thích với khai báo chương trình con trong khai báo gói. Thân chương trình con phải tương thích chính xác với khai báo chương trình con về số thông số, kiểu của các thông số và kiểu trả về. Thân của gói cũng có thể chứa các khai báo cục bộ chỉ được sử dụng bên trong thân của gói để xây dựng các thân chương trình con khác hoặc các giá trị hằng trì hoãn. Các khai báo này không được nhìn thấy từ bên ngoài thân của gói nhưng có thể rất có ích bên trong thân gói. Ví dụ 2-71 về một gói hoàn chỉnh sử dụng tính chất này như sau: Ví dụ 2-71: LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; PACKAGE math IS TYPE st16 IS ARRAY (0 TO 15) OF std_logic; FUNCTION add(a, b : IN st16) RETURN st16; FUNCTION sub(a, b : IN st16) RETURN st16; END math; PACKAGE BODY math IS FUNCTION vect_to_int (s : st16) RETURN INTEGER IS VARIABLE result : INTEGER:=0; BEGIN FOR i IN 0 TO 7 LOOP result := result * 2; IF S(i) = ‘1’ THEN result := result +1; END IF; END LOOP ; RETURN result; END vect_to_int ; FUNCTION in_to_st16 (s : INTEGER) RETURN st16 IS VARIABLE result : st16; VARIABLE digit: INTEGER := 2**15; VARIABLE local : INTEGER; BEGIN Local:= s; FOR i IN 15 DOWNTO 0 LOOP IF local/digit >= 1 THEN result(i) := ‘1’; Local:= Local - digit; ELSE result(i) := ‘0’; END IF; digit := digit /2; END LOOP ; RETURN result; END in_to_st16 ; FUNCTION add (a,b : IN st16) RETURN st16 IS VARIABLE result : INTEGER; Simpo PDF Merge and Split Unregistered Version - Chương 2. Ngôn ngữ lập trình VHDL SPKT – Nguyễn Đình Phú 126 Kỹ thuật PLD và ASIC BEGIN Result := vect_to_int(a) + vect_to_int(b) ; RETURN int_to_st16 (result); END add; FUNCTION sub (a,b : IN st16) RETURN st16 IS VARIABLE result : INTEGER; BEGIN Result := vect_to_int(a) - vect_to_int(b) ; RETURN int_to_st16 (result); END sub; END math; Khai báo gói ở trên là một khai báo kiểu st16 và hai hàm add và sub hoạt động theo kiểu nêu trên. Thân gói có chứa thân các hàm cho các khai báo hàm add và sub và cũng chứa hai hàm chỉ được sử dụng trong thân của gói đó là các hàm này là int_to_st16 và vec_to_int. Các hàm này không được thấy từ bên ngoài thân của gói. Để làm cho các hàm này có thể nhìn thấy được, một khai báo hàm cần phải thêm vào phần khai báo gói cho mỗi hàm. Các hàm vec_to_int và int_to_st16 phải được khai báo trước hàm add để dịch chương trình cho đúng. Tất cả các hàm phải được khai báo trước khi chúng được sử dụng. X. CÂU HỎI ÔN TẬP VÀ BÀI TẬP Câu 2-1. Hãy phân biệt sự khác nhau giữa biến và tín hiệu? Câu 2-2. Hãy phân biệt sự khác nhau giữ khai báo BIT và STD_LOGIC ? Câu 2-3. Hãy phân biệt sự khác nhau giữ khai báo BIT và BIT_VECTOR? Câu 2-4. Hãy phân biệt sự khác nhau giữ khai báo BIT và STD_LOGIC ? end Simpo PDF Merge and Split Unregistered Version - Chương 3 THIẾT KẾ MẠCH LOGIC TỔ HỢP BẰNG VHDL GIỚI THIỆU THIẾT KẾ MẠCH GIẢI MÃ – MẠCH MÃ HOÁ THIẾT KẾ MẠCH GIẢI MÃ THIẾT KẾ MẠCH MÃ HOÁ THIẾT KẾ MẠCH GIẢI MÃ LED 7 ĐOẠN LOẠI ANODE CHUNG THIẾT KẾ MẠCH ĐA HỢP – MẠCH GIẢI ĐA HỢP THIẾT KẾ MẠCH ĐA HỢP THIẾT KẾ MẠCH GIẢI ĐA HỢP CÂU HỎI ÔN TẬP VÀ BÀI TẬP Simpo PDF Merge and Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú 128 Kỹ thuật PLD và ASIC CÁC HÌNH VẼ Hình 3-1. Sơ đồ khối mạch GM 2 - 4. Hình 3-2. Sơ đồ khối mạch GM 3 - 8. Hình 3-3. Sơ đồ khối mạch MH 4 - 2. Hình 3-4. Sơ đồ khối mạch GM led 7 đoạn loại anode chung. Hình 3-5. Sơ đồ khối mạch ĐH 4 vào. Hình 3-6. Sơ đồ khối mạch GĐH 4 ra. CÁC BẢNG Bảng 3-1. BTT mạch GM 2 - 4. Bảng 3-2. BTT mạch GM 3 - 8. Bảng 3-3. BTT mạch MH 4 - 2. Bảng 3-4. BTT mạch GM led 7 đoạn anode chung. Bảng 3-5. BTT mạch đa hợp 4 ngõ vào. Bảng 3-6. BTT mạch GĐH 4 ra. Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 129 I. GIỚI THIỆU: Trong phần này sẽ thiết kế các mạch logic tổ hợp dùng ngôn ngữ VHDL và sử dụng thiết bị lập trình. Các mạch logic tổ hợp bao gồm mạch giải mã n đường sang m đường, mạch mã hoá m đường sang n đường, mạch dồn kênh và mạch phân kênh, mạch giải mã led 7 đoạn loại anode chung và cathode chung. Các thiết bị lập trình có thể dùng CPLD XC9572, XC 95144, Coolrunner XC2C256. II. THIẾT KẾ MẠCH GIẢI MÃ – MẠCH MÃ HOÁ 1. THIẾT KẾ MẠCH GIẢI MÃ: Bài 3-1: Thiết kế mạch giải mã 2 đường sang 4 đường với ngõ ra tích cực mức cao: Bước 1: Vẽ sơ đồ khối của mạch: I0 I1 DECODE Q0 Q1 Q2 Q3 2 to 4 Hình 3-1. Sơ đồ khối mạch GM 2 - 4. Bước 2: Lập bảng trạng thái: Ngõ vào Ngõ ra I1 I0 Q3 Q2 Q1 Q0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 Bảng 3-1. BTT mạch GM 2 - 4. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity giaima_24 is Port ( I : in STD_LOGIC_VECTOR (1 downto 0); Q : out STD_LOGIC_VECTOR (3 downto 0)); end giaima_24; architecture Behavioral of giaima_24 is Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú 130 Kỹ thuật PLD và ASIC begin PROCESS (I) BEGIN CASE I IS WHEN "00" => Q <= "0001"; WHEN "01" => Q <= "0010"; WHEN "10" => Q <= "0100"; WHEN "11" => Q <= "1000"; WHEN OTHERS => NULL; END CASE; END PROCESS; end Behavioral; Bài 3-2: Thiết kế mạch giải mã 3 đường sang 8 đường với ngõ ra tích cực mức thấp và 1 ngõ cho phép E: Bước 1: Vẽ sơ đồ khối của mạch: I0 I1 DECODE Q0 Q1 Q2 Q3 3 to 8 Q4 Q5 Q6 Q7 I2 E Hình 3-2. Sơ đồ khối mạch GM 3 - 8. Bước 2: Lập bảng trạng thái: Ngõ vào Ngõ ra E I2 I1 I0 Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 0 × × × 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 Bảng 3-2. BTT mạch GM 3 - 8. Bước 3: Viết chương trình: Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 131 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity giaima_38 is Port ( I : in STD_LOGIC_VECTOR (2 downto 0); Q : out STD_LOGIC_VECTOR (7 downto 0); E : in STD_LOGIC); end giaima_38; architecture Behavioral of giaima_38 is BEGIN PROCESS (I,E) BEGIN IF E = '0' THEN Q <= "11111111"; ELSE CASE I IS WHEN "000" => Q <= "11111110"; WHEN "001" => Q <= "11111101"; WHEN "010" => Q <= "11111011"; WHEN "011" => Q <= "11110111"; WHEN "100" => Q <= "11101111"; WHEN "101" => Q <= "11011111"; WHEN "110" => Q <= "10111111"; WHEN "111" => Q <= "01111111"; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; end Behavioral; 2. THIẾT KẾ MẠCH MÃ HOÁ Bài 3-3: Thiết kế mạch mã hoá 4 đường sang 2 đường với ngõ vào tích cực mức cao. Bước 1: Vẽ sơ đồ khối của mạch: Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú 132 Kỹ thuật PLD và ASIC Hình 3-3. Sơ đồ khối mạch MH 4 - 2. Bước 2: Lập bảng trạng thái: Ngõ vào Ngõ ra I3 I2 I1 I0 Q1 Q0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 1 Bảng 3-3. BTT mạch MH 4 - 2. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mahoa42 is Port ( I : in STD_LOGIC_VECTOR (3 downto 0); Q : out STD_LOGIC_VECTOR (1 downto 0)); end mahoa42; architecture Behavioral of mahoa42 is begin PROCESS(I) BEGIN CASE I IS WHEN "0001" => Q <= "00"; WHEN "0010" => Q <= "01"; WHEN "0100" => Q <= "10"; WHEN "1000" => Q <= "11"; WHEN OTHERS => NULL; END CASE; END PROCESS; end Behavioral; 3. THIẾT KẾ MẠCH GIẢI MÃ LED 7 ĐOẠN LOẠI ANODE CHUNG Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 133 Bài 3-4: Thiết kế mạch giải mã led 7 đoạn loại anode chung Bước 1: Vẽ sơ đồ khối của mạch: Hình 3-4. Sơ đồ khối mạch GM led 7 đoạn loại anode chung. Bước 2: Lập bảng trạng thái: Số Ngõ vào Ngõ ra Số tp I3 I2 I1 I0 g f e d c b a hex 0 0 0 0 0 1 0 0 0 0 0 0 40 1 0 0 0 1 1 1 1 1 0 0 1 79 2 0 0 1 0 0 1 0 0 1 0 0 24 3 0 0 1 1 0 1 1 0 0 0 0 30 4 0 1 0 0 0 0 1 1 0 0 1 19 5 0 1 0 1 0 0 1 0 0 1 0 22 6 0 1 1 0 0 0 0 0 0 1 0 02 7 0 1 1 1 1 1 1 1 0 0 0 78 8 1 0 0 1 0 0 0 0 0 0 0 00 9 1 0 0 1 0 0 1 0 0 0 0 10 tắt 1 0 1 0 1 1 1 1 1 1 1 7F tắt 1 0 1 1 1 1 1 1 1 1 1 7F tắt 1 1 0 0 1 1 1 1 1 1 1 7F tắt 1 1 0 1 1 1 1 1 1 1 1 7F tắt 1 1 1 0 1 1 1 1 1 1 1 7F tắt 1 1 1 1 1 1 1 1 1 1 1 7F Bảng 3-4. BTT mạch GM led 7 đoạn anode chung. Bước 3: Viết chương trình: Để đơn giản nên trong chương trình thì ngõ ra được đặt tên theo dạng vector và tên là Y. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity giaima7doan is Port ( I : in STD_LOGIC_VECTOR (3 downto 0); Y : out STD_LOGIC_VECTOR (6 downto 0)); end giaima7doan; Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú 134 Kỹ thuật PLD và ASIC architecture Behavioral of giaima7doan is begin PROCESS (I) BEGIN CASE I IS when "0000" => Y <= "1000000"; -- so 0 when "0001" => Y <= "1111001"; -- so 1 when "0010" => Y <= "0100100"; -- so 2 when "0011" => Y <= "0110000"; -- so 3 when "0100" => Y <= "0011001"; -- so 4 when "0101" => Y <= "0010010"; -- so 5 when "0110" => Y <= "0000010"; -- so 6 when "0111" => Y <= "1111000"; -- so 7 when "1000" => Y <= "0000000"; -- so 8 when "1001" => Y <= "0010000"; -- so 9 when others => Y <= "1111111"; -- tat END CASE; END PROCESS; end Behavioral; III. THIẾT KẾ MẠCH ĐA HỢP – MẠCH GIẢI ĐA HỢP 1. THIẾT KẾ MẠCH ĐA HỢP: Bài 3-5: Thiết kế mạch đa hợp 4 ngõ vào, 1 ngõ ra, 2 ngõ lựa chọn. Bước 1: Vẽ sơ đồ khối của mạch: Hình 3-5. Sơ đồ khối mạch ĐH 4 vào. Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 135 Bước 2: Lập bảng trạng thái: Ngõ vào Ngõ ra S1 S0 I3 I2 I1 I0 Q 0 0 x x x I0 I0 0 1 x X I1 X I1 1 0 X I2 x X I2 1 1 I3 x x X I3 Bảng 3-5. BTT mạch đa hợp 4 ngõ vào. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity GMA is Port ( I : in STD_LOGIC_VECTOR (3 downto 0); S : in STD_LOGIC_VECTOR (1 downto 0); Q : out STD_LOGIC); end GMA; architecture Behavioral of GMA is begin PROCESS(I,S) BEGIN CASE S IS WHEN "00" => Q <= I(0); WHEN "01" => Q <= I(1); WHEN "10" => Q <= I(2); WHEN "11" => Q <= I(3); WHEN OTHERS => NULL; END CASE; END PROCESS; end Behavioral; 2. THIẾT KẾ MẠCH GIẢI ĐA HỢP Bài 3-6: Thiết kế mạch giải đa hợp 1 ngõ vào, 4 ngõ ra, 2 ngõ lựa chọn. Bước 1: Vẽ sơ đồ khối của mạch: Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú 136 Kỹ thuật PLD và ASIC Hình 3-6. Sơ đồ khối mạch GĐH 4 ra. Bước 2: Lập bảng trạng thái: Ngõ vào Ngõ ra I S1 S0 Y3 Y2 Y1 Y0 I 0 0 0 0 0 I I 0 1 0 0 I 0 I 1 0 0 I 0 0 I 1 1 I 0 0 0 Bảng 3-6. BTT mạch GĐH 4 ra. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity GDH is Port ( I : in STD_LOGIC; S : in STD_LOGIC_VECTOR (1 downto 0); Q : out STD_LOGIC_VECTOR (3 downto 0)); end GDH; architecture Behavioral of GDH is begin PROCESS(I,S) BEGIN CASE S IS WHEN "00" => Q(0) <= I; WHEN "01" => Q(1) <= I; WHEN "10" => Q(2) <= I; WHEN "11" => Q(3) <= I; WHEN OTHERS => NULL; END CASE; Simpo PDF Merge nd Split Unregistered Version - Chương 3. Thiết Kế mạch logic tổ hợp SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 137 END PROCESS; end Behavioral; IV. CÂU HỎI ÔN TẬP VÀ BÀI TẬP Bài tập 3-1: Thiết kế mạch giải mã 2 đường sang 4 đường với ngõ ra tích cực mức thấp và có một tín hiệu cho phép E tích cực mức cao. Bài tập 3-2: Thiết kế mạch giải mã 2 đường sang 4 đường với ngõ ra tích cực mức thấp và có một tín hiệu cho phép E1 tích cực mức cao, và một tín hiệu cho phép E2 tích cực mức thấp. Bài tập 3-3: Thiết kế mạch giải mã bên trong có 4 mạch giải mã 2 đường sang 4 đường với ngõ ra tích cực mức thấp. Bài tập 3-4: Thiết kế mạch giải mã 3 đường sang 8 đường với ngõ ra tích cực mức thấp và có một tín hiệu cho phép E1 tích cực mức cao, và một tín hiệu cho phép E2 tích cực mức thấp. Bài tập 3-5: Thiết kế mạch mã hoá 8 đường sang 3 đường với các ngõ vào tích cực mức thấp. Bài tập 3-6: Thiết kế mạch mã hoá 8 đường sang 3 đường với các ngõ vào tích cực mức cao. Bài tập 3-7: Thiết kế mạch giải mã led 7 đoạn loại cathode chung. Bài tập 3-8: Thiết kế mạch giải mã led 7 đoạn loại giống như IC 74247. Bài tập 3-9: Thiết kế mạch giải mã led 7 đoạn loại giống như IC 4511. Bài tập 3-10: Thiết kế mạch đa hợp 8 ngõ vào, 1 ngõ ra và 3 ngõ lựa chọn. Bài tập 3-11: Thiết kế mạch đa hợp 16 ngõ vào, 1 ngõ ra và 4 ngõ lựa chọn. Bài tập 3-12: Thiết kế mạch giải đa hợp 1 ngõ vào, 8 ngõ ra và 3 ngõ lựa chọn. Bài tập 3-13: Thiết kế mạch giải đa hợp 1 ngõ vào, 16 ngõ ra và 4 ngõ lựa chọn. Bài tập 3-14: Thiết kế mạch giải đa hợp giống như IC 74151. Bài tập 3-15: Thiết kế mạch so sánh 2 số 8 bit A và B và có 3 led hiển thị LEDLH, LEDBA, LEDNH. Nếu A>B thì LEDLH sáng, nếu A=B thì LEDBA sáng, nếu A<B thì LEDNH sáng. Bài tập 3-16: Thiết kế mạch chuyển đổi số nhị phân 8 bit thành số BCD. Bài tập 3-17: Thiết kế mạch chuyển đổi số 2 số BCD thành số nhị phân. Bài tập 3-18: Thiết kế mạch kiểm tra chẵn lẻ của một số nhị phân 8 bit, nếu là số chẵn thì đèn chẵn sáng, nếu là số lẻ thì đèn lẻ sáng. end Simpo PDF Merge nd Split Unregistered Version - Chương 4 CÁC FLIP FLOP, THANH GHI, BỘ ĐẾM TRONG VHDL GIỚI THIỆU THIẾT KẾ CÁC LOẠI FLIP FLOP THIẾT KẾ FLIP FLOP JK THIẾT KẾ FLIP FLOP D CÓ ENABLE THIẾT KẾ THANH GHI DỊCH THIẾT KẾ THANH GHI DỊCH 4 BIT THIẾT KẾ THANH GHI DỊCH 8 BIT THIẾT KẾ MẠCH ĐẾM JOHNSON 8 BIT THIẾT KẾ MẠCH ĐẾM VÒNG 8 BIT THIẾT KẾ MẠCH ĐIỀU KHIỂN 8 LED SÁNG DẦN – TẮT DẦN THIẾT KẾ MẠCH ĐẾM THIẾT KẾ MẠCH ĐẾM NHỊ PHÂN 4 BIT – ĐẾM LÊN THIẾT KẾ MẠCH BCD – ĐẾM LÊN THIẾT KẾ MẠCH ĐẾM BCD VÀ GIẢI MÃ HIỂN THỊ LED 7 ĐOẠN THIẾT KẾ MẠCH ĐẾM BCD TỪ 00 ĐẾN 59 – HIỂN THỊ TRÊN 2 LED 7 ĐOẠN THIẾT KẾ MẠCH ĐẾM BCD TỪ 000 ĐẾN 999 – HIỂN THỊ TRÊN 3 LED 7 ĐOẠN CÂU HỎI ÔN TẬP VÀ BÀI TẬP Simpo PDF Merge and Split Unregistered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 142 Kỹ thuật PLD và ASIC Hình 4-1. Sơ đồ khối FLIP FLIP JK. Hình 4-2. Sơ đồ khối FLIP FLIP D có enable. Hình 4-3. Sơ đồ khối thanh ghi 4 bit. Hình 4-4. Sơ đồ khối thanh ghi 4 bit, nạp song song. Hình 4-5. Sơ đồ khối thanh ghi 8 bit. Hình 4-6. Sơ đồ khối mạch đếm vòng Johnson 8 bit. Hình 4-7. Sơ đồ khối mạch đếm vòng 8 bit. Hình 4-8. Sơ đồ khối mạch điều khiển 8 led sáng tắt dần. Hình 4-9. Sơ đồ khối mạch đếm nhị phân 4 bit. Hình 4-10. Sơ đồ khối mạch đếm BCD. Hình 4-11. Sơ đồ khối mạch đếm BCD có giải mã 7 đoạn anode chung. Hình 4-12. Sơ đồ khối mạch đếm từ 00 đến 59 có hiển thị. Hình 4-13. Sơ đồ khối mạch đếm từ 000 đến 999. Bảng 4-1. BTT FLIP FLIP JK. Bảng 4-2. BTT FLIP FLIP D có enable. Bảng 4-3. BTT mạch thanh ghi dịch 4 bit. Bảng 4-4. BTT mạch thanh ghi dịch 4 bit, nạp song song. Bảng 4-5. BTT thanh ghi dịch 8 bit. Bảng 4-6. BTT mạch đếm JOHNSON 8 bit. Bảng 4-7. BTT mạch mạch đếm vòng 8bit. Bảng 4-8. BTT mạch điều khiển 8 led sáng tắt dần. Bảng 4-9. BTT mạch đếm nhị phân 4 bit. Bảng 4-10. BTT mạch đếm BCD. Bảng 4-11. BTT mạch đếm BCD có giải mã 7 đoạn. Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 143 I. GIỚI THIỆU: Trong phần này sẽ thiết kế các mạch flip flop, thanh ghi và mạch đếm dùng ngôn ngữ VHDL và sử dụng thiết bị lập trình. Các mạch flip flop bao gồm flip flop JK, flip flop T, flip flop D. Thanh ghi dịch bao gồm thanh ghi dịch nối tiếp sang nối tiếp, nối tiếp sang song song, mạch đếm vòng, mạch đếm JohnSon. Mạch đếm nhị phân, mạch đếm lên đếm xuống, mạch đếm BCD, mạch đếm đặt trước số đếm, mạch đếm có giải mã sang led 7 đoạn, mạch đếm giây, đếm phút giây,… Các thiết bị lập trình có thể dùng CPLD XC9572, XC 95144, Coolrunner XC2C256. II. THIẾT KẾ CÁC LOẠI FLIP FLOP 1. THIẾT KẾ FLIP FLOP JK: Bài 4-1: Thiết kế flip flop JK gồm có các ngõ vào J, K, CLK, PRE, CLR và các ngõ ra gồm Q và Q : Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-1. Sơ đồ khối FF JK. Bước 2: Bảng trạng thái: NGÕ VÀO NGÕ RA Pre CLR CLK J K Q QD 0 0 X X X 1 1 0 1 X X X 1 0 1 0 X X X 0 1 1 1 0 X X Q0 QD0 1 1 ↓ 0 0 Q0 QD0 1 1 ↓ 0 1 0 1 1 1 ↓ 1 0 1 0 1 1 ↓ 1 1 NOT Q0 NOT QD0 Bảng 4-1. BTT FF JK. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 144 Kỹ thuật PLD và ASIC use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ffjk is Port ( J : in STD_LOGIC; K : in STD_LOGIC; CLK : in STD_LOGIC; PRE : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC; QD : out STD_LOGIC); end ffjk; architecture Behav_ffjk of ffjk is SIGNAL QT,QDT: STD_LOGIC; SIGNAL JK : STD_LOGIC_VECTOR(1 DOWNTO 0); begin PROCESS(J,K,CLK,PRE,CLR) BEGIN IF (PRE='0') AND (CLR='0') THEN QT <='1'; QDT <='1'; IF (PRE='0') AND (CLR='1') THEN QT <='1'; QDT <='0'; ELSIF (PRE='1') AND (CLR='0') THEN QT <='0'; QDT <='1'; ELSIF (PRE='1') AND (CLR='1') THEN IF CLK='0' AND CLK'EVENT THEN JK <=J & K; CASE T IS WHEN "11" => QT <=NOT QT; QDT <=NOT QDT; WHEN "10" => QT <='1'; QDT <='0'; WHEN "01" => QT <='0'; QDT <='1'; WHEN OTHERS => NULL; END CASE; END IF; END IF; END PROCESS; Q <= QT; QD <= QDT; end Behav_ffjk; 2. THIẾT KẾ FLIP FLOP D CÓ ENABLE: Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 145 Bài 4-2: Thiết kế flip flop D gồm có các ngõ vào D, CLK, Enable và ngõ ra gồm Q và Q : Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-2. Sơ đồ khối FF D có enable. Bước 2: Bảng trạng thái: NGÕ VÀO NGÕ RA E clk D Q QD 0 x x Q0 QD0 1 0 0 Q0 QD0 1 ↓ 0 0 1 1 ↓ 1 1 0 Bảng 4-2. BTT FF D có enable. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ff_de is Port ( D : in STD_LOGIC; E : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC; QD : out STD_LOGIC); end ff_de; architecture Behavioral of ff_de is SIGNAL QT: STD_LOGIC; begin PROCESS(D,E,CLK) BEGIN IF E='1' THEN IF CLK='0' AND CLK'EVENT THEN QT <= D; END IF; END IF; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 146 Kỹ thuật PLD và ASIC Q <= QT; QD <= NOT QT; END PROCESS; end Behavioral; III. THIẾT KẾ THANH GHI DỊCH 1. THIẾT KẾ THANH GHI DỊCH 4 BIT: Bài 4-3: Thiết kế thanh ghi dịch 4 bit vào nối tiếp ra nối tiếp. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-3. Sơ đồ khối thanh ghi 4 bit. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA Ghi chú clr clk D Q3 Q2 Q1 Q0 0 x x 0 0 0 0 Reset 1 0 x Q30 Q20 Q10 Q00 Không có xung clk 1 ↑ d Q20 Q10 Q00 d Dịch dữ liệu vào Bảng 4-3. BTT thanh ghi 4 bit. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity reg4b is Port ( D : in STD_LOGIC; CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0)); end reg4b; architecture Behavioral of reg4b is begin process(D,CLK,CLR) variable QT: std_logic_vector(3 downto 0); Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 147 begin if CLR ='0' then QT :="0000"; elsif CLK='1' and CLK'event then QT(3 downto 0) := QT(2 downto 0) & D; end if; Q <= QT; end process; end Behavioral; Bài 4-4: Thiết kế thanh ghi dịch 4 bit vào nối tiếp, song song, ra nối tiếp song song. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-4. Sơ đồ khối thanh ghi 4 bit, nạp song song, nối tiếp. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA Ghi chú CLR CLK D PL P3 P2 P1 P0 Q3 Q2 Q1 Q0 0 x x x x x x x 0 0 0 0 Reset 1 x x 0 P3 P2 P1 P0 P3 P2 P1 P0 Load 1 0 x 1 x x x x Q30 Q20 Q10 Q00 Không có xung clk 1 ↑ d 1 x x x X Q20 Q10 Q00 d Dịch dữ liệu vào Bảng 4-4. BTT mạch thanh ghi dịch 4 bit, nạp song song, nối tiếp. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity tghi4b_ntss is Port ( D : in STD_LOGIC; CLR : in STD_LOGIC; CLK : in STD_LOGIC; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 148 Kỹ thuật PLD và ASIC P : in STD_LOGIC_VECTOR (3 downto 0); Q : out STD_LOGIC_VECTOR (3 downto 0); PL : in STD_LOGIC); end tghi4b_ntss; architecture Behavioral of tghi4b_ntss is begin PROCESS(D,CLR,CLK,P,LOAD) VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF CLR='0' THEN QT:= "0000"; ELSIF PL='0' THEN QT:= P; ELSIF CLK='1' AND CLK'EVENT THEN QT:= QT(2 DOWNTO 0) & D; END IF; Q <= QT; END PROCESS; end Behavioral; 2. THIẾT KẾ THANH GHI DỊCH 8 BIT: Bài 4-5: Thiết kế thanh ghi dịch 8 bit vào nối tiếp, ra nối tiếp song song. Bước 1: Vẽ sơ đồ khối của mạch: CLK CLR Q0 Q1 Q2 Q3 D Q4 Q5 Q6 Q7 Hình 4-5. Sơ đồ khối thanh ghi 8 bit. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA Ghi chú clr clk D Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 0 x x 0 0 0 0 0 0 0 0 Reset 1 0 x Q7O Q6O Q5O Q4O Q3O Q2O Q1O Q0O Không có xung clk 1 ↑ d Q6O Q5O Q4O Q3O Q2O Q1O Q0O d Dịch dữ liệu vào Bảng 4-5. BTT thanh ghi dịch 8 bit. Bước 3: Viết chương trình: Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 149 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TGHI8BIT is Port ( CLK : in STD_LOGIC; CLR,D : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0)); end TGHI8BIT; architecture Behavioral of TGHI8BIT is SIGNAL QT: STD_LOGIC_VECTOR (7 downto 0); begin PROCESS (CLK,CLR) BEGIN IF CLR = '0' THEN QT <= "00000000"; ELSIF CLK='1' AND CLK'EVENT THEN QT <= QT(6 DOWNTO 0) & D; END IF; END PROCESS; Q <= QT; end Behavioral; 3. THIẾT KẾ MẠCH ĐẾM JOHNSON 8 BIT: Bài 4-6: Thiết kế mạch đếm vòng JONHSON 8 bit. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-6. Sơ đồ khối mạch đếm vòng Johnson 8 bit. Chú ý: D đã được kết nối với ngõ ra 7Q và nằm bên trong mạch điện. Bước 2: Lập bảng trạng thái: Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 150 Kỹ thuật PLD và ASIC NGÕ VÀO NGÕ RA clr clk Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 0 X 0 0 0 0 0 0 0 0 1 ↑ 0 0 0 0 0 0 0 1 1 ↑ 0 0 0 0 0 0 1 1 1 ↑ 0 0 0 0 0 1 1 1 1 ↑ 0 0 0 0 1 1 1 1 1 ↑ 0 0 0 1 1 1 1 1 1 ↑ 0 0 1 1 1 1 1 1 1 ↑ 0 1 1 1 1 1 1 1 1 ↑ 1 1 1 1 1 1 1 1 1 ↑ 1 1 1 1 1 1 1 0 1 ↑ 1 1 1 1 1 1 0 0 1 ↑ 1 1 1 1 1 0 0 0 1 ↑ 1 1 1 1 0 0 0 0 1 ↑ 1 1 1 0 0 0 0 0 1 ↑ 1 1 0 0 0 0 0 0 1 ↑ 1 0 0 0 0 0 0 0 1 ↑ 0 0 0 0 0 0 0 0 Bảng 4-6. BTT mạch đếm JOHNSON 8 bit. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity johnson8bit is Port ( CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0)); end johnson8bit; architecture Behavioral of johnson8bit is SIGNAL QT: STD_LOGIC_VECTOR (7 downto 0); SIGNAL D : STD_LOGIC; begin PROCESS (CLK,CLR) BEGIN IF CLR = '1' THEN QT <= "00000000"; ELSIF CLK='1' AND CLK'EVENT THEN D <= NOT QT(7); Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 151 QT <= QT(6 DOWNTO 0) & D; END IF; END PROCESS; Q <= QT; end Behavioral; 4. THIẾT KẾ MẠCH ĐẾM VÒNG 8 BIT: Bài 4-7: Thiết kế mạch đếm vòng 8 bit. Bước 1: Vẽ sơ đồ khối của mạch: CLK CLR Q0 Q1 Q2 Q3 8 BIT RING COUNTER D Q4 Q5 Q6 Q7 Hình 4-7. Sơ đồ khối mạch đếm vòng 8 bit. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA clr clk Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 0 X 0 0 0 0 0 0 0 1 1 ↑ 0 0 0 0 0 0 1 0 1 ↑ 0 0 0 0 0 1 0 0 1 ↑ 0 0 0 0 1 0 0 0 1 ↑ 0 0 0 1 0 0 0 0 1 ↑ 0 0 1 0 0 0 0 0 1 ↑ 0 1 0 0 0 0 0 0 1 ↑ 1 0 0 0 0 0 0 0 Bảng 4-7. BTT mạch đếm vòng 8bit. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ringcounter8 is Port ( CLK : in STD_LOGIC; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 152 Kỹ thuật PLD và ASIC CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(7 downto 0)); end ringcounter8; architecture Behavioral of ringcounter8 is SIGNAL QT: STD_LOGIC_VECTOR(7 downto 0):=”00000001”; begin PROCESS (CLK,CLR) BEGIN IF CLR = '0' THEN QT <="00000001"; ELSIF CLK='1' AND CLK'EVENT THEN QT <= QT(6 DOWNTO 0) & QT(7); END IF; END PROCESS; Q <= QT; end Behavioral; Chú ý: Chương trình sau sử dụng biến thay vì tín hiệu như các chương trình trên: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ringcounter8 is Port ( CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0)); end ringcounter8; architecture Behavioral of ringcounter8 is begin PROCESS (CLK,CLR) VARIABLE QT: STD_LOGIC_VECTOR (7 downto 0); BEGIN IF CLR = '0' THEN QT:="00000001"; ELSIF CLK='0' AND CLK'EVENT THEN QT := QT(6 DOWNTO 0) & QT(7); END IF; Q <= QT; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 153 END PROCESS; end Behavioral; 5. THIẾT KẾ MẠCH ĐIỀU KHIỂN 8 LED SÁNG DẦN – TẮT DẦN: Bài 4-8: Thiết kế mạch điều khiển 8 led sáng dần, tắt dần từ trái sang phải và từ phải sang trái theo xung clock. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-8. Sơ đồ khối mạch điều khiển 8 led sáng tắt dần. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA clr clk Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 THẬP PHÂN 0 X 0 0 0 0 0 0 0 0 0 1 ↑ 0 0 0 0 0 0 0 1 1 1 ↑ 0 0 0 0 0 0 1 1 2 1 ↑ 0 0 0 0 0 1 1 1 3 1 ↑ 0 0 0 0 1 1 1 1 4 1 ↑ 0 0 0 1 1 1 1 1 5 1 ↑ 0 0 1 1 1 1 1 1 6 1 ↑ 0 1 1 1 1 1 1 1 7 1 ↑ 1 1 1 1 1 1 1 1 8 1 ↑ 1 1 1 1 1 1 1 0 9 1 ↑ 1 1 1 1 1 1 0 0 10 1 ↑ 1 1 1 1 1 0 0 0 11 1 ↑ 1 1 1 1 0 0 0 0 12 1 ↑ 1 1 1 0 0 0 0 0 13 1 ↑ 1 1 0 0 0 0 0 0 14 1 ↑ 1 0 0 0 0 0 0 0 15 1 ↑ 0 0 0 0 0 0 0 0 16 1 ↑ 1 0 0 0 0 0 0 0 17 1 ↑ 1 1 0 0 0 0 0 0 18 1 ↑ 1 1 1 0 0 0 0 0 19 1 ↑ 1 1 1 1 0 0 0 0 20 1 ↑ 1 1 1 1 1 0 0 0 21 1 ↑ 1 1 1 1 1 1 0 0 22 1 ↑ 1 1 1 1 1 1 1 0 23 1 ↑ 1 1 1 1 1 1 1 1 24 1 ↑ 0 1 1 1 1 1 1 1 25 1 ↑ 0 0 1 1 1 1 1 1 26 Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 154 Kỹ thuật PLD và ASIC 1 ↑ 0 0 0 1 1 1 1 1 27 1 ↑ 0 0 0 0 1 1 1 1 28 1 ↑ 0 0 0 0 0 1 1 1 29 1 ↑ 0 0 0 0 0 0 1 1 30 1 ↑ 0 0 0 0 0 0 0 1 31 1 ↑ 0 0 0 0 0 0 0 0 32 Bảng 4-8. BTT mạch điều khiển 8 led sáng tắt dần. Các trạng thái sáng dần tắt dần từ phải sang trái cần 16 xung clock và trạng thái ngược lại cũng cần 16 xung clock. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity sangtatdan_tppt is Port ( CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0)); end sangtatdan_tppt; architecture Behavioral of sangtatdan_tppt is SIGNAL QT: STD_LOGIC_VECTOR (7 downto 0); begin PROCESS(CLK,CLR) VARIABLE DEM: INTEGER RANGE 0 TO 32; BEGIN IF CLR ='1' THEN QT <= "00000000"; ELSIF CLK='1' AND CLK'EVENT THEN IF DEM <16 THEN QT <= QT(6 DOWNTO 0) & NOT QT(7); DEM:= DEM +1; ELSE QT <= NOT QT(0) & QT(7 DOWNTO 1); DEM:= DEM +1; END IF; IF DEM = 32 THEN DEM:=0; END IF; END IF; END PROCESS; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 155 Q <= QT; end Behavioral; Trong chương trình biến DEM có chức năng làm biến đếm để thực hiện lần lượt các trạng thái. IV. THIẾT KẾ MẠCH ĐẾM 1. THIẾT KẾ MẠCH ĐẾM NHỊ PHÂN 4 BIT – ĐẾM LÊN Bài 4-9: Thiết kế mạch đếm nhị phân 4 bit. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-9. Sơ đồ khối mạch đếm nhị phân 4 bit. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA Ghi chú clr clk Q3 Q2 Q1 Q0 0 x 0 0 0 0 Reset 1 ↑ 0 0 0 1 1 ↑ 0 0 1 0 1 ↑ 0 0 1 1 … . .. .. 1 ↑ 1 1 1 1 1 ↑ 0 0 0 0 Bảng 4-9. BTT mạch đếm nhị phân 4 bit. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cout_4bit is Port ( CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0)); end cout_4bit; architecture Behavioral of cout_4bit is begin Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 156 Kỹ thuật PLD và ASIC PROCESS(CLK,CLR) VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF CLR ='0' THEN QT:= "0000"; ELSIF CLK='1' AND CLK'EVENT THEN QT:= QT +1; END IF; Q <= QT; END PROCESS; end Behavioral; 2. THIẾT KẾ MẠCH ĐẾM BCD – ĐẾM LÊN: Bài 4-10: Thiết kế mạch đếm bcd. Bước 1: Vẽ sơ đồ khối của mạch: Hình 4-10. Sơ đồ khối mạch đếm BCD. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA Ghi chú clr clk Q3 Q2 Q1 Q0 0 x 0 0 0 0 1 ↑ 0 0 0 1 1 ↑ 0 0 1 0 1 ↑ 0 0 1 1 1 ↑ 0 1 0 0 1 ↑ 0 1 0 1 1 ↑ 0 1 1 0 1 ↑ 0 1 1 1 1 ↑ 1 0 0 0 1 ↑ 1 0 0 1 1 ↑ 0 0 0 0 Bảng 4-10. BTT mạch đếm BCD. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 157 use IEEE.STD_LOGIC_UNSIGNED.ALL; entity bcdcounter is Port ( CLK : in STD_LOGIC; CLR : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0)); end bcdcounter; architecture Behavioral of bcdcounter is begin PROCESS(CLK,CLR) VARIABLE QT: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF CLR ='0' THEN QT:= "0000"; ELSIF CLK='1' AND CLK'EVENT THEN QT:= QT +1; IF QT = "1010" THEN QT := “0000” ; END IF; END IF; Q <= QT; END PROCESS; end Behavioral; 3. THIẾT KẾ MẠCH ĐẾM BCD VÀ GIẢI MÃ HIỂN THỊ LED 7 ĐOẠN Bài 4-11: Thiết kế mạch đếm bcd hiển thị trên led 7 đoạn. Bước 1: Vẽ sơ đồ khối của mạch: I0 I1 DECODE a b c d e f g I2 I3 SEGMENT CLK CLR Q0 COUNTER Q1 Q2 Q3 BCD LED Hình 4-11. Sơ đồ khối mạch đếm BCD có giải mã 7 đoạn anode chung. Bước 2: Lập bảng trạng thái: NGÕ VÀO NGÕ RA tp clr clk Q3 Q2 Q1 Q0 dp g f e d c b a hex 0 0 x 0 0 0 0 1 1 0 0 0 0 0 0 C0 1 1 ↑ 0 0 0 1 1 1 1 1 1 0 0 1 F9 Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 158 Kỹ thuật PLD và ASIC 2 1 ↑ 0 0 1 0 1 0 1 0 0 1 0 0 A4 3 1 ↑ 0 0 1 1 1 0 1 1 0 0 0 0 B0 4 1 ↑ 0 1 0 0 1 0 0 1 1 0 0 1 99 5 1 ↑ 0 1 0 1 1 0 0 1 0 0 1 0 92 6 1 ↑ 0 1 1 0 1 0 0 0 0 0 1 0 82 7 1 ↑ 0 1 1 1 1 1 1 1 1 0 0 0 F8 8 1 ↑ 1 0 0 0 1 0 0 0 0 0 0 0 80 9 1 ↑ 1 0 0 1 1 0 0 1 0 0 0 0 90 Bảng 4-11. BTT mạch đếm BCD có giải mã 7 đoạn. Bước 3: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity count_bcd_gma is Port ( CLR : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0); L7D : out STD_LOGIC_VECTOR (6 downto 0)); end count_bcd_gma; architecture Behavioral of count_bcd_gma is begin PROCESS (CLR,CLK) VARIABLE QTAM: STD_LOGIC_VECTOR (3 downto 0); VARIABLE YTAM: STD_LOGIC_VECTOR (6 downto 0); BEGIN IF CLR='0' THEN QTAM :="0000"; ELSIF CLK='1' AND CLK'EVENT THEN QTAM:= QTAM +1; IF QTAM = "1010" THEN QTAM:="0000"; END IF; END IF; CASE QTAM IS when "0000" => YTAM := x"C0"; -- so 0 when "0001" => YTAM := x"F9"; -- so 1 when "0010" => YTAM := x"A4"; -- so 2 when "0011" => YTAM := x"B0"; -- so 3 when "0100" => YTAM := x"99"; -- so 4 Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 159 when "0101" => YTAM := x"92"; -- so 5 when "0110" => YTAM := x"82"; -- so 6 when "0111" => YTAM := x"F8"; -- so 7 when "1000" => YTAM := x"80"; -- so 8 when "1001" => YTAM := x"90"; -- so 9 when others => YTAM := x"FF"; -- tat END CASE; Q <= QTAM; L7D <= YTAM; END PROCESS; end Behavioral; 4. THIẾT KẾ MẠCH ĐẾM BCD TỪ 00 ĐẾN 59 – HIỂN THỊ TRÊN 2 LED 7 ĐOẠN Bài 4-12: Thiết kế mạch đếm bcd từ 00 đến 59 hiển thị trên 2 led 7 đoạn kết nối theo phương pháp quét. Sử dụng nguồn xung clock có tần số 1,8432MHz trên bộ thí nghiệm dùng để quét và làm xung tăng giá trị đếm. Bước 1: Vẽ sơ đồ khối của mạch: CLK CLR OSC 1,8432MHz a b c d e f g anod0 anod1 Vcc Hình 4-12. Sơ đồ khối mạch đếm từ 00 đến 59 có hiển thị. Bước 2: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DEM0099 is Port ( CLR : in std_logic; CLK : in std_logic; anod : out std_logic_vector(3 downto 0); Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 160 Kỹ thuật PLD và ASIC QB : out std_logic_vector( 7 downto 0); ma7d : out std_logic_vector( 7 downto 0)); end DEM0099; architecture Behavioral of DEM0099 is signal F: std_logic_vector(18 downto 0); signal mabl: std_logic_vector(7 downto 0); signal mabh: std_logic_vector(7 downto 0); function giai_ma(x1: in std_logic_vector(3 downto 0)) return std_logic_vector is variable z1: std_logic_vector(7 downto 0); begin case x1 is when "0000" => z1 := "11000000"; -- so 0 when "0001" => z1 := "11111001"; -- so 1 when "0010" => z1 := "10100100"; -- so 2 when "0011" => z1 := "10110000"; -- so 3 when "0100" => z1 := "10011001"; -- so 4 when "0101" => z1 := "10010010"; -- so 5 when "0110" => z1 := "10000010"; -- so 6 when "0111" => z1 := "11111000"; -- so 7 when "1000" => z1 := "10000000"; -- so 8 when "1001" => z1 := "10010000"; -- so 9 when others =>z1 := "11111111"; -- so end case; return z1; end giai_ma; begin process (CLR,CLK,F,mabl,mabh) variable bcd1: std_logic_vector(3 downto 0); variable bcd2: std_logic_vector(3 downto 0); begin Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 161 if CLR = '1' then bcd1:="0000"; bcd2:="0000"; F <= "0000000000000000000"; elsif RISING_EDGE(CLK) then F <= F + 1; if F = "1111111111111111111" then bcd1:=bcd1+1; if bcd1 = "1010" then bcd1:="0000"; bcd2:= bcd2+1; if bcd2 = "0110" then bcd2:="0000"; end if; end if; nd if; end if; QB <= bcd2 & bcd1 ; -- hien thi 8 led don mabh <= giai_ma(bcd2); mabl <= giai_ma(bcd1); case F (10 downto 9)is when "00" => ma7d <= mabh; anod <="0010"; when "10" => ma7d <= mabl; anod <="0001"; when others => null; end case; END PROCESS; end Behavioral; 5. THIẾT KẾ MẠCH ĐẾM BCD TỪ 000 ĐẾN 999 – HIỂN THỊ TRÊN 3 LED 7 ĐOẠN Bài 4-13: Thiết kế mạch đếm bcd từ 000 đến 999 hiển thị trên 3 led 7 đoạn kết nối theo phương pháp bình thường. Sử dụng nguồn xung clock tuỳ ý. Bước 1: Vẽ sơ đồ khối của mạch: a b c d e f g a b c d e f g a b c d e f g Hình 4-13. Sơ đồ khối mạch đếm từ 000 đến 999. Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 162 Kỹ thuật PLD và ASIC Bước 2: Viết chương trình: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DEM_999000 is Port ( CLR : in STD_LOGIC; CLK : in STD_LOGIC; QDVI : out STD_LOGIC_VECTOR (6 downto 0); QCHU : out STD_LOGIC_VECTOR (6 downto 0); QTRA : out STD_LOGIC_VECTOR (6 downto 0)); end DEM_999000; architecture Behavioral of DEM_999000 is signal GMA_DVI: std_logic_vector(7 downto 0); signal GMA_CHU: std_logic_vector(7 downto 0); signal GMA_TRM: std_logic_vector(7 downto 0); function giai_ma(x1: in std_logic_vector(3 downto 0)) return std_logic_vector is variable z1: std_logic_vector(6 downto 0); begin case x1 is when "0000" => z1 := "1000000"; -- so 0 when "0001" => z1 := "1111001"; -- so 1 when "0010" => z1 := "0100100"; -- so 2 when "0011" => z1 := "0110000"; -- so 3 when "0100" => z1 := "0011001"; -- so 4 when "0101" => z1 := "0010010"; -- so 5 when "0110" => z1 := "0000010"; -- so 6 when "0111" => z1 := "1111000"; -- so 7 when "1000" => z1 := "0000000"; -- so 8 when "1001" => z1 := "0010000"; -- so 9 when others =>z1 := "1111111"; -- TATLED end case; Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 163 return z1; end giai_ma; begin process (CLR,CLK) variable BCD_DVI: std_logic_vector(3 downto 0); variable BCD_CHU: std_logic_vector(3 downto 0); variable BCD_TRA: std_logic_vector(3 downto 0); begin if CLR = '1' then BCD_DVI:="0000"; BCD_CHU:="0000"; BCD_TRA:="0000"; Elsif CLK= '1' and CLK'event then BCD_DVI:=BCD_DVI+1; if BCD_DVI= "1010" then BCD_DVI:="0000"; BCD_CHU:= BCD_CHU+1; if BCD_CHU= "1010" then BCD_CHU:="0000"; BCD_TRA:= BCD_TRA+1; if BCD_TRA= "1010" then BCD_TRA:="0000"; end if; end if; end if; end if; QDVI <= giai_ma(BCD_DVI); QCHU <= giai_ma(BCD_CHU); QTRA <= giai_ma(BCD_TRA); END PROCESS; end Behavioral; V. CÂU HỎI ÔN TẬP VÀ BÀI TẬP Bài tập 4-1: Thiết kế flip flop RS. Bài tập 4-2: Thiết kế mạch chốt D. Bài tập 4-3: Thiết kế flip flop D. Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú 164 Kỹ thuật PLD và ASIC Bài tập 4-4: Thiết kế flip flop T. Bài tập 4-5: Thiết kế 4 flip flop D gồm 4 ngõ vào D, 4 ngõ ra Q và 4 ngõ ra QD, dùng chung 1 CLK. Bài tập 4-6: Thiết kế 8 flip flop T gồm 8 ngõ vào T, 8 ngõ ra Q và 8 ngõ ra QD, dùng chung CLK. Bài tập 4-7: Thiết kế thanh ghi dịch giống như IC 74164. Bài tập 4-8: Thiết kế thanh ghi dịch giống như IC 47194. Bài tập 4-9: Thiết kế mạch điều khiển đèn giao thông với xanh_1, vàng_1, Đỏ_1, xanh_2, vàng_2, đỏ_2. Cho xanh sáng 15 giây, vàng sáng 5 giây và đỏ sáng 20 giây. Bài tập 4-10: Thiết kế mạch điều khiển đèn 8 led đơn với yêu cầu như sau: điểm sáng chạy từ phải sang trái và từ trái sang phải theo xung clock và có 1 chân cho phép E tích cực mức 0. Bài tập 4-11: Thiết kế mạch có chức năng giống như IC 4017. Bài tập 4-12: Thiết kế mạch có chức năng giống như IC 4017 nhưng gồm có 20 ngõ ra. Bài tập 4-13: Thiết kế mạch có chức năng giống như IC 4017 nhưng gồm 2 con: một con đếm hàng đơn vị và một con đếm hàng chục. Bài tập 4-14: Thiết kế mạch đếm nhị phân 4 bit – đếm xuống. Bài tập 4-15: Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR. Bài tập 4-16: Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR. Có thêm chức năng đặt trước số đếm như IC 74193. Bài tập 4-17: Thiết kế mạch đếm nhị phân 4 bit – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 1 led 7 đoạn từ 0 đến F tương ứng với số thập lục phân. Bài tập 4-18: Thiết kế mạch đếm BCD – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 1 led 7 đoạn. Bài tập 4-19: Thiết kế mạch đếm BCD từ 00 đến 99 – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 2 led 7 đoạn – không dùng quét. Bài tập 4-20: Thiết kế mạch đếm BCD từ 000 đến 999 – đếm lên, đếm xuống được điều khiển bằng tín hiệu UD (UD = 0 thì đếm lên, UD = 1 thì đếm xuống), có một tín hiệu CLK, một tín hiệu CLR, có giải mã hiển thị ra 3 led 7 đoạn – dùng quét. Bài tập 4-21: Thiết kế mạch gồm có 3 led 7 đoạn, bàn phím gồm 10 phím số từ “0” đến “9”. Ban đầu thì 3 led hiển thị số “000”, khi nhấn phím nào thì phím đó được dịch vào từ bên phải. (giống như máy tính calculator). Bài tập 4-22: Thiết kế mạch định thời: gồm có 2 led 7 đoạn để hiển thị số giây từ 00 đến 99, bàn phím gồm 10 phím số từ “0” đến “0” vàà phím chức năng như “clear”, “enter”, “test”, một ngõ ra điều khiển relay. Ban đầu thì 2 led hiển thị số “00”, khi nhấn phím nào thì phím đó được dịch Simpo PDF Merge nd Split Unre istered Version - Chương 4. Flip flop, thanh ghi, bộ đếm trong VHDL SPKT – Nguyễn Đình Phú Kỹ thuật PLD và ASIC 165 vào từ bên phải. Sau khi nhấn xong thì nhấn “enter” quá trình đếm xuống sẽ bắt đầu cho đến khi giá trị đếm bằng 00 thì relay sẽ tác động. Hệ thống ngừng. end Simpo PDF Merge nd Split Unre istered Version - TÀI LIỆU THAM KHẢO [1]. “Digital Fundamental Experiments and Concepts with CPLDs” , Thomson Delmar Learning_Chartrand, 2004 [2]. Mivhael.Dciletti, “ Starter’”, Pearson– Pretice Hall, 2004. [3]. Wayne Wolf, “FPGA based System design ”, Prentice Hall, 2004 [4]. William Kleitz, “Digital Electronics with VHDL Quartus II version”, Pearson– Pretice Hall, 2004. [5]. Jong Ching Chuen, Chang Chip Hong, “Digital System Design Principle and Practices”, Pearson Prentice Hall, 2007. Simpo PDF Merge and Split Unregistered Version -

Các file đính kèm theo tài liệu này:

  • pdfLuận văn - Kỹ thuật PLD và ASIC.pdf
Tài liệu liên quan