Bảng chuyển trạng thái tín hiệu đèn

Một phần của tài liệu Thiết kế hệ thống điều khiển tín hiệu đèn giao thông sử dụng FPGA (Trang 32)

Đườ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;

Một phần của tài liệu Thiết kế hệ thống điều khiển tín hiệu đèn giao thông sử dụng FPGA (Trang 32)

Tải bản đầy đủ (PDF)

(50 trang)