Tải bản đầy đủ (.pdf) (26 trang)

GIÁO TRÌNH KỸ THUẬT PLD & ASIC - CHƯƠNG 4 CÁC FLIP FLOP, THANH GHI, BỘ ĐẾM TRONG VHDL pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (316.61 KB, 26 trang )


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

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.

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 Q
0
QD
0

1 1

00 Q
0
QD
0


1 1

0 10 1
1 1

10 1 0
1 1

1 1 NOT Q
0
NOT QD
0

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;
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:
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 Q
0
QD
0
10 0Q
0
QD
0
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;
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 Q3
0

Q2
0
Q1
0
Q0
0
Không có xung clk
1

d Q2
0
Q1
0
Q0
0
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);
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 Q3
0
Q2
0
Q1
0
Q0
0
Không có xung clk

1

d 1 x x x X Q2
0
Q1
0
Q0
0
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;
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 Q7
O
Q6

O
Q5
O
Q4
O
Q3
O
Q2
O
Q1
O
Q0
O
Không có xung clk
1

d Q6
O
Q5
O
Q4
O
Q3
O
Q2
O
Q1
O
Q0
O

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:
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:
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);
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;
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;
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
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;
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
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;
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
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
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);
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
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.
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;
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.
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
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



×