Báo cáo thực tập tốt nghiệp(tuần cuối)
SV :
Thầy hướng dẫn :
I.
Bài toán điều khiển đèn giao thông cho ngã tư
Có một ngã tư với 4 đường A,B,C,D 2 chiều như hình vẽ minh họa, yêu cầu đặt ra là
thiết kế hệ thống đèn giao thông tối ưu nhất cho ngã tư này.
Ta thấy có tất cả 12 ngã rẽ ( lối đi thẳng cũng coi là 1 ngã rẽ) là AB, AC, AD, BA, BC,
BD, CA, CB, CD, DA, DB, DC.
Sẽ có các ngã rẽ được đi đồng thời và các ngã rẽ không được đi cùng thời điểm.
Nếu giữa 2 ngã rẽ không thể đi đồng thời hay xảy ra xung đột thì ta gán giá trị là 1. Do
đó ta có bảng giá trị trạng thái sau :
AB
AB
AC
AD
BA
BC
BD
CA
CB
CD
DA
DB
1
1
1
1
1
AC
AD
BA
BC
1
BD
1
1
1
1
1
1
1
1
CA
1
1
1
1
1
1
1
CB
CD
1
1
DA
1
1
DB
1
1
1
1
1
1
1
1
1
1
1
DC
DC
Hệ thống đèn giao thông tại ngã tư sẽ có các trạng thái sao cho mỗi trạng thái là 1 tập
các ngã rẽ không xung đột với nhau.
Từ bảng ta sẽ có các trạng thái sau :
State 1 : AB, AC,AD,BA,CB,DC
State 2 : BC,BD
State 3 : CA,CD
State 4 : DA,DB
Vậy hệ thống đèn giao thông tại ngã tư sẽ có 4 trạng thái hoạt đông luân phiên nhau.
Khi một trạng thái hoạt động thì 3 trạng thái còn lại sẽ bị cấm. Dễ thấy các ngã rẽ AD,
BA, CB, DC không xung đột với bất kì ngã rẽ nào khác cho nên state 1 sẽ rút gọn còn 2
ngã rẽ : AB và AC.
Như vậy ta cần 4 cột đèn tín hiệu tại bên phải của mỗi con đường. Mỗi cột đèn tín hiệu
bao gồm một LCD hiển thị led 7 thanh 2 số, 3 led đơn hiển thị các mầu đỏ, vàng, xanh.
Trên thực tế tại các ngã tư, ta thấy chỉ có 2 trạng thái đó là (state 1 + state 3) và (state 2 + state
4).
Điều này cũng dễ hiểu vì nếu ta chia làm 4 trạng thái như trên thì nếu một trạng thái muốn hoạt
động thì sẽ phải chờ trong khoảng gấp 3 lần thời gian hoạt động của mỗi trạng thái kia. Như vậy
nếu thời gian đèn xanh của state1 là 30s thì thời gian đèn đỏ của nó là 90s, điều này là không khả
thi.
Vì vậy từ yêu cầu của bài toán và thực tế, hệ thống điều khiển đèn giao thông sẽ có các module
sau :
Counter
Divider clock ( chia clock cho phù hợp với bài toán)
Module xử lý trung tâm
Module hiển thị(led đơn, led 7 thanh)
-
II.
Viết chương trình (ngôn ngữ verilog)
1.module divide clock : div_clk.v
module div_clk(input clk_100, output reg clk);
reg [26:0] tmp;
always @ (posedge clk_100)
begin
if (tmp<49999999) tmp <= tmp+1;
else tmp<=0;
end
always @ (posedge clk_100)
begin
if (tmp==49999999) clk<=!clk;
else clk<=clk;
end
endmodule
2.Module main : dengiaothong.v
module dengiaothong(input clk,rst,output reg [4:0] c,output reg [11:0] a);
always @ (posedge clk)
begin
if(rst)
begin
c<=30;
a<=12'b100100001001;
end
else
begin
if(c>0)
begin
c<=c-1;
if(c==3)
begin
if(a==12'b100100001001) a<=12'b010010001001;
else if(a==12'b001001100100) a<=12'b001001010010;
else;
end
end
else
begin
c<=30;
if(a==12'b010010001001) a<=12'b001001100100;
else if(a==12'b001001010010) a<=12'b100100001001;
else;
end
end
end
endmodule
trong đó : c là số đếm từ 30 về 0. C= 3 thì đèn xanh nhảy về vàng và c=0 thì đèn vàng sẽ chuyển
sang đèn đỏ.
a là 1 chuỗi 12bit trong đó tính từ bit thấp sang bit cao sẽ lần lượt thể hiện trạng thái của cột đèn
tại 4 đường A,C,B,D với các màu tương ứng là đỏ vàng xanh.
3.Module chia số c thành 2 số là số đơn vị và hàng chục : twosep.v
module twosep(input [4:0] c, output reg [3:0] dv,ch);
always @ (c)
begin
if(c<10)
begin
dv<=c;
ch<=0;
end
else if((c>=10)&&(c<20))
begin
ch<=1;
dv<=c-10;
end
else if((c>=20)&&(c<30))
begin
dv<=c-20;
ch<=2;
end
else
begin
dv<=0;
ch<=3;
end
end
endmodule
4. Module giải mã led7thanh : seg7_dec.v
module seg7_dec(input [3:0] dv,ch,output reg [6:0] DV,CH);
always @ (dv,ch)
begin
if (dv==0) DV<=7'b1000000;
else if (dv==1) DV<=7'b1111001;
else if (dv==2) DV<=7'b0100100;
else if (dv==3) DV<=7'b0110000;
else if (dv==4) DV<=7'b0011001;
else if (dv==5) DV<=7'b0010010;
else if (dv==6) DV<=7'b0000010;
else if (dv==7) DV<=7'b1111000;
else if (dv==8) DV<=7'b0000000;
else DV<=7'b0010000;
end
always @ (dv,ch)
begin
if (ch==0) CH<=7'b1000000;
else if (ch==1) CH<=7'b1111001;
else if (ch==2) CH<=7'b0100100;
else if (ch==3) CH<=7'b0110000;
else if (ch==4) CH<=7'b0011001;
else if (ch==5) CH<=7'b0010010;
else if (ch==6) CH<=7'b0000010;
else if (ch==7) CH<=7'b1111000;
else if (ch==8) CH<=7'b0000000;
else CH<=7'b0010000;
end
endmodule
5.Module nối dây : top.v
module top(input clk_100,rst,output [11:0] a,output [6:0] DV,CH);
wire clk;
wire [4:0] c;
wire [3:0] dv,ch;
div_clk div(
.clk_100(clk_100),
.clk(clk));
dengiaothong trafficlight(
.clk(clk),
.rst(rst),
.c(c),
.a(a));
twosep twosep_c(
.c(c),
.dv(dv),
.ch(ch));
seg7_dec dec_dv(
.dv(dv),
.DV(DV));
seg7_dec dec_ch(
.ch(ch),
.CH(CH));
Endmodule
III.
Kết quả
1.kết quả thực thi chương trình
2. RTL view
RTL đã thể hiện đúng như yêu cầu.
IV.
Kết luận
Về phần mềm đã chạy tốt, hệ thống có thể thực thi trên một kit CPLD hoặc FPGA bất kì của
hãng Xilinx.
Về phần cứng : chỉ cần gắn chân cho các đầu ra của chương trình tương ứng với các chân trên
kit và sau đó nạp chương trình là có thể chạy được.
Nhưng do kit XC2XL của hãng Xilinx không hỗ trợ chuẩn USB mà dùng chuẩn giao tiếp song
song nên gây khó khăn trong việc thực thi cũng như nghiên cứu nên chúng em quyết định sẽ
không làm đồ án liên quan tới kit này nữa. Vậy mong thầy xem xét về phần thực tập này của
chúng em và cho chúng em một hướng đi khác phù hợp hơn.