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 hoà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;