5. Phân tích khối TIME_COUNTERChọn giá trị:GREEN_TIME = 59. Đèn xanh sáng 60sYELLOW_TIME = 4. Thời gian đèn vàng sáng 5s.RED_TIME = 1 Thời gian đèn đỏ trên cả 2 đường cùng sáng là 2s.YELLOW_YELLOW_TIME = 17999. (5 giờ đồng hồ)LEFT_TIME = 24; thời gian rẽ trái là 25sSTART_YY_TIME = 68399; from 5h:00 to 24h:59DAY_TIME = 86399;Hình 5 Sơ đồ nguyên lý khối TIME_COUNTER Bộ đếm xung có output n+1 bit, cho phép người dùng điều chỉnh linh hoạt các giá trị RED_RED_TIME, GREEN_TIME, YELLOW_TIME, YELLOW_YELLOW_TIME và RED_LEFT_TIME tùy ý. Trong bài này có YELLOW_YELLOW_TIME = 200 nên chỉ cần sử dụng n=7 nhưng nhóm quyết định sử dụng n=14 là để phù hợp vợi với thực tế YELLOW_YELLOW_TIME = 18000s (từ 0 giờ đến 5 giờ sáng).Giả sử current_state = AGBR | ARBG, khi đó fsm_g=1, fsm_y=0, fsm_rr=0, fsm_l=0 và fsm_yy=0. Như vậy clk_countern:0 sẽ được đưa vào bộ so sánh với GREEN_TIME. Khi clk_countern:0 = 14’d29 thì g_end =0 =>> clr_counter = 0 =>> bộ đếm được tăng lên 1 đơn vị cho đến khi clk_countern:0 = 14’d29 thì đầu ra bộ so sánh bằng 1 =>> g_end = 1. Khi g_end = 1 sẽ làm cho clr_counter =1 =>> bộ đếm được thiết lập lại, nghĩa là clk_countern:0 =14’d0, đồng thời cũng tác động lên khối FSM chuyển sang next_state tương ứng.Với clk_counter_yy17:0 sẽ được đếm từ lúc có tín hiệu rst_n = 0 đến khi clk_counter_yy17:0=17’d1000 (với 1 ngày hoàn chỉnh nó sẽ đếm đến 17’d86400).
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ-VIỄN THÔNG BÁO CÁO GIỮA KỲ 20171 THIẾT KẾ VÀ TỔNG HỢP IC SỐ Đề tài: ĐIỀU KHIỂN ĐÈN GIAO THÔNG Nhóm 20 mssv Giảng viên hướng dẫn BT traffic light Nhóm 20 Mục lục Đề tài Sơ đồ tổng quát Sơ đồ khối 3.1 TIME_COUNTER 3.2 FSM Phân tích khối FSM Phân tích khối TIME_COUNTER Mã hóa trạng thái Mô 10 Phụ luc (hình ảnh, bảng biểu code) 11 Tài liệu tham khảo: Jr.Charles H.Roth - Digital Systems Design Usin BT traffic light Nhóm 20 Đề tài G R STREET - A Y Y R STREET - B R STREET - A R G STREET - B Y G G Hình Đèn giao thơng ngã tư 1.1 Giả sử STREET A có mức độ ưu tiên STREET B, rst_n tích cực mức thấp đèn STREET A xanh trước 1.2 Mỗi đường có tín hiệu điều khiển đèn tương ứng với màu Red/Yellow/Green Left (màu xanh) để rẽ trái viết tắt R/Y/G/L 1.3 Đèn hoạt động bình thường chuyển trạng thái đỏ >> xanh >> vàng >> rẽ trái từ sáng đến hết 12 đêm Sau 12 đêm đến sáng đèn đường màu vàng (nếu ko có tín hiệu rst_n/rst_nA/rst_nB) 1.4 Trạng thái khởi động trạng thái đèn STREET A STREET B đỏ (AR-BR1 AR-BR2) 1.5 Bảng chuyển trạng thái BT traffic light Nhóm 20 Street A Street B Y R G Y RL R R R Y R R R R G Y RL Bảng bảng chuyển trạng thái Sơ đồ tổng quát clk rst_n street_a[3:0] Traffic_light_controller rst_nA street_b[3:0] rst_nB Hình Sơ đồ tổng quát Trong đó: - clk xung clock - rst_n tín hiệu dùng để khởi động điều khiển đến trạng thái ban đầu Red-Red tích cực mức thấp, STREET A ưu tiên trước rst_n ưu tiên so với rst_nA - rst_nA tín hiệu dùng để khởi động điều khiển đến trạng thái ban đầu RedRed tích cực mức thấp, STREET A ưu tiên trước.rst_nA gần giống với rst_n ưu tiên so với rst_nB - rst_nB tín hiệu dùng để khởi động điều khiển đến trạng thái ban đầu RedRed tích cực mức thấp, STREET B ưu tiên trước BT traffic light Nhóm 20 - street_a[3:0] tín hiệu điều khiển đèn đường STREET A Thứ tự bit từ đến tương ứng với trạng thái R/Y/G/L, tích cực mức - street_b[3:0] tương tự street_a[3:0] đường STREET B Bảng mã hóa giá trị ngõ tương ứng với trạng thái đèn sau: Street A Street B Street_a[2:0] Street_b[20] Y Y 0100 0100 R R 1000 1000 G R 0010 1000 Y R 0100 1000 RL R 1001 1000 R G 1000 0010 R Y 1000 0100 R RL 1000 1001 Bảng Bảng giá trị ngõ điều khiển tương ứng với trạng thái đèn Sơ đồ khối yy_end rr_end g_end clk rst_n rst_nA rst_nB street_a[3:0] y_end l_end Time_counter fsm_l fsm_y FSM Traffic_light street_b[3:0] fsm_g fsm_rr fsm_yy Hình Sơ đồ khối điều khiển đèn giao thông BT traffic light Nhóm 20 3.1 TIME_COUNTER: dùng để đếm xunh clock xác định thời gian trì trạng thái đèn Đây thời gian cấu hình trước biên dịch yêu cầu đặt Năm tín hiệu g_end, rr_end, y_end, yy_end l_end báo thời điểm kết thúc trạng thái GREEN, RED_RED, YELLOW, YELLOW_YELLOW RED_LEFT Năm tín hiệu fsm_g, fsm_rr, fsm_y , fsm_yy fsm_l báo trạng thái GREEN, REG_RED, YELLOW, YELLOW_YELLOW RED_LEFT để đếm hoạt động theo giá trị cấu hình phù hợp 3.2 FSM: máy trạng thái tạo ngõ street_a, street_b fsm_g, fsm_rr, fsm_y, fsm_yy fsm_l Phân tích khối FSM yy_end AR – BR1 AY-BR ARL-BR rr_end g_end AG-BR AY - BY AR-BG rst_n/ rst_nA g_end AR-BRL AR-BY rr_end rst_nB AR – BR2 Hình FSM điều khiển đèn giao thơng BT traffic light Nhóm 20 Trong đó, ký hiệu A B ứng với STREET A STREET B G GREEN, R RED Y YELLOW Ví dụ, AG_BR nghĩa trạng thái STREET A GREEN, STREET B RED Sau reset hai đèn phải RED-RED nên ta chọn trạng thái AR-BR1 AR-BR2 tùy vào yêu cầu ưu tiên Việc tự động chuyển trạng thái xảy tín hiệu báo độ trễ tương ứng trạng thái tích cực Ví dụ, đèn STREET A STREET B xanh g_end phải tích cực chuyển sang trạng thái state AY-BY AR-BR1 AG-BR AY-BR ARL-BR AR-BG AR-BY AR-BRL AR-BR2 Street_a [3:0] 0100 1000 0010 0100 1001 1000 1000 1000 1000 Street_b [3:0] 0100 1000 1000 1000 1000 0010 0100 1001 1000 fsm_g fsm_y fsm_rr fsm_yy fsm_l 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 Bảng Bảng giá trị đầu FSM Phân tích khối TIME_COUNTER Chọn giá trị: - GREEN_TIME = 59 Đèn xanh sáng 60s - YELLOW_TIME = Thời gian đèn vàng sáng 5s - RED_TIME = Thời gian đèn đỏ đường sáng 2s - YELLOW_YELLOW_TIME = 17999 (5 đồng hồ) - LEFT_TIME = 24; thời gian rẽ trái 25s - START_YY_TIME = 68399; // from 5h:00 to 24h:59 BT traffic light Nhóm 20 - DAY_TIME = 86399; clr_counter +1 rst_n YELLOW_YELLOW_TIME rst_nA fsm_yy clk_counter[14:0] =? rst_nB GREEN_TIME ? fsm_g clk =? YELLOW_TIME yy_end g_end fsm_y y_end =? RED_RED_TIME ? fsm_rr rr_end =? RED_LEFT_TIME ? fsm_l Bộ đếm xung l_end =? ? Hình Sơ đồ nguyên lý khối TIME_COUNTER clr_counter_yy rst_n +1 DAY_TIME clk_counter_yy[17:0] =? ? clk START_YY_TIME =? Hình Bộ đếm xung pos_Y ? BT traffic light Nhóm 20 Bộ đếm xung có output n+1 bit, cho phép người dùng điều chỉnh linh hoạt giá trị RED_RED_TIME, GREEN_TIME, YELLOW_TIME, YELLOW_YELLOW_TIME RED_LEFT_TIME tùy ý Trong có YELLOW_YELLOW_TIME = 200 nên cần sử dụng n=7 nhóm định sử dụng n=14 để phù hợp vợi với thực tế YELLOW_YELLOW_TIME = 18000s (từ đến sáng) Giả sử current_state = AG-BR | AR-BG, fsm_g=1, fsm_y=0, fsm_rr=0, fsm_l=0 fsm_yy=0 Như clk_counter[n:0] đưa vào so sánh với GREEN_TIME Khi clk_counter[n:0] != 14’d29 g_end =0 =>> clr_counter = =>> đếm tăng lên đơn vị clk_counter[n:0] = 14’d29 đầu so sánh =>> g_end = Khi g_end = làm cho clr_counter =1 =>> đếm thiết lập lại, nghĩa clk_counter[n:0] =14’d0, đồng thời tác động lên khối FSM chuyển sang next_state tương ứng Với clk_counter_yy[17:0] đếm từ lúc có tín hiệu rst_n = đến clk_counter_yy[17:0]=17’d1000 (với ngày hoàn chỉnh đếm đến 17’d86400) Mã hóa trạng thái State Mã hóa bit nhị phân AY-BY 4’d1 AR-BR1 4’d2 AG-BR 4’d3 AY-BR 4’d4 ARL-BR 4’d5 AR-BG 4’d6 AR-BY 4’d7 AR-BR2 4’d8 AR-BRL 4’d9 Bảng Mã hóa trạng thái BT traffic light Nhóm 20 Mơ Hình Thời điểm ban đầu có tín hiệu rst_n = Hình Thời điểm có pos_Y = 10 BT traffic light Nhóm 20 Phụ luc (hình ảnh, bảng biểu code) Bảng bảng chuyển trạng thái Bảng Bảng giá trị ngõ điều khiển tương ứng với trạng thái đèn Bảng Bảng giá trị đầu FSM Bảng Mã hóa trạng thái Hình Hình Hình Hình Hình Hình Hình Hình Đèn giao thơng ngã tư ( street B rẽ trái ) Sơ đồ tổng quát Sơ đồ khối điều khiển đèn giao thông FSM điều khiển đèn giao thông Sơ đồ nguyên lý khối TIME_COUNTER Bộ đếm xung Thời điểm ban đầu có tín hiệu rst_n = 10 Thời điểm có pos_Y = 10 //CODE /*FSM**************************/ module fsm ( // Outputs street_a, street_b, fsm_g, fsm_y, fsm_rr,fsm_yy, fsm_l, // Inputs clk,rst_n, rst_nA,rst_nB,pos_Y, g_end, y_end, rr_end,yy_end,l_end ); // input clk; input rst_n; input rst_nA; input rst_nB; output pos_Y; input g_end; input y_end; input rr_end; input yy_end; input l_end; output reg [3:0] street_a; output reg [3:0] street_b; output wire fsm_g; output wire fsm_y; output wire fsm_rr; output wire fsm_yy; output wire fsm_l; // reg [3:0] current_state, next_state; //STATE code localparam AY_BY = 4'd0; localparam AR_BR1 = 4'd1; localparam AG_BR = 4'd2; localparam AY_BR = 4'd3; localparam ARL_BR = 4'd4; localparam AR_BG = 4'd5; localparam AR_BY = 4'd6; localparam AR_BR2 = 4'd7; localparam AR_BRL = 4'd8; //Next state logic always @ (*) begin case (current_state[3:0]) AY_BY: begin if (yy_end) next_state[3:0] = AR_BR1; else next_state[3:0] = current_state[3:0]; end AR_BR1: begin 11 BT traffic light Nhóm 20 if (rr_end) next_state[3:0] = AG_BR; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AG_BR: begin if (g_end) next_state[3:0] = AY_BR; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AY_BR: begin if (y_end) next_state[3:0] = ARL_BR; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end ARL_BR: begin if (l_end) next_state[3:0] = AR_BG; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AR_BG: begin if (g_end) next_state[3:0] = AR_BY; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AR_BY: begin if (y_end) next_state[3:0] = AR_BRL; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AR_BRL: begin if (l_end) next_state[3:0] = AG_BR; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end AR_BR2: begin if (rr_end) next_state[3:0] = AR_BG; else if (pos_Y) next_state[3:0] = AY_BY; else next_state[3:0] = current_state[3:0]; end default: next_state[3:0] = current_state[3:0]; endcase end //STATE MEMORY always @ (posedge clk) begin if (~rst_n|~rst_nA) current_state[3:0]