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

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

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

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

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

数码管扫描时钟产生模块(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:

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

if(clock_1s_counter==clock_1s_value-1'

b1)

clock_1s_counter<

d0;

else

=clock_1s_counter+1'

b1;

end

//二分频,即1s分频

if(reset)

clock_1s<

=1'

else

clock_1s<

=~clock_1s;

数码管扫描时钟产生模块(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'

regdisplay_div=1'

//计数分频

//模1250*5/2计数器,即1.25ms分频

always@(posedgedisplay_DIV_clk)

if(display_div_counter==display_div_value-1'

display_div_counter<

=20'

else

=display_div_counter+1'

//二分频,即2.5ms分频

display_div<

=~display_div;

数码管扫描驱动模块(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;

0]led_display_port_temp;

//连接此模块与dectohex模块的接线,将的dectohex模块的段选与此模块的段选输出连接

regled1,led2,led3,led4;

reg[6:

0]led_display_port;

reg[1:

0]display_counter=2'

//显示循环计数寄存器,加入初始值主要是为仿真时用

reg[3:

0]number_temp=4'

//待显示数字中间变量,加入初始值主要是为仿真时用

//扫描显示

//进行扫描循环计数

always@(posedgedisplay_clk)

display_counter<

=display_counter+1'

end

//进行扫描循环显示

always@(display_counter)

if(display_counter==2'

b00)

begin

led1<

led2<

led3<

led4<

number_temp<

=number1[7:

4];

end

elseif(display_counter==2'

b01)

=number1[3:

0];

b10)

=number2[7:

b11)

=number2[3:

end

//模块连接,进行十进制到数码管的转换解码

dectohexu3(.number(number_temp),.light(led_display_port_temp));

//数码管段选赋值接线

led_display_port<

=led_display_port_temp;

十进制数字与数码管显示解码模块(dectohex)

十进制数字(number),范围0~15

二进制数字(light),要对应数码管

moduledectohex(number,light);

input[3:

0]number;

0]light;

//进行数值转换

always@(*)

case(number)

4'

d0:

light=7'

b0000001;

//0

d1:

b1001111;

//1

d2:

b0010010;

//2

d3:

b0000110;

//3

d4:

b1001100;

//4

d5:

b0100100;

//5

d6:

b0100000;

//6

d7:

b0001111;

//7

d8:

b0000000;

//8

d9:

b0000100;

//9

d10:

b0001000;

//A

d11:

b1100000;

//B

d12:

b0110001;

//C

d13:

b1000010;

//D

d14:

b0110000;

//E

d15:

b0111000;

//F

endcase

交通灯控制模块(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[7:

0]numa,numb;

//输出数码管显示数值

reg[7:

0]numa=8'

b0,numb=8'

regtempa=1'

b0,tempb=1'

0]counta=2'

b0,countb=2'

0]agreen,ayellow,ared;

0]bgreen,byellow,bred;

reg[2:

0]LAMPA=3'

b0,LAMPB=3'

//设置各交通灯的持续时间初始化值

always@(en)

if(!

en)//使能信号en无效时,对交通灯的计数值进行初始化

ared<

=8'

b00110000;

//左红灯亮灯30s

ayellow<

b00000101;

//左黄灯亮灯5s

agreen<

b00100101;

//左绿灯亮灯25s

bred<

//右红灯亮灯30s

byellow<

//右黄灯亮灯5s

bgreen<

//左绿灯亮绿灯25s

//控制a方向3种灯的模块

always@(posedgetraffic_clk)

if(en)//使能信号en有效时,交通灯开始工作

tempa)

tempa<

case(counta)//使能信号en有效时,交通灯开始工作

0:

begin//状态0

numa<

=agreen;

//直行绿灯亮

LAMPA<

=3'

b001;

//输出001

counta<

d1;

//进入下一个状态

end

1:

begin//状态1

numa<

=ayellow;

//黄灯亮

b010;

//输出010

d2;

2:

begin//状态2

=ared;

//红灯亮

b100;

//输出100

//进入下一个状态(状态0)

default:

//默认状态

LAMPA<

//红灯亮,输出100

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'

elsenuma[3:

=numa[3:

0]-1'

if(numa==2)tempa<

//倒计时结束,返回灯状态变化判断,将进入下一个状态

LAMPA<

//使能端无效时,红灯亮

counta<

=2'

//返回方向A的状态0(绿灯状态)

tempa<

//进入状态变化判断

numa<

=0;

//数码管进行清零

if(en)

tempb)

tempb<

=1;

case(countb)

begin

numb<

=bred;

LAMPB<

countb<

=bgreen;

=byellow;

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

当前位置:首页 > 自然科学 > 物理

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

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