需求
在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值
输入信号
周期性脉冲信号:需要做检测的脉冲频率信号
使能信号:高电平进行频率计数,低电平清零计数器
输出信号
计数值:输出脉冲频率的计数值
有效信号:该信号拉高时,输出计数值有效
需求分析
1,输出产生计数完成状态《=EN 且有上升沿脉冲
2,输出计数值《=上升沿来临时候从0开始计数,直至下一个上升沿脉冲到来结束,把计数值传出去
框图分析
vlg_design
/
/*
@需求
在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值
@输入信号
周期性脉冲信号:需要做检测的脉冲频率信号
使能信号:高电平进行频率计数,低电平清零计数器
@输出信号
计数值:输出脉冲频率的计数值
有效信号:该信号拉高时,输出计数值有效
*/
/
`timescale 1ns/1ps
module vlg_design(
input clk,//100M
input pulse,//
input reset_n,
input i_en,
output [31:0] o_cnt, //输出计数值
output o_state
);
//
//产生pluse 上升沿一个时钟脉冲
reg [1:0]r_pluse;
wire w_pluse_pos;
always @(posedge clk) begin
if(!reset_n) r_pluse <= 'b00;
else r_pluse <= {r_pluse[0],pulse};
end
assign w_pluse_pos = r_pluse[0] & ~r_pluse[1];
assign o_state = w_pluse_pos;
//
//en 时,如果 w_pluse_pos = 1 清零,否则计数
reg [31:0]r_cnt;
always @(posedge clk) begin
if(!reset_n)r_cnt <= 'b0;
else if(!i_en ) r_cnt <= 'b0;
else if(w_pluse_pos) r_cnt <= 'b0;
else r_cnt <= r_cnt + 1'b1;
end
assign o_cnt = w_pluse_pos?r_cnt:'b0;
endmodule
testbench_top
`timescale 1ns/1ps
module testbench_top();
//参数定义
`define CLK_PERIORD 10 //时钟周期设置为10ns(100MHz)
//接口申明
reg clk;
reg pulse;
reg reset_n;
reg i_en;
wire [31:0] o_cnt;
wire o_state;
vlg_design uut_vlg_design(
.clk(clk),
.pulse(pulse),
.reset_n(reset_n),
.i_en(i_en),
.o_cnt(o_cnt),
.o_state(o_state)
);
//时钟和复位初始化、复位产生
initial begin
clk <= 0;
reset_n <= 0;
#10;
reset_n <= 1;
clk <= 1;
pulse <= 'b0; //初始化都为0
#10;
i_en <= 0;
end
//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;
integer i;
//测试激励产生
initial begin
@(posedge reset_n); //等待复位完成
@(posedge clk);
i_en <= 1;
#2;
//5次循环,
for(i = 0;i < 5;i = i+1) begin
pulse <= 'b1;
#({$random}%30*10);
pulse <= 'b0;
#20;
end
pulse <= 'b0;
i_en <= 0;
#2_000_000;
$stop;
end
endmodule