카테고리 없음

[verilog] 펄스카운터 스펙정리

caneo 2023. 7. 2. 23:59
728x90

외부 기능
0->1->0 펄스를 세는 기능을 함.
액티브엣지 시점에서

외부 포트
input source
output cnt

동작
1. source가 1이면 internal_cnt가 1이 할당됨.
2. source가 0이되면 internal_cnt가 1인지 확인하고 그렇다면 cnt값을 1만큼 증가시킴. 그리고 다음 펄스를 위해 internal_cnt를 0으로 초기화시킴.

// Code your design here
module pulse_counter(
input source,
output reg [3:0] cnt,

input clk,
   input rstn
);
  
   reg internal_cnt;
  
always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
        internal_cnt = 0;
        cnt = 0;
      end
      else begin
        if (source == 1) begin
          internal_cnt = 1;
        end
        else begin
          if (internal_cnt == 1) begin
              cnt = cnt+1;
              internal_cnt = 0;
          end
          else begin
              cnt = cnt;
              internal_cnt = 0;
          end
        end
      end
end
  
endmodule

// Code your testbench here
// or browse Examples
module tb_top;
   reg  clk;
   reg source;
  wire [3:0] cnt;
   reg rstn
  
  initial begin
    clk = 1;
    forever begin
      #10 clk = ~clk;
    end
  end
  
  
  // Instantiate device under test
  pulse_counter u1(.source(source),
                   .cnt(cnt),
                   .clk(clk),
                   .rstn(rstn));
  
  initial begin
    rstn = 1;
    #1 rstn = 0;
    #1 rstn = 1;
    
  end

endmodule

728x90