软件:Quartus
语言:Verilog
代码功能:
设计3 数字频率计
1.设计一个能测量方波信号的频率的频率计。
2.测量的频率范围是0~99999Hz。
3.结果用十进制数显示。
教学提示:
1.脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为f=N/T,f为被测信号的频率,N为计数器所累计的脉冲个数,T为产生N个脉冲所需的时间。所以,在1秒时间内计数器所记录的结果,就是被测信号的频率。
2.被测频率信号取自实验箱晶体振荡器输出信号,加到主控门的输入端。
3.再取晶体振荡器的另一标准频率信号,经分频后产生各种时基脉冲:1ms、10ms、0.1s、1s等,时基信号的选择可以控制,即量程可以改变。
4.时基信号经控制电路产生闸门信号至主控门,只有在闸门信号采样期间内(时基信号的一个周期),输入信号才通过主控门。
5.f=N/T,改变时基信号的周期T,即可得到不同的测频范围。
6.当主控门关闭时,计数器停止计数,显示器显示记录结果,此时控制电路输出一个置零信号,将计数器和所有触发器复位,为新的一次采样做好准备。
7.改变量程时,小数点能自动移位。
1、工程文件
2、程序文件
3、程序编译
4、RTL图
5、testbench
6、仿真图
整体仿真图
闸门控制模块
频率计算模块
显示模块
部分代码展示:
//频率计算模块 module frequency_calculate( input clk_in,//输入基准时钟 input reset_p,//复位信号 input signal_in,//待测频率输入 input doors_open,//闸门信号 output [31:0]total_frequency//输出频率 ); reg signal_in_buf0=0; reg signal_in_buf1=0; wire signal_in_rise; always@(posedge clk_in) signal_in_buf0<=signal_in;//D触发器打拍 always@(posedge clk_in) signal_in_buf1<=signal_in_buf0;//D触发器打拍 assign signal_in_rise=signal_in_buf0 & ~signal_in_buf1;//输入待测频率信号上升沿 wire [31:0] CNT; //定义8位数 reg [3:0] bit0=4'd0; reg [3:0] bit1=4'd0; reg [3:0] bit2=4'd0; reg [3:0] bit3=4'd0; reg [3:0] bit4=4'd0; reg [3:0] bit5=4'd0; reg [3:0] bit6=4'd0; reg [3:0] bit7=4'd0; assign CNT={bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0}; always@(posedge clk_in) begin
1238