首页 > 其他分享 >计数器得到特定时间的高脉冲信号

计数器得到特定时间的高脉冲信号

时间:2023-01-11 21:23:09浏览次数:47  
标签:cnt clk trig 脉冲 计数器 特定 rstn data reg

一、概述

本篇博客主要介绍:使用计数器来得到自己想要的的一段脉冲信号。

二、实现方法及代码

1、框图,端口及相关信号

image

2、代码实现

Verilog实现
`timescale 1ns/1ps
module  data_cnt (
    input clk,     //50MHZ  20ns
    input rstn,
    input trig,    //触发信号 一个时钟周期

    output wire state   //得到1us的高脉冲信号
);


//define
reg [5:0]  data_cnt;    //1us 50 
reg        data_cnt_clr;

//----------------1us计数器----------------//
always @(posedge clk or negedge rstn) begin
    if (!rstn) 
        data_cnt <= 6'd0;
    else if(!data_cnt_clr)   // 等于0  data_cnt = 0
        data_cnt <= 6'd0;
    else 
        data_cnt <= data_cnt + 1'b1;
end


//---------------得到一个1us的高脉冲信号state----------------//
always @(posedge clk or negedge rstn) begin
  if (!rstn) 
    begin
        data_cnt_clr <= 1'b0;  
    end
  else if(trig == 1 && data_cnt == 6'd0)
        begin
            data_cnt_clr <= 1'b1;  
        end
  else if(data_cnt == 50 - 1) 
    begin
        data_cnt_clr <= 1'b0;
    end
  else
    begin
        data_cnt_clr <= data_cnt_clr; 
    end     
end

 assign state = data_cnt_clr;

endmodule



Testbench
`timescale 1ns / 1ps
module data_cnt_tb;

  // Parameters

  // Ports
  reg clk  ;
  reg rstn ;
  reg trig ;

  wire state;

  data_cnt 
  data_cnt_dut (
    .clk    (clk    ),
    .rstn   (rstn   ),
    .trig   (trig   ),
    .state  (state  )
  );

  initial begin
    begin
          clk = 0;
          rstn = 0;
          trig = 0;
          
    #20   rstn = 1;
    #500  
          trig = 1;
    #20   trig = 0;

    #1200
          trig = 1;
    #20   trig = 0;

    end
  end

  always
    #10  clk = ! clk ;

endmodule

仿真图如下:

image

本篇随笔为学习记录所用,如有错误,请各位指正批评。

标签:cnt,clk,trig,脉冲,计数器,特定,rstn,data,reg
From: https://www.cnblogs.com/zqh1126/p/17044931.html

相关文章