西电 数字电路与系统设计 EDA大作业.docx
- 文档编号:5275483
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:19
- 大小:83.71KB
西电 数字电路与系统设计 EDA大作业.docx
《西电 数字电路与系统设计 EDA大作业.docx》由会员分享,可在线阅读,更多相关《西电 数字电路与系统设计 EDA大作业.docx(19页珍藏版)》请在冰豆网上搜索。
西电数字电路与系统设计EDA大作业
《数字电路与系统设计》
EDA实验报告
班级:
学号:
姓名:
西安电子科技大学电子工程学院
基于FPGA的交通灯控制器
一、实验功能简介:
本实验基于XILINX的BASYS2FPGA开发板,配合编写verilogHDL硬件描写语言,实现交通灯控制器的设计。
应用板上的资源有四位数码管、一个拨键开关。
四位数码管前两位显示A路绿灯、黄灯和红灯亮灯的时间数值,后两位显示B路绿灯、黄灯、红灯亮灯的时间数值。
拨键开关SWO控制交通灯的工作状态。
当SW0置为“1”时,交通灯控制器开始工作。
当SW0置为“0”时,交通灯控制器进行复位操作。
交通灯控制器的A方向的绿灯、黄灯和红灯亮灯时间分别为25s、5s和30s,B方向的绿灯、黄灯和红灯亮灯时间也分别为25s、5s和30s。
本实验在50MHZ的主时钟的条件下控制6个LED灯的亮熄以及用四位数码管显示亮熄的时间。
这样便可以实现本实验的功能。
二、实验条件:
本实验所用到的开发板为Basys2开发板。
它是构建在XilinxSpartan3E现场可编程门阵列和一个AtmelAT90USB2USB控制器。
其核心部件为XilinxSpartan3E-100CP132,它采用100000-gateXilinxSpartan3EFPGA;通过AtmelAT90USB2全速USB2端口提供开发板所需的电源盒编程及数据输出接口。
开发板上的闪存来存储FPGA的声明。
其外围部件有8路LED灯;4个7段的数码管;4个按键;8个滑行开关;PS/2端口;8位的VGAD端口;用户可选择开发板配置的时钟(25/50/100MHZ),也可以外接时钟;4组6针的扩展接口;所有输入输出信号都有ESD和短路保护电路。
实验所用的综合软件为XilinxISEDesignSuite13.1,实验所用到的开发语言为Verilog,用ModelsimSE6.5e编程和仿真。
用DigilentAdept_v2-3-0来下载Bit文件。
三、实验过程:
1、系统组成框图:
2、模块划分及各个模块的详细功能:
本系统共包括个6个模块,分别为交通灯顶层模块(top_traffic)、1s计时时钟产生模块(clock_1s)、数码管扫描时钟产生模块(display_DIV)、数码管扫描驱动模块(display)、交通灯控制模块(traffic)、十进制数字与数码管显示解码模块(dectohex)。
交通灯顶层模块(top_traffic):
此模块为顶层连接模块,负责将各个模块连接起来,包括总系统的输入与输出信号的定义与连接。
1s计时时钟产生模块(clock_1s):
此模块用来对主频进行分频,使其产生跑表计时所需要的1s的方波信号。
数码管扫描时钟产生模块(display_DIV):
此模块用来对主频进行分频,使其产生数码管扫描所需的2.5ms时钟信号,此时钟信号为数码管扫描驱动模块(display)使用。
数码管扫描驱动模块(display):
此模块用来驱动数码管进行扫描显示,要显示的数据经由此模块显示到四位数码管上。
十进制数字与数码管显示解码模块(dectohex):
此模块是对要显示的数字进行解码,转换为数码管显示所需要的编码,此模块包含于数码管扫描驱动模块(display)。
交通灯控制模块(traffic):
此模块为整个系统的核心模块,用来控制输入的交通灯时钟信号,产生交通灯的效果,对交通灯进行开关与复位。
3、流程图及流程图详细介绍:
系统流程图为:
描述过程:
当交通灯控制模块(traffic)启动时,首先判断使能端EN是否为1。
若为1则程序继续进行。
接下来分别判断中间变量tempa与tempb是否为0.若为tempa为0,判断counta的数值。
若counta为0,则此时A路绿灯亮,并且数码管开始倒数计时。
当计时结束时,再返回判断counta的数值对应相应的交通灯亮熄。
tempb的判断与tempa类似。
说明:
在流程图的任意一点,只要RESET复位被按下,直接从“开始”重新开始。
按键说明:
开关复位键(SW0)。
4、详细的程序清单及程序注释:
/******************************************
交通灯顶层模块(top_traffic)
将各个模块进行连接,并设置总系统的输入输出
*******************************************/
moduletop_traffic(mainclk,reset,display_led,
led_control_1,led_control_2,led_control_3,led_control_4,
traffic_control,LAMPA,LAMPB);
//端口定义
inputmainclk,reset,traffic_control;//输入主时钟、复位信号与交通灯控制信号
output[6:
0]display_led;//输出数码管段选控制端
outputled_control_1,led_control_2,led_control_3,led_control_4;//数码管位选控制端
output[2:
0]LAMPA,LAMPB;
wire[6:
0]display_led;
wireled_control_1,led_control_2,led_control_3,led_control_4,drop;
wireclock_1s,display_div;//分频时钟接线:
交通灯计数时钟与数码管扫描时钟接线
wire[7:
0]number1,number2;//待显示数字接线
//1s时钟
clock_1su2(.clock_1s_clk(mainclk),.reset(reset),.clock_1s(clock_1s));
//显示分频
display_DIVu4(.display_DIV_clk(mainclk),.reset(reset),.display_div(display_div));
//数字显示
displayu5(.display_clk(display_div),.reset(reset),
.led1(led_control_1),.led2(led_control_2),.led3(led_control_3),.led4(led_control_4),
.number1(number1),.number2(number2),.led_display_port(display_led));
//交通灯
trafficu1(.traffic_clk(clock_1s),.en(traffic_control),.LAMPA(LAMPA),.LAMPB(LAMPB),.numa(number1),.numb(number2));
endmodule
/******************************************
1s计时时钟产生模块(clock_1s)
输入:
50MHz的主时钟(clock_1s_clk)
输出:
分频后信号5ms(clock_1s)
转换公式:
1/mainclk*clock_1s_value*2
*******************************************/
moduleclock_1s
(
clock_1s_clk,reset,clock_1s
);
parameterclock_1s_value=25000*1000;//更改此处的值改变分频时间
//端口定义
inputclock_1s_clk,reset;//输入此模块的时钟,与复位信号
outputclock_1s;//输出此模块的时钟
reg[25:
0]clock_1s_counter;//分频计数器
regclock_1s;
//计数分频
//模50000*1000/2计数器,即0.5s分频
always@(posedgeclock_1s_clkorposedgereset)
begin
if(reset)
begin
clock_1s_counter<=26'b0;
end
else
begin
if(clock_1s_counter==clock_1s_value-1'b1)
clock_1s_counter<=26'd0;
else
clock_1s_counter<=clock_1s_counter+1'b1;
end
end
//二分频,即1s分频
always@(posedgeclock_1s_clkorposedgereset)
begin
if(reset)
begin
clock_1s<=1'b0;
end
else
if(clock_1s_counter==clock_1s_value-1'b1)
clock_1s<=~clock_1s;
end
endmodule
/******************************************
数码管扫描时钟产生模块(display_DIV)
输入:
50MHz的主时钟(display_DIV_clk)
输出:
分频后LED扫描信号2.5ms(display_div)
转换公式:
1/mainclk*display_div_value*2
*******************************************/
moduledisplay_DIV
(
display_DIV_clk,reset,display_div
);
parameterdisplay_div_value=1250*5;//更改此处的值改变分频时间
//端口定义
inputdisplay_DIV_clk,reset;//输入此模块的时钟,与复位信号
outputdisplay_div;//输出此模块的时钟
reg[19:
0]display_div_counter=20'b0;//分频计数器
regdisplay_div=1'b0;
//计数分频
//模1250*5/2计数器,即1.25ms分频
always@(posedgedisplay_DIV_clk)
begin
if(display_div_counter==display_div_value-1'b1)
display_div_counter<=20'd0;
else
display_div_counter<=display_div_counter+1'b1;
end
//二分频,即2.5ms分频
always@(posedgedisplay_DIV_clk)
begin
if(display_div_counter==display_div_value-1'b1)
display_div<=~display_div;
end
endmodule
/******************************************
数码管扫描驱动模块(display)
输入:
LED扫描信号(display_DIV)
LED位选信号(led1,led2,led3,led4)
待显示数字(number1,number2)
输出:
控制LED段选信号(led_display_port)
*******************************************/
moduledisplay
(
display_clk,reset,led1,led2,led3,led4,number1,number2,led_display_port
);
//端口定义
inputdisplay_clk,reset;//显示输入时钟,与复位信号
outputled1,led2,led3,led4;//数码管位选控制端
inputnumber1,number2;//输入待显示的数字
outputled_display_port;//输出数码管段选控制端
wire[7:
0]number1,number2;
wire[6:
0]led_display_port_temp;//连接此模块与dectohex模块的接线,将的dectohex模块的段选与此模块的段选输出连接
regled1,led2,led3,led4;
reg[6:
0]led_display_port;
reg[1:
0]display_counter=2'b0;//显示循环计数寄存器,加入初始值主要是为仿真时用
reg[3:
0]number_temp=4'b0;//待显示数字中间变量,加入初始值主要是为仿真时用
//扫描显示
//进行扫描循环计数
always@(posedgedisplay_clk)
begin
display_counter<=display_counter+1'b1;
end
//进行扫描循环显示
always@(display_counter)
begin
if(display_counter==2'b00)
begin
led1<=1'b0;
led2<=1'b1;
led3<=1'b1;
led4<=1'b1;
number_temp<=number1[7:
4];
end
elseif(display_counter==2'b01)
begin
led1<=1'b1;
led2<=1'b0;
led3<=1'b1;
led4<=1'b1;
number_temp<=number1[3:
0];
end
elseif(display_counter==2'b10)
begin
led1<=1'b1;
led2<=1'b1;
led3<=1'b0;
led4<=1'b1;
number_temp<=number2[7:
4];
end
elseif(display_counter==2'b11)
begin
led1<=1'b1;
led2<=1'b1;
led3<=1'b1;
led4<=1'b0;
number_temp<=number2[3:
0];
end
end
//模块连接,进行十进制到数码管的转换解码
dectohexu3(.number(number_temp),.light(led_display_port_temp));
//数码管段选赋值接线
always@(display_counter)
led_display_port<=led_display_port_temp;
endmodule
/******************************************
十进制数字与数码管显示解码模块(dectohex)
输入:
十进制数字(number),范围0~15
输出:
二进制数字(light),要对应数码管
*******************************************/
moduledectohex(number,light);
//端口定义
input[3:
0]number;
output[6:
0]light;
reg[6:
0]light;
//进行数值转换
always@(*)
case(number)
4'd0:
light=7'b0000001;//0
4'd1:
light=7'b1001111;//1
4'd2:
light=7'b0010010;//2
4'd3:
light=7'b0000110;//3
4'd4:
light=7'b1001100;//4
4'd5:
light=7'b0100100;//5
4'd6:
light=7'b0100000;//6
4'd7:
light=7'b0001111;//7
4'd8:
light=7'b0000000;//8
4'd9:
light=7'b0000100;//9
4'd10:
light=7'b0001000;//A
4'd11:
light=7'b1100000;//B
4'd12:
light=7'b0110001;//C
4'd13:
light=7'b1000010;//D
4'd14:
light=7'b0110000;//E
4'd15:
light=7'b0111000;//F
endcase
endmodule
/******************************************
交通灯控制模块(traffic)
traffic_clk:
为1s同步时钟;
en:
使能信号,为1的话,则控制器开始工作;
LAMPA:
控制A方向3盏灯的亮灭;其中,LAMPA0~LAMPA2,分别控制A方向的
绿灯、黄灯和红灯;
LAMPB:
控制B方向3盏灯的亮灭;其中,LAMPB0~LAMPB2,分别控制B方向的
绿灯、黄灯和红灯;
numa:
用于A方向灯的时间显示,8位;
numb:
用于B方向灯的时间显示,8位。
*******************************************/
moduletraffic(traffic_clk,en,LAMPA,LAMPB,numa,numb);
//端口定义
inputtraffic_clk,en;//输入此模块的时钟与交通灯控制信号控制信号
output[2:
0]LAMPA,LAMPB;//输出交通灯红绿黄灯亮灯的控制端
output[7:
0]numa,numb;//输出数码管显示数值
reg[7:
0]numa=8'b0,numb=8'b0;
regtempa=1'b0,tempb=1'b0;
reg[1:
0]counta=2'b0,countb=2'b0;
reg[7:
0]agreen,ayellow,ared;
reg[7:
0]bgreen,byellow,bred;
reg[2:
0]LAMPA=3'b0,LAMPB=3'b0;
//设置各交通灯的持续时间初始化值
always@(en)
if(!
en)//使能信号en无效时,对交通灯的计数值进行初始化
begin
ared<=8'b00110000;//左红灯亮灯30s
ayellow<=8'b00000101;//左黄灯亮灯5s
agreen<=8'b00100101;//左绿灯亮灯25s
bred<=8'b00110000;//右红灯亮灯30s
byellow<=8'b00000101;//右黄灯亮灯5s
bgreen<=8'b00100101;//左绿灯亮绿灯25s
end
//控制a方向3种灯的模块
always@(posedgetraffic_clk)
begin
if(en)//使能信号en有效时,交通灯开始工作
begin
if(!
tempa)
begin
tempa<=1'b1;
case(counta)//使能信号en有效时,交通灯开始工作
0:
begin//状态0
numa<=agreen;//直行绿灯亮
LAMPA<=3'b001;//输出001
counta<=3'd1;//进入下一个状态
end
1:
begin//状态1
numa<=ayellow;//黄灯亮
LAMPA<=3'b010;//输出010
counta<=3'd2;//进入下一个状态
end
2:
begin//状态2
numa<=ared;//红灯亮
LAMPA<=3'b100;//输出100
counta<=3'd0;//进入下一个状态(状态0)
end
default:
//默认状态
LAMPA<=3'b100;//红灯亮,输出100
endcase
end
else
begin//每一个状态的倒计时
if(numa>1)//判断倒计时未归零时分别对高低位进行递减
if(numa[3:
0]==4'd0)begin
numa[3:
0]<=4'd9;
numa[7:
4]<=numa[7:
4]-1'b1;
end
elsenuma[3:
0]<=numa[3:
0]-1'b1;
if(numa==2)tempa<=1'b0;//倒计时结束,返回灯状态变化判断,将进入下一个状态
end
end
else
begin
LAMPA<=3'b100;//使能端无效时,红灯亮
counta<=2'd0;//返回方向A的状态0(绿灯状态)
tempa<=1'b0;//进入状态变化判断
numa<=0;//数码管进行清零
end
end
always@(posedgetraffic_clk)
begin
if(en)
begin
if(!
tempb)
begin
tempb<=1;
case(countb)
0:
begin
numb<=bred;
LAMPB<=3'b100;
countb<=3'd1;
end
1:
begin
numb<=bgreen;
LAMPB<=3'b001;
countb<=3'd2;
end
2:
begin
numb<=byellow;
LAMPB<=3'b010;
countb<=3'b0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西电 数字电路与系统设计 EDA大作业 数字电路 系统 设计 EDA 作业