Menu
Coddy logo textTech

送信機の設計

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

challenge icon

チャレンジ

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

シフトレジスタは、フレーム全体(ストップビット + 8ビットのデータ + スタートビット)をロードし、一度に1ビットずつシフトして出力します。

フレームフォーマット

ストップ (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,           // 新規: 送信を開始するためのスタート信号
  output reg tx,         // 新規: シリアル出力ライン
  output reg [3:0] cnt   // テスト用に出力として保持
);

  initial begin
    cnt = 0;
    tx = 1;              // 新規: txをHIGHに設定(アイドル状態)
  end

  always @(posedge clk) begin
    // 新規: スタート条件付きのカウンタロジック
    if (cnt == 0 && start) begin   // 新規: 送信開始
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // 新規: 送信中にカウント
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // 新規: 最後のビットの後にリセット
      cnt <= 0;
    end
  end

endmodule

基礎のすべてのレッスン