inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[Verilog HDL/FPGA 외전1 - 시계만들기] Chapter 2. 시,분,초 만들기 - Part1

시계만들기 아키텍처-1 의 코딩 방식에 관한 질문

66

apex737

작성한 질문수 7

1

안녕하세요 🙂

[1. 질문 챕터] : Verilog HDL/FPGA 외전1 - Chapter2

[2. 질문 내용] : 아키텍처-1 의 코딩 방식에 관한 질문

[3. 시도했던 내용, 그렇게 생각하는 이유] :

module clock_arch1 (
  input clk, rst, en,
  output reg [5:0] sec_cnt, // clog2(60)
  output reg [5:0] min_cnt, // clog2(60)
  output reg [4:0] hour_cnt // clog2(24)
);

wire w_sec_tick;
gen_sec u_gen_sec (
  clk, rst, en, w_sec_tick
);

wire sec_th = sec_cnt == 60-1;
wire min_th = min_cnt == 60-1;
wire hour_th = hour_cnt == 24-1;

always@(posedge clk) begin
  if(rst) begin
    sec_cnt <= 0;
    min_cnt <= 0;
    hour_cnt <= 0;
  end
  else if (w_sec_tick) begin
    if(sec_th) begin
      sec_cnt <= 0;
      if(min_th) begin
          min_cnt <= 0;
          hour_cnt <= hour_th ? 0 : hour_cnt + 1;
      end else begin
          min_cnt <= min_cnt + 1;
      end 
    end else begin
        sec_cnt <= sec_cnt + 1;
    end
  end
end
  
endmodule
image.png
  1. 파형은 문제없이 나온것 같은데, 이런 방식으로 중첩 if 문을 사용하면 기존 Matbi_Watch_1 구조와 다르게 합성되어 타이밍에서 문제가 되는지 궁금합니다.

  2. 경계값(th)를 초 단위가 아닌 분/시/일/월 단위로하게되면 if 중첩은 깊어지겠지만 tick_cnt를 60/24/30/12으로 줄 수 있어서 큰 카운터가 필요하지 않을 것 같은데, 이 부분은 어떻게 생각하시는지 궁금합니다.

verilog-hdl fpga 임베디드

답변 2

0

설계독학맛비

안녕하세요 🙂

A1. 합성기로 직접 돌려보고 test 를 추천드립니다. 똑똑한 합성기라면 if 중첩문을 단순화 시킬 수 있습니다. (카르노맵 과 같은 원리로) 환경은 드렸으니 test 해보시면 정확한 답을 얻으실 수 있을 것 같아요.

A2. A1 의 답을 참고하셔서, Tool 로써 코드 결과를 비교하시는 것이 가장 best 이다 생각이 듭니다.

알고계신대로, 제 생각에도 조건의 중첩의 이슈가 있을 것 같아요. 그로인한 critical path 가 발생할 수 있겠죠. 하지만, area 는 작게 나오지 않을까..? 하는 기대감도 있습니다.

실제 현업에서도 tool 을 돌리고 PPA 를 봅니다.

즐공하세요 🙂

 

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. apex737님.

Verilog HDL 코드를 사용하여 시계 기능을 구현하시는 과정에서의 질문에 대해 답변드리겠습니다.

질문 요약 및 답변

  1. 중첩 if 문에 따른 합성 결과 차이:

    • 중첩된 if 문을 사용하는 것 자체가 합성 결과에 큰 영향을 미치지는 않습니다. 다만, 코딩 스타일에 따라 신호의 경로 및 회로의 깊이가 달라질 수 있으며, 복잡한 조건문을 관리하는 데 신중을 기해야 합니다. 일반적으로는 코드의 가독성과 유지보수성을 고려하여 중첩 깊이를 얕게 유지하는 것이 좋습니다.
  2. 카운터 크기의 최적화:

    • 각 카운터가 특정 범위까지 도달할 때만 증가하도록 조건을 설정하여 카운터의 크기를 최소화할 수 있습니다. 분/시/일/월 등의 단위로 조건을 설정하는 것은 상당히 유효한 방법입니다. 이렇게 하면 필요 이상으로 큰 비트를 사용하는 것을 방지하고, 자원 사용을 최적화할 수 있습니다. 다만, 모든 경우설에서 정확한 overflow/underflow 처리에 유의해야 합니다. 예를 들어, 설정된 값에 도달할 때마다 다음 단위 카운터가 올바르게 증가하는지를 확실히 검증해야 합니다.

추가 설명

  • Verilog HDL에서는 반복 구조를 최적화하는 것이 중요합니다. 이러한 최적화는 FPGA 또는 ASIC 설계에서 하드웨어 자원의 효율적인 배분에 영향을 줄 수 있습니다.
  • 각 단위(초, 분, 시)에서 넘치는 경우(Overflow)가 발생했을 때 다음 단위가 증가하는 로직을 정확히 구현하는 것이 핵심입니다. 이를 효과적으로 구현하는 방법 중 하나는 위에서 언급하신 것처럼 조건문과 tick 신호를 적절히 사용하는 방법입니다.

관련 질문 링크

  • 해당 강좌에서 다루어진 중첩 if문 사용과 카운터 최적화에 대한 답변들이 있습니다. 비슷한 질문이 있었던 링크를 참고하시면 초기에 오버헤드를 해결하는 방법에 대한 견해를 얻으실 수 있을 것입니다.
  • 이곳에서는 Verilog HDL에서의 카운터 사용 및 최적화에 대한 질문이 다루어졌습니다. 관련 내용을 읽어보시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

latency 개념 구현

1

87

3

비바도 all os버전

1

72

2

초기화를 reset_n 이 '1'일 때가 아닌 '0' 일 때 실행시키는 이유 질문

1

71

2

다운로드용량

1

71

2

비바도리눅스설치

1

80

2

전체path복사넣기

1

63

2

Vivado 2025.2 리눅스 설치 후 실행 에러와 솔루션 (libxv_commontasks.so)

1

149

2

explorer.exe오류

1

106

3

mobaxterm설치오류

1

90

2

./build시, waveform 'divide color' 사용

1

57

2

Latch와 관련하여 (Time borrowing, Latch-based design)

1

130

2

clean 명령어가 안되는데, 따로 저장해줘야 하는지 궁금합니다.

0

63

1

안녕하세요 설치 관련 질문 드립니다.

1

64

3

16장 mealy 설계.

1

74

2

14장 Cycle 관련, Testbench 코드.

1

64

2

21강(16장) 초기값 설정이 적용되는 시점 질문

1

60

1

20강(15장) - 밀리 머신 관련하여 질문 드립니다.

1

68

2

build에러 질문

0

57

2

1장 ./build에서 에러가 나요

1

73

2

FPGA 강의 보드 문의 드립니다.

1

107

2

5장 DFF특성에 대한 질문

1

77

3

vivado linux 사용 이유.

1

137

2

메모리의 형태가 전체설계에 미치는 영향이 궁금합니다.

1

104

2

디스코드 멤버쉽 등업 관련 문제

1

92

2