Menu
Coddy logo textTech

送信機の設計

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

challenge icon

チャレンジ

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

シフトレジスタは、フルフレーム(stop bit + 8 data bits + start bit)をロードし、それを1 bitずつシフトして出力します。

Frame Format

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

例えば、data_in = 8'b01000001(文字 'A')の場合、シフトレジスタは 1 01000001 0 となります。

タスク

前のレッスンで作成したステートマシン(固定バイトを送信)が用意されています。これを変更して、data_in 入力からの任意のバイトを送信できるようにしてください。

手順:

  1. ポートリスト(括弧内)に data_in という名前の input [7:0] を追加します
  2. 括弧の外(モジュール本体の内部。内部 signal であるため)に shift_reg という名前の 10-bit の 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: 送信を開始するためのstart信号
  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

基礎のすべてのレッスン