산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

4비트 카운터: 0부터 15까지 효율적인 이진 카운팅

4비트 카운터는 4'b0000에서 4'h1111까지 증가하다가 다시 4'b0000으로 롤오버합니다. 실행 중인 클럭이 제공되고 리셋이 하이 상태로 유지되는 한 계속 카운트합니다.

롤오버는 최종 덧셈의 최상위 비트(MSB)가 버려질 때 발생합니다. 카운터가 최대값 4'b1111에 있을 때 카운트 요청을 한 번 더 받으면 5'b10000에 도달하려 하지만 4비트만 지원하므로 MSB가 버려져 0이 됩니다.

0000 0001 0010 ... 1110 1111 rolls over 0000 0001 ...

설계에는 클럭용 입력 하나와 액티브 로우 리셋용 입력 하나가 있습니다. 액티브 로우 리셋은 리셋 핀의 값이 0일 때 설계가 리셋되는 방식입니다. 카운터 값을 제공하는 4비트 출력 out이 있습니다.

전자 카운터 설계

module counter (
  input clk,        // 카운터가 카운트 업할 수 있도록 클럭 입력 포트 선언
  input rstn,       // 필요 시 카운터를 0으로 리셋할 수 있도록 리셋 입력 포트 선언
  output reg[3:0] out  // 카운터 값을 얻기 위한 4비트 출력 포트 선언
);
  // 이 always 블록은 clk의 상승 에지(0->1)에서 트리거됨
  // 블록에 진입하면 리셋이 0인지 확인하고, 예이면 out을 0으로 변경
  // 리셋이 1이면 설계가 카운트 업하도록 허용하므로 카운터 증가
  always @ (posedge clk) begin
    if (! rstn) out <= 0;
    else out <= out + 1;
  end
endmodule

module counter는 클럭과 액티브 로우 리셋(n으로 표시)을 입력으로 받고 카운터 값을 4비트 출력으로 가집니다. always 블록은 클럭이 0에서 1로 전환될 때마다 항상 실행되며, 이는 상승 에지 또는 포지티브 에지를 의미합니다. 출력은 리셋이 하이(1)로 유지될 때만 if-else 블록에 의해 증가합니다. 클럭의 포지티브 에지에서 리셋이 로우로 발견되면 출력은 기본값 4'b0000으로 리셋됩니다.

테스트벤치

설계를 테스트벤치 모듈에 인스턴스화하여 카운터가 예상대로 카운트하는지 검증할 수 있습니다.

테스트벤치 모듈은 tb_counter로 명명되며 시뮬레이션에서 최상위 모듈이므로 포트는 필요하지 않습니다. 그러나 클럭과 리셋을 생성, 저장, 구동하기 위한 내부 변수가 필요합니다. 이를 위해 클럭과 리셋용으로 reg 타입 변수 두 개를 선언했습니다. 또한 설계의 출력과 연결하기 위해 wire 타입 넷이 필요하며, 그렇지 않으면 기본적으로 1비트 스칼라 넷이 됩니다.

클럭은 always 블록으로 생성되며 10시간 단위의 주기를 가집니다. initial 블록은 내부 변수의 초기값을 설정하고 설계에 리셋 값을 구동하는 데 사용됩니다. 설계는 테스트벤치에 인스턴스화되어 내부 변수와 연결되므로, 테스트벤치에서 값을 구동할 때 설계가 이를 받게 됩니다. 테스트벤치에 $display 문이 없으므로 콘솔에 메시지가 표시되지 않습니다.

module tb_counter;
  reg clk;        // 설계를 구동할 클럭용 내부 TB 변수 선언
  reg rstn;       // 설계에 액티브 로우 리셋을 구동할 내부 TB 변수 선언
  wire [3:0] out; // 설계 출력과 연결할 wire 선언
  
  // 카운터 설계 인스턴스화 및 테스트벤치 변수와 연결
  counter c0 (
    .clk (clk),
    .rstn (rstn),
    .out (out)
  );
  
  // 설계에 구동할 클럭 생성
  // 이 클럭은 5ns마다 값이 반전 -> 주기 = 10ns -> 주파수 = 100 MHz
  always #5 clk = ~clk;
  
  // 이 initial 블록은 테스트벤치의 자극을 형성
  initial begin
    // 1. 시뮬레이션 시작 시 테스트벤치 변수를 0으로 초기화
    clk <= 0;
    rstn <= 0;
    
    // 2. 나머지 자극 구동, 중간에 리셋 어서트
    #20 rstn <= 1;
    #80 rstn <= 0;
    #50 rstn <= 1;
    
    // 3. 200ns 후 자극 종료
    #20 $finish;
  end
endmodule

시뮬레이션 로그

ncsim> run
[0ns] clk=0 rstn=0 out=0xx
[5ns] clk=1 rstn=0 out=0x0
[10ns] clk=0 rstn=0 out=0x0
[15ns] clk=1 rstn=0 out=0x0
[20ns] clk=0 rstn=1 out=0x0
[25ns] clk=1 rstn=1 out=0x1
[30ns] clk=0 rstn=1 out=0x1
[35ns] clk=1 rstn=1 out=0x2
[40ns] clk=0 rstn=1 out=0x2
[45ns] clk=1 rstn=1 out=0x3
[50ns] clk=0 rstn=1 out=0x3
[55ns] clk=1 rstn=1 out=0x4
[60ns] clk=0 rstn=1 out=0x4
[65ns] clk=1 rstn=1 out=0x5
[70ns] clk=0 rstn=1 out=0x5
[75ns] clk=1 rstn=1 out=0x6
[80ns] clk=0 rstn=1 out=0x6
[85ns] clk=1 rstn=1 out=0x7
[90ns] clk=0 rstn=1 out=0x7
[95ns] clk=1 rstn=1 out=0x8
[100ns] clk=0 rstn=0 out=0x8
[105ns] clk=1 rstn=0 out=0x0
[110ns] clk=0 rstn=0 out=0x0
[115ns] clk=1 rstn=0 out=0x0
[120ns] clk=0 rstn=0 out=0x0
[125ns] clk=1 rstn=0 out=0x0
[130ns] clk=0 rstn=0 out=0x0
[135ns] clk=1 rstn=0 out=0x0
[140ns] clk=0 rstn=0 out=0x0
[145ns] clk=1 rstn=0 out=0x0
[150ns] clk=0 rstn=1 out=0x0
[155ns] clk=1 rstn=1 out=0x1
[160ns] clk=0 rstn=1 out=0x1
[165ns] clk=1 rstn=1 out=0x2
Simulation complete via $finish(1) at time 170 NS + 0

액티브 로우 리셋이 0이 되면 카운터가 0으로 리셋되고, 약 150ns에서 리셋이 디어서트되면 카운터는 클럭의 다음 포지티브 에지에서 카운팅을 시작합니다.

하드웨어 회로도

verilog

  1. 여름철 성공을 위한 IT 전략 재충전, 재설정, 재구성
  2. 555 타이머와 4027 플립플롭으로 3비트 이진 카운터 제작
  3. 동기 이진 카운터: 설계, 업/다운 동작, 인코더 응용
  4. 카운터 모듈러스: 현대 시스템을 위한 최적화 알고리즘
  5. 링 카운터와 존슨 카운터: 설계, 동작 원리 및 실용적 응용
  6. IT/OT 융합: 지속 가능한 디지털 전환을 위한 문화적 재설정
  7. 파이썬 collections.Counter: 효율적 카운팅, 업데이트, 산술 연산
  8. Verilog Mod-N 카운터 설계: 파라미터화 모듈 및 테스트벤치
  9. Verilog 그레이 카운터 모듈: 4비트 그레이 코드 생성기
  10. PID 리셋 와인드업 방지: 신뢰할 수 있는 공정 제어를 위한 전략