实验4 数字频率计

news/2024/12/22 14:05:53/

实验目的:

1、使用铆孔U7输出一个脉冲,频率不定。

2、使用铆孔V7测量脉冲频率,并在数码管上显示。

实验内容及步骤:

  • 设计原理

测量频率的方法有很多,按照其工作原理分为无源测量法、比较法、示波器法和计数法等。计数法在实质上属于比较法,其中最常用的方法是电子计数器法。电子计数器是一种最常见、最基本的数字化测量仪器。

数字计数式频率计能直接计数单位时间内被测信号的脉冲数,然后以数字形式显示频率值。这种方法测量精确度高、快速,适合不同频率、不同精确度测频的需要。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。

由于数字电路的飞速发展和集成电路的普及,计数器的应用十分广泛。利用电子计数器测量频率具有精度高,显示醒目直观,测量迅速,以及便于实现测量过程自动化等一系列突出优点,所以该方法是目前最好的。

1.任务分析

数字频率计是采用数字电路制做成的能实现对周期性变化信号频率测量的仪器。频率计主要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号的频率值。其扩展功能可以测量信号的周期和脉冲宽度。通常说的,数字频率计是指电子计数式频率计。

被测输入信号:方波

测试频率范围:0HZ-48MHZ

显示方式:用8个BCD七段数码管显示读数。采用对高为无意义补零显示。

3.模块设计

闸门产生、闸门电路工作原理:在测试电路中设置一个闸门产生电路,用于产生脉冲宽度为1s的闸门信号。该闸门信号控制闸门电路的导通与开断。让被测信号送入闸门电路,当1s闸门脉冲到来时闸门导通,被测信号通过闸门并到达后面的计数电路(计数电路用以计算被测输入信号的周期数),当1s闸门结束时,闸门再次关闭,此时计数器记录的周期个数为1s内被测信号的周期个数,即为被测信号的频率。测量频率的误差与闸门信号的精度直接相关,因此,为保证在1s内被测信号的周期量误差在10³量级,则要求闸门信号的精度为10 ⁴量级。例如,当被测信号为1kHz时,在1s的闸门脉冲期间计数器将计数1000次,由于闸门脉冲精度为10⁴,闸门信号的误差不大于0.1s,固由此造成的计数误差不会超过1,符合5*10³的误差要求。进一步分析可知,当被测信号频率增高时,在闸门脉冲精度不变的情况下,计数器误差的绝对值会增大,但是相对误差仍在5*10³范围内。

闸门信号产生、闸门电路实现方法

方法一:通常上述电路可以用分频器产生和多路选择器实现

方法二:采用相位累加法精确控制闸门

代码如下:

//
//8位数码管显示控制模块smg
//module smg(clk, d1, d2, d3, d4, d5, d6, d7, d8, sel, seg);
input clk;
output reg [7:0] sel;
output reg [7:0] seg;	//a~g,dp
input [3:0] d1, d2, d3, d4; //d[7]-dp, d[6:0]-ASCII
input [3:0] d5, d6, d7, d8; //d[7]-dp, d[6:0]-ASCII //扫描频率:50Hz
parameter update_interval = 48000000 / 400 - 1; 
reg [4:0] dat; 
reg [2:0] cursel;
integer selcnt;//扫描计数,选择位
always @(posedge clk)
beginselcnt <= selcnt + 1;if (selcnt == update_interval)beginselcnt <= 0;cursel <= cursel +  1'b1;end
end//切换扫描位选线和数据
always @(posedge clk)
begincase (cursel)3'b000: begin dat = d1; sel = ~8'b00000001; end3'b001: begin dat = d2; sel = ~8'b00000010;end3'b010: begin dat = d3; sel = ~8'b00000100; end3'b011: begin dat = d4; sel = ~8'b00001000; end3'b100: begin dat = d5; sel = ~8'b00010000; end3'b101: begin dat = d6; sel = ~8'b00100000;end3'b110: begin dat = d7; sel = ~8'b01000000; end3'b111: begin dat = d8; sel = ~8'b10000000; endendcase
end//更新段码
always @(posedge clk)
beginseg[0] <= dat[4]; //dpcase (dat[3:0])4'h00 	: seg[7:1] <= ~7'b0000001;	//04'h01 	: seg[7:1] <= ~7'b1001111;	//14'h02 	: seg[7:1] <= ~7'b0010010;	//24'h03 	: seg[7:1] <= ~7'b0000110;	//34'h04 	: seg[7:1] <= ~7'b1001100;	//44'h05 	: seg[7:1] <= ~7'b0100100;	//54'h06 	: seg[7:1] <= ~7'b0100000;	//64'h07 	: seg[7:1] <= ~7'b0001111;	//74'h08 	: seg[7:1] <= ~7'b0000000;	//84'h09 	: seg[7:1] <= ~7'b0000100;	//9 4'h0a 	: seg[7:1] <= ~7'b0001000;	//a 4'h0b 	: seg[7:1] <= ~7'b1100000;	//b 4'h0c 	: seg[7:1] <= ~7'b1110010;	//c 4'h0d 	: seg[7:1] <= ~7'b1000010;	//d 4'h0e 	: seg[7:1] <= ~7'b0110000;	//e 4'h0f 	: seg[7:1] <= ~7'b0111000;	//f default  : seg[7:1] <= ~7'b0110000; 	//E-rrorendcase
endendmodule
module freqmeasure(output  P99,//输出脉冲	input  P100,//测量脉冲	output  [7:0] sel,output  [7:0] seg,	//a~g,dpinput clkin//时钟);//
//
//锁相环模块
//
//
wire clk;
pll4 pll4_inst0(.inclk0(clkin),//12Mhz.c0(clk)//48Mhz
);reg [31:0]	count;
reg clk_1s;
//1S定时时钟产生
always @(posedge clk ) 
beginif(count<48_000_000-1)begincount <= count+1;clk_1s <= 0;endelse begincount <= 0;clk_1s <= 1;	end
end	reg [31:0] count_p100; 
always @(posedge P100 ) count_p100 <= count_p100+1;reg [31:0] count_p100_last; 
reg [31:0] freq_1s; 
always @(posedge clk )
if(clk_1s)
beginfreq_1s <= count_p100-count_p100_last;count_p100_last <= count_p100;
endreg [31:0] phase;
always @(posedge clk )
phase <= phase + 123456789;assign P99 = phase[31]; //freq=48000000*123456789/2^32//
//
//数码管模块
//
//
smg smg_inst
(.clk(clk) ,	// input  clkin.d1(d1) ,	// input [4:0] d1.d2(d2) ,	// input [4:0] d2.d3(d3) ,	// input [4:0] d2.d4(d4) ,	// input [4:0] d2.d5(d5) ,	// input [4:0] d2.d6(d6) ,	// input [4:0] d2.d7(d7) ,	// input [4:0] d2.d8(d8) ,	// input [4:0] d2.sel(sel) ,	// output [7:0] sel.seg(seg) 	// output [7:0] seg
);reg [3:0] d1, d2 ; //d[4]-dp, d[3:0]  reg [3:0] d3, d4 ; //d[4]-dp, d[3:0]  reg [3:0] d5, d6 ; //d[4]-dp, d[3:0]  reg [3:0] d7, d8 ; //d[4]-dp, d[3:0]  
reg [7:0]status;reg [31:0]s,s1,div;always @(posedge clk)
begins1<=freq_1s/div;s<=s1%10;status <= status+1;
case(status[7:4])
0:div<=10000000;
1:d1	<= s;2:div<=1000000;
3:d2	<= s;4:div<=100000;
5:d3	<= s;6:div<=10000;
7:d4	<= s;8:div<=1000;
9:d5	<= s;10:div<=100;
11:d6	<= s;12:div<=10;
13:d7	<= s;14:div<=1;
15:d8	<= s;endcase
end 			
endmodule

module freqmeasure(

output  P99,//输出脉冲

input  P100,//测量脉冲

   output  [7:0] sel,

output  [7:0] seg, //a~g,dp

input clkin//时钟

);

//

//

//锁相环模块

//

//

wire clk;

pll4 pll4_inst0(

.inclk0(clkin),//12Mhz

.c0(clk)//48Mhz

);


http://www.ppmy.cn/news/1434556.html

相关文章

HOT100与剑指Offer

文章目录 前言一、70. 爬楼梯&#xff08;HOT100&#xff09;二、118. 杨辉三角&#xff08;HOT100&#xff09;总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划刷完hot100和剑指Offer的刷题计划&#xff0c;加油&#xff01; 根据要求&#xff0c;每…

椭圆曲线密码学(ECC)基本介绍和总结

背景 ECC英文全称"Elliptic Curve Cryptography"&#xff0c;其背后的密码学原理或者说安全性&#xff0c;是基于椭圆曲线离散对数问题&#xff08;Elliptic Curve Discrete Logarithm Problem&#xff0c;ECDLP&#xff09;。ECC密码学被普遍认为是RSA密码系统的接…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描&#xff0c;Spring 会自动从扫描指定的包及其子包下的所有类&#xff0c;并根据类上的特定注解将该类装配到容器中&#xff0c;而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

001 redis高并发减库存

文章目录 释放锁加lua脚本String lockValue&#xff08;唯一标识符作为锁的值&#xff09;lua脚本无String lockValue&#xff08;唯一标识符作为锁的值&#xff09;无Lua脚本加锁的过期时间防死锁无lockValue代码 lockValue加了lockValue无lua脚本代码加了lockValue加了lua脚本…

工厂方法模式设计实验

【实验内容】 楚锋软件公司欲开发一个系统运行日志记录器&#xff08;Logger&#xff09;。该记录器可以通过多种途径保存系统的运行日志&#xff1a;例如通过文件记录或数据库记录&#xff0c;用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时&#…

【ZZULIOJ】1078: a+b(多实例测试1)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 计算AB 输入 输入第1行为一个整数n(1≤n≤10)&#xff0c;代表测试的组数。 下面有n组测试数据&#xff0c;每组1行&#xff0c;为2个整数&#xff0c;为A, B。 输出 对每行输入&#xff…

【Java】文件操作(一)

文章目录 ✍一、文件的基本认识1.文件是什么&#xff1f;2.文本文件和二进制文件3.文件权限4.相对路径和绝对路径1.1绝对路径1.2相对路径 ✍二、文件的基本操作1.FIle的属性2.File的构造方法3.File类的方法3.1File类的获取操作3.2File类的判断操作3.3文件创建和删除3.4其他的常…

SQL超详细解析

目录 SQL通用语法 SQL分类 DDL-数据库定义语言 1、DDL-数据库操作-查询 查询所有数据库 查询当前数据库 2、DDL-数据库操作-创建 创建数据库 3、DDL-数据库操作-删除 4、DDL-数据库操作-使用 5、DDL-表操作-查询&#xff1a; 查看当前数据库的所有表名称 查询当前表…