|
数字频率计的基本原理(关于这部分的内容网上有很多,大家可以参考看看)
频率测量的方法常用的有测频法和测周法两种。
计数器模块
由于系统要求的精度是0.1HZ~100000000HZ,该十进制计数模块由十个一位十进制计数器组成,计数器的特殊之处是,有一个时钟使能输入端ENA,用于锁定计数值。当高电平是计数允许,低电平时计数禁止。
该测频的十位十进制频率计的计数模块,先通过Verilog语言编写一位十进制计数器,再将其原件例化后搭建一个十位十进制计数模块。
module CNT10(
clk,
rst,
en,
cq,
carry_out
);
input clk;
input rst;
input en;
output [3:0]cq;
output carry_out;
reg [3:0]cq;
reg carry_out;
always @(posedge clk)
begin
if(!rst)
begin
cq <=4'd0;
carry_out<=1'b0;
end
else begin
if(en==1'b1)
begin
if(cq==4'd9)
begin
cq<=4'd0;
carry_out<=1'b1;
end
else begin
cq<=cq+4'd1;
carry_out<=1'b0;
end
end
else begin
carry_out<=1'b0;
cq<=4'd0;
end
end
end
endmodule
数据锁存器
锁存模块由锁存器构成,主要功能是数据的稳定显示,不会由于周期行的清零信号而不断闪烁。在信号LOAD的上升沿后即被所存到寄存器的内部,并由锁存器的输出端输出,然后由实验板的7段译码器译成能在数码管上显示的相对应的数值。
module REG32B(
load,
din,
dout
);
input load;
input[39:0]din;
output[39:0]dout;
reg[39:0]dout;
always @(load or din)
begin
if(load==1'b1)
dout<=din;
end
endmodule
·系统总体设计
module FREQ(
fsin,
clk,
dout2
);
input fsin;
input clk;
output[39:0]dout2;
wire TSTEN;
wire CLR_CNT;
wire LOAD;
TESTCTL TESTCTL_u(
.CLK (clk),
.TSTEN (TSTEN),
.CLR_CNT (CLR_CNT),
.LOAD (LOAD)
);
wire[39:0]dout;
wire s1;
wire s2;
wire s3;
wire s4;
wire s5;
wire s6;
wire s7;
wire s8;
wire s9;
wire s10;
CNT10 CNT10_u1(
.clk (fsin),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[3:0]),
.carry_out (s1)
);
CNT10 CNT10_u2(
.clk (s1),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[7:4]),
.carry_out (s2)
);
CNT10 CNT10_u3(
.clk (s2),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[11:8]),
.carry_out (s3)
);
CNT10 CNT10_u4(
.clk (s3),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[15:12]),
.carry_out (s4)
);
CNT10 CNT10_u5(
.clk (s4),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[19:16]),
.carry_out (s5)
);
CNT10 CNT10_u6(
.clk (s5),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[23:20]),
.carry_out (s6)
);
CNT10 CNT10_u7(
.clk (s6),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[27:24]),
.carry_out (s7)
);
CNT10 CNT10_u8(
.clk (s7),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[31:28]),
.carry_out (s8)
);
CNT10 CNT10_u9(
.clk (s8),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[35:32]),
.carry_out (s9)
);
CNT10 CNT10_u10(
.clk (s9),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[39:36]),
.carry_out (s10)
);
REG32B REG32B_u(
.load (LOAD),
.din (dout),
.dout (dout2)
);
endmodule
ISE/Modelsim联合仿真
一般对于系统的仿真,我们均采用Modelsim进行,我们在建立工程的时候,将仿真设置为Modelsim即可