数字电路课程设计实习报告.docx
《数字电路课程设计实习报告.docx》由会员分享,可在线阅读,更多相关《数字电路课程设计实习报告.docx(20页珍藏版)》请在冰豆网上搜索。
数字电路课程设计实习报告
数字电路课程设计
题目:
利用CPLD设计可调时数字钟
学院
专业
学号
姓名
教师
201
利用CPLD设计可调时数字钟
摘要
本数字钟采用动态显示数字的方法,输入512Hz的时钟信号,驱动显示位选信号产生,位选信号以85Hz从0到6不断地扫描数码管。
输入2Hz信号通过2分频变成秒信号,秒信号驱动时钟计数模块计数,完成时钟计数的功能,在位选信号扫描到相应的数码管时,计数器将计数的结果显示在数码管上,由于视觉残留的关系,人眼会感觉到数字一直在显示,从而实现计时功能。
在手动调节时钟时,有三个按键,一个实现清零,一个作为分调整按键,最后一个作为时调整按键。
调整时间键在对应时或者分数码管后通过按压按键产生脉冲使数码管实现加一的运算,从而改变时间,将1Hz闪烁的小数点接在秒信号上即可。
关键词:
CPLD计数器分频器三选择器七段译码器
一、总体设计方案........................................1
1.1设计要求...............................................1
1.2设计原理...............................................1
1.2.1电源电路............................................1
1.2.2振荡电路与分频电路.....................................1
1.2.3显示电路...............................................2
1.2.4JTAG下载接口...........................................2
1.2.5CPLD电路原理图.........................................3
二、各模块说明............................................4
2.1设计思路及步骤............................................4
2.2总体框图.................................................4
2.3各模块说明................................................4
2.3.17段译码器.............................................4
2.3.2消抖模块..............................................5
2.3.3与门模块...............................................5
2.3.4数据选择器模块 ........................................6
2.3.5D触发器模块 ..........................................6
2.3.6非门模块 ..............................................7
2.3.7或门模块 ..............................................7
2.3.8十进制计数模块 ........................................7
2.3.9位选模块 ..............................................8
2.3.10秒计数模块 ...........................................8
2.3.11六进制模块 ...........................................10
2.3.12分计数模块 ...........................................11
2.3.13分频器模块 ...........................................12
2.3.14顶层总模块 ...........................................13
2.4数字钟电路总图..........................................12
三、课程总结.............................................16
3.1遇到的问题及其解决办法...................................16
3.2收获与体会...............................................16
参考文献....................................................16
一总体设计方案
1.1设计要求
1、以数字形式显示时、分、秒的时间;
2、要求手动校时、校分;
3、时与分显示之间的小数点常亮;
4、分与秒显示之间的小数点以1Hz频率闪烁;
5、各单元模块设计即可采用原理图方式也可以用Verilog程序进行设计。
1.2设计原理
1.2.1电源电路
如图1.1示为实验所需的电源电路。
图1-1电源电路图
1.2.2振荡电路与分频电路
晶体振荡器给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.
分频电路采用T触发器对其分频,每经过一个T触发器对其二分频,所以各点的分频倍数分别为:
QD:
24QE:
25QF:
26QG:
27QH:
28QI:
292QJ:
210QL:
212QM:
213QN:
214;此处采用的是32768Hz的晶振,故分频之后QF:
512Hz、QI:
64Hz、QN:
2Hz。
图1-2振荡电路与分频电路图
1.2.3显示电路
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流.
图1-3显示电路图
数码管是共阴数码显示管,当其控制端为“0”时,数码显示管显示。
显示模块输入时钟频率为512Hz,显示刷新频率约为85Hz。
如图1.3示。
1.2.4JTAG接口电路
图1-4JTAG接口电路图
1.2.5CPLD电路原理图
此原理图1.4的MODE和ADD分别控制校正位和其校正位进行加一校正。
MODE共有七个状态分别对应六个数码管的校正和正常计数。
图1-5CPLD电路图
二各模块说明
2.1设计思路及步骤
1、按原理图和元件插件图完成电路的焊接;
2、拟定数字钟的组成框图,划分模块;
3、编写各模块程序;
4、下载程序。
2.2总体框图
图2-1总体程序框图
2.3各模块说明
2.3.17段译码器模块
moduleyima(datain,dataout);
input[3:
0]datain;
output[6:
0]dataout;
reg[6:
0]dataout;
always@(datain)
begin
casex(datain)
4'b0000:
dataout<=7'b0111111;
4'b0001:
dataout<=7'b0000110;
4'b0010:
dataout<=7'b1011011;
4'b0011:
dataout<=7'b1001111;
4'b0100:
dataout<=7'b1100110;
4'b0101:
dataout<=7'b1101101;
4'b0110:
dataout<=7'b1111101;
4'b0111:
dataout<=7'b0000111;
4'b1000:
dataout<=7'b1111111;
4'b1001:
dataout<=7'b1101111;
default:
dataout<=7'bx;
endcase
end
endmodule
2.3.2消抖模块
modulexiaodou(clk,key_in,key_out);
inputclk,key_in;
outputkey_out;
Dchufau1(.datain(key_in),.clk(clk),.dataout(c0));
Dchufau4(.datain(c2),.clk(clk),.dataout(key_out));
yumenu3(.datain1(c1),.datain2(key_in),.dataout(c2));
feimenu2(.datain(c0),.dataout(c1));
endmodule
2.3.3与门模块
moduleyumen(datain1,datain2,dataout);
inputdatain1,datain2;
outputdataout;
regdataout;
always@(datain1,datain2)
begin
if(datain1&&datain2)
dataout=1;
else
dataout=0;
end
endmodule
2.3.4数据选择器模块
modulesel61(datain1,datain2,datain3,datain4,datain5,datain6,sel,dataout);
input[3:
0]datain1,datain3,datain5;
input[2:
0]datain2,datain4,sel;
input[1:
0]datain6;
output[3:
0]dataout;
reg[3:
0]dataout;
always@(datain1,datain2,datain3,datain4,datain5,datain6,sel)
begin
case(sel)
3'b000:
dataout=datain1;
3'b001:
dataout=datain2;
3'b010:
dataout=datain3;
3'b011:
dataout=datain4;
3'b100:
dataout=datain5;
3'b101:
dataout=datain6;
default:
dataout=dataout;
endcase
end
endmodule
2.3.5D触发器模块
moduleDchufa(datain,clk,dataout);
inputdatain,clk;
outputdataout;
regdataout;
always@(posedgeclk)
begin
dataout<=datain;
end
endmodule
2.3.6非门模块
modulefeimen(datain,dataout);
inputdatain;
outputdataout;
regdataout;
always@(datain)
begin
dataout=~datain;
end
endmodule
2.3.7或门模块
modulehuo(datain1,datain2,dataout);
inputdatain1,datain2;
outputdataout;
assigndataout=datain1||datain2;
endmodule
2.3.8十进制计数模块
moduleshijinzhi(clk,res,HD,LD);
inputclk,res;
output[1:
0]HD;
output[3:
0]LD;
reg[1:
0]HD;
reg[3:
0]LD;
always@(posedgeclkorposedgeres)
begin
if(res)
begin
LD<=4'b0;
HD<=2'b0;
end
elseif((LD==4'b1001)&&(HD==2'b0))
begin
LD<=4'b0;
HD<=2'b1;
end
elseif((LD==4'b1001)&&(HD==2'b01))
begin
LD<=4'b0;
HD<=2'b10;
end
elseif((LD==4'b0011)&&(HD==2'b10))
begin
LD<=4'b0;
HD<=2'b0;
end
else
LD<=LD+1;
end
endmodule
2.3.9位选模块
modulewela(datain,dataout);
input[2:
0]datain;
output[5:
0]dataout;
reg[5:
0]dataout;
always@(datain)
begin
case(datain)
3'b000:
dataout=6'b111110;
3'b001:
dataout=6'b111101;
3'b010:
dataout=6'b111011;
3'b011:
dataout=6'b110111;
3'b100:
dataout=6'b101111;
3'b101:
dataout=6'b011111;
default:
dataout=dataout;
endcase
end
endmodule
2.3.10秒计数模块
moduleseccount(clk,res,cout,g,s);
inputclk,res;
output[3:
0]g;
output[2:
0]s;
outputcout;
reg[3:
0]g;
reg[2:
0]s;
regcout;
always@(posedgeclkorposedgeres)
begin
if(res)
begin
g<=4'b0;
s<=2'b0;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd5))
begin
g<=4'b0;
s<=3'b0;
cout<=1;
end
elseif((g==4'b1001)&&(s==3'b0))
begin
g<=4'b0;
s<=3'b1;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'b1))
begin
g<=4'b0;
s<=3'd2;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd2))
begin
g<=4'b0;
s<=3'd3;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd3))
begin
g<=4'b0;
s<=3'd4;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd4))
begin
g<=4'b0;
s<=3'd5;
cout<=0;
end
elseif((g==4'b0)&&(s==3'd0))
begin
cout<=0;
g=g+1;
end
else
g=g+1;
end
endmodule
2.3.11六进制模块
moduleliujinzhi(clk,dataout);
inputclk;
output[2:
0]dataout;
reg[2:
0]dataout;
always@(posedgeclk)
begin
if(dataout==5)
dataout<=0;
else
dataout<=dataout+1;
end
endmodule
2.3.13分计数模块
modulemincount(clk,res,cout,g,s);
inputclk,res;
output[3:
0]g;
output[2:
0]s;
outputcout;
reg[3:
0]g;
reg[2:
0]s;
regcout;
always@(posedgeclkorposedgeres)
begin
if(res)
begin
g<=4'b0;
s<=2'b0;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd5))
begin
g<=4'b0;
s<=3'b0;
cout<=1;
end
elseif((g==4'b1001)&&(s==3'b0))
begin
g<=4'b0;
s<=3'b1;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'b1))
begin
g<=4'b0;
s<=3'd2;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd2))
begin
g<=4'b0;
s<=3'd3;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd3))
begin
g<=4'b0;
s<=3'd4;
cout<=0;
end
elseif((g==4'b1001)&&(s==3'd4))
begin
g<=4'b0;
s<=3'd5;
cout<=0;
end
elseif((g==4'b0)&&(s==3'd0))
begin
cout<=0;
g=g+1;
end
else
g=g+1;
end
endmodule
2.3.14分频器模块
modulefenpin(clk1,clk2);
inputclk1;
outputclk2;
regclk2;
always@(posedgeclk1)
begin
clk2=~clk2;
end
endmodule
2.3.15顶层总模块
moduleshizhong(key1,key2,key3,clk1,clk2,clk3,dataout1,dataout2,dataout3);
inputkey1,key2,key3,clk1,clk2,clk3;
output[6:
0]dataout1;
output[5:
0]dataout2;
outputdataout3;
wirec0,c1,c3,c5,c6,c7,c8;
wire[1:
0]c14;
wire[2:
0]c12,c4,c10;
wire[3:
0]c11,c15,c9,c13;
xiaodouu1(.clk(clk1),.key_in(key2),.key_out(c0));
xiaodouu2(.clk(clk1),.key_in(key3),.key_out(c1));
fenpinu3(.clk1(clk2),.clk2(c3));
liujinzhiu4(.clk(clk3),.dataout(c4));
huou5(.datain1(c0),.datain2(c5),.dataout(c6));
huou6(.datain1(c1),.datain2(c7),.dataout(c8));
seccountu7(.clk(c3),.res(key1),.cout(c7),.g(c9),.s(c10));
mincountu8(.clk(c8),.res(key1),.cout(c5),.g(c11),.s(c12));
shijinzhiu9(.clk(c6),.res(key1),.HD(c14),.LD(c13));
sel61u10(.datain1(c9),.datain2(c10),.datain3(c11),.datain4(c12),.datain5(c13),.datain6(c14),.sel(c4),.dataout(c15));
welau11(.datain(c4),.dataout(dataout2));
yimau12(.datain(c15),.dataout(dataout1));
huo5u13(.datain1(c4),.datain2(c3),.dataout(dataout3));
endmodule
2.4数字钟电路总图
数码管显示控制电路工作原理:
以512Hz的频率作为输入端时钟脉冲,用六进制计数器为三八译码器提供六个不同状态,分别控制六个数码管的状态,每个数码管的显示频率约为85Hz,可以充分的利用人眼的视觉残留现象实现数字的常显,观测到的结果为:
数码管常亮。
此电路中小数点的显示是用一个或门,通过1Hz频率来控制第三个数码管的小数点显示,再通过一个与非门来控制第五个数码管的小数点显示。
第五个数码管的小数点在整个脉冲阶段显示,而第三个数码管的小数点只有在低电平时显示,故观察到结果是第五个数码管常亮,而第三个数码管的小数点以1Hz的频率闪烁。
在手动调节时钟时,有三个按键,一个实现复位清零,一个作为调整时的按键,最后一个作为调整分的按键。
三课程总结
3.1遇到的问题及其解决办法
1.焊接之前,要认真阅读数字钟的相关资料,了解各个元器件的属性和掌握焊接板子的一些基本操作,便于操作时得心应手,也要仔细核对元器件是否正确,要保证使用正确的元件,以防焊接错误再去改到;
2.焊接的时候要注意元器件的引脚分配和属性值,另外,还有注意不要虚焊,如果不清楚是否虚焊了,需要用万用表进行测试;
3.程序方面,由于EPM3064ALC44-10芯片只有64个宏单元,编写程序时有可能导致所需的宏单元数超过提供的数量,经过分析在处理小数点的时候,直接把其作为与其它段显示一起定义成八位变量,这样就会增加芯片内存消耗,但实际要求中只用到两个小数点,所以把这个小数点单独进行操作处理,大大减少了宏单元的利用,这样才能编译成功。
3.2 收获与体会
通过这次做数字钟,首先,就是加深了对Verilog语言的模块化编程的认识,其次,是对编程中元件例化的方法的应用,各个程序相互独立的实现有了更深的了解,最后,通过顶层模块将所有子模块调用进来,这样使整个工程十分清晰,并且容易进行测试修改;
另一方面,在编程的过程中会出现很多问题,通过上网搜索、和同学一起探讨,发现问题并解决问题,我觉得这个过程才能学到很多超出知识本身的东西,对知识的学习和掌握需要理论与实践相结合,应该是学习致用的一个过程。
最重要的是要静下心来有耐心和恒心才可以把事做成,这是至关重要的。
参考文献
[1]《数字电路综合实习讲稿》河北大学电子信息工程学院编
[IBSN978-7-8114-309-3]夏宇闻《Verilog数字系统设计教程(第2版)》北京航空航天大学出版社2008.