《EDA技术及其应用》实验.docx
《《EDA技术及其应用》实验.docx》由会员分享,可在线阅读,更多相关《《EDA技术及其应用》实验.docx(13页珍藏版)》请在冰豆网上搜索。
《EDA技术及其应用》实验
学生实验报告
系别
课程名称
《EDA技术及其应用》实验
班级
实验名称
电子钟设计
姓名
实验时间
2012年11月20日
学号
指导教师
报告内容
一、实验目的和任务
1、设计电子钟,学习较复杂的数字系统设计方法;
2、熟悉掌握之前学过的知识应用。
二、实验原理介绍
完成一个带有时分秒显示的电子钟,时间可以设定。
可12、24小时调节,能作秒表计时,可倒计时,可做闹钟。
实验步骤
1、为本项设计建立文件夹;
2、输入设计项目和存盘
3、将设计项目设置成工程文件
4、定制6进制计数器文件,下面是其程序,然后生成控制器原理图
modulecnt6(q,clk,cout,rst,en,add_sub);
inputclk,rst,en,add_sub;
output[3:
0]q;
outputregcout;
regcout1,cout2;
reg[3:
0]q;
reg[3:
0]q1;
reg[3:
0]q2;
always@(posedgeclkorposedgerst)
begin
if(rst)q1<=0;
elseif(add_sub)
if(q1==4'b0101)
begin
q1<=0;
cout1<=1;
end
else
begin
q1<=q1+1;
cout1<=0;
end
else
if(q1==4'b0000)
begin
q1<=4'b0101;
cout1<=1;
end
else
begin
q1<=q1-1;
cout1<=0;
end
end
always@(posedgeclkorposedgerst)
begin
if(rst)q2<=0;
elseif(en)
begin
if(q2==4'b0101)
begin
q2<=0;
cout2<=1;
end
else
begin
q2<=q2+4'b0001;
cout2<=0;
end
end
end
always@(en,q1,q2,cout1,cout2)
begin
if(en)
beginq<=q2;cout<=cout2;end
else
beginq<=q1;cout<=cout1;end
end
endmodule
5、定制10进制计数器文件,下面是其程序,然后生成计数器原理图
modulecnt10(q,clk,cout,rst,en,add_sub);
inputclk,rst,en,add_sub;
output[3:
0]q;
outputregcout;
regcout1,cout2;
reg[3:
0]q;
reg[3:
0]q1;
reg[3:
0]q2;
always@(posedgeclkorposedgerst)
begin
if(rst)q1<=0;
elseif(add_sub)
if(q1==4'b1001)
begin
q1<=0;
cout1<=1;
end
else
begin
q1<=q1+1;
cout1<=0;
end
else
if(q1==4'b0000)
begin
q1<=4'b1001;
cout1<=1;
end
else
begin
q1<=q1-1;
cout1<=0;
end
end
always@(posedgeclkorposedgerst)
begin
if(rst)q2<=0;
elseif(en)
begin
if(q2==4'b1001)
begin
q2<=0;
cout2<=1;
end
else
begin
q2<=q2+4'b0001;
cout2<=0;
end
end
end
always@(en,q1,q2,cout1,cout2)
begin
if(en)
beginq<=q2;cout<=cout2;end
else
beginq<=q1;cout<=cout1;end
end
endmodule
6、利用已定制好的6进制及10进制原理图生成60进制原理图:
图:
秒输出的原理框图
图:
分输出的原理框图
7、定制24进制计数器文件,含12—24小时转换,下面是其程序,然后生成计数器原理图
modulecnt24(q,clk,cout,rst,en,add_sub,switch);
inputclk,rst,en,add_sub,switch;
output[4:
0]q;
outputregcout;
regcout1,cout2;
reg[4:
0]q;
reg[4:
0]q1;
reg[4:
0]q2;
reg[4:
0]q3;
always@(posedgeclkorposedgerst)
begin
if(rst)q1<=0;
elseif(add_sub)//实现倒计时
if(q1==5'b10111)
begin
q1<=5'b00000;
cout1<=1;
end
else
begin
q1<=q1+1;
cout1<=0;
end
else
if(q1==5'b00000)
begin
q1<=5'b10111;
cout1<=1;
end
else
begin
q1<=q1-5'b00001;
cout1<=0;
end
end
always@(posedgeclkorposedgerst)//实现秒表功能
begin
if(rst)q2<=0;
elseif(en)
begin
if(q2==5'b10111)
begin
q2<=0;
cout2<=1;
end
else
begin
q2<=q2+5'b00001;
cout2<=0;
end
end
end
always@(en,q1,q2,cout1,cout2)//秒表和倒计时互相转换
begin
if(en)
beginq3<=q2;cout<=cout2;end
else
beginq3<=q1;cout<=cout1;end
end
always@(q3,switch)//12小时和24小时互相转换
begin
if(switch)
begin
if(q3>4'd12)q<=q3-4'd12;
elseq<=q3;
end
elseq<=q3;
end
endmodule
图:
小时输出的原理框图
8、定制十进制的小时在数码管上显示器件,下面是其程序,然后生成计数器原理图
modulebcd(a,hour);
input[4:
0]a;
output[7:
0]hour;
reg[7:
0]hour;
always@(a)
begin
if(a>19)hour<=a+8'b00001100;
elseif(a>9)hour<=a+8'b00000110;
elsehour<={4'b0000,a};
end
endmodule
图:
十进制的小时在数码管上显示
9、完成原理图设计,具体步骤如下:
(1)选择File文件里的新生成文件newfile,然后选择BlockDiagram/SchematicFile,点击确定;
(2)进入原理图设计面,双击空白处,弹出Symbol框,选择Project文件包,选择已生成的原理图,并完成原理图;
10、时序仿真,测试设计项目的正确性,即逻辑仿真;
11、引脚锁定;
12、编程下载。
三、设计代码(或原理图)、仿真波形及分析
图:
电子钟原理图
原理图中:
rst:
复位键,异步复位,高电平有效。
en:
秒表计时键,高电平有效,启动秒表计时功能。
add_sub:
倒计时键,当add_sub=1时,正常计时;add_sub=0时,启动倒计时功能。
switch:
12-24小时显示转换键,当switch=1时,时钟为12小时制;当switch=0时,小时为24小时制
图:
加了闹钟功能的电子钟原理图
图:
正常显示时分秒的仿真波形
图:
复位功能仿真波形
图:
秒表计时的仿真波形
从上面两图可以貌似正常显示时间与当秒表计算的效果是一样的,其实不然,正常显示时间是真正的时间显示,当秒表使用的计时只是采用了24时的计算方法,才导致其仿真效果一样,下载到硬件上实现时,其效果就明显不同了。
图:
倒计时的仿真波形
当倒计时用时,因为这个电子钟没有设定可以设置时间的程序,因此,只能在当前显示的时间进行倒计时,这点需要改进。
四、实验结论与心得
1、设置6进制、10进制的程序时,使我明白了不是所有程序都是可以直接运用,要符合自己的设计要求才行,如直接调用10进制异步复位和同步时钟时能的程序,则与时间60进制的个位向十位进位不一样,这时就需要改进了。
2、由于这个时钟的程序上设计存在一定的缺陷:
①仿真及下载实现时,均必须令倒计时功能键处在高电平,才可以让时钟正常显示时间。
②没有独立正常显示时钟的模块,即复位键有效时,正常显示的时间也为零,不符合实际应用。
五、实验评价(教师)
1.实验步骤正确,完成了本实验的全部内容。
很好( ) 一般( ) 否( )
2.实验数据全面,调试步骤准确,结果正确。
很好( ) 一般( ) 否( )
3.实验报告格式规范,图表清晰。
很好( ) 一般( ) 否( )
教师签名
王红航
批改时间
年月日