送信機の設計
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 89/90。
チャレンジ
このレッスンでは、固定の文字 'A' だけでなく任意のバイトを送信できるように、shift register を追加して UART 送信機を完成させます。
シフトレジスタは、フルフレーム(stop bit + 8 data bits + start bit)をロードし、それを1 bitずつシフトして出力します。
Frame Format
| Stop (1) | Data (8 bits) | Start (0) |
|---|---|---|
| 1 | data_in | 0 |
例えば、data_in = 8'b01000001(文字 'A')の場合、シフトレジスタは 1 01000001 0 となります。
タスク
前のレッスンで作成したステートマシン(固定バイトを送信)が用意されています。これを変更して、data_in 入力からの任意のバイトを送信できるようにしてください。
手順:
- ポートリスト(括弧内)に
data_inという名前のinput [7:0]を追加します - 括弧の外(モジュール本体の内部。内部 signal であるため)に
shift_regという名前の 10-bit のregを追加します cnt == 0かつstart == 1の時:shift_regに{1'b1, data_in, 1'b0}をロードします
cntが 1 から 8 の間の時:tx <= shift_reg[0]を送信します- 右にシフトします:
shift_reg <= shift_reg >> 1
cnt == 9の時:tx <= shift_reg[0]を送信します- 右にシフトします:
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