FPGA-任务五、十字路口交通控制灯器系统设计(一)

简介: FPGA-任务五、十字路口交通控制灯器系统设计(一)

设计一个十字路口交通控制系统,其东西、南北两个方向除了有红、黄、绿灯指示是否允许通行外,还设有时间显示,以倒计时方式显示每一路允许通行的时间,绿灯、黄灯、红灯的持续时间分别是45、5和50秒。当东西或南北两路中任一道上出现特殊情况,例如有消防车,警车要去执行任务,此时交通控制系统应可由交警手动控制立即进入特殊运行状态,即两条道上的所有车辆皆停止通行,红灯全亮,时钟停止计时,且其数字在闪烁。当特殊运行状态结束后,管理系统恢复原来的状态,继续正常运行。


实现主干道和支干道的红绿灯,并实现时间显示功能;

实现绿灯,黄灯,红灯的持续时间固定的交通控制功能;

顶层设计模块:


moduletop(ext_clk_25m,ext_rst_n,dtube_cs_n,dtube_data,led    );
//顶层控制模块inputext_clk_25m; //时钟信号25MHzinputext_rst_n;  //复位信号output [3:0] dtube_cs_n;    //段选数据位output [6:0] dtube_data;//位选数据位output [5:0] led;
wire [3:0] TimeL;
wire [3:0] TimeH;
wire [3:0] TimeL1;
wire [3:0] TimeH1;
wireclk;//中间变量//分频25MHZ变为1HZdivd1(
    .ext_clk_25m(ext_clk_25m),
    .ext_rst_n(ext_rst_n),
    .mclk(clk)
    );
//倒计时计数模块(东西)counterc1(
    .ext_clk_25m(ext_clk_25m),
    .mclk(clk),
    .ext_rst_n(ext_rst_n),
    .TimeH(TimeH),
    .TimeL(TimeL),
    .led(led[2:0])
    );
//数码管显示模块(东西,南北)segs1(
    .ext_clk_25m(ext_clk_25m),      
    .ext_rst_n(ext_rst_n),          
    .TimeH(TimeH),
    .TimeL(TimeL),
    .TimeH1(TimeH1),
    .TimeL1(TimeL1),
    .dtube_cs_n(dtube_cs_n),    
    .dtube_data(dtube_data) 
    );
//倒计时计数模块(南北)counter1c2(
    .ext_clk_25m(ext_clk_25m),
    .mclk(clk),
    .ext_rst_n(ext_rst_n),
    .TimeH1(TimeH1),
    .TimeL1(TimeL1),
    .led(led[5:3])
    );
endmodule

数码管显示模块:


moduleseg(ext_clk_25m,ext_rst_n,TimeH,TimeL,TimeH1,TimeL1,dtube_cs_n,dtube_data        );
inputext_clk_25m;      //时钟信号25MHzinputext_rst_n;            //复位信号input [3:0]TimeH;           //两位输入高位  [0]input [3:0]TimeL;           //两位输入低位  [1]input [3:0]TimeH1;          //两位输入高位  [2]input [3:0]TimeL1;          //两位输入低位  [3]outputreg[3:0] dtube_cs_n; //段选数据位outputreg[6:0] dtube_data;//位选数据位reg[3:0] display_num;   //当前显示数据reg[16:0] div_cnt;  //延时计数器计数位initialdiv_cnt=0;//赋初值为0//延时计数器模块always@ (posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n) 
div_cnt<=8'd0;elseif(div_cnt==17'd80000)div_cnt<=8'd0;        elsediv_cnt<=div_cnt+1'b1;end//显示当前的数据模块always@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n) 
display_num<=4'h0;elseif(div_cnt<17'd20000)display_num<=TimeL;
elseif((div_cnt>17'd20000)&(div_cnt <17'd40000))
display_num<=TimeH;
elseif((div_cnt>17'd40000)&(div_cnt < 17'd60000))
display_num<=TimeL1;
elsedisplay_num<=TimeH1;
end//段选数据译码模块(共阴数码管)always@(*)
beginif(!ext_rst_n) 
dtube_data<=8'h00;elsebegincase(display_num) 
4'h0: dtube_data <= 8'h3f;
4'h1: dtube_data <= 8'h06;
4'h2: dtube_data <= 8'h5b;
4'h3: dtube_data <= 8'h4f;
4'h4: dtube_data <= 8'h66;
4'h5: dtube_data <= 8'h6d;
4'h6: dtube_data <= 8'h7d;
4'h7: dtube_data <= 8'h07;
4'h8: dtube_data <= 8'h7f;
4'h9: dtube_data <= 8'h6f;
default:dtube_data<=8'h00;endcaseendend//位选选译模块always@(posedgeext_clk_25mornegedgeext_rst_n)  
beginif(!ext_rst_n) 
dtube_cs_n<=4'b1111;elseif(div_cnt<=17'd20000)dtube_cs_n<=4'b1110;elseif((div_cnt>17'd20000)&(div_cnt <=17'd40000))
dtube_cs_n<=4'b1101;elseif((div_cnt>17'd40000)&(div_cnt <=17'd60000))
dtube_cs_n<=4'b1011;elsedtube_cs_n<=4'b0111;endendmodule

分频模块:


modulediv(ext_clk_25m,ext_rst_n,mclk    );
inputext_clk_25m;//输入时钟inputext_rst_n; //复位端口outputregmclk;//输出1Hzreg  [23:0] cnt;//存放计数器的值initialcnt=0;
parameterTIME=24'd1250_0000;//时钟25MHz//分频模块//使得输入时钟为25MHz输出时钟为1Hzalways@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n)
beginmclk<=1'b0;cnt<=25'd0;endelseif(cnt==TIME-1'b1)beginmclk<=~mclk;
cnt<=1'b0;endelsecnt<=cnt+1'b1;endendmodule

计数器模块(东西):


modulecounter(ext_clk_25m,mclk,ext_rst_n,TimeH,TimeL,led    );
inputext_clk_25m;
inputmclk;//时钟信号inputext_rst_n;//复位信号outputreg [3:0]TimeH;//两位数码管显示高位outputreg [3:0]TimeL;//两位数码管显示低位outputreg [2:0] led;
//状态机实现三种状态切换reg[2:0] state_c,state_n;
reg [7:0] times;
parameter [2:0] IDLE=3'b001,S1=3'b010,S2=3'b100;//状态切换模块always@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n)
state_c<=IDLE;
elsestate_c<=state_n;
end//状态切换always@(*)
begincase(state_c)
IDLE:
beginif({TimeH,TimeL}==8'h00)state_n=S1;
elsestate_n=IDLE;
endS1:
beginif({TimeH,TimeL}==8'h00)state_n=S2;
elsestate_n=S1;
endS2:
beginif({TimeH,TimeL}==8'h00)state_n=IDLE;
elsestate_n=S2;
enddefault:
state_n=state_c;
endcaseendalways@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n)
times<=8'd00;elseif(state_c==IDLE)
begintimes<=8'h20;endelseif(state_c==S1)
begintimes<=8'h15;endelseif(state_c==S2)
begintimes<=8'd5;endelse;
endalways@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
led=3'b111;elseif(state_c==IDLE)
beginled[2]=1'b1;led[0]=1'b0;endelseif(state_c==S1)
beginled[0]=1'b1;led[1]=1'b0;endelseif(state_c==S2)
beginled[1]=1'b1;led[2]=1'b0;endelseled=3'b111;endinitialTimeH=times[7:4]; //计数器赋初值//计数器模块高位always@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
TimeH<=times[7:4]; //计数器赋初值elseif({TimeH,TimeL}==8'h00)beginTimeH<=times[7:4]; //计数器赋初值endelseif(TimeL==4'h0)beginTimeH<=TimeH-1'b1;endelsebeginTimeH<=TimeH;
endendinitialTimeL=times[3:0];
//计数器模块低位always@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
beginTimeL<=times[3:0];
endelseif({TimeH,TimeL}==8'h00) beginTimeL<=times[3:0];
endelseif(TimeL==4'h0)beginTimeL<=4'h9;endelsebeginTimeL<=TimeL-1'b1;endendendmodule

计数器模块(南北)


modulecounter1(ext_clk_25m,mclk,ext_rst_n,TimeH1,TimeL1,led    );
inputext_clk_25m;
inputmclk;//时钟信号inputext_rst_n;//复位信号outputreg [3:0]TimeH1;//两位数码管显示高位outputreg [3:0]TimeL1;//两位数码管显示低位outputreg [5:3] led;
//状态机实现三种状态切换reg[2:0] state_c,state_n;
reg [7:0] times1;
parameter [2:0] IDLE=3'b001,S1=3'b010,S2=3'b100;//状态切换模块initialstate_c=IDLE;
always@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n)
state_c<=IDLE;
elsestate_c<=state_n;
end//状态切换always@(*)
begincase(state_c)
IDLE:
beginif({TimeH1,TimeL1}==8'h01)state_n=S1;
elsestate_n=IDLE;
endS1:
beginif({TimeH1,TimeL1}==8'h01)state_n=S2;
elsestate_n=S1;
endS2:
beginif({TimeH1,TimeL1}==8'h01)state_n=IDLE;
elsestate_n=S2;
enddefault:
state_n=state_c;
endcaseendalways@(posedgeext_clk_25mornegedgeext_rst_n)
beginif(!ext_rst_n)
times1<=8'd00;elseif(state_c==IDLE)
begintimes1<=8'h15;endelseif(state_c==S1)
begintimes1<=8'h5;endelseif(state_c==S2)
begintimes1<=8'h20;endelse;
endalways@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
led=3'b111;elseif(state_c==IDLE)
beginled[3]=1'b1;led[4]=1'b0;endelseif(state_c==S1)
beginled[4]=1'b1;led[5]=1'b0;endelseif(state_c==S2)
beginled[5]=1'b1;led[3]=1'b0;endelseled=3'b111;endinitialTimeH1=times1[7:4]; //计数器赋初值//计数器模块高位always@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
TimeH1<=times1[7:4]; //计数器赋初值elseif({TimeH1,TimeL1}==8'h00)beginTimeH1<=times1[7:4]; //计数器赋初值endelseif(TimeL1==4'h0)beginTimeH1<=TimeH1-1'b1;endelsebeginTimeH1<=TimeH1;
endendinitialTimeL1=times1[3:0];
//计数器模块低位always@(posedgemclkornegedgeext_rst_n)
beginif(!ext_rst_n)
beginTimeL1<=times1[3:0];
endelseif({TimeH1,TimeL1}==8'h00) beginTimeL1<=times1[3:0];
endelseif(TimeL1==4'h0)beginTimeL1<=4'h9;endelsebeginTimeL1<=TimeL1-1'b1;endendendmodule


目录
相关文章
|
存储 算法 编译器
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
|
异构计算
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
1719 0
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
|
芯片 异构计算
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
966 0
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
FPGA-任务五、十字路口交通控制灯器系统设计(二)
FPGA-任务五、十字路口交通控制灯器系统设计(二)
319 0
FPGA-任务五、十字路口交通控制灯器系统设计(二)
FPGA-(任务01)设计一个三位二进制减法计数器
FPGA-(任务01)设计一个三位二进制减法计数器
219 0
FPGA-(任务01)设计一个三位二进制减法计数器
|
传感器 异构计算
FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
本文介绍了FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
472 0
FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
|
5月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于FPGA的SNN脉冲神经网络之LIF神经元verilog实现,包含testbench
本项目展示了 LIF(Leaky Integrate-and-Fire)神经元算法的实现与应用,含无水印运行效果预览。基于 Vivado2019.2 开发,完整代码配有中文注释及操作视频。LIF 模型模拟生物神经元特性,通过积分输入信号并判断膜电位是否达阈值产生脉冲,相较于 Hodgkin-Huxley 模型更简化,适合大规模神经网络模拟。核心程序片段示例,助您快速上手。
|
8月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
314 74
|
6月前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
6月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本内容展示了基于Vivado2019.2的算法仿真效果,包括设置不同信噪比(SNR=8db和20db)下的结果及整体波形。同时,详细介绍了2ASK调制解调技术的原理与实现,即通过改变载波振幅传输二进制信号,并提供数学公式支持。此外,还涉及帧同步理论,用于确定数据帧起始位置。最后,给出了Verilog核心程序代码,实现了2ASK解调与帧同步功能,结合DDS模块生成载波信号,完成信号处理流程。
123 0

热门文章

最新文章