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


目录
相关文章
|
3月前
|
存储 算法 编译器
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
|
异构计算
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
1136 0
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
|
芯片 异构计算
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
538 0
数电FPGA实验:实验一 基于FPGA的计数器设计 (基本任务:采用原理图法设计一个十进制计数器,完成波形功能仿真和时序仿真。拓展任务1:采用原理图法设计一个六进制计数器,完成波形功能仿真和时序仿真)
FPGA-任务五、十字路口交通控制灯器系统设计(二)
FPGA-任务五、十字路口交通控制灯器系统设计(二)
228 0
FPGA-任务五、十字路口交通控制灯器系统设计(二)
FPGA-(任务01)设计一个三位二进制减法计数器
FPGA-(任务01)设计一个三位二进制减法计数器
157 0
FPGA-(任务01)设计一个三位二进制减法计数器
|
传感器 异构计算
FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
本文介绍了FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
347 0
FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块
|
4月前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
133 7
|
4月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
167 2
|
4月前
|
编解码 算法 异构计算
基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序
在Vivado 2019.2和Matlab 2022a中测试的图像质量评估算法展示了效果。该算法基于NC指标,衡量图像与原始图像的相似度,关注分辨率、色彩深度和失真。提供的Verilog代码段用于读取并比较两个BMP文件,计算NC值。
|
4月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
53 1

热门文章

最新文章