送信機の設計
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 89/90。
チャレンジ
このレッスンでは、固定された文字 'A' だけでなく、任意のバイトを送信できるようにシフトレジスタを追加して、UART送信機を完成させます。
シフトレジスタは、フレーム全体(ストップビット + 8ビットのデータ + スタートビット)をロードし、一度に1ビットずつシフトして出力します。
フレームフォーマット
| ストップ (1) | データ (8ビット) | スタート (0) |
|---|---|---|
| 1 | data_in | 0 |
例えば、data_in = 8'b01000001 (文字 'A')の場合、シフトレジスタは 1 01000001 0 となります。
あなたのタスク
前回のレッスンで使用したステートマシン(固定バイトを送信するもの)が用意されています。これを、data_in 入力からの任意のバイトを送信するように修正してください。
行うべきこと:
data_inという名前のinput [7:0]をポートリスト(括弧内)に追加します。shift_regという名前の10ビットの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, // 新規: 送信を開始するためのスタート信号
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