基于FPGA的交通燈設計
摘要
本設計采用FPGA技術實現了一個智能交通燈控制系統。系統以Verilog HDL為設計語言,在FPGA平臺上實現了交通燈的自動控制、數碼管倒計時顯示、緊急情況處理等功能。通過合理的狀態機設計和模塊化編程,系統具有良好的實時性、可靠性和可擴展性,能夠有效管理十字路口的交通流量。
關鍵詞:FPGA;交通燈;Verilog HDL;狀態機;數碼管顯示
Abstract: This design implements an intelligent traffic light control system using FPGA technology. The system uses Verilog HDL as the design language and realizes automatic traffic light control, digital tube countdown display, emergency handling and other functions on the FPGA platform. Through reasonable state machine design and modular programming, the system has good real-time performance, reliability and scalability, and can effectively manage traffic flow at intersections.
Keywords: FPGA; Traffic Light; Verilog HDL; State Machine; Digital Display
- FPGA交通燈設計-vivado2018.3工程
工程代碼也可以私信獲取,本人工程基于vivado2018.3設計。
目錄
- 設計目標與要求
- 1.1 設計目的
- 1.2 功能要求
- 方案論證與選擇
- 2.1 系統方案
- 2.2 設計思路
- 系統設計
- 3.1 系統總體框圖
- 3.2 各模塊功能
- 3.3 狀態轉換圖
- 3.4 源程序
- 3.5 管腳鎖定
- 3.6 仿真波形
- 3.7 元器件清單
- 測試驗證與實物展示
- 4.1 測試驗證
- 4.2 實物展示
- 總結與心得體會
1. 設計目標與要求
1.1 設計目的
隨著城市化進程的加快和汽車保有量的急劇增長,城市交通擁堵問題日益嚴重。智能交通燈控制系統作為城市交通管理的重要組成部分,對緩解交通壓力、提高道路通行效率具有重要意義。
FPGA(現場可編程門陣列)作為一種可重構的數字電路平臺,具有并行處理能力強、響應速度快、可靠性高等優點,非常適合用于實時性要求較高的交通控制系統。本設計基于FPGA平臺,采用Verilog HDL硬件描述語言,設計并實現了一套完整的智能交通燈控制系統。
1.2 功能要求
本交通燈控制系統需要實現以下功能要求:
基本功能要求:
-
交通燈控制:實現標準的四相位交通燈控制邏輯
- 東西方向:綠燈16秒 → 黃燈4秒 → 紅燈20秒
- 南北方向:紅燈20秒 → 綠燈16秒 → 黃燈4秒
- 循環執行上述時序
-
數碼管顯示:提供實時的倒計時顯示功能
- 通過8位數碼管顯示各方向剩余通行時間
- 顯示格式:東西方向時間 | 南北方向時間
-
緊急處理:支持緊急情況處理
- 當檢測到緊急按鍵時,立即切換到緊急狀態
- 緊急狀態下,所有方向顯示紅燈20秒
- 緊急狀態結束后,恢復正常循環
-
系統復位:支持異步復位功能
- 確保系統能夠可靠啟動和重新初始化
性能要求:
- 系統響應時間:≤1ms
- 時間精度:±0.1秒
- 工作溫度:-40℃~+85℃
- 可靠性:MTBF≥10000小時
2. 方案論證與選擇
2.1 系統方案
方案一:基于單片機的控制方案
優點:
- 成本較低
- 開發工具成熟
- 程序設計相對簡單
缺點:
- 響應速度較慢
- 實時性不夠好
- 擴展性有限
- 抗干擾能力較弱
方案二:基于FPGA的控制方案(本設計采用)
優點:
- 響應速度快,實時性好
- 并行處理能力強
- 可重構性好,便于升級
- 抗干擾能力強
- 可靠性高
缺點:
- 成本相對較高
- 開發難度較大
方案三:基于PLC的控制方案
優點:
- 可靠性高
- 抗干擾能力強
- 編程簡單
缺點:
- 成本高
- 體積大
- 響應速度一般
方案選擇:綜合考慮性能、成本和技術要求,本設計選擇基于FPGA的控制方案。
2.2 設計思路
本設計采用模塊化、層次化的設計思想:
- 頂層設計:采用自頂向下的設計方法,將系統分解為若干功能模塊
- 狀態機設計:使用有限狀態機實現交通燈控制邏輯
- 時序設計:合理設計時鐘域和時序約束
- 接口設計:標準化各模塊間的接口
- 驗證策略:采用仿真驗證和硬件測試相結合的方法
3.1 系統總體框圖
系統采用模塊化設計思想,主要包括以下模塊:
系統總體框圖如上所示,主要包括:
- 時鐘模塊:提供系統時鐘信號
- 復位模塊:提供系統復位信號
- 交通燈邏輯控制模塊:系統核心,實現狀態機控制
- LED控制模塊:控制交通燈LED顯示
- 數碼管顯示模塊:實現倒計時顯示
- 按鍵輸入模塊:處理緊急按鍵輸入
3.2 各模塊功能
1. 頂層模塊(jtd_test)
- 系統的頂層封裝模塊
- 負責各子模塊的例化和信號連接
- 處理輸入輸出信號的分配和數據格式轉換
2. 交通燈邏輯控制模塊(jtd_logic)
- 系統的核心控制模塊
- 實現交通燈狀態機邏輯
- 處理時間計數和狀態轉換
- 響應緊急按鍵輸入
- 輸出當前狀態和倒計時信息
3. LED控制模塊(led_ctl)
- 負責控制交通燈LED的顯示
- 根據當前狀態輸出相應的LED控制信號
- 支持12路LED輸出(東西南北各3路)
4. 數碼管顯示模塊(smg)
- 實現8位數碼管的動態掃描顯示
- 顯示東西和南北方向的倒計時
- 支持位選和段選信號輸出
3.3 狀態轉換圖
系統采用四狀態有限狀態機實現交通燈控制邏輯:
- IDLE狀態(5’b00001):東西綠燈,南北紅燈(16秒)
- STAGE_1狀態(5’b00010):東西黃燈,南北紅燈(4秒)
- STAGE_2狀態(5’b00100):東西紅燈,南北綠燈(16秒)
- STAGE_3狀態(5’b01000):東西紅燈,南北黃燈(4秒)
- EMERGENT_LED狀態(5’b10000):緊急狀態,所有方向紅燈(20秒)
狀態轉換條件:
- 正常狀態按時間順序循環轉換:IDLE → STAGE_1 → STAGE_2 → STAGE_3 → IDLE
- 任何狀態下檢測到緊急按鍵都會跳轉到緊急狀態
- 緊急狀態結束后返回IDLE狀態重新開始循環
3.4 源程序
系統源程序采用Verilog HDL語言編寫,主要包括以下文件:
1. 頂層模塊(jtd_test.v)
module jtd_test(input clk, // 系統時鐘input rst_n, // 異步復位信號input key, // 緊急按鍵output [7:0] sm_bit, // 數碼管位選output [7:0] sm_seg, // 數碼管段選output [11:0] led // LED控制信號
);// 內部信號定義
wire [4:0] c_state;
wire [5:0] time_second_cnt_dx, time_second_cnt_nb;
wire [3:0] ge1, shi1, ge0, shi0;// 例化交通燈邏輯控制模塊
jtd_logic u_jtd_logic(.clk(clk),.rst_n(rst_n),.key(key),.c_state(c_state),.time_second_cnt_dx(time_second_cnt_dx),.time_second_cnt_nb(time_second_cnt_nb)
);// 例化LED控制模塊
led_ctl u_led_ctl(.clk(clk),.rst_n(rst_n),.c_state(c_state),.led(led)
);// 數碼管顯示數據處理
assign ge1 = time_second_cnt_dx%10; // 東西方向個位
assign shi1 = time_second_cnt_dx/10; // 東西方向十位
assign ge0 = time_second_cnt_nb%10; // 南北方向個位
assign shi0 = time_second_cnt_nb/10; // 南北方向十位// 例化數碼管顯示模塊
smg u_smg(.clk(clk),.rst_n(rst_n),.ge1(ge1), .shi1(shi1),.ge0(ge0), .shi0(shi0),.sm_bit(sm_bit),.sm_seg(sm_seg)
);endmodule
2. 交通燈邏輯控制模塊(jtd_logic.v)
該模塊是系統的核心,實現了完整的狀態機控制邏輯。主要功能包括:
- 按鍵檢測與消抖
- 1秒時鐘生成
- 狀態機控制
- 時間計數管理
詳細代碼請參見附錄A。
3. LED控制模塊(led_ctl.v)
module led_ctl(input clk,input rst_n,input [4:0] c_state,output reg [11:0] led
);// 狀態參數定義
parameter idle = 5'b00001,stage_1 = 5'b00010,stage_2 = 5'b00100,stage_3 = 5'b01000,emergent_led = 5'b10000;// LED控制邏輯
always@(posedge clk or negedge rst_n)beginif(!rst_n)led <= 12'b0;else if(c_state == idle)led <= 12'b0111_1001_1110; // 東西綠,南北紅else if(c_state == stage_1)led <= 12'b0111_0101_1101; // 南北紅,東西黃else if(c_state == stage_2)led <= 12'b1100_1111_0011; // 東西紅,南北綠else if(c_state == stage_3)led <= 12'b1010_1110_1011; // 東西紅,南北黃else if(c_state == emergent_led)led <= 12'b0110_1101_1011; // 東西紅,南北紅elseled <= led;
endendmodule
4. 數碼管顯示模塊(smg.v)
該模塊實現8位數碼管的動態掃描顯示,詳細代碼請參見附錄B。
3.5 管腳鎖定
系統的管腳分配通過約束文件(jtd_test.xdc)進行定義:
# 時鐘約束
create_clock -period 20.000 -name sys_clk [get_ports clk]
set_property PACKAGE_PIN Y18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]# 復位信號約束
set_property PACKAGE_PIN F15 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]# 按鍵約束
set_property PACKAGE_PIN A20 [get_ports key]
set_property IOSTANDARD LVCMOS33 [get_ports key]# LED控制信號約束
set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
# ... 其他LED引腳約束# 數碼管約束
set_property PACKAGE_PIN K2 [get_ports {sm_bit[0]}]
set_property PACKAGE_PIN J2 [get_ports {sm_bit[1]}]
# ... 其他數碼管引腳約束
3.6 仿真波形