Menu
CoddyTech

发送器设计

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 89 课,共 90 课。

challenge icon

挑战

在本课中,你将通过添加移位寄存器来完成 UART 发送器,使它能够发送任意字节,而不只是固定的字母 'A'。

移位寄存器会载入完整帧(停止位 + 8 个数据位 + 起始位),然后一次移出一位。

帧格式

停止位(1)数据(8 位)起始位(0)
1data_in0

例如,如果 data_in = 8'b01000001(字母 'A'),移位寄存器就会变成:1 01000001 0

你的任务

给你的是上一课中的状态机(发送固定字节)。你需要修改它,使其能够发送来自 data_in 输入的任意字节。

要做什么:

  1. 在端口列表(括号内)添加一个名为 data_in 的 input [7:0]
  2. 在括号外添加一个 10 位的 reg,名为 shift_reg(在模块体内,因为它是内部信号)
  3. 当 cnt == 0 且 start == 1 时:
    1. 将 {1'b1, data_in, 1'b0} 载入 shift_reg
  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 设为高电平(空闲状态)
  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 在线编译器