卢思萌 信1411011001频率计设计 第 - 16 - 页 共 46 页
4.3门控模块gate_control
门控模块实现检测外界量程的选择,并且根据量程输出控制6位BCD码十进
制计算器的计数时钟,以及在测量完一次信号频率后,计数器计数值清零。计数器的清零要与后级寄存器的锁存时刻做很好的时序配合。应该实在计数器测量完一次信号频率后,首先将数据锁存到寄存器,然后再将计数器值清零,这样可以惊醒下一次测量。
门控模块的结构框图如图4.3.1所示
图4.3.1 门控模块结构框图
根据模块实现的功能设计Verilog HDL源代码如下: module gate_control(
SW0,SW1,SW2, f1hz,f10hz,f100hz, Latch_EN, Counter_Clr, Counter_EN,
dp_s1hz,dp_s10hz,dp_s100hz
);
- 16 -
output Latch_EN; output Counter_Clr; output Counter_EN; output
dp_s1hz,dp_s10hz,dp_s100hz;
input SW0,SW1,SW2; input f1hz,f10hz,f100hz;
reg dp_s1hz,dp_s10hz,dp_s100hz; reg fref; reg wire_1; reg wire_2;
//初始化输入以及中间量 initial begin
fref <= 1'b0; wire_1 <= 1'b0; wire_2 <= 1'b0; end
//根据不同的外界量程选择,选择相应的计数基时钟
always @(SW0 or SW1 or SW2 or f1hz or f10hz or f100hz) begin
if(SW2 == 1'b1) begin
fref <= f100hz;
{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b001; end
else if(SW1 == 1'b1) begin
fref <= f10hz;
{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b010; end
else if(SW0 == 1'b1) begin
fref <= f1hz;
{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b100; end end
//根据不同的计数基时钟,提供输出相应的计数器计数值的清除脉冲与锁存器锁存脉冲
always @(posedge fref) begin
wire_1 <= ! wire_1; end
always @(negedge fref) begin
wire_2 <= wire_1; end
assign Counter_EN = wire_1; assign Latch_EN = (! Counter_EN) & wire_2;
assign Counter_Clr = (! Counter_EN) & (! Latch_EN) | (! wire_2); endmodule
卢思萌 信1411011001频率计设计 第 - 18 - 页 共 46 页
该模块定义输入端如下: ● SW0、SW1、SW2:量程选择开关 ● flhz:1Hz的标准时钟输入 ● fl0hz:10Hz的标准时钟输入 ● fl00hz:100Hz的标准时钟输入 该模块定义输入端口如下:
● Latch_EN:用来是能寄存器所存数据 ● Counter_Clr:用于计数器的清零 ● Counter_EN:用于使能计数器开始计数
● dp_s1hz:选择999999Hz量程时,用于控制显示中的小数点位置 ● dp_s10hz:选择9999.99Hz量程时,用于控制显示中的小数点位置 ● dp_s100hz:选择99.9999Hz量程时,用于控制显示中的小数点位置
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.3.2所示。
图4.3.2 门控模块的仿真波形
- 18 -
卢思萌 信1411011001频率计设计 第 - 19 - 页 共 46 页
4.4分频模块fdiv
分频模块在系统全局时钟的驱动下,经过分频得到系统中所需要的多种频率成分的时钟信号。
分频模块的结构框图如图4.4.1所示。
图4.4.1 分频模块结构框图
根据模块实现的功能设计Verilog HDL源代码如下: module
fdiv(clk,f1hz,f10hz,f100hz,f1khz);
output f1hz,f10hz,f100hz,f1khz; input clk;
reg f1hz,f10hz,f100hz,f1khz; integer
cnt1=0,cnt2=0,cnt3=0,cnt4=0; always @(posedge clk) begin
//if(cnt1<9999) //实际系统分
频值
if(cnt1 < 2) //仿真时的分频值 begin
f1khz <= 1'b0;
cnt1 = cnt1 + 1;
end else begin
f1khz <= 1'b1; cnt1 = 0; end
- 19 -
卢思萌 信1411011001频率计设计 第 - 20 - 页 共 46 页
end else begin
f10hz <= 1'b1; cnt3 = 0; end
end
always @(posedge f1khz) begin
//if(cnt2<9) //实际系统分
频值
if(cnt2 < 2) //仿真时的分频值 begin
f100hz <= 1'b0; cnt2 = cnt2 + 1; end else begin
f100hz <= 1'b1; cnt2 = 0; end
end
always @(posedge f10hz) begin
//if(cnt4<9) //实际系统分
频值
if(cnt4 < 2) //仿真时的分频值 begin
f1hz <= 1'b0; cnt4 = cnt4 + 1; end else begin
f1hz <= 1'b1; cnt4 = 0; end
end
always @(posedge f100hz) begin
//if(cnt3<9) //实际系统分
频值
该模块定义输入端口如下: ● Clk:全局系统时钟信号 该模块定义输出端口如下: ● F1hz:输出1Hz的时钟信号 ● F10hz:输出1Hz的时钟信号
if(cnt3 < 2) //仿真时的分频值 begin
f10hz <= 1'b0; cnt3 = cnt3 + 1;
end endmodule
- 20 -