数字频率计课程设计实习报告.docx
《数字频率计课程设计实习报告.docx》由会员分享,可在线阅读,更多相关《数字频率计课程设计实习报告.docx(19页珍藏版)》请在冰豆网上搜索。
数字频率计课程设计实习报告
数字频率计
设计报告书
一、设计要求
设计一个4位十进制数字式频率计,最大测量范围为10MHz。
量程分
10kHz、100kHz、1MHz和10MHz四档(最大读数分别为
9.999kHz、99.99kHz、999.9kHz、9999.kHz).
量程自动转换规则如下:
(1)当读数大于9999时,频率计处于超量程状态,此时显示器发出溢出指示,下一次测量时,量程自动增大一档,小数点位置随量程变更自动移位。
(2)可用手动方式使量程在每次测量开始时处于最低档。
显示方式如下:
(3)采用记忆显示方式,即计数过程中不显示数据,待计数过程结束以后,显示计数结果,将此显示结果保持到下一次计数结束。
显示时间应不小于1s。
(4)送入信号应是符合CMOS电路要求的脉冲波,对于小信号模拟信号应有放大整形电路。
二、方案设计
<1>整体思路
所谓频率就是周期性信号在单位时间(1s)内变化的次数。
若在一定时间间隔T内测得周期性信号的重复变化次数为N,则频率可表示为f=N/T(Hz)。
被测信号fx经放大整形电路变成计数电路所要求的脉冲信号,其频率与被测信号fx的频率相同。
基准电路提供标准时间基准信号clk,其高电平持续时间t1=1s,当1s信号来到时,闸门电路开通,被测脉冲信号通过闸门电路,成为计数电路的计数脉冲CP,计数电路开始计数,直到ls信号
1
结束时闸门电路关闭,停止计数。
若在闸门时间1s内计数电路计得的脉冲个数为N,则被测信号频率f=NHz。
控制电路的作用有两个:
一是产生锁存脉冲CLK,使显示电路上的数字稳定;二是产生清“0”脉冲,使计数电路每次测量从零开始计数。
<2>时钟信号的选择
设计电路中时钟信号采用12M有源晶振产生,下面是12M有源晶振引脚图:
<3>整形电路的选择
整形电路中可以用运算放大器LM311组成电压选择器实现,以下是关于此芯片的资料:
引脚功能:
GROUND/GND接地
INPUT+
INPUT-
OUTPUT
BALANCE
正向输入端反向输入端输出端
平衡
BALANCE/STROBE平衡/选通
V+
V-
NC
电源正
电源负
空脚
LM311引脚图
2
由于LM311过于复杂且此次设计要求精度不高,整形电路可以改为如下电路:
R1
1.0k
D1
BAS81
D2
BAS81
这样产生稳定3.3V为幅值的信号送入EPM570中,对芯片起到保护作用。
<3>设计所用核心芯片资料及其原理
所用核心芯片为CPLD器件EPM570T100C5。
基本设计方法是借助集成开发软件平台quartusII6.0,用原理图、硬件描述语言(VerilogHDL)等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。
EPM570引脚图:
3
在QuartusII6.0中设定的引脚分布如下:
4
<4>计数译码原理图:
<5>分频选择器原理图:
5
时钟信号
待测信号
<6>数码管引脚图:
通过VerilogHDL语言设计程序,实现上述原理图功能,最终所测信号频率以四位共阴极数码管显示,单位为KHz。
6
三、调试
1、
2、
3、
4、
程序代码
按照分频计、计数器、锁存器、选择器、译码器模块分别进行编程调试、仿真;
建立工程,把五个模块连接,调试。
针对错误模块进行修改,重新建立工程、连接模块;
将程序下载到EMP570中,利用数电实验板以及数码管进行调试;
将各种器件焊接到万用板上,连接电源进行实际调试。
1.modulessss(b,base);
inputb;
outputregbase;
reg[23:
0]q;
always@(posedgeb)
if(q<5999999)
q<=q+1;
else
begin
base<=!
base;q<=0;
end
Endmodule
2
moduleFen6M(b,base);
7
inputb;
outputregbase;
reg[23:
0]q;
always@(posedgeb)
if(q<5999999)
q<=q+1;
else
begin
base<=!
base;q<=0;
end
Endmodule
3.
modulectrl(clk,Counter_EN,Latch_EN,Counter_Clr);
inputclk;
outputCounter_EN,Latch_EN,Counter_Clr;
regwire_1=0,wire_2=0;
always@(posedgeclk)
begin
wire_1<=!
wire_1;
end
8
always@(negedgeclk)
begin
wire_2<=wire_1;
end
assignCounter_EN=wire_1;
assignLatch_EN=(!
Counter_EN)&wire_2;
assignCounter_Clr=(!
Counter_EN)&(!
Latch_EN)&(!
wire_2);
endmodule
4.
modulecounter(clk,clr,en,q,ql);
inputclk,en,clr;
outputreg[3:
0]q;
outputql;
assignql=en&(q==9);
always@(posedgeclk,posedgeclr)
if(clr)q<=0;
else
if(en)
9
begin
if(q<9)q<=q+1;
elseq<=0;
end
endmodule
5.
modulelatcher(d1,d2,en,clk,q1,q2);
input[3:
0]d1,d2;
inputclk,en;
outputreg[3:
0]q1,q2;
always@(posedgeclk)
if(~en)
begin
q1<=d1;
q2<=d2;
end
endmodule
10
6.
moduleover_select(IN,SELECT,OUT);
input[3:
0]IN;
inputSELECT;
outputreg[3:
0]OUT;
always@(SELECT)
case(SELECT)
0:
OUT<=IN;
1:
OUT<=10;
endcase
endmodule
7.
moduledecode4to7(incode,outcode);
input[3:
0]incode;
output[6:
0]outcode;
reg[6:
0]outcode;
11
always@(incode)
begin
case(incode)
4'b0000:
outcode=7'b1111110;
4'b0001:
outcode=7'b0110000;
4'b0010:
outcode=7'b1101101;
4'b0011:
outcode=7'b1111001;
4'b0100:
outcode=7'b0110011;
4'b0101:
outcode=7'b1011011;
4'b0110:
outcode=7'b1011111;
4'b0111:
outcode=7'b1110000;
4'b1000:
outcode=7'b1111111;
4'b1001:
outcode=7'b1110011;
ddddddd:
outcode=7'b1000111;
eeeeeee
end
Endmodule
8.
moduleHalf_freq(CLK_in,CLK_out);
inputCLK_in;
outputCLK_out;
12
regCLK_out;
always@(posedgeCLK_in)
begin
CLK_out=~CLK_out;
end
Endmodule
9.
modulefenpin(clk,fout10,fout100,fout1000);
inputclk;
outputfout10,fout100,fout1000;
reg[3:
0]q1,q2,q3;
assignfout10=(q1==9);
assignfout100=fout10&(q2==9);
assignfout1000=fout100&(q3==9);
always@(posedgeclk)
if(q1<9)q1<=q1+1;
elseq1<=0;
always@(negedgefout10)
if(q2<9)q2<=q2+1;
elseq2<=0;
always@(negedgefout100)
if(q3<9)q3<=q3+1;
13
elseq3<=0;
Endmodule
10.
moduledecode2to4(incode,outcode);
input[1:
0]incode;
outputreg[3:
0]outcode;
integeri;
always@(incode)
begin
case(incode)
2'b00:
outcode=4'b1000;
2'b01:
outcode=4'b0100;
2'b10:
outcode=4'b0010;
2'b11:
outcode=4'b0001;
endcase
end
endmodule
11.
14
moduledecode4to7(incode,outcode,in);
input[3:
0]incode;
inputin;
output[7:
0]outcode;
reg[7:
0]outcode;
always@(incode)
begin
case(incode)
4'b0000:
outcode[6:
0]=7'b1111110;
4'b0001:
outcode[6:
0]=7'b0110000;
4'b0010:
outcode[6:
0]=7'b1101101;
4'b0011:
outcode[6:
0]=7'b1111001;
4'b0100:
outcode[6:
0]=7'b0110011;
4'b0101:
outcode[6:
0]=7'b1011011;
4'b0110:
outcode[6:
0]=7'b1011111;
4'b0111:
outcode[6:
0]=7'b1110000;
4'b1000:
outcode[6:
0]=7'b1111111;
4'b1001:
outcode[6:
0]=7'b1110011;
ddddddd:
outcode[6:
0]=7'b1000111;
eeeeeee
if(in==1)outcode[7]=1'b1;
elseoutcode[7]=1'b0;
end
endmodule
15
12.
modulemux4_1(a,b,c,d,s,out);
inputa,b,c,d;
input[1:
0]s;
outputregout;
always@(s)
case(s)
2'b00:
out=a;
2'b01:
out=b;
2'b10:
out=c;
2'b11:
out=d;
endcase
endmodule
13.
16
modulerenge_counter(clk,clr,q,ql);
inputclk,clr;
outputreg[2:
0]q;
outputql;
assignql=(q==4);
always@(posedgeclk,posedgeclr)if(clr)
q<=0;
elseif(q<4)
q<=q+1;
elseq<=0;
endmodule
17
总体电路图
18
四、测试数据与实验结果
组号
准确数据
实验数据
1
2
3
4
5
6
7
五、心得体会
我们小组的实习题目是数字式频率计。
该项目主要是通过verilog语言编程后进行焊接完成。
我们在十七十八号两天对verilogHDL语言设计进行了学习与巩固,从十九号正式开始数字式频率计的设计,二十一号编程验收通过,开始处理外部信号的测试,即稳压工作。
之后进行PCB图的制作。
从二十四号开始焊接电路板,于二十七号完成所有工作。
在刚开始编程的时候,对于verilogHDL语言这种新知识要花一段时间来消化,所以在编写频率计的代码时遇到很多问题,但是经过我们查找资料和激烈的讨论后终于解决了问题。
通过自我学习以及其他方式我们了解到了计数器分频器译码器等模块的编译方式,学到了很多Verilog的有用的知识点。
从二十四号开始的焊接由于之前电子工艺实习时焊接过几百个点,所以最后的焊接工作还比较顺利。
同时经过这几天的焊接,在某种程度上又锻炼了我们的动手能力。
通过这十几天的学习与实践,我们完成了数字频率计的设计以及制作,我们才发现自己只学书本上的知识是远远不够的,还是要靠动手来提高自己的能力。
这次实习一方面提高了自己的学习与思考的能力,另一方面在动手能力方面也有了较大的提高,所以这次的电子工艺实习对我们来说是收获颇多的。
当然,我们在这一方面还有许多的不足之处,我们会在今后的学习生涯中继续努力争取继续提高。
19