Menu
Coddy logo textTech

송신기 설계

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 89번째.

challenge icon

챌린지

이 레슨에서는 고정된 문자 'A'뿐만 아니라 모든 바이트를 전송할 수 있도록 시프트 레지스터(shift register)를 추가하여 UART 송신기를 완성해 보겠습니다.

시프트 레지스터는 전체 프레임(정지 비트 + 8개 데이터 비트 + 시작 비트)을 로드하고 한 번에 한 비트씩 시프트하여 내보냅니다.

프레임 형식

정지 (1)데이터 (8 비트)시작 (0)
1data_in0

예를 들어, data_in = 8'b01000001 (문자 'A')인 경우, 시프트 레지스터는 1 01000001 0이 됩니다.

과제

이전 레슨에서 작성한 상태 머신(고정된 바이트 전송)이 제공됩니다. 이를 수정하여 data_in 입력으로부터 어떤 바이트든 전송할 수 있도록 만들어야 합니다.

수행할 작업:

  1. 포트 목록(괄호 안)에 data_in이라는 이름의 input [7:0]을 추가합니다.
  2. 괄호 밖(모듈 본문 내부, 내부 신호이므로)에 shift_reg라는 이름의 10비트 reg를 추가합니다.
  3. cnt == 0이고 start == 1일 때:
    1. shift_reg{1'b1, data_in, 1'b0}를 로드합니다.
  4. cnt가 1에서 8 사이일 때:
    1. tx <= shift_reg[0]를 전송합니다.
    2. 오른쪽으로 시프트합니다: shift_reg <= shift_reg >> 1
  5. cnt == 9일 때:
    1. tx <= shift_reg[0]를 전송합니다.
    2. 오른쪽으로 시프트합니다: shift_reg <= shift_reg >> 1

직접 해보기

module uart_tx (
  input clk,
  input start,           // NEW: 전송을 시작하기 위한 시작 신호
  output reg tx,         // NEW: 직렬 출력 라인
  output reg [3:0] cnt   // 테스트를 위해 출력으로 유지
);

  initial begin
    cnt = 0;
    tx = 1;              // NEW: tx를 HIGH로 설정 (유휴 상태)
  end

  always @(posedge clk) begin
    // NEW: 시작 조건이 포함된 카운터 로직
    if (cnt == 0 && start) begin   // NEW: 전송 시작
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NEW: 전송 중 카운트
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NEW: 마지막 비트 이후 리셋
      cnt <= 0;
    end
  end

endmodule

기초의 모든 레슨