西电 数字电路与系统设计 EDA大作业.docx

上传人:b****5 文档编号:11742041 上传时间:2023-03-31 格式:DOCX 页数:23 大小:132.08KB
下载 相关 举报
西电 数字电路与系统设计 EDA大作业.docx_第1页
第1页 / 共23页
西电 数字电路与系统设计 EDA大作业.docx_第2页
第2页 / 共23页
西电 数字电路与系统设计 EDA大作业.docx_第3页
第3页 / 共23页
西电 数字电路与系统设计 EDA大作业.docx_第4页
第4页 / 共23页
西电 数字电路与系统设计 EDA大作业.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

西电 数字电路与系统设计 EDA大作业.docx

《西电 数字电路与系统设计 EDA大作业.docx》由会员分享,可在线阅读,更多相关《西电 数字电路与系统设计 EDA大作业.docx(23页珍藏版)》请在冰豆网上搜索。

西电 数字电路与系统设计 EDA大作业.docx

西电数字电路与系统设计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;

end

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1