西工大FPGA实验大作业(共15页).docx
精选优质文档-倾情为你奉上西北工业大学硬件描述语言与FPGA实验报告学 院:学号:姓名:专 业:实验时间:实验地点:指导教师:西北工业大学20 年 月基于Verilog交通灯的设计与实现一、实验目的及要求实验目的:通过交通灯的设计与仿真综合,体会复杂时序的实现方法,学会用框图表示程序的设计思想,掌握中小规模集成电路的系统综合设计方法。实验要求:设计一个交通灯信号控制电路。具体要求为:输入为50MHz的时钟和复位信号,输出为红、绿、黄三个信号(高电平为亮)。复位信号(高电平)有效,红、绿、黄灯灭;接着进行如下循环:绿灯亮1分钟,黄灯闪烁10秒,红灯亮1分钟。在此基础上再加两个数码管,对倒计时的数显示。二、实验设备(环境)及要求ModelSimSE和Synplify Pro 9.6.2 三、实验内容与步骤1设计思路概述:考虑一个红绿黄交通灯及倒计时显示器设计首先复位电平置1,所有的交通灯电平为低,即灭。首先绿灯亮60s,然后黄灯闪烁10s;红灯再接着亮60s;而后绿灯亮60s,黄灯闪烁10s,红灯亮60s以此循环,直至复位电平置1,所有交通灯灭。2模块结构设计及流程图顶层模块(module lights):模块例化,对控制模块和译码模块进行例化控制模块:交通灯颜色和倒计时时钟分频(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中间位都为低(黄灯灭)。七段译码:38译码器,把倒计时译码输出显示模块框图: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计框图及相关时序 四实验代码/ 顶层模块module lights(clk50MHz,reset,light_out,led_ctrlge,led_ctrlshi); input clk50MHz; input reset; 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/ 控制模块Module control (clk50MHz,reset, outge, outshi, light_select); inputclk50MHz; inputreset; output3:0 outge; output3:0 outshi; output2:0 light_select; reg 2:0 light_select; reg 1:0 light_status; reg clk1Hz; reg 24:0 counter; reg enable; reg 7:0 light_long; parameter g_long=8'h59; parameter y_long=8'h09; parameter r_long=8'h59; always(posedge clk50MHz or posedge reset)begin if(reset) begin clk1Hz<=0; counter<=5'd0; end else if(counter=25'd-1) begin counter<=25'd0; clk1Hz<=clk1Hz; end else counter<=counter+1;endalways(posedge clk1Hz or posedge reset)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: beginlight_long<=g_long; light_select<=3'b100; light_status<=2'd1; end 1: beginlight_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; enddefault light_select<=3'b000; endcase end else if(light_long=0) enable<=0; else if(light_long3:0=0) begin light_long3:0<=4'd9; light_long7:4<=light_long7:4-1; end else light_long3:0<=light_long3:0-1;endassign outge=light_long3:0;assign outshi=light_long7:4;endmodule/ 译码模块module decode (clk50MHz, reset, inge,inshi,light_sel,light_out,led_datage, led_datashi); input clk50MHz; input reset; 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; reg frequencies; always(posedge clk50MHz or posedge reset)begin if(reset) begin counter_yell<=25'd0; frequencies <=0; end else if(counter_yell=25'd-1) begin counter_yell<=25'd0; frequencies <= frequencies; end else counter_yell<=counter_yell+1;endalways( frequencies or light_sel)begin light_out2=light_sel2; light_out0=light_sel0; if(frequencies =1)&&(light_sel1=1'b1) light_out1<=1'b1; else light_out1<=1'b0; endalways(inge)begincase(inge) / 个位七段译码,低电平有效 4'h0 : led_datage = 7'b; 4'h1 : led_datage = 7'b; 4'h2 : led_datage = 7'b; 4'h3 : led_datage = 7'b; 4'h4 : led_datage = 7'b; 4'h5 : led_datage = 7'b; 4'h6 : led_datage = 7'b; 4'h7 : led_datage = 7'b; 4'h8 : led_datage = 7'b; 4'h9 : led_datage = 7'b; default : led_datage = 7'b; endcaseendalways(inshi) begin case(inshi) /十位七段译码,低电平有效 4'h0 : led_datashi = 7'b; 4'h1 : led_datashi = 7'b; 4'h2 : led_datashi = 7'b; 4'h3 : led_datashi = 7'b; 4'h4 : led_datashi = 7'b; 4'h5 : led_datashi = 7'b; 4'h6 : led_datashi = 7'b; 4'h7 : led_datashi = 7'b; 4'h8 : led_datashi = 7'b; 4'h9 : led_datashi = 7'b; default : led_datashi = 7'b; endcaseendendmodule测试代码timescale 1ns/1nsmodule traffic_tb; reg clk50MHz; reg reset; wire 2:0 light_out; wire 6:0 led_ctrlge;wire 6:0 led_ctrlshi;initialbeginreset=1;#1 reset=0;endalwaysbegin#1 clk50MHz=0;#1 clk50MHz=1;endlightslights(.clk50MHz(clk50MHz),.reset(reset),.light_out(light_out),.led_ctrlge(led_ctrlge),.led_ctrlshi(led_ctrlshi);endmodule五实验结果仿真图绿灯红灯黄灯综合结果总模块控制模块译码模块六结论通过交通信号控制器功能仿真与测试,本设计达到了预定设计的目的,实现了交通灯的仿真机布局布线,对我们的生活有指导性的意义,同时也体现了verilog语言的重要性。在以后的实验中,一定要先理清思路,得出大致的流程图以及核心部分,在分各个模块实现,最后连接起来七、教师评语签名:日期:成绩专心-专注-专业