u13653 自动化1105班 骆攀.docx
- 文档编号:9555844
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:51
- 大小:212.75KB
u13653 自动化1105班 骆攀.docx
《u13653 自动化1105班 骆攀.docx》由会员分享,可在线阅读,更多相关《u13653 自动化1105班 骆攀.docx(51页珍藏版)》请在冰豆网上搜索。
u13653自动化1105班骆攀
华中科技大学
电子线路测试实验报告
题目:
数字钟设计
专业:
自动化1105班
实验组别:
19
姓名:
学号:
U201113653
指导老师:
汪小燕
日期:
2013年6月
目录:
一、实验目的3
二、实验要求3
三、实验仪器3
四、需求分析与系统设计说明4
五、功能仿真21
六、思考题24
七、实验收获与体会25
八、附录25
一、实验目的
1.掌握可编程逻辑器件的应用开发技术,设计输入、编译、仿真和器件编程;
2.熟悉EDA软件使用;
3.掌握VerilogHDL设计方法;
4.分模块、分层次数字系统设计
二、实验要求
1.能显示小时、分钟、秒钟(小时以24进制,时、分用显示器,秒用LED)
2.能调整小时、分钟的时间
3.复位
三、实验仪器
QUARTUSII软件PCDEO实验板
四、需求分析与系统设计说明
数字钟由2个60进制计数器和1个24进制计数器和两个2选1数据选择器共5个模块构成,3个计数器公用一个时钟信号CP。
2个选择器分别用于选择分计数器和时计数器的使能控制信号,对时间进行校正时,在控制器的作用下,使能信号接高电平,此时每来一个时钟信号,计数器加一计数,从而实现对小时和分钟的校正.正常计时时,使能信号来自低位计数器的输出,即秒计数器达到59秒时,产生输出信号使分计数器加1,分秒计数器同时计到最大值时即59分59秒时,产生输出信号使小时计数器加一。
主要模块如下:
顶层模块:
moduletime_counter(
inputCLK,
inputRESET,
input[2:
0]SWITCH,
inputGrimSelect,
input[1:
0]KEY,
output[31:
0]SEG,
output[7:
0]LED
);
parameterFCLK=50_000_000;//设定时钟频率
wireclk_1hz,clk_4hz,clk_10hz,clk_100hz;
wireadd_cmd,sub_cmd;
wirecarry_in_minute,carry_in_hour;
wire[2:
0]mode;
wiregrim_select;
wire[5:
0]sec_value,min_value,hour_value;
wire[3:
0]min_out_ones,min_out_tens,hour_out_ones,hour_out_tens;
wire[5:
0]alarm_min,alarm_hour;
wire[3:
0]alarm_min_ones,alarm_min_tens,alarm_hour_ones,alarm_hour_tens;
wire[6:
0]stop_sec,stop_mill;
wire[3:
0]stop_sec_ones,stop_sec_tens,stop_mill_ones,stop_mill_tens;
reg[3:
0]led_in_1,led_in_2,led_in_3,led_in_4;
wire[7:
0]led_out_1,led_out_2,led_out_3,led_out_4;
/*assignclk_1hz=CLK;
assignclk_4hz=CLK*4;
assignclk_10hz=CLK*10;
assignclk_100hz=CLK*100;*/
assignmode=SWITCH;
assigngrim_select=GrimSelect;
/************************************************/
/*开关模式选择*/
/************************************************/
always@(posedgeCLK)
begin
if(mode==3'b000)
begin
led_in_1=min_out_ones;
led_in_2=min_out_tens;
led_in_3=hour_out_ones;
led_in_4=hour_out_tens;
end
elseif(mode==3'b001)
begin
led_in_1=min_out_ones;
led_in_2=min_out_tens;
led_in_3=hour_out_ones;
led_in_4=hour_out_tens;
end
elseif(mode==3'b010)
begin
led_in_1=min_out_ones;
led_in_2=min_out_tens;
led_in_3=hour_out_ones;
led_in_4=hour_out_tens;
end
elseif(mode==3'b101)
begin
led_in_1=alarm_min_ones;
led_in_2=alarm_min_tens;
led_in_3=alarm_hour_ones;
led_in_4=alarm_hour_tens;
end
elseif(mode==3'b110)
begin
led_in_1=alarm_min_ones;
led_in_2=alarm_min_tens;
led_in_3=alarm_hour_ones;
led_in_4=alarm_hour_tens;
end
elseif(mode==3'b100)
begin
led_in_1=alarm_min_ones;
led_in_2=alarm_min_tens;
led_in_3=alarm_hour_ones;
led_in_4=alarm_hour_tens;
end
elseif(mode==3'b111)
begin
led_in_1=stop_mill_ones;
led_in_2=stop_mill_tens;
led_in_3=stop_sec_ones;
led_in_4=stop_sec_tens;
end
else
begin
led_in_1=min_out_ones;
led_in_2=min_out_tens;
led_in_3=hour_out_ones;
led_in_4=hour_out_tens;
end
end
freq_dividerinst_freq_divider
(
.CLK(CLK),
.clk_1hz(clk_1hz),
.clk_4hz(clk_4hz),
.clk_10hz(clk_10hz),
.clk_100hz(clk_100hz)
);
KeyDetectinst_KeyDetect(
.Key(KEY),
.clk_10hz(clk_10hz),
.add_cmd(add_cmd),
.sub_cmd(sub_cmd)
);
SecondCountinst_SecondCount(
.clk_1hz(clk_1hz),
.reset(RESET),
.carry_in_minute(carry_in_minute),
.sec_value(sec_value)
);
MinuteCountinst_MinuteCount(
.clk_10hz(clk_10hz),
.reset(RESET),
.carry_in_minute(carry_in_minute),
.mode(mode),
.add_cmd(add_cmd),
.sub_cmd(sub_cmd),
.carry_in_hour(carry_in_hour),
.min_value(min_value)
);
HourCountinst_HourCount(
.clk_10hz(clk_10hz),
.reset(RESET),
.carry_in_hour(carry_in_hour),
.mode(mode),
.add_cmd(add_cmd),
.sub_cmd(sub_cmd),
.grim_select(grim_select),
.hour_value(hour_value)
);
SEG7_OUTinst_SEG7_OUT1(
.in_seg_value(led_in_1),
.out_seg_value(led_out_1[6:
0])
);
SEG7_OUTinst_SEG7_OUT2(
.in_seg_value(led_in_2),
.out_seg_value(led_out_2[6:
0])
);
SEG7_OUTinst_SEG7_OUT3(
.in_seg_value(led_in_3),
.out_seg_value(led_out_3[6:
0])
);
SEG7_OUTinst_SEG7_OUT4(
.in_seg_value(led_in_4),
.out_seg_value(led_out_4[6:
0])
);
LED_OUTinst_LED_OUT(
.in_led_value(sec_value),
.out_led_value(LED[5:
0])
);
//change
ConvertToBCDinst_ConvertToBCD1(
.bin_in(min_value),
.ones(min_out_ones),
.tens(min_out_tens)
);
ConvertToBCDinst_ConvertToBCD2(
.bin_in(hour_value),
.ones(hour_out_ones),
.tens(hour_out_tens)
);
ConvertToBCDinst_ConvertToBCD3(
.bin_in(alarm_min),
.ones(alarm_min_ones),
.tens(alarm_min_tens)
);
ConvertToBCDinst_ConvertToBCD4(
.bin_in(alarm_hour),
.ones(alarm_hour_ones),
.tens(alarm_hour_tens)
);
SharpClockinst_SharpClock(
.clk_1hz(clk_1hz),
.clk_10hz(clk_10hz),
.reset(RESET),
.mode(mode),
.min_value(min_value),
.hour_value(hour_value),
.sharp_led(LED[6])
);
Alarm_Setinst_Alarm_Set(
.clk_10hz(clk_10hz),
.reset(RESET),
.mode(mode),
.add_cmd(add_cmd),
.sub_cmd(sub_cmd),
.grim_select(grim_select),
.alarm_min(alarm_min),
.alarm_hour(alarm_hour)
);
Alarm_Ringinst_Alarm_Ring(
.clk_4hz(clk_4hz),
.clk_10hz(clk_10hz),
.mode(mode),
.min_value(min_value),
.hour_value(hour_value),
.alarm_min(alarm_min),
.alarm_hour(alarm_hour),
.alarm_led(LED[7])
);
Stop_Watchinst_Stop_Watch(
.clk_10hz(clk_10hz),
.reset(RESET),
.mode(mode),
.stop(add_cmd),
.start(sub_cmd),
.stop_mill(stop_mill),
.stop_sec(stop_sec)
);
assignSEG={led_out_4,led_out_3,led_out_2,led_out_1};
assign{led_out_4[7],led_out_3[7],led_out_2[7],led_out_1[7]}=((mode==3'b0)||(mode==3'b100))?
4'b1011:
4'b1111;
assignstop_sec_ones=stop_sec%10;
assignstop_sec_tens=stop_sec/10;
assignstop_mill_ones=stop_mill%10;
assignstop_mill_tens=stop_mill/10;
endmodule
计数模块:
//时分秒分别计时
moduleSecondCount(
inputclk_1hz,
inputreset,
outputcarry_in_minute,
output[5:
0]sec_value
);
regcarry_in_minute_temp;
reg[5:
0]sec_value_temp;
initial
begin
sec_value_temp=6'b0;
carry_in_minute_temp=1'b0;
end
always@(posedgeclk_1hzornegedgereset)
begin
if(!
reset)
sec_value_temp<=6'b0;
else
begin
if(sec_value_temp==6'd59)
sec_value_temp<=6'b0;
else
sec_value_temp<=sec_value_temp+6'b1;
end
end
always@(posedgeclk_1hzornegedgereset)
begin
if(!
reset)
carry_in_minute_temp<=1'b0;
elseif(sec_value_temp==6'd58)
carry_in_minute_temp<=1'b1;
else
carry_in_minute_temp<=1'b0;
end
assigncarry_in_minute=carry_in_minute_temp;
assignsec_value=sec_value_temp;
endmodule
moduleMinuteCount(
inputclk_10hz,
inputreset,
inputcarry_in_minute,
input[2:
0]mode,
inputadd_cmd,
inputsub_cmd,
outputcarry_in_hour,
output[5:
0]min_value
);
reg[5:
0]min_value_temp;
regcarry_in_hour_temp;
regcarry_in_min_last;
regcarry_in_min_temp;
initial
begin
min_value_temp<=6'b0;
carry_in_hour_temp<=1'b0;
carry_in_min_last<=1'b0;
carry_in_min_temp<=1'b0;
end
always@(posedgeclk_10hzornegedgereset)
begin
if(!
reset)
begin
carry_in_min_temp<=1'b0;
carry_in_min_last<=1'b0;
end
else
begin
carry_in_min_last=carry_in_min_temp;
carry_in_min_temp=carry_in_minute;
end
end
always@(posedgeclk_10hzornegedgereset)
begin
if(!
reset)
min_value_temp<=6'b0;
else
begin
if(mode==3'b0)//mode=2'b00)
begin
if((carry_in_min_temp==1'b0)&&(carry_in_min_last==1'b1))
begin
if(min_value_temp==6'd59)
min_value_temp<=6'b0;
else
min_value_temp<=min_value_temp+6'b1;
end
end
elseif(mode==3'b001)//mode=2'b01
begin
if(add_cmd)
begin
if(min_value_temp==6'd59)
min_value_temp<=6'b0;
else
min_value_temp<=min_value_temp+6'b1;
end
elseif(sub_cmd)
begin
if(min_value_temp==6'b0)
min_value_temp<=6'd59;
else
min_value_temp<=min_value_temp-6'b1;
end
end
end
end
always@(posedgeclk_10hzornegedgereset)
begin
if(!
reset)
carry_in_hour_temp<=1'b0;
elseif(min_value_temp==6'd59&&carry_in_minute&&mode==3'b0)
carry_in_hour_temp<=1'b1;
else
carry_in_hour_temp<=1'b0;
end
assigncarry_in_hour=carry_in_hour_temp;
assignmin_value=min_value_temp;
endmodule
moduleHourCount(
inputclk_10hz,
inputreset,
inputcarry_in_hour,
input[2:
0]mode,
inputadd_cmd,
inputsub_cmd,
inputgrim_select,
output[5:
0]hour_value
);
reg[5:
0]hour_value_temp;
regcarry_in_hour_last;
regcarry_in_hour_temp;
reg[5:
0]Hour_MAX;
initial
begin
hour_value_temp=6'b0;
carry_in_hour_last=1'b0;
carry_in_hour_temp=1'b0;
Hour_MAX=6'd24;
end
always@(posedgeclk_10hz)
begin
if(grim_select)
begin
Hour_MAX=6'd23;
end
else
begin
Hour_MAX=6'd12;
end
end
always@(posedgeclk_10hzornegedgereset)
begin
if(!
reset)
begin
carry_in_hour_last<=1'b0;
carry_in_hour_temp<=1'b0;
end
else
begin
carry_in_hour_last=carry_in_hour_temp;
carry_in_hour_temp=carry_in_hour;
end
end
always@(posedgeclk_10hzornegedgereset)
begin
if(!
reset)
hour_value_temp<=6'b0;
else
begin
if(mode==3'b0)//mode=2'b00
begin
if((carry_in_hour_temp==1'b0)&&(carry_in_hour_last==1'b1))
begin
if(hour_value_temp>=Hour_MAX)
hour_value_temp<=6'b0;
else
hour_value_temp<=hour_value_temp+6'b1;
end
end
elseif(mode==3'b010)//mode=2'b01,add_cmdandsub_cmdvalid
begin
if(add_cmd)
begin
if(hour_value_temp>=Hour_MAX)
hour_value_temp<=6'b0;
else
hour_value_temp<=hour_value_temp+6'b1;
end
if(sub_cmd)
begin
if(hour_value_temp==6'b0)
hour_value_temp<=Hour_MAX;
else
hour_value_temp<=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- u13653 自动化1105班 骆攀 自动化 1105