báo cáo thực tập tốt nghiệp phần thiết kế hệ thống đèn giao thông cho ngã tư sử dụng chip FPGA XC2XL của xilinx và dùng ngôn ngữ lập trình phần cứng là verilog. Phần mềm mô phỏng là xilinx ISE 9.1. Báo cáo này chỉ bao gồm phần thiết kế giải thuật và phần mềm code cho hệ thống, chưa có phần thiết kế phần cứng do vấn đề về kinh phí
Trang 1Bá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 :
AD
BA
CB
Trang 2DB 1 1 1 1
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;
Trang 3always @ (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;
Trang 4end 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))
Trang 5dv<=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;
Trang 6else 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));
Trang 7seg7_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
Trang 8RTL đã 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
Trang 9Về 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