西工大FPGA实验大作业Word格式.docx
《西工大FPGA实验大作业Word格式.docx》由会员分享,可在线阅读,更多相关《西工大FPGA实验大作业Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
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;
0]led_ctrlshi;
wire[3:
0]dataoutge;
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);
output[3:
0]outge;
0]outshi;
output[2:
0]light_select;
reg[2:
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'
always@(posedgeclk50MHzorposedgereset)
begin
if(reset)
begin
clk1Hz<
=0;
counter<
=5'
d0;
end
else
if(counter==25'
d25000000-1)
begin
counter<
=25'
clk1Hz<
=~clk1Hz;
end
else
=counter+1;
end
always@(posedgeclk1Hzorposedgereset)
light_select<
=3'
b000;
light_status<
=2'
enable<
if(enable==0)
enable<
=1;
case(light_status)
0:
light_long<
=g_long;
light_select<
b100;
light_status<
d1;
1:
=y_long;
b010;
d2;
2:
light_long<
=r_long;
b001;
defaultlight_select<
endcase
if(light_long==0)
enable<
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]-1;
assignoutge=light_long[3:
0];
assignoutshi=light_long[7:
4];
//译码模块
moduledecode(clk50MHz,reset,inge,inshi,light_sel,light_out,led_datage,led_datashi);
input[3:
0]inge;
0]inshi;
input[2:
0]light_sel;
0]led_datage;
0]led_datashi;
reg[6:
0]counter_yell;
regfrequencies;
counter_yell<
frequencies<
if(counter_yell==25'
counter_yell<
frequencies<
=~frequencies;
=counter_yell+1;
always@(frequenciesorlight_sel)
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
b0;
always@(inge)
case(inge)//个位七段译码,低电平有效
4'
h0:
led_datage=7'
b0001000;
h1:
b1101101;
h2:
b0100010;
h3:
b0100100;
h4:
b1000101;
h5:
b0010100;
h6:
b0010000;
h7:
b0101101;
h8:
b0000000;
h9:
b0000100;
default:
b1111111;
endcase
always@(inshi)
case(inshi)//十位七段译码,低电平有效
led_datashi=7'
测试代码
`timescale1ns/1ns
moduletraffic_tb;
regclk50MHz;
regreset;
wire[6:
initial
reset=1;
#1reset=0;
always
#1clk50MHz=0;
#1clk50MHz=1;
lightslights(.clk50MHz(clk50MHz),.reset(reset),.light_out(light_out),.led_ctrlge(led_ctrlge),.led_ctrlshi(led_ctrlshi));
五.实验结果
仿真图
绿灯
红灯
黄灯
综合结果
总模块
控制模块
译码模块
六.结论
通过交通信号控制器功能仿真与测试,本设计达到了预定设计的目的,实现了交通灯的仿真机布局布线,对我们的生活有指导性的意义,同时也体现了verilog语言的重要性。
在以后的实验中,一定要先理清思路,得出大致的流程图以及核心部分,在分各个模块实现,最后连接起来
七、教师评语
签名:
日期:
成绩