数字频率计设计.docx
- 文档编号:25759900
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:23
- 大小:471.91KB
数字频率计设计.docx
《数字频率计设计.docx》由会员分享,可在线阅读,更多相关《数字频率计设计.docx(23页珍藏版)》请在冰豆网上搜索。
数字频率计设计
学号XX
EDA技术及应用
设计说明书
数字频率计设计
起止日期:
2012年12月31日至2013年1月4日
学生姓名
XX
班级
XX
成绩
指导教师(签字)
计算机与信息工程学院
2013年1月4日
目录
第一章设计任务及要求1
1.1设计任务1
1.2设计要求1
1.2.1整体设计要求1
1.2.2测试要求1
第二章设计思路2
2.1数字频率计的介绍2
2.2设计原理2
2.2.1频率测量的基本原理2
2.2.2数字测频计整体方框图2
第三章模块介绍4
3.1闸门产生模块4
3.1.1闸门模块介绍4
3.1.2闸门模块verilog语言程序描述及仿真4
3.2计数模块5
3.2.1计数模块介绍5
3.2.2计数模块verilog语言程序描述及仿真5
3.3锁存器模块6
3.3.1锁存器模块介绍6
3.3.2锁存器模块verilog语言程序描述及仿真6
3.4译码模块7
3.4.1译码模块介绍7
3.4.2译码模块verilog语言程序描述及仿真7
3.5扫描显示模块8
3.5.1扫描显示模块介绍8
3.5.2扫描显示模块verilog语言程序描述及仿真9
第四章数字频率计的实现10
4.1数字频率计的verilog语言程序描述10
4.2设计与调试中遇到的问题与解决方法16
4.2.1设计中遇到的问题与解决方法16
4.2.2调试中遇到的问题与解决方法16
第五章设计总结17
第六章参考文献18
第一章设计任务及要求
1.1设计任务
采用测频法设计一个数字显示的数字频率计,被测试的频率可由基准频率分频得到。
其中应利用硬件描述语言Verilog、EDA软件QuartusⅡ和硬件平台Cyclone/CycloneⅡFPGA进行电路系统的设计。
1.2设计要求
1.2.1整体设计要求
(1)要求独立完成设计任务。
(2)课程设计说明书封面格式要求见《天津城市建设学院课程设计教学工作规范》附表1
(3)课程设计的说明书要求简洁、通顺,计算正确,图纸表达内容完整、清楚、规范。
(4)测试要求:
根据题目的特点,采用相应的时序仿真或者在实验系统上观察结果。
(5)课设说明书要求:
1)说明题目的设计原理和思路、采用方法及设计流程。
2)系统框图、VHDL语言设计清单或原理图。
3)对各子模块的功能以及各子模块之间的关系作较详细的描述。
4)详细说明调试方法和调试过程。
5)说明测试结果:
仿真时序图和结果显示图。
并对其进行说明和分析。
1.2.2测试要求
(1)可预置闸门时间/0.1/1s/10s。
(2)频率在数码管上显示。
(3)测量范围1Hz----999999Hz。
第二章设计思路
2.1数字频率计的介绍
数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。
本设计用硬件描述语言Verilog描述程序,在实验箱上实现数字频率计测频系统,要求能够在数码管上显示被测信号的频率。
采用Verilog编程设计实现的数字频率计,除被测信号bclk、时钟信号clk、键输入复位信号reset和数码管显示部分以外,其余全部在一片FPGA芯片上实现,整个系统最突出的优点就是系统非常精简,而且可以根据设计要求灵活更改程序,重新编译与下载,实现新的功能,设计灵活多变。
2.2设计原理
2.2.1频率测量的基本原理
频率测量的基本原理:
计算每秒钟内待测信号的脉冲个数,可根据这一定义采用如图2-1所示的算法。
图2-1频率算法示意图
用时钟信号clk产生脉冲宽度为1s的闸门信号cl,让被测信号送入闸门电路,当1s闸门脉冲到来时闸门导通,被测信号通过闸门并进入计数模块(计数模块是计算被测输入信号1s钟内脉冲的个数),当1s闸门结束时,闸门再次关闭,此时计数器记录的数据为1s内被测信号的脉冲个数,即为被测信号的频率。
2.2.2数字测频计整体方框图
测频计的整体方框图如图2-2所示。
图2-2测频计设计总体框图
其中若要要计算每秒钟内待测信号的脉冲个数,则要求:
1)电路产生一个1秒的时间闸门信号cl,在这1秒钟内启动计数器对被测信号bclk进行计数;
2)1秒结束时将计数器所计的脉冲个数的状态值送入锁存器REG24B锁存;
3)在计数值锁存完成后还应对计数器清零,以待下1秒钟开始新的一轮计数;
4)锁存到锁存器中的数据则输出译码模块进行七段译码扫描显示。
第三章模块介绍
3.1闸门产生模块
3.1.1闸门模块介绍
闸门信号cl由时钟信号clk(选定频率为1KHZ)产生,当cl为高电平时,对输入信号脉冲计数,当cl为低电平时,将计数所得数据data1输入到锁存器。
若按程序3-1设计则闸门信号高电平时间为:
低电平时间为:
从而实现1s的闸门信号。
3.1.2闸门模块verilog语言程序描述及仿真
闸门产生模块verilog语言程序描述如下:
modulezhamen(clk,reset,cl);
inputclk,reset;
outputcl;
regcl;
reg[9:
0]counter;
always@(posedgeclk)
if(reset==1'b0)
begin
counter<=10'b0000000000;
cl<=1'b0;
end
elseif(counter<=10'b0000100000)
begin
counter<=counter+1;
cl<=1'b0;
end
else
begin
counter<=counter+1;
cl<=1'b1;
end
endmodul
闸门模块的仿真图如图3-1所示。
图3-1闸门模块的仿真图
3.2计数模块
3.2.1计数模块介绍
由程序3-2可知在闸门信号cl为低电平或复位信号为低电平时计数数据data1清零,当闸门信号cl为高电平且复位信号为高电平时被测信号来一个脉冲,计数数据data1加1,从而实现对被测信号1秒钟内脉冲个数的计算。
3.2.2计数模块verilog语言程序描述及仿真
计数模块verilog语言描述程序见下:
modulejishu(bclk,reset,cl,data1);
inputbclk,cl,reset;
output[23:
0]data1;
reg[23:
0]data1;
always@(posedgebclkornegedgereset)
if(reset==1'b0)
data1<={24{1'b0}};
elseif(cl==1'b0)
data1<={24{1'b0}};
elseif(cl==1'b1)
data1<=data1+1;
endmodule
计数模块的仿真图如图3-2所示。
图3-2计数模块的仿真图
3.3锁存器模块
3.3.1锁存器模块介绍
由程序3-2可知在闸门信号cl下降沿来临或复位信号为低电平时计将24位0赋给输出data,当闸门信号cl下降沿来临且复位信号为高电平时,将计数数据data1赋给输出data,从而实现对计数数据data1的锁存,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
3.3.2锁存器模块verilog语言程序描述及仿真
锁存器模块verilog语言程序描述如下:
modulesuocunqi(cl,reset,data,data1);
inputcl,reset;
input[23:
0]data1;
output[23:
0]data;
reg[23:
0]data;
always@(negedgeclornegedgereset)
if(reset==1'b0)
data<={24{1'b0}};
else
data<=data1;
endmodule
锁存器的仿真图如图3-3所示。
图3-3锁存器模块仿真图
3.4译码模块
3.4.1译码模块介绍
由程序可知此为一个4-16线译码器,输入信号为A[3:
0],输出信号为低电平有效,而发光二极管为共阳极接法,故经译码器的处理输出后数码管可显示相应的数值。
3.4.2译码模块verilog语言程序描述及仿真
译码器模块verilog语言程序描如下:
moduleshumaxianshi(A,LED7S);
input[3:
0]A;
output[6:
0]LED7S;
reg[6:
0]LED7S;
always@(A)
begin
case(A)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
endmodule
译码模块的仿真图如图3-4所示。
图3-4译码模块的仿真图
3.5扫描显示模块
3.5.1扫描显示模块介绍
由程序可知当复位信号为低电平时,将0赋给输出信号sel,当时钟信号上升沿到来且复位信号为高电平时,输出信号sel加1,而不同的sel值选择不同的数码管,数码管显示选择随扫描频率clk循环变化,当时钟信号频率很高时,肉眼看不出闪烁,则可以清楚的看到数码管上显示的数据。
3.5.2扫描显示模块verilog语言程序描述及仿真
扫描显示模块verilog语言程序描述如下:
modulesaomiaoxuanze(clk,reset,sel);
inputclk,reset;
output[2:
0]sel;
reg[2:
0]sel;
always@(posedgeclkornegedgereset)
if(reset==1'b0)
sel<=3'b000;
elseif(sel==3'b101)
sel<=3'b000;
else
sel<=sel+3'b001;
endmodule
扫描显示模块的仿真图如图3-5所示。
图3-5扫描显示模块的仿真图
第四章数字频率计的实现
4.1数字频率计的verilog语言程序描述
数字频率计的verilog语言程序描述见程序4-1
moduletest(s,bclk,clk,reset,sel,LED7S);//实现bclk频率的测量
inputbclk;//被测信号输入端
input[1:
0]s;
inputclk,reset;//数码管扫描周期,设定为1kHZ/系统清零端,且为低电平复位
output[6:
0]LED7S;//七段码管显示输出
output[2:
0]sel;//七段码管扫描驱动
reg[2:
0]sel;
reg[6:
0]LED7S;
reg[9:
0]counter;//计数,实现1秒的闸门控制和1毫秒的数据输出
reg[6:
0]counter0;
reg[13:
0]counter1;
reg[23:
0]data1,data;//计数数据/显示数据
regcl;
wire[3:
0]din0,din1,din2,din3,din4,din5;
always@(posedgeclk)
case(s)
2'b00:
begin
if(reset==1'b0)
begin
counter<=10'b0000000000;
cl<=1'b0;
end
elseif(counter<10'b0001000000)
begin
counter<=counter+1;
cl<=1'b0;
end
else
begin
counter<=counter+1;
cl<=1'b1;
end
end
2'b01:
begin
if(reset==1'b0)
begin
counter0<=7'b0000000;
cl<=1'b0;
end
elseif(counter0<7'b0010000)
begin
counter0<=counter0+1;
cl<=1'b0;
end
else
begin
counter0<=counter0+1;
cl<=1'b1;
end
end
2'b10:
begin
if(reset==1'b0)
begin
counter1<=14'b00000000000000;
cl<=1'b0;
end
elseif(counter1<14'b01000000000000)
begin
counter1<=counter1+1;
cl<=1'b0;
end
else
begin
counter1<=counter1+1;
cl<=1'b1;
end
end
endcase
always@(posedgeclkornegedgereset)
if(reset==1'b0)
sel<=3'b000;
elseif(sel==3'b101)
sel<=3'b000;
else
sel<=sel+3'b001;
always@(posedgebclkornegedgereset)
if(reset==1'b0)
data1<={24{1'b0}};
elseif(cl==1'b0)
data1<={24{1'b0}};
elseif(cl==1'b1)
data1<=data1+1;
always@(negedgeclornegedgereset)
if(reset==1'b0)
data<={24{1'b0}};
else
data<=data1;
always@(posedgeclk)
begin
if(sel==3'b000)
begin
case(din0)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
elseif(sel==3'b001)
begin
case(din1)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
elseif(sel==3'b010)
begin
case(din2)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
elseif(sel==3'b011)
begin
case(din3)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
elseif(sel==3'b100)
begin
case(din4)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
elseif(sel==3'b101)
begin
case(din5)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
default:
LED7S<=7'b0111111;
endcase
end
end
assigndin0={data[3],data[2],data[1],data[0]};
assigndin1={data[7],data[6],data[5],data[4]};
assigndin2={data[11],data[10],data[9],data[8]};
assigndin3={data[15],data[14],data[13],data[12]};
assigndin4={data[19],data[18],data[17],data[16]};
assigndin5={data[23],data[22],data[21],data[20]};
endmodule
其中引脚分配如图4-1。
图4-1引脚分配图
4.2设计与调试中遇到的问题与解决方法
4.2.1设计中遇到的问题与解决方法
(1)问题:
如何实现1s的闸门信号?
解决方法:
利用将时钟信号循环计数的方法实现,当计数数据小于n时输出cl=0,否则cl=1。
也可以利用分频的方法解决问题,但计数的方法可以灵活改变闸门信号的占空比和脉冲宽度。
(2)问题:
如何使输出数据在数码管上显示?
解决方法:
用4-16译码器和数码管实现输出数据在数码管上的静止显示。
(3)问题:
如何使输出数据data1[23:
0]在6个数码管上显示相应的数据?
解决方法:
使data1[23:
20],…data1[7:
4],data1[3:
0]6组数据译码后在6个数码管上分别显示,再用时钟信号选择不同数码管使数据data1[23:
0]在6个数码管上扫描显示。
(4)问题:
如何使数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁?
解决方法:
加入锁存器,只有当闸门信号cl的下降沿来临时将计数数据data1赋给data扫描显示。
4.2.2调试中遇到的问题与解决方法
(1)问题:
如何选择时钟信号?
解决方法:
首先时钟信号频率应大于100HZ,使人眼看不出数码管上数据的闪烁,再者根据选择的时钟信号修改程序实现1s的闸门信号cl。
(2)问题:
为何有的被测信号显示数据为零?
解决方法:
分析知这是由于被测信号太低,小于1HZ。
在被测信号频率很低的时候,那么此数字测频计误差很大,为了克服测量低频信号时的不足,可以使用测周期的方法,再经过相应运算得到频率。
第五章设计总结
本频率计满足实验要求,测量频率范围是1-999999HZ,采用直接测频法对被测信号频率进行测量,但也存在不足的地方,最好的设计方法是用测周法与直接测频法相结合的方式,在频率低于1000HZ采用测周法,高于1000HZ时采用直接测频法,这样的好
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字频率计 设计