1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

báo cáo thiết kế điều khiển đèn giao thông bằng ngôn ngữ verilog (có code )

20 1,9K 16
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 597,33 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

1.Đề tài32.Sơ đồ tổng quát43.Sơ đồ khối53.1TIME_COUNTER63.2FSM64.Phân tích khối FSM65.Phân tích khối TIME_COUNTER76.Mã hóa trạng thái97.Mô phỏng108.Phụ luc (hình ảnh, bảng biểu và code)11

Trang 1

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

Nguyễn Minh Tuân 20179501

Phạm Minh Hoàng 20179556

Trang 2

BT traffic light Nhóm 20

M c l c ục lục ục lục

1 Đề tài 3

2 Sơ đồ tổng quát 4

3 Sơ đồ khối 5

3.1 TIME_COUNTER 6

3.2 FSM 6

4 Phân tích khối FSM 6

5 Phân tích khối TIME_COUNTER 7

6 Mã hóa trạng thái 9

7 Mô phỏng 10

8 Phụ luc (hình ảnh, bảng biểu và code) 11

Tài liệu tham khảo: Jr.Charles H.Roth - Digital Systems Design Usin

Trang 3

1 Đề tài

1.1 Giả sử STREET A có mức độ ưu tiên hơn STREET B, khi rst_n tích cực mức thấp thì đèn trên STREET A sẽ xanh trước.

1.2 Mỗi đường sẽ có 4 tín hiệu điều khiển đèn tương ứng với 3 màu Red/Yellow/Green và Left (màu xanh) để rẽ trái viết tắt là R/Y/G/L

1.3 Đèn sẽ hoạt động bình thường chuyển trạng thái đỏ >> xanh >> vàng >> rẽ trái từ

5 giờ sáng đến hết 12 giờ đêm Sau 12 giờ đêm đến 5 giờ sáng đèn trên cả 2 đườ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 là trạng thái đèn trên cả STREET A và STREET B đều đỏ (AR-BR1 hoặc AR-BR2)

Hình 1 Đèn giao thông tại 1 ngã tư

STR EET

- B

STREET - B

G

G

Y

Y

R

R

G

Trang 4

BT traffic light Nhóm 20

1.5 Bảng chuyển trạng thái

Street A Street B

Y R G

Y R R Y

RL

R R

R R

Y RL Bảng 1 bảng chuyển trạng thái

2 Sơ đồ tổng quát

Hình 1 Sơ đồ tổng quát

Trong đó:

- clk là xung clock.

- rst_n là tín hiệu dùng để khởi động bộ điều khiển đến trạng thái ban đầu Red-Red khi nó tích cực mức thấp, STREET A sẽ được ưu tiên đi trước rst_n được ưu tiên

so với rst_nA.

- rst_nA là tín hiệu dùng để khởi động bộ điều khiển đến trạng thái ban đầu Red-Red khi nó tích cực mức thấp, STREET A sẽ được ưu tiên đi trước.rst_nA gần giống với rst_n và được ưu tiên so với rst_nB.

- rst_nB là tín hiệu dùng để khởi động bộ điều khiển đến trạng thái ban đầu Red-Red khi nó tích cực mức thấp, STREET B sẽ được ưu tiên đi trước

- street_a[3:0] là tín hiệu điều khiển đèn trên đường STREET A Thứ tự bit từ 3 đến

0 tương ứng với trạng thái R/Y/G/L, tích cực mức 1.

Traffic_light_controller

street_a[3:0]

street_b[3:0]

clk rst_n rst_nA rst_nB

Trang 5

- street_b[3:0] tương tự street_a[3:0] trên đường STREET B.

Bảng mã hóa giá trị ngõ ra tương ứng với các trạng thái đèn như sau:

Street A Street B Street_a[2:0] Street_b[20]

Bảng 2 Bảng giá trị ngõ ra bộ điều khiển tương ứng với trạng thái đèn

3 S đ kh i ơ đồ khối ồ khối ối

Hình 2 Sơ đồ khối của bộ điều khiển đèn giao thông 3.1 TIME_COUNTER : dùng để đếm xunh clock xác định thời gian duy trì trạng thái của đèn Đây là thời gian có thể cấu hình được trước khi biên dịch như yêu cầu đặt ra Năm tín hiệu g_end, rr_end, y_end, yy_end và l_end báo thời điểm kết thúc của trạng thái GREEN, RED_RED, YELLOW, YELLOW_YELLOW và RED_LEFT Năm tín hiệu fsm_g,

Traffic_light

g_end rr_end y_end yy_end

fsm_g fsm_y

fsm_rr fsm_yy

street_b[3:0]

street_a[3:0]

clk

rst_n

rst_nA

rst_nB

l_end fsm_l

Trang 6

BT traffic light Nhóm 20

fsm_rr, fsm_y , fsm_yy và fsm_l báo trạng thái GREEN, REG_RED, YELLOW, YELLOW_YELLOW và RED_LEFT để bộ đếm hoạt động theo giá trị cấu hình phù hợp.

3.2 FSM : là máy trạng thái sẽ tạo ngõ ra street_a, street_b và fsm_g, fsm_rr, fsm_y, fsm_yy và fsm_l.

4 Phân tích kh i FSM ối

Trong đó, ký hiệu A và B ứng với STREET A và STREET B G là GREEN, R là RED và Y là YELLOW Ví dụ, AG_BR nghĩa là trạng thái STREET A đang GREEN, STREET B đang RED.

Sau khi reset thì cả hai đèn phải RED-RED nên ta có thể chọn trạng thái AR-BR1 hoặc AR-BR2 tùy vào yêu cầu ưu tiên.

AR – BR2

AY-BR

AR – BR1

AG-BR

rst_n/ rst_nA

rr_end

g_end

y_ en d

g_end

AY - BY

rst_nB

rr_end

po

ARL-BR

l_e

nd

l_e nd

AR-BRL

d

Y

Y

Hình 3 FSM điều khiển đèn giao thông

Trang 7

Việc tự động chuyển trạng thái chỉ xảy ra khi tín hiệu báo độ trễ tương ứng của trạng thái đó tích cực Ví dụ, khi đèn trên STREET A hoặc STREET B đang xanh thì g_end phải tích cực thì mới chuyển sang trạng thái tiếp theo.

state Street_a

[3:0]

Street_b [3:0]

fsm_g fsm_y fsm_rr fsm_yy fsm_l

Bảng 3 Bảng giá trị đầu ra của FSM

Chọn giá trị:

- GREEN_TIME = 59 Đèn xanh sáng 60s

- YELLOW_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à 25s

- START_YY_TIME = 68399; // from 5h:00 to 24h:59

- DAY_TIME = 86399;

Bộ đếm xung 1

GREEN_TIME

=??

=?

=??

YELLOW_YELLOW_TIME

YELLOW_TIME clk

rst_n rst_nA rst_nB

0

+1

1

fsm_y

y_end fsm_g g_end

fsm_yy

yy_end

clr_counter

clk_counter[14:0]

0 1

Trang 8

BT traffic light Nhóm 20

Hình 4 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ế

=??

=??

fsm_rr rr_end RED_LEFT_TIME

=??

fsm_l l_end

Hình 5 Bộ đếm xung 2

Trang 9

YELLOW_YELLOW_TIME = 18000s (từ 0 giờ đến 5 giờ sáng).

Giả sử current_state = AG-BR | AR-BG, khi đó fsm_g=1, fsm_y=0, fsm_rr=0,

fsm_l=0 và fsm_yy=0 Như vậy clk_counter[n:0] sẽ được đưa vào bộ so sánh với GREEN_TIME Khi clk_counter[n:0] != 14’d29 thì g_end =0 =>> clr_counter = 0

=>> bộ đếm được tăng lên 1 đơn vị cho đến khi clk_counter[n: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_counter[n: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_yy[17:0] sẽ được đếm từ lúc có tín hiệu rst_n = 0 đến khi clk_counter_yy[17:0]=17’d1000 (với 1 ngày hoàn chỉnh nó sẽ đếm đến 17’d86400).

6 Mã hóa trạng thái

State Mã hóa 4 bit nhị phân

Bảng 4 Mã hóa trạng thái

Trang 10

BT traffic light Nhóm 20

7 Mô phỏng

Hình 6 Thời điểm ban đầu có tín hiệu rst_n = 0

Hình 7 Thời điểm có pos_Y = 1

Trang 11

Phụ luc (hình ảnh, bảng biểu và code

8.

Bảng 1 bảng chuyển trạng thái 4

Bảng 2 Bảng giá trị ngõ ra bộ điều khiển tương ứng với trạng thái đèn 5

Bảng 3 Bảng giá trị đầu ra của FSM 7

Bảng 4 Mã hóa trạng thái 9

Hình 1 Đèn giao thông tại 1 ngã tư ( street B được rẽ trái ) 3

Hình 2 Sơ đồ tổng quát 4

Hình 3 Sơ đồ khối của bộ điều khiển đèn giao thông 5

Hình 4 FSM điều khiển đèn giao thông 6

Hình 5 Sơ đồ nguyên lý khối TIME_COUNTER 8

Hình 6 Bộ đếm xung 2 8

Hình 7 Thời điểm ban đầu có tín hiệu rst_n = 0 10

Hình 8 Thời điểm có pos_Y = 1 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;

Trang 12

BT traffic light Nhóm 20

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

if (rr_end) next_state[3:0] = AG_BR;

Trang 13

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;

Trang 14

BT traffic light Nhóm 20

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]

<= AR_BR1;

else if (~rst_nB) current_state[3:0] <=

AR_BR2;

else current_state[3:0] <= next_state[3:0];

end //Output logic

always @ (*) begin case (current_state[3:0]) AY_BY: street_a[3:0] = 4'b0100; AG_BR: street_a[3:0] = 4'b0010; AY_BR: street_a[3:0] = 4'b0100; ARL_BR:street_a[3:0] = 4'b1001; default: street_a[3:0] = 4'b1000; endcase

end //

always @ (*) begin case (current_state[3:0]) AY_BY: street_b[3:0] = 4'b0100;

Trang 15

AR_BG: street_b[3:0] = 4'b0010;

AR_BY: street_b[3:0] = 4'b0100;

AR_BRL:street_b[3:0] = 4'b1001;

default: street_b[3:0] = 4'b1000;

endcase

end

assign fsm_g = (current_state[3:0] ==

AG_BR) | (current_state[3:0] ==

AR_BG);

assign fsm_y = (current_state[3:0] ==

AY_BR) | (current_state[3:0] == AR_BY);

assign fsm_rr = (current_state[3:0] ==

AR_BR1)|(current_state[3:0] ==

AR_BR2);

assign fsm_yy = (current_state[3:0] ==

AY_BY);

assign fsm_l = (current_state[3:0] ==

ARL_BR)|(current_state[3:0] ==

AR_BRL);

endmodule

/*******************************/

/*TIME_COUNTER*****************/

module time_counter ( // Outputs

g_end, y_end, rr_end, yy_end,l_end, // Inputs

clk,rst_n, rst_nA,rst_nB,pos_Y, fsm_g, fsm_rr, fsm_y,fsm_yy,fsm_l

);

parameter RED_RED_TIME = 1; parameter GREEN_TIME = 59;

parameter YELLOW_TIME = 4;

parameter LEFT_TIME = 24;

parameter START_YY_TIME = 68399; parameter DAY_TIME = 86399;

parameter YELLOW_YELLOW_TIME = 17999;

parameter n=14;

parameter m=17;

//

input clk;

Trang 16

BT traffic light Nhóm 20

input rst_n;

input rst_nA;

input rst_nB;

output pos_Y;

input fsm_g;

input fsm_rr;

input fsm_yy;

input fsm_y;

input fsm_l;

output wire g_end;

output wire y_end;

output wire rr_end;

output wire yy_end;

output wire l_end;

//

reg [n:0] clk_counter;

wire clr_counter;

reg [m:0] clk_counter_yy;

wire clr_counter_yy;

//

always @ (posedge clk) begin

if (~rst_n|~rst_nA|~rst_nB|pos_Y) clk_counter[n:0] <=0;

else if (clr_counter) clk_counter[n:0]

<= 0;

else clk_counter[n:0] <=

clk_counter[n:0] + 1'b1;

end //

always @ (posedge clk) begin

if (~rst_n) clk_counter_yy[m:0] <=0;

else if (clr_counter_yy) clk_counter_yy[m:0] <= 0;

else clk_counter_yy[m:0] <=

clk_counter_yy[m:0] + 1'b1;

end //Compare the end time

Trang 17

assign g_end = fsm_g &

(clk_counter[n:0] == GREEN_TIME);

assign y_end = fsm_y &

(clk_counter[n:0] == YELLOW_TIME);

assign rr_end = fsm_rr &

(clk_counter[n:0] == RED_RED_TIME);

assign yy_end = fsm_yy &

(clk_counter[n:0] ==

YELLOW_YELLOW_TIME);

assign l_end = fsm_l & (clk_counter[n:0]

== LEFT_TIME);

assign pos_Y=(clk_counter_yy [m:0]

==START_YY_TIME);

//

assign clr_counter = g_end | y_end |

rr_end|yy_end|l_end;

assign

clr_counter_yy=(clk_counter_yy[m:0]

== DAY_TIME);

endmodule

/*******************************/

/*CONTROLLER*******************/

module traffic_light_controller (

// Outputs street_b, street_a, // Inputs

rst_n,rst_nA,rst_nB , clk );

input clk;

input rst_n;

input rst_nA;

input rst_nB;

output [3:0]street_a; output [3:0]street_b; wire pos_Y;

wire fsm_l;

wire fsm_g;

wire fsm_rr;

Trang 18

BT traffic light Nhóm 20

wire fsm_y;

wire fsm_yy;

wire g_end;

wire rr_end;

wire y_end;

wire yy_end;

wire l_end;

time_counter cnt (

// Outputs

l_end(l_end),

g_end(g_end),

y_end(y_end),

rr_end(rr_end),

yy_end(yy_end),

// Inputs

clk(clk),

rst_n(rst_n), .rst_nA(rst_nA), .rst_nB(rst_nB), .pos_Y(pos_Y), .fsm_g(fsm_g), .fsm_rr(fsm_rr), .fsm_y(fsm_y), .fsm_yy(fsm_yy), .fsm_l(fsm_l) );

fsm fsm (

// Outputs .street_a(street_a[3:0]), .street_b(street_b[3:0]), .fsm_l (fsm_l),

fsm_g (fsm_g),

Trang 19

fsm_y (fsm_y),

fsm_rr(fsm_rr),

fsm_yy(fsm_yy),

// Inputs

clk(clk),

rst_n(rst_n),

rst_nA(rst_nA),

rst_nB(rst_nB),

pos_Y(pos_Y),

g_end(g_end),

y_end(y_end),

rr_end(rr_end),

yy_end(yy_end),

l_end(l_end)

);

endmodule

/*******************************/

/*TEST_BENCH*******************/

`timescale 1ns/1ns module tb_traffic_light;

reg clk;

reg rst_n;

reg rst_nA;

reg rst_nB;

wire [3:0]street_a;

wire [3:0]street_b;

traffic_light_controller DUT ( // Outputs

street_a(street_a[3:0]), .street_b(street_b[3:0]), // Inputs

.clk(clk),

Trang 20

BT traffic light Nhóm 20

rst_n(rst_n),

rst_nA(rst_nA),

.rst_nB(rst_nB)

);

initial begin

clk = 0;

forever #10 clk = !clk;

end initial begin rst_n = 0;rst_nA=1;rst_nB=1;

#20 rst_n = 1;

endmodule

Ngày đăng: 21/12/2017, 01:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w