需求
在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值
输入信号
周期性脉冲信号:需要做检测的脉冲频率信号
使能信号:高电平进行频率计数,低电平清零计数器
输出信号
计数值:输出脉冲频率的计数值
有效信号:该信号拉高时,输出计数值有效
需求分析
1,输出产生计数完成状态《=EN 且有上升沿脉冲
2,输出计数值《=上升沿来临时候从0开始计数,直至下一个上升沿脉冲到来结束,把计数值传出去
框图分析
vlg_design
/
/*
@需求在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值
@输入信号周期性脉冲信号:需要做检测的脉冲频率信号使能信号:高电平进行频率计数,低电平清零计数器
@输出信号计数值:输出脉冲频率的计数值有效信号:该信号拉高时,输出计数值有效*/
/
`timescale 1ns/1ps
module vlg_design(input clk,//100Minput 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) beginif(!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) beginif(!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) beginpulse <= 'b1;#({$random}%30*10); pulse <= 'b0;#20;
endpulse <= 'b0;
i_en <= 0;
#2_000_000;
$stop;
end
endmodule