Menu
Coddy logo textTech

Transmitter Design

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 89/90。

challenge icon

チャレンジ

このレッスンでは、固定された文字 'A' だけでなく、任意のバイトを送信できるように、shift registerを追加してUART transmitterを完成させます。

shift registerはフレーム全体(stop bit + 8 data bits + start bit)を読み込み、1ビットずつシフトして送信します。

フレーム形式

Stop (1)Data (8 bits)Start (0)
1data_in0

たとえば、data_in = 8'b01000001(文字 'A')の場合、shift registerは次のようになります:1 01000001 0

あなたの課題

前のレッスンのstate machine(固定バイトを送信)が与えられています。data_in inputから任意のバイトを送信できるように変更してください。

行うこと:

  1. port list(括弧内)に、data_inという名前のinput [7:0]を追加する
  2. 10ビットのregであるshift_reg括弧の外側(内部signalなので、module本体の中)に追加する
  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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ