ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA BÁO CÁO THÍ NGHIỆM KĨ THUẬT SỐ GV Lớp L08 Đặng Thái Dương 2011031 TP Hồ Chí Minh tháng 11 năm 2021 Đề bài Thiết kế đèn giao thông trên phần mềm.
Trang 1ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO THÍ NGHIỆM KĨ THUẬT SỐ GV:
Lớp L08 Đặng Thái Dương 2011031
_
TP.Hồ Chí Minh tháng 11 năm 2021
Trang 2Đề bài:
Thiết kế đèn giao thông trên phần mềm PROTEUS và QUARTUS với
thời gian hiển thị của ba đèn xanh, vàng và đỏ được cho
Trang 3PHẦN LÀM TRÊN PROTEUS
-Các linh kiện sử dụng: 74LS151, 7447, NOT, AND,OR, LED 7 ĐOẠN,74LS283, TRAFFIC LIGHT -Ta sử dụng JK-FF để đếm lên, vì tổng thời gian đếm là 13 nên ta sử dụng 4 flip flop để mô tả
-Ứng với mỗi giá trị đếm lên có 1 trong ba đèn sáng Ta có bảng sau:
Q3 Q2 Q1 Q0 Giá trị thập phân delay Đèn Biểu thức
0 0 0 0 0 1 Xanh Q3’.Q2’.Q1’ + Q3’.Q2’.Q1.Q0’ +
Q3’.Q2’.Q1.Q0 + Q3’.Q2.Q1’Q0’ + Q3’.Q2.Q1’.Q0
0 1 1 0 6 1 Vàng Q3’.Q2.Q1.Q0’ + Q3’.Q2.Q1.Q0
1 0 0 0 8 1 Đỏ Q3.Q2’.Q1’.Q0’ + Q3.Q2’.Q1’.Q0 +
Q3.Q2’.Q1.Q0’ + Q3.Q2’.Q1.Q0 + Q3.Q2.Q1’.Q0’
*Là trạng thái không mong muốn, để 1101 về trạng thái ban đầu “0000” đếm tiếp => nối (Q3.Q2.Q0)’ vào chân R của flip flop
Bên trái là sơ đồ đèn xanh, bên phải lần lượt là đèn vàng(trên) và đèn đỏ (dưới)
Trang 4-Ta thấy, vì giá trị chính xác (thập phân) của bộ đếm bị lệch với thời gian delay của đèn
Vì vậy ta phải sử dụng IC 74LS283 để cộng thêm giá trị để sau đó đưa vào IC 74LS47 hiển thị ra LED 7 đoạn Cụ thể:
+đèn xanh: cộng “0001”
+đèn vàng: cộng bù 2 của 5 “1011”
+đèn đỏ: cộng bù 2 của 7 “1001”
IC 74LS283 thực hiện chức năng cộng A+B với :
A là các giá trị đếm của flip flop,
B là số hạng phải cộng thêm như trên để thõa yêu cầu.
Để cộng A với B (4 bit) thì ta sử dụng thêm 4 IC 74151 dồn 3 bit của đèn
(“001,010,100”) (Mỗi IC sẽ ứng với từng bit của B)) => Khi tín hiệu đếm rơi vào đèn nào thì sẽ có 4 giá trị ở mỗi IC MUX được tích cực và đưa vào bộ cộng.
Bước cuối cùng là đưa tín hiệu thể hiện ra LED.
*
Trang 5PHẦN LÀM TRÊN QUARTUS
-Ý tưởng:
Đầu tiên ta chia bài này thành hai process Process thứ nhất là khối “den” có một đầu vào là “clk” và đầu ra là ba led tượng trưng cho đèn đỏ, vàng, xanh Process thứ hai là khối “decode” với đầu vào là number để hiển thị kết quả đếm giây Dưới đây là sơ đồ khối của ý tưởng:
-Chương trình mô tả hoạt động:
library ieee;
use ieee.std_logic_1164.all;
entity den is
port(clk: in std_logic;
green: out std_logic;
yellow: out std_logic;
red: out std_logic;
digit: out std_logic_vector(6 downto 0)); led có 7 bit
end entity;
architecture behavior of den is
signal number: integer range 0 to 9; led hiển thị từ 0 đến 9
begin
Trang 6den: process(clk)
variable count : integer range 0 to 9; khai báo biến đếm, chính là số giây hiển thị
variable state : integer range 0 to 2; khai báo biến trạng thái, có ba trạng thái là đỏ vàng xanh
begin
if clk'event and clk = '1' then nếu clk thay đổi và kích cạnh lên 1
if count = 0 then nếu count bằng 0 thì
ba đèn tắt hết
green <= '0';
yellow <= '0';
red <= '0';
if state =0 then nếu ở trạng thái
0 thì sẽ chuyển lên trạng thái 1
state := 1;
count := 6; thời gian yêu cầu của đèn xanh
green <= '1';
elsif state = 1 then nếu ở trạng thái 1 thì sẽ chuyển lên trạng thái 2
state := 2;
count := 2; thời gian yêu cầu của đèn vàng
yellow <= '1';
else ngược lại hai trạng thái ở trên thì là trạng thái còn lại
state := 0;
count := 5; thời gian yêu cầu của đèn đỏ
red <= '1';
end if;
else
count := count - 1; nếu đếm không bằng 0 thì sẽ cho nó đếm ngược về 0
end if;
number <= count; gán count vào number để đếm giây
end if;
Ở đoạn chương trình này, nếu count được đếm hết về 0 thì sẽ bắt đầu được chuyển trạng thái, ví
dụ ở trạng thái 0 (đèn đỏ) thì sẽ được chuyển
về trạng thái 1(đèn xanh)
có 6s, và khi
đó count sẽ đếm xuống tới khi nào còn 0s lúc đó mới chuyển đến trạng thái tiếp theo
Trang 7end process;
decode : process(number) process hiển thị số giây
begin
case number is
when 0 => digit <= "0000001";
mã led anode chung của số 0, tương tự với các trường hợp ở dưới
when 1 => digit <= "1001111"; when 2 => digit <= "0010010"; when 3 => digit <= "0000110"; when 4 => digit <= "1001100"; when 5 => digit <= "0100100"; when 6 => digit <= "0100000"; when 7 => digit <= "0001111"; when 8 => digit <= "0000000"; when 9 => digit <= "0000100"; when others => null;
end case;
end process;
end architecture;
-Kết quả RTL viewer:
Trang 8-Kết quả dạng sóng:
Trang 9Nhận xét: ta thấy đèn giao thông đã được đếm tuần tự theo đúng như yêu cầu đề
bài, ở đây em vẫn giữ trường hợp đếm về “0” bởi vì trong thực tế em cũng thấy đèn giao thông có đếm lùi về “0”