西工大FPGA实验大作业.docx
《西工大FPGA实验大作业.docx》由会员分享,可在线阅读,更多相关《西工大FPGA实验大作业.docx(15页珍藏版)》请在冰豆网上搜索。
西工大FPGA实验大作业
西北工业大学
《硬件描述语言与FPGA》实验报告
学院:
学 号:
姓 名:
专业:
实验时间:
实验地点:
指导教师:
西北工业大学
20年月
基于Verilog交通灯的设计与实现
一、实验目的及要求
实验目的:
通过交通灯的设计与仿真综合,体会复杂时序的实现方法,学会用框图表示程序的设计思想,掌握中小规模集成电路的系统综合设计方法。
实验要求:
设计一个交通灯信号控制电路。
具体要求为:
输入为50MHz的时钟和复位信号,输出为红、绿、黄三个信号(高电平为亮)。
复位信号(高电平)有效,红、绿、黄灯灭;接着进行如下循环:
绿灯亮1分钟,黄灯闪烁10秒,红灯亮1分钟。
在此基础上再加两个数码管,对倒计时的数显示。
二、实验设备(环境)及要求
ModelSimSE和SynplifyPro9.6.2
三、实验内容与步骤
1.设计思路概述:
考虑一个红绿黄交通灯及倒计时显示器设计
首先复位电平置1,所有的交通灯电平为低,即灭。
首先绿灯亮60s,然后黄灯闪烁10s;红灯再接着亮60s;而后绿灯亮60s,黄灯闪烁10s,红灯亮60s……以此循环,直至复位电平置1,所有交通灯灭。
2.模块结构设计及流程图
顶层模块(modulelights):
模块例化,对控制模块和译码模块进行例化
控制模块:
交通灯颜色和倒计时
时钟分频(frequencies):
将50MHZ的频率分成我们所需要的1HZ;
颜色变化:
状态循环及倒计时,状态用light_status,如果状态light_status为0,绿灯亮,时间(60s)给统计灯亮时间的变量light_long,并且把显示灯亮的变量light_select赋值100(高电平表示亮),最后把状态标志位light_status赋1,控制倒计时。
交通灯亮灭情况:
light_out
交通灯亮灭情况
001
红灯亮
010
黄灯亮
100
绿灯亮
倒计时:
灯亮或闪烁时间(绿、黄、红分别为60s、10s、60s)用BCD码表示(分别为60h、10h、60h),倒计时的时候个位和十位分别是高四位和低四位,首先是低四位倒数,当倒数到0时,重新赋值为9,且高四位减1,如此循环,直到这个数减到0,灯亮的时间到,接着进行下一个状态,在时间减到0的时候,给使能端enable赋值0;高四位和低四位分别显示十位和个位。
译码模块:
黄灯闪烁及倒计时译码输出。
黄灯闪烁:
黄灯在1s内亮0.5s灭0.5s,中间位当分频时钟y_flicker为高且输入light_select为高时,输出light_out才为高(黄灯亮),别的情况light_out中间位都为低(黄灯灭)。
七段译码:
3—8译码器,把倒计时译码输出显示
模块框图:
3.时序说明
在0时刻,加上系统时钟,首先进行reset置1,计数器清零,所有交通灯为灭的状态,二进制代码为00,七段译码无显示。
在reset为0时,系统开始正常工作。
计数器开始工作,纵向路口的路灯亮,横向路口的红灯亮,二进制代码为01,同时两个倒计时显示器工作,从59到0的倒计时。
经过60s(也就是经过60*50M个系统时钟上升沿之后)纵向路口,横向路口的黄灯开始闪烁(1秒内只有半秒,黄灯是亮的,从9秒到8.5秒之间黄灯是亮的,然后8.5到8是灭的,如此继续下去,知道10秒结束)又经过10s(70*50M个系统时钟上升沿),状态转移到红灯,然后显示及七段译码过程与绿灯相似。
至此一个周期已经完成,接下来就是循环执行以上步骤的过程,直到有reset清零端打断其正常工作。
4.计框图及相关时序
四.实验代码
//顶层模块
modulelights(clk50MHz,reset,light_out,led_ctrlge,led_ctrlshi);
inputclk50MHz;
inputreset;
output[2:
0]light_out;
output[6:
0]led_ctrlge;
output[6:
0]led_ctrlshi;
wire[3:
0]dataoutge;wire[3:
0]dataoutshi;wire[2:
0]light_selccted;
controlcontrollk50MHz),.reset(reset),.doutge(dataoutge),.doutshi(dataoutshi),.light_select(light_selccted));//控制模块例化
decodeU_decode(.sysclk_50MHz(sysclk_50M,.reset(reset),.inge(dataoutge),.inshi(dataoutshi).light_sel(light_selccted),.light_out(light_out),.led_datage(led_ctrlge),.led_datashi(led_ctrlshi));//译码模块例化
endmodule
//控制模块
Modulecontrol(clk50MHz,reset,outge,outshi,light_select);
inputclk50MHz;
inputreset;
output[3:
0]outge;
output[3:
0]outshi;
output[2:
0]light_select;
reg[2:
0]light_select;
reg[1:
0]light_status;
regclk1Hz;
reg[24:
0]counter;
regenable;
reg[7:
0]light_long;
parameterg_long=8'h59;
parametery_long=8'h09;
parameterr_long=8'h59;
always@(posedgeclk50MHzorposedgereset)
begin
if(reset)
begin
clk1Hz<=0;
counter<=5'd0;
end
else
if(counter==25'd25000000-1)
begin
counter<=25'd0;
clk1Hz<=~clk1Hz;
end
else
counter<=counter+1;
end
always@(posedgeclk1Hzorposedgereset)
begin
if(reset)
begin
light_select<=3'b000;
light_status<=2'd0;
enable<=0;
end
else
if(enable==0)
begin
enable<=1;
case(light_status)
0:
begin
light_long<=g_long;
light_select<=3'b100;
light_status<=2'd1;
end
1:
begin
light_long<=y_long;
light_select<=3'b010;
light_status<=2'd2;
end
2:
begin
light_long<=r_long;
light_select<=3'b001;
light_status<=2'd0;
end
defaultlight_select<=3'b000;
endcase
end
else
if(light_long==0)
enable<=0;
else
if(light_long[3:
0]==0)
begin
light_long[3:
0]<=4'd9;
light_long[7:
4]<=light_long[7:
4]-1;
end
else
light_long[3:
0]<=light_long[3:
0]-1;
end
assignoutge=light_long[3:
0];
assignoutshi=light_long[7:
4];
endmodule
//译码模块
moduledecode(clk50MHz,reset,inge,inshi,light_sel,light_out,led_datage,led_datashi);
inputclk50MHz;
inputreset;
input[3:
0]inge;
input[3:
0]inshi;
input[2:
0]light_sel;
output[2:
0]light_out;
output[6:
0]led_datage;
output[6:
0]led_datashi;
reg[6:
0]led_datage;
reg[6:
0]led_datashi;
reg[2:
0]light_out;
reg[24:
0]counter_yell;
regfrequencies;
always@(posedgeclk50MHzorposedgereset)
begin
if(reset)
begin
counter_yell<=25'd0;
frequencies<=0;
end
else
if(counter_yell==25'd25000000-1)
begin
counter_yell<=25'd0;
frequencies<=~frequencies;
end
else
counter_yell<=counter_yell+1;
end
always@(frequenciesorlight_sel)
begin
light_out[2]=light_sel[2];
light_out[0]=light_sel[0];
if((frequencies==1)&&(light_sel[1]==1'b1))
light_out[1]<=1'b1;
else
light_out[1]<=1'b0;
end
always@(inge)
begin
case(inge)//个位七段译码,低电平有效
4'h0:
led_datage=7'b0001000;
4'h1:
led_datage=7'b1101101;
4'h2:
led_datage=7'b0100010;
4'h3:
led_datage=7'b0100100;
4'h4:
led_datage=7'b1000101;
4'h5:
led_datage=7'b0010100;
4'h6:
led_datage=7'b0010000;
4'h7:
led_datage=7'b0101101;
4'h8:
led_datage=7'b0000000;
4'h9:
led_datage=7'b0000100;
default:
led_datage=7'b1111111;
endcase
end
always@(inshi)
begin
case(inshi)//十位七段译码,低电平有效
4'h0:
led_datashi=7'b0001000;
4'h1:
led_datashi=7'b1101101;
4'h2:
led_datashi=7'b0100010;
4'h3:
led_datashi=7'b0100100;
4'h4:
led_datashi=7'b1000101;
4'h5:
led_datashi=7'b0010100;
4'h6:
led_datashi=7'b0010000;
4'h7:
led_datashi=7'b0101101;
4'h8:
led_datashi=7'b0000000;
4'h9:
led_datashi=7'b0000100;
default:
led_datashi=7'b1111111;
endcase
end
endmodule
测试代码
`timescale1ns/1ns
moduletraffic_tb;
regclk50MHz;
regreset;
wire[2:
0]light_out;
wire[6:
0]led_ctrlge;
wire[6:
0]led_ctrlshi;
initial
begin
reset=1;
#1reset=0;
end
always
begin
#1clk50MHz=0;
#1clk50MHz=1;
end
lightslights(.clk50MHz(clk50MHz),.reset(reset),.light_out(light_out),.led_ctrlge(led_ctrlge),.led_ctrlshi(led_ctrlshi));
endmodule
五.实验结果
仿真图
绿灯
红灯
黄灯
综合结果
总模块
控制模块
译码模块
六.结论
通过交通信号控制器功能仿真与测试,本设计达到了预定设计的目的,实现了交通灯的仿真机布局布线,对我们的生活有指导性的意义,同时也体现了verilog语言的重要性。
在以后的实验中,一定要先理清思路,得出大致的流程图以及核心部分,在分各个模块实现,最后连接起来
七、教师评语
签名:
日期:
成绩