eda交通灯设计和实现.docx
- 文档编号:10116871
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:14
- 大小:2.04MB
eda交通灯设计和实现.docx
《eda交通灯设计和实现.docx》由会员分享,可在线阅读,更多相关《eda交通灯设计和实现.docx(14页珍藏版)》请在冰豆网上搜索。
eda交通灯设计和实现
EDA交通灯课程设计
班级:
电气技术
1031
交通灯控制器
1.实验目的
学习交通灯控制器的设计,学习简单状态机的设计和硬件测试。
2.实验内容
本实验的内容是设计一个建议的交通灯控制,要求能实现三种灯的控制并通过数码管显示倒计时的时间。
整个设计在MagicSOPC试验箱上实现。
3.实验原理
本实验设计的交通灯控制器要求实现对A、B两个方向的红、绿、黄三种灯的控制,并能实现时间显示的倒计时。
因此每个方向的灯可以用一个状态机实现,状态的跳转顺序为灯-绿灯-黄灯-红灯(另一个的状态应为绿-黄-红绿),同时设计一个计时器,来记录每种灯的倒计时时间。
最后将交通灯的状态信息输出,至数码管显示模块和交通灯显示模块。
注意一个方向的红灯时间应和另一个方向的绿黄灯时间总和相等。
4.实验步骤
1)启动QuartusII建立一个空白工程,然后命名为traffic-top.qpf。
2)新建VerilogHDL源程序文件traffic.v、traffic-test、traffic-top.v,输入程序代码并保存(完整的VerilogHDL程序参考程序清单3.17),对各个HDL文件进行综合编译,若在编译过程中发现错误,则找出并更改错误,直至编译成功为止。
3)选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司CycloneII系列的EP2C35F672C8芯片,引脚锁定方法如表3.16所列。
将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。
设置方法见3.1节。
Lampa,lampb
表3.16引脚锁定方法
4)设置traffic-top.v为顶层文件,对该工程文件进行全程编译处理,若在编译处理过程中发现错误,则找出更正错误,直至编译成功为止。
5)把程序下载到FPGA器件中。
按一下复位键SYS-RST,然后观察交通灯及数码管的显示状态。
5.实验参考程序
程序清单3.17交通灯程序
1)交通灯控制器,文件traffic.v
本模块实现交通灯控制器的逻辑功能。
//*********************************************************//**交通灯控制器//*********************************************************
moduletraffic(clock,rst_n,clken,lampa,lampb,acount,bcount);
inputclock;//系统时钟50MHz
inputrst_n;//同步复位信号,低电平有效
inputclken;//时钟使能信号:
1Hz。
output[2:
0]lampa;//控制A方向三盏灯的亮灭;其中lampa[2:
0]分
//别控制A方向的绿灯、黄灯、红灯(低电平灯亮)
output[2:
0]lampb;//控制B方向三盏灯的亮灭;其中lampb[2:
0]分
//别控制B方向的绿灯、黄灯、红灯(低电平灯亮)
output[7:
0]acount;//用于A方向灯的时间显示,8位BCD码输出output[7:
0]bcount;//用于B方向灯的时间显示,8位BCD码输出reg[2:
0]lampa,lampb;
reg[7:
0]numa,numb;//时间计数器
regtempa,tempb;//防重进入标志
reg[2:
0]StateA,StateB;//A、B方向灯控制状态机的状态
//设置各种灯的计数器的预置数
parameterared=8'h30,//30秒
ayellow=8'h5,//5秒
agreen=8'h15,//15秒
bred=8'h20,//20秒
byellow=8'h5,//5秒
bgreen=8'h25;//25秒
assignacount=numa;
assignbcount=numb;
//控制A方向的三种灯
always@(posedgeclockornegedgerst_n)
begin
if(!
rst_n)
begin
StateA<=3'h0;
lampa<=3'b011;
tempa<=1'b0;
end
elseif(clken)
begin
if(!
tempa)
begin
tempa<=1'b1;//防重进入标志
case(StateA)//控制亮灯的顺序
0:
beginnuma<=agreen;lampa<=3'b011;StateA<=1;end1:
beginnuma<=ayellow;lampa<=3'b101;StateA<=2;end2:
beginnuma<=ared;lampa<=3'b110;StateA<=0;enddefault:
lampa<=3'b110;
endcase
end
else
begin//倒计时
if(numa>1)
if(numa[3:
0]==0)
begin
numa[3:
0]<=4'h9;
numa[7:
4]<=numa[7:
4]-4'h1;
end
else
numa[3:
0]<=numa[3:
0]-4'h1;
if(numa==2)
tempa<=1'b0;
end
end
end
//控制A方向的三
种灯
always@(posedgeclockornegedgerst_n)
begin
if(!
rst_n)
begin
lampb<=3'b110;
StateB<=3'h0;
tempb<=1'b0;
end
elseif(clken)
begin
if(!
tempb)
begin
tempb<=1'b1;//防重进入标志
case(StateB)//控制亮灯的顺序
0:
beginnumb<=bred;lampb<=3'b110;StateB<=1;end
1:
beginnumb<=bgreen;lampb<=3'b011;StateB<=2;end
2:
beginnumb<=byellow;lampb<=3'b101;StateB<=0;end
ddddddd:
lampb<=3'b110;
eeeeeee
end
else
begin//倒计时
if(numb>1)
if(numb[3:
0]==0)
begin
numb[3:
0]<=4'h9;
numb[7:
4]<=numb[7:
4]-4'h1;
end
else
numb[3:
0]<=numb[3:
0]-4'h1;
if(numb==2)
tempb<=1'b0;
end
end
end
endmodule
2)显示控制程序,文件名为traffic.v
本模块实现交通灯倒计时的显示并产生1HZ的时钟使能信号。
//*********************************************************//**交通灯控制器显示模块
//**功能:
显示交通灯时间,并产生1Hz时钟使能信号,//*********************************************************
moduletraffic_test(clock,clken,rst_n,acount,bcount,seg,dig);
inputclock;//系统时钟(50MHz)
inputrst_n;
outputclken;
input[7:
0]acount;
input[7:
0]bcount;
output[7:
0]seg;//数码管段码输出
output[7:
0]dig;//数码管位码输出
//I/O寄存器
reg[7:
0]seg;
reg[7:
0]dig;
//内部寄存器
reg[25:
0]clk_cnt;
reg[16:
0]count;//时钟分频计数器
reg[1:
0]cnt;//数码管扫描计数器
reg[3:
0]disp_dat;//数码管扫描显存
wirediv_clk;//分频时钟
//产生1Hz时钟使能信号
always@(posedgeclock)
begin
if(clken)
clk_cnt<=26'h0;
else
clk_cnt<=clk_cnt+26'h1;
end
assignclken=(clk_cnt>=26'd49999999);
//时钟分频进程,用于数码管扫描显示
always@(posedgeclock)
bbbbb
bbbbb<=count+1'b1;
end
assigndiv_clk=&count;
//数码管扫描显示部分
always@(posedgeclock)
begin
if(div_clk)
cnt<=cnt+1'b1;
end
always@(posedgeclock)
begin
if(div_clk)
begin
case(cnt)//选择扫描显示数据
2'd0:
disp_dat<=acount[7:
4];//第一个数码管2'd1:
disp_dat<=acount[3:
0];//第二个数码管2'd2:
disp_dat<=bcount[7:
4];//第五个数码管2'd3:
disp_dat<=bcount[3:
0];//第六个数码管endcase
case(cnt)//选择数码管显示位
2'd0:
dig<=8'b01111111;//选择第一个数码管显示2'd1:
dig<=8'b10111111;//选择第二个数码管显示2'd2:
dig<=8'b11110111;//选择第五个数码管显示2'd3:
dig<=8'b11111011;//选择第六个数码管显示endcase
end
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'h0:
seg=8'hc0;//显示0
4'h1:
seg=8'hf9;//显示1
4'h2:
seg=8'ha4;//显示2
4'h3:
seg=8'hb0;//显示3
4'h4:
seg=8'h99;//显示4
4'h5:
seg=8'h92;//显示5
4'h6:
seg=8'h82;//显示6
4'h7:
seg=8'hf8;//显示7
4'h8:
seg=8'h80;//显示8
4'h9:
seg=8'h90;//显示9
4'ha:
seg=8'h88;//显示a
4'hb:
seg=8'h83;//显示b
4'hc:
seg=8'hc6;//显示c
4'hd:
seg=8'ha1;//显示d
4'he:
seg=8'h86;//显示e
4'hf:
seg=8'h8e;//显示f
endcase
end
endmodule
2)顶层模块,文件名为traffic-top.v
本模块将traffic.v及traffic-test.v进行封装。
//*********************************************************//**交通灯控制器顶层程序//*********************************************************
moduletraffic_top(clock,rst_n,seg,dig,lampa,lampb);
inputclock;//系统时钟(48MHz)
inputrst_n;//复位信号,低电平有效
output[2:
0]lampa;//A方向红绿灯
output[2:
0]lampb;//B文向红绿灯
output[7:
0]seg;//数码管段码输出
output[7:
0]dig;//数码管位码输出
//内部线网
wireclken;
wire[7:
0]acount;
wire[7:
0]bcount;
//交通灯控制模块
traffictraffic(
.clock(clock),
.rst_n(rst_n),
.clken(clken),
.lampa(lampa),
.lampb(lampb),
.acount(acount),
.bcount(bcount)
);
//显示模块
traffic_testtraffic_test(
.clock(clock),
.clken(clken),
.rst_n(rst_n),
.acount(acount),
.bcount(bcount),
.seg(seg),
.dig(dig)
);
Endmodule
二仿真波形
三
照片等文件
四方框图
五参考资料
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 交通灯 设计 实现