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 G
Trang 1Chươ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
Trang 2Hì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
Trang 3I 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.
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 74194.
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
Trang 4Bà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 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
Bài tập 4-23: Dùng PLD kết nối với IC đếm BCD 74LS90, hãy viết chương trình điều khiển IC
74LS90 đếm với trình tự như sau:
Đếm từ 0 đến 9, sau đó đếm từ 0 đến 8, tương tự đếm từ 0 đến 7 rồi lặp lại
Bài tập 4-24: Mô tả mạch đếm nhị phân 4 bit có thể đếm với 4 cấp tần số f , 2f , 4f , 8f , các cấp tần số có thể chọn bằng 2 switch S0 và S1, cho tần số cung cấp cho mạch là f
Bài tập 4-25: Mô tả mạch có thể tạo ra dạng sóng với yêu cầu như sau:
Mạch tạo ra 5 xung có tần số 1Hz rồi ngừng 5 xung có tần số 1 hz, cho xung vào có tần số 10hz Có 1 ngõ vào reset
Bài tập 4-26: Mô tả mạch có 3 nút nhấn A, B và C: khi nhấn nút A thì mạch tạo ra 5 xung rồi
ngừng, khi nhấn nút B thì mạch tạo ra 10 xung rồi ngừng, khi nhấn nút C thì mạch tạo ra 15 xung rồi ngừng Cho xung clock ngõ vào có tần số bằng 1Hz
Bài tập 4-27: Thiết kế mạch so sánh 2 số nhị phân 3 bit A và B và 1 mạch đếm nhị 4 bit: nếu
số nhị phân A lớn hơn B thì mạch đếm lên, nếu A bằng B thì mạch đếm xuống, nếu A nhỏ hơn B thì mạch đếm
Bài tập 4-28: Thiết kế 1 mạch đếm nhị phân 4 bit và 1 mạch đếm Johnson 4 bit có cùng clr và
enable nhưng xung clock khác nhau
Bài tập 4-29: Thiết kế 1 mạch đếm nhị phân 4 bit có clr, clk có thể lựa chọn đếm nhị phân
chẵn hoặc lẻ
Bài tập 4-30: Thiết kế 1 mạch đếm nhị phân 5 bit có clr, clk, enable, với trình tự đếm: đếm lên
từ cực tiểu lên cực đại theo số theo số thập phân chẵn rồi quay lại theo số thập phân lẻ, cứ thế lặp lại
Trang 5Bài tập 4-31: Thiết kế 1 mạch có 8 ngõ ra và các ngõ vào gồm: 1 clk, 1 clr, 1 ngõ vào S: S=0
thì mạch đếm Johnson, S=1 thì mạch đếm vòng, 1 ngõ vào pause bình thường ở mức 1: khi nút pause thì mạch đang đếm sẽ ngừng đếm và sau 5 xung thì mạch sẽ đếm tiếp
BÀI LÀM:
• Sơ đồ khối
PAUSE =1 NHAN THI PAUSE = 0 BUONG TAY VE 1
Trang 6ELSE QT:="00000001";
END IF;
ELSIF CLK='1' AND CLK'EVENT THEN
IF ((PAUSE = '1') AND (DEM = 0)) THEN
IF SW = '0' THEN QT:=QT(6 DOWNTO 0) & NOT QT(7
Bài 4-8: Thiết kế mạch điều khiển 8 led: chương trình 1: sáng tắt dần từ trái sang phải, chương
trình 2: sáng tắt dần từ phải sang trái, chương trình 3: 1 led dịch chuyển từ phải sang trái, chương trình 4: 1 led dịch chuyển từ trái sang phải Tất cả đều thực hiện 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
Trang 80 0 0 0 0 0 0 0 48
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
entity STD_8LED is
Port ( CLK,CLR : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR (7 downto 0));
end STD_8LED;
architecture Behavioral of STD_8LED is
SIGNAL QT: STD_LOGIC_VECTOR (7 downto 0);
ELSIF CLK='1' AND CLK'EVENT THEN
IF DEM <16 THEN QT <= QT(6 DOWNTO 0) & NOT QT(7);
ELSIF DEM <32 THEN QT <= NOT QT(0) & QT(7 DOWNTO 1);
ELSIF DEM =32 THEN QT <= "00000001";
ELSIF DEM <40 THEN QT <= QT(6 DOWNTO 0) & QT(7);
ELSIF DEM <48 THEN QT <= QT(0) & QT(7 DOWNTO 1);
Trang 9Bà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ố 2MHz trên bộ thí nghiệm dùng để quét và làm xung tăng giá trị đếm
THỜI GIAN TĂNG LÀ 1S, THỜI GIAN SÁNG HIỂN THỊ CHO MỖI LED LÀ 1MS
Bước 1: Vẽ sơ đồ khối của mạch:
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:
entity DEM0059 is
Port ( CLR, CLK : in std_logic ;
anod : out std_logic_vector (3 downto 0);
ma7d : out std_logic_vector ( 7 downto 0));
end DEM0059;
architecture Behavioral of DEM0059 is
signal FTANG: std_logic_vector (19 downto 0);
signal FHTHI: std_logic_vector (9 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
Trang 10variable BCD1,BCD2: std_logic_vector (3 downto 0);
VARIABLE AN: std_logic;
Trang 11END IF;
END IF;
mabh <= giai_ma(bcd2);
mabl <= giai_ma(bcd1);
IF FHTHI = X"7D0" THEN FHTHI <= (others => ‘0’);
AN:= NOT AN;
Thời gian tăng giá trị là 524288 * 0,5425 µs = 284426,24 µs=0,3s
Bài 4-12: Thiết kế mạch đếm BCD từ 0000 đến 9999 hiển thị trên 4 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ố 2MHz trên bộ thí nghiệm dùng để quét và làm xung tăng giá trị đếm
Trang 12THỜI GIAN TĂNG LÀ 1S, THỜI GIAN SÁNG HIỂN THỊ CHO MỖI LED LÀ 1MS
Bước 1: Vẽ sơ đồ khối của mạch:
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:
entity DEM0059 is
Port ( CLR, CLK : in std_logic ;
anod : out std_logic_vector (3 downto 0);
ma7d : out std_logic_vector ( 7 downto 0));
end DEM0059;
architecture Behavioral of DEM0059 is
signal FTANG: std_logic_vector (19 downto 0);
signal FHTHI: std_logic_vector (9 downto 0);
signal mab1, mab2, mab3, mab4: 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
Trang 13variable BCD1,BCD2, BCD3,BCD4: std_logic_vector (3 downto 0);
VARIABLE AN: std_logic_vector (1 downto 0);
IF BCD1 = "1010" THEN BCD1:="0000"; BCD2:= BCD2+1; END IF;
IF BCD2 = "1010" THEN BCD2:="0000"; BCD3:= BCD3+1; END IF;
IF BCD3 = "1010" THEN BCD3:="0000"; BCD4:= BCD4+1; END IF;
IF BCD4 = "1010" THEN BCD4:="0000"; END IF;
END IF;
Trang 14when "00" => ma7d <= mab1; anod <="0001";
when "01" => ma7d <= mab2; anod <="0010";
when "10" => ma7d <= mab3; anod <="0100";
when "11" => ma7d <= mab4; anod <="1000";
when others => null;
end case;
END PROCESS;
end Behavioral;
Bài 4-12: Thiết kế mạch đếm sản phẩm hiển thị trên 4 led quét Sử dụng nguồn xung clock có
tần số 2MHz dùng để quét và xung ngoài làm tăng giá trị đếm
THỜI GIAN SÁNG HIỂN THỊ CHO MỖI LED LÀ 1MS
Bước 1: Vẽ sơ đồ khối của mạch:
Hình 4-12 Sơ đồ khối mạch đếm từ 00 đến 59 có hiển thị
entity DEM0059 is
Trang 15Port ( CLR, CLK,CLKXN : in std_logic ;
anod : out std_logic_vector (3 downto 0);
ma7d : out std_logic_vector ( 7 downto 0));
end DEM0059;
architecture Behavioral of DEM0059 is
signal FHTHI: std_logic_vector (9 downto 0);
signal mab1, mab2, mab3, mab4: 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);
variable BCD1,BCD2, BCD3,BCD4: std_logic_vector (3 downto 0);
VARIABLE AN: std_logic_vector (1 downto 0):= “00”;
IF BCD1 = "1010" THEN BCD1:="0000"; BCD2:= BCD2+1; END IF;
IF BCD2 = "1010" THEN BCD2:="0000"; BCD3:= BCD3+1; END IF;
IF BCD3 = "1010" THEN BCD3:="0000"; BCD4:= BCD4+1; END IF;
IF BCD4 = "1010" THEN BCD4:="0000"; END IF;
Mab1 <= giai_ma(bcd1);
Mab2 <= giai_ma(bcd2);
Mab3 <= giai_ma(bcd3);
Mab4 <= giai_ma(bcd4);
Trang 16IF FHTHI = X"7D0" THEN FHTHI <= (others => ‘0’);
AN:= AN + 1;
END IF;
case AN is
when "00" => ma7d <= mab1; anod <="0001";
when "01" => ma7d <= mab2; anod <="0010";
when "10" => ma7d <= mab3; anod <="0100";
when "11" => ma7d <= mab4; anod <="1000";
when others => null;
end case;
END PROCESS;
end Behavioral;
Bài 4-12: Thiết kế mạch đếm sản phẩm 2 kênh hiển thị trên 4 led quét, mỗi kênh 2 led Sử
dụng nguồn xung clock có tần số 2MHz dùng để quét và xung ngoài clkxn1 làm tăng giá trị đếm kênh 1, clkxn2 làm tăng giá trị đếm kênh 2
THỜI GIAN SÁNG HIỂN THỊ CHO MỖI LED LÀ 1MS
Bước 1: Vẽ sơ đồ khối của mạch:
Hình 4-12 Sơ đồ khối mạch đếm từ 00 đến 59 có hiển thị
entity DEM0059 is
Port ( CLR, CLK,CLKXN1, CLKXN2 : in std_logic ;
anod : out std_logic_vector (3 downto 0);
ma7d : out std_logic_vector ( 7 downto 0));
end DEM0059;
Trang 17architecture Behavioral of DEM0059 is
signal FHTHI: std_logic_vector (9 downto 0);
signal mab1, mab2, mab3, mab4: 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);
variable BCD11,BCD12, BCD21,BCD22: std_logic_vector (3 downto 0);
VARIABLE AN: std_logic_vector (1 downto 0):= “00”;
IF BCD11 = "1010" THEN BCD11:="0000"; BCD12:= BCD12+1; END IF;
IF BCD12 = "1010" THEN BCD12:="0000"; END IF;
IF CLR = '0' THEN BCD21:="0000"; BCD22:="0000";
ELSIF RISING_EDGE (CLKXN2) THEN BCD21:= BCD21+1;
END IF;
IF BCD21 = "1010" THEN BCD21:="0000"; BCD22:= BCD22+1; END IF;
IF BCD22 = "1010" THEN BCD22:="0000"; END IF;
Trang 18END IF;
case AN is
when "00" => ma7d <= mab1; anod <="0001";
when "01" => ma7d <= mab2; anod <="0010";
when "10" => ma7d <= mab3; anod <="0100";
when "11" => ma7d <= mab4; anod <="1000";
when others => null;
Trang 19entity DEM_PHUT_GIAY is
Port ( CLR,CK : in STD_LOGIC;
QSEG : out STD_LOGIC_VECTOR (7 downto 0);
ANODE : out STD_LOGIC_VECTOR (3 downto 0));
end DEM_PHUT_GIAY;
architecture Behavioral of DEM_PHUT_GIAY is
FUNCTION GIAI_MA(BCDT: STD_LOGIC_VECTOR (3 DOWNTO 0)) RETURN STD_LOGIC_VECTOR IS
VARIABLE MA7D: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLR = '0' THEN CHIA := 0; CHIAHT := (OTHERS=>'0');
MANODE:="00";