发送器设计
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 89 课,共 90 课。
挑战
在本课中,你将通过添加移位寄存器来完成 UART 发送器,使它能够发送任意字节,而不只是固定的字母 'A'。
移位寄存器会载入完整帧(停止位 + 8 个数据位 + 起始位),然后一次移出一位。
帧格式
| 停止位(1) | 数据(8 位) | 起始位(0) |
|---|---|---|
| 1 | data_in | 0 |
例如,如果 data_in = 8'b01000001(字母 'A'),移位寄存器就会变成:1 01000001 0
你的任务
给你的是上一课中的状态机(发送固定字节)。你需要修改它,使其能够发送来自 data_in 输入的任意字节。
要做什么:
- 在端口列表(括号内)添加一个名为
data_in的input [7:0] - 在括号外添加一个 10 位的
reg,名为shift_reg(在模块体内,因为它是内部信号) - 当
cnt == 0且start == 1时:- 将
{1'b1, data_in, 1'b0}载入shift_reg
- 将
- 当
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:用于开始传输的启动信号
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 在线编译器