目录
前言
我好久之前就想做写通信协议接口的,之前写了RISC-V的处理器内核,想试试看SOC怎么搭,所以学习了下UART接口。
一、UART相关
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。因此包含一个发送器和一个接收器。

工作原理是将传输数据的每个字符以串行方式一位接一位的传输,通信双方需要事先约定传输速率(波特率)。其具体工作时序图如下:

二、本次设计
本次设计思路为先分别设计收发模块,然后再在顶层组合。发送模块采取状态机写法,一帧数据包含起始位、8位数据位、奇校验位(忘了是奇校验还是偶校验)、结束位。接收模块采用16倍采样接收,从而保证采样准确性。为了能够在FPGA上测试,增加了单周期脉冲模块,用以将按键脉冲变成一个单时钟周期的脉冲信号。
(一)顶层模块
module top(
input wire clk,
input wire key,
input wire key2,
input wire [7:0] data,
output wire uart_txd,
output wire [7:0] o_data,
output wire over_flag
);
wire clk_divider1;
wire clk_divider2;
wire o_done;
wire signal_send_request;
divider #(7) divider_init1 (clk_divider2,key2,clk_divider1);
divider #(13) divider_init2 (clk,key2,clk_divider2);
UART_Tx UART_Tx_init(.data(data),.clk(clk_divider1),.signal_send_request(signal_send_request),.rst_n(key2),.uart_txd(uart_txd),.o_done(o_done));
Monopulse_clock Monopulse_clock_init(
.clk(clk_divider1),
.signal(key),
.rst_n(key2),
.o_monopulse(signal_send_request)
);
UART_Rx UART_Rx_init(
.uart_txd(uart_txd),
.clk(clk_divider2),
.rst_n(key2),
.data(o_data),
.over_flag(over_flag)
);
endmodule
(二)发送模块UART_Tx
module UART_Tx(
input wire [7:0] data,
input wire clk,
input wire

最低0.47元/天 解锁文章
2742

被折叠的 条评论
为什么被折叠?



