Đường chính Đường cắt ngang
Xanh Đỏ Vàng Đỏ Đỏ Đỏ Đỏ Xanh Đỏ Vàng Đỏ Đỏ
3.2 Thiết kế bộ điều khiển tín hiệu đèn giao thơng
Bộ điều khiển tín hiệu đèn giao thông được thiết kế theo máy trạng thái hữu hạn (FSM). Module traffic_light gồm có 3 tín hiệu ngõ vào clock, reset và switch; 2 đường tín hiệu ngõ ra mỗi đường có độ rộng 3-bit. Dưới đây là sơ đồ khối của Traffic_light với các ngõ vào và ngõ ra mà người viết báo cáo muốn thiết kế:
22 clk light_mainroad rst_n light_crossroad switch Traffic_light 3 3
Hình 3.1: Sơ đồ khối đơn vị traffic_light Bảng 3.2: Mơ tả chân tín hiệu bộ điều khiển đèn giao thơng Bảng 3.2: Mơ tả chân tín hiệu bộ điều khiển đèn giao thông
Chân Loại Độ rộng (bit) Chức năng
clk Input 1 Tín hiệu xung Clock
rst_n Input 1 Tín hiệu Reset
switch Input 1 Tín hiệu giữ trạng thái
light_mainroad Output 3 Ngõ ra điều khiển đèn đường chính light_crossroad Output 3 Ngõ ra điều khiển đèn đường ngang Trong đó:
- Tín hiệu xung Clock sử dụng xung 1Hz. - Tín hiệu reset và switch tích cực mức thấp.
- Ngõ ra của light_mainroad và light_crossroad là tín hiệu điều khiển đèn giao thông. Thứ tự bit từ bit 0 đến bit 2 lần lượt là đỏ, vàng và xanh.
Bảng 3.3: Bảng trá trị ngõ ra tương ứng với trạng thái đèn
Đường chính Đường cắt ngang light_mainroad[2:0] light_crossroad[2:0]
Xanh Đỏ 100 001
23
Đỏ Đỏ 001 001
Đỏ Xanh 001 100
Đỏ Vàng 001 010
Đỏ Đỏ 001 001
Kiến trúc của bộ điều khiển tín hiệu đèn giao thơng gồm hai đơn vị chính: delay_counter và traffic_ligh_fsm. Đơn vị delay_counter có chức năng tạo thời gian delay cho đơn vị máy trạng thái đèn giao thơng (traffic_light_fsm), vì u cầu thiết kế bao gồm sau một khoảng thời gian xác định chuyển sang trạng thái kế tiếp. Đối với đơn vị traffic_light_fsm là máy trạng thái, có chức năng tạo tín hiệu ngõ ra theo Bảng 3.1. Kiến trúc của bộ điều khiển tín hiệu đèn giao thơng được thể hiện dưới Hình 3.2.
Delay_Counter Traffic_light FSM light_mainroad [2:0] light_crossroad [2:0] g_end y_end r_end state_g state_y state_r clk rst_n switch
Hình 3.2: Sơ đồ thiết kế bộ điều khiển tín hiệu đèn giao thơng
Tín hiệu ngõ ra g_end, y_end và r_end của đơn vị delay_counter, có chức năng cho biết khi delay ở mỗi trạng thái đèn được hồn thành thì tín hiệu đó sẽ được kéo lên mức logic 1. Tín hiệu ngõ ra state_g, state_y và state_r của đơn vị traffic_light, có chức năng giúp đơn vị delay_counter biết được hiện trại đèn đang ở trạng thái nào, từ đó có thể chọn mức delay phù hợp với trạng thái đó.
24
Đơn vị traffic_light_fsm có chức năng tạo các tín hiệu điều khiển đèn giao thơng, các tín hiệu này được tạo ra theo mơ hình máy trạng thái hữu hạn.
Traffic_light FSM light_mainroad [2:0] light_crossroad [2:0] g_end y_end r_end state_g state_y state_r rst_n clk
Hình 3.3: Sơ đồ chân đơn vị traffic_light_fsm Bảng 3.4: Mơ tả chân tín hiệu đơn vị traffic_light Bảng 3.4: Mơ tả chân tín hiệu đơn vị traffic_light
Chân Loại Độ rộng (bit) Chức năng
clk Input 1 Tín hiệu xung Clock
rst_n Input 1 Tín hiệu Reset
g_end Input 1 Tín hiệu xác định delay đèn xanh
y_end Input 1 Tín hiệu xác định delay đèn vàng
r_end Input 1 Tín hiệu xác định delay đèn đỏ
state_g Output 1 Tín hiệu trạng thái đèn xanh
state_y Output 1 Tín hiệu trạng thái đèn vàng
state_r Output 1 Tín hiệu trạng thái đèn đỏ
light_mainroad Output 3 Ngõ ra điều khiển đèn đường chính light_crossroad Output 3 Ngõ ra điều khiển đèn đường ngang
25
Thực hiện thiết kế đơn vị traffic_light_fsm theo mơ hình máy trạng thái hữu hạn FSM. Gồm có 6 trạng thái là MGRE_CRED, MYEL_CRED, MRED_CRED1, MRED_CGRE, MRED_CYEL và MRED_CRED2. Mỗi trạng thái được xây dựng theo từng bước dựa trên
Bảng 3.3. MY_CR 010&001 MG_CR 100&001 MR_CR1 001&001 MR_CY 001&010 MR_CR2 001&001 MR_CG 001&100 rst_n r_end g_end y_end g_end y_end r_end
Hình 3.4: Sơ đồ trạng thái đơn vị traffic_light_fsm
Trạng thái MR_CR1 là trạng thái khởi tạo FSM, khi đó cả hai đèn đều màu đỏ. Trạng thái MR_CG có chức năng điều khiển đèn ở đường chính đỏ và đèn đường cắt ngang xanh. Trạng thái MR_CY có chức năng điều khiển đèn ở đường chính đỏ và đèn đường cắt ngang vàng. Trạng thái MR_CR2 có chức năng điều khiển đèn ở đường chính đỏ và đèn đường cắt ngang đỏ. Trạng thái MG_CR có chức năng điều khiển đèn ở đường chính xanh và đèn đường cắt ngang đỏ. Cuối cùng, Trạng thái MY_CR có chức năng điều khiển đèn ở đường chính vàng và đèn đường cắt ngang đỏ.
Bảng 3.5: Bảng trạng thái hoạt động đơn vị traffic_light_fsm
Trạng thái hiện tại Trạng thái kế tiếp
Điều kiện Tín hiệu ra (Trạng thái hiện tại)
MR_CR1 MR_CG r_end = 1 001&001
MR_CG MR_CY g_end = 1 001&100
26
MR_CR2 MG_CR r_end = 1 001&001
MG_CR MY_CR g_end = 1 100&001
MY_CR MR_CR1 y_end = 1 010&001
3.2.2 Thiết kế đơn vị delay_counter
Đơn vị delay_counter có chức năng tạo các tín hiệu thơng báo khi delay được hồn thành. Delay_Counter g_end y_end r_end clk rst_n state_g state_y state_r
Hình 3.5: Sơ đồ chân đơn vị delay_counter
Chân Loại Độ rộng (bit) Chức năng
clk Input 1 Tín hiệu xung Clock
rst_n Input 1 Tín hiệu Reset
state_g Input 1 Tín hiệu xác định FSM đang ở
trạng thái đèn xanh
state_y Input 1 Tín hiệu xác định FSM đang ở
27
state_r Input 1 Tín hiệu xác định FSM đang ở
trạng thái đèn đỏ
g_end Output 1 Tín hiệu xác định delay đèn xanh hoàn thành
y_end Output 1 Tín hiệu xác định delay đèn vàng hoàn thành
r_end Output 1 Tín hiệu xác định delay đèn đỏ
hoàn thành
Nhóm tín hiệu g_end, y_end và r_end tại một thời điểm chỉ có một tín hiệu được kéo lên mức logic 1, hai tín hiệu cịn lại phải ở mức logic 0. Đối với nhóm tín hiệu state_g, state_y và state_r cũng tương tự.
Hình 3.6: Sơ đồ nguyên lý đơn vị delay_counter
Hình 3.6 cho thấy được thiết kế cấu tạo các thành phần trong của đơn vị
delay_counter. Bộ mux 2x1 có chức năng lựa chọn thiết đặt biến đếm về 0 hoặc tăng 1. Bên trong đơn vị delay_counter gồm có 3 bộ so sánh biến đếm với biến dùng để delay đã được
28
thiết đặt sẵn. Tiếp theo, 3 tín hiệu fsm_g, fsm_y và fsm_r khi kết hợp với ngõ ra của bộ so sánh cho biết được delay của tín hiệu đèn nào được hồn thành. Cuối cùng là cổng OR 3 ngõ vào dùng để lựa chọn thiết đặt biến đếm về 0 hay tăng 1.
3.2.3 Thiết kế chức năng giữ trạng thái
Đối với chức năng giữ trạng thái, đề tài sử dụng một cổng AND 2 ngõ vào để khống chế xung clock, khi đó các đơn vị chức năng khác sẽ bị tạm dừng hoạt động cho đến khi có xung clock lại.
Khi tín hiệu switch tích cực, tức mức logic bằng 0, thì ngõ ra clk_out ln ln bằng mức logic 0.
clk_in switch
clk_out
29
KẾT QUẢ NGHIÊN CỨU VÀ ĐÁNH GIÁ 4.1 Sơ đồ khối đơn vị traffic_light
Bộ điều khiển tín hiệu đèn giao thơng sau khi được tổng hợp tạo ra được sơ đồ khối như hình 4.1. Các ngõ vào có độ rộng lần lượt là C 1-bit, clk 1-bit và rst_n 1-bit. Và các ngõ ra lần lượt là light_crossroad 3-bit và light_mainroad 3-bit.
Hình 4.1: Top module traffic_light
4.2 Kết quả mô phỏng chức năng
Tất cả các chức năng và trường hợp xảy ra được mô phỏng kết quả với các tín hiệu đầu vào là tín hiệu switch, clock và reset. Module traffic_ligh sẽ được mô phỏng chức năng tại 3 trường hợp: Hoạt động bình thường (Switch khơng tích cực và reset khơng tích cực), hoạt động khi reset tích cực và hoạt động khi Switch tích cực.
Để có thể kiểm tra tất cả các chức năng và trường hợp của module đèn giao thông, người thực hiện đề tài sẽ phải giảm tốc độ xung clock thấp nhất để có thể dễ dàng quan sát.
30
Bảng 4.1: Thông số lựa chọn các trường hợp đặc biệt
Trường hợp rst_n (Reset) C (Switch)
Bình thường 1 1
Reset tích cực 0 X
Switch tích cực 1 0
4.2.1 Kiểm tra trường hợp bình thường
Kiểm tra trường hợp tín hiệu đèn tự động chuyển trạng thái theo thời gian đã được thiết đặt mặc định. Kết quả mơ phỏng được biểu diễn qua Hình 4.2. Các trạng thái từ S0 đến S5 lần lượt được thực hiện đúng theo sơ đồ trạng thái được nêu trên phần thiết kế.
Hình 4.2: Kết quả mơ phỏng trường hợp reset và switch khơng tích cực 4.2.2 Kiểm tra trường hợp Reset tích cực
Kiểm tra trường hợp tín hiệu đèn đang tự động chuyển trạng thái thì tín hiệu reset tích cực. Kết quả mơ phỏng được biểu diễn qua Hình 4.3. Khi đèn đang ở trạng thái S1 (đèn chính: 001 và đèn cắt ngang: 100) thì tín hiệu reset tích cực, làm cho đèn chuyển về trạng thái ban đầu S0 (đèn chính: 001 và đèn cắt ngang: 001). Kết quả được reset theo đúng như thiết kế.
31
4.2.3 Kiểm tra trường hợp Switch tích cực
Kiểm tra trường hợp tín hiệu đèn đang tự động chuyển trạng thái thì tín hiệu switch tích cực. Kết quả mơ phỏng được biểu diễn qua Hình 4.4. Khi đèn đang ở trạng thái S2 (đèn chính: 001 và đèn cắt ngang: 010) thì tín hiệu switch tích cực, làm cho đèn đang ở trạng thái S2 sẽ được giữ lại. Sau khi tín hiệu switch hết tích cực, đèn sẽ tiếp tục hoạt động lại bình thường theo trạng thái trước đó.
Hình 4.4: Kết quả mơ phỏng trường hợp switch tích cực
4.3 Kết quả mô phỏng trên Xilinx Spartan 3E Stater Kit
Dưới đây là kết quả bằng việc mô phỏng trên Kit FPGA Spartan 3E. Các trạng thái được thể hiện trên Kit đúng với yêu cầu thiết kế.
Hình 4.5: FSM ở trạng thái MG_CR Hình 4.6: FSM ở trạng thái MY_CR
32
33
KẾT LUẬN VÀ KIẾN NGHỊ 5.1 Kết luận
Mục tiêu ban đầu của đề tài là thiết kế được bộ điều khiển tín hiệu đèn giao thơng tại ngã tư. Với những kết quả đạt được qua q trình thiết kế, có thể kết luận kết quả của đề tài đã đáp ứng được như mục tiêu đề ra và phù hợp với lý thuyết ban đầu.
Cụ thể, đề tài đã đạt được những kết quả như sau:
Thiết kế được hồn chỉnh một bộ điều khiển tín hiệu đèn giao thơng tại ngã tư với đầy đủ chức năng yêu cầu.
Sử dụng ngôn ngữ Verilog để tạo ra bộ điều khiển tín hiệu đèn giao thơng như thiết kế trên giấy.
Bên cạnh những thành quả đạt được sau quá trình nghiên cứu, đề tài cũng có những hạn chế cần phải giải quyết như sau:
Thiết kế chưa phải là tối ưu nhất về phần cứng.
Chưa có chức năng có thể lựa chọn từng trạng thái tín hiệu đèn.
5.2 Kiến nghị
Đề tài nhóm đã có thể sử dụng thực tế cho một tuyến đường thực tế nhưng chỉ nên vận hành ở tuyến đường nhỏ với lưu lượng giao thơng trung bình. Để được sử dụng ở tuyến đường lớn hơn, nhóm kiến nghị thêm những chức năng nhóm đã đề xuất ở trên để hỗ trợ tốt nhất cho việc kiểm sốt lưu lượng giao thơng lớn hơn.
34
TÀI LIỆU THAM KHẢO
[1] Nguyễn Bảo Ngọc, “Tại sao lại sử dụng FPGA ? Cấu trúc FPGA như thế nào” , 2019 [online]. Available
https://semiconvn.com/home/hoc-thiet-ke-vi-mach/bai-hc-vi-mch/12559-ti-sao-li-s- dng-fpga--cu-truc-fpga-nh-th-nao-.html
[2] Lâm Đức Khải, “Giáo trình Verilog HDL”, Bài báo khoa học, 2017. [3] Nguyễn Quân, “Máy trạng thái hữu hạn FSM”, 2017, [online]. Available
http://nguyenquanicd.blogspot.com/2017/08/verilogsystem-verilog-may-trang- thai.html
35
PHỤ LỤC A. Source code traffic_light_topModule
module traffic_light_topModule(
input clk,
input rst_n,//low active
input switch,//low active output [2:0] light_mainRoad, output [2:0] light_crossRoad );
wire g_end, r_end, y_end, state_g, state_r, state_y; wire inter_clk;
and a1 (inter_clk, clk, switch); delay_counter delay_module ( .clk(inter_clk), .rst_n(rst_n), .state_g(state_g), .state_r(state_r), .state_y(state_y), .g_end(g_end), .r_end(r_end), .y_end(y_end) ); traffic_light_fsm fsm_module ( .clk(inter_clk), .rst_n(rst_n), .g_end(g_end), .r_end(r_end), .y_end(y_end), .light_mainroad(light_mainRoad), .light_crossroad(light_crossRoad), .state_g(state_g), .state_r(state_r), .state_y(state_y) ); endmodule
B. Source code đơn vị traffic_light_fsm
module traffic_light_fsm(
input clk, input rst_n,
36
input g_end, input r_end, input y_end,
output reg [2:0] light_mainroad, output reg [2:0] light_crossroad, output wire state_g,
output wire state_r, output wire state_y );
//encode state
localparam MGRE_CRED = 3'b000;// mainroad green and
crossroad red
localparam MYEL_CRED = 3'b001;// mainroad yellow and
crossroad red
localparam MRED_CRED1 = 3'b010;// mainroad red and
crossroad red
localparam MRED_CGRE = 3'b011;// mainroad red and
crossroad green
localparam MRED_CYEL = 3'b100;// mainroad red and
crossroad yellow
localparam MRED_CRED2 = 3'b101;// mainroad red and
crossroad red
//signal declaration
reg [2:0] current_state, next_state;
//next state
always @ (*) begin
case (current_state[2:0])
MGRE_CRED: begin
if(g_end) next_state = MYEL_CRED; else next_state = current_state; end
MYEL_CRED: begin
if(y_end) next_state = MRED_CRED1; else next_state = current_state; end
MRED_CRED1: begin
if(r_end) next_state = MRED_CGRE; else next_state = current_state; end
MRED_CGRE: begin
if(g_end) next_state = MRED_CYEL; else next_state = current_state; end
MRED_CYEL: begin
if(y_end) next_state = MRED_CRED2; else next_state = current_state; end
37
if(r_end) next_state = MGRE_CRED; else next_state = current_state; end
default: next_state = current_state; //can chu
y truong hop nay
endcase end
//state register
always @ (posedge clk) //reset syn begin
if (~rst_n) current_state <= MRED_CRED1; else current_state <= next_state;
end always @ (*) begin case (current_state) MGRE_CRED: light_mainroad = 3'b100; MYEL_CRED: light_mainroad = 3'b010; default: light_mainroad = 3'b001; endcase end always @ (*) begin case (current_state) MRED_CGRE: light_crossroad = 3'b100; MRED_CYEL: light_crossroad = 3'b010; default: light_crossroad = 3'b001; endcase end
//output signal for counter
assign state_g = (current_state == MGRE_CRED) |
(current_state == MRED_CGRE);
assign state_y = (current_state == MYEL_CRED) |
(current_state == MRED_CYEL);
assign state_r = (current_state == MRED_CRED1) |
(current_state == MRED_CRED2);
endmodule
C. Source code đơn vị delay_counter
module delay_counter( input clk, input rst_n, input state_g, input state_r, input state_y, output wire g_end, output wire r_end, output wire y_end );
38 localparam GREEN_TIME = 3; localparam YELLOW_TIME = 1; localparam RED_TIME = 1; //signal declaration reg [7:0] clk_counter; wire clr_counter;
always @ (posedge clk) begin
if (~rst_n) clk_counter[7:0] <= 8'd0;
else if (clr_counter) clk_counter[7:0] <= 8'd0; else clk_counter[7:0] <= clk_counter[7:0] + 1'b1;
end
//Compare the end time
assign g_end = state_g & (clk_counter[7:0] == GREEN_TIME); assign y_end = state_y & (clk_counter[7:0] == YELLOW_TIME); assign r_end = state_r & (clk_counter[7:0] == RED_TIME);
//
assign clr_counter = g_end | y_end | r_end;
endmodule
D. Source code đơn vị chia xung 50MHz qua 1Hz
module pulse_1Hz #(parameter M = 50000000, N = 26) (input clk, reset, output q ); //signal declaration reg [N-1 : 0] r_reg; wire [N-1 : 0] r_next; //body, register
always @ (posedge clk, posedge reset) begin if (reset) r_reg <= 0; else r_reg <= r_next; end
//next state logic
assign r_next = (r_reg == M) ? 0 : r_reg + 1;
//ouput
assign q = (r_reg < M/2) ? 0 : 1;