【FPGA/verilog -入门学习6】verilog频率计数器

需求

在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值

输入信号

周期性脉冲信号:需要做检测的脉冲频率信号

使能信号:高电平进行频率计数,低电平清零计数器

输出信号

计数值:输出脉冲频率的计数值

有效信号:该信号拉高时,输出计数值有效

需求分析

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

仿真输出

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值