西电 数字电路与系统设计 EDA大作业Word格式.docx
《西电 数字电路与系统设计 EDA大作业Word格式.docx》由会员分享,可在线阅读,更多相关《西电 数字电路与系统设计 EDA大作业Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
数码管扫描时钟产生模块(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;