APB UART 系统综合设计文档
1. 系统概览
我们的APB UART系统是一个精心设计的通信接口,它巧妙地将UART(通用异步收发器)的功能与APB(高级外设总线)的标准相结合。这个系统不仅能够进行串行数据的收发,还能通过APB总线进行灵活的配置和控制。
2. 模块详解
2.1 apb_uart_top:系统的统筹者
功能详解:
这个顶层模块是整个系统的总指挥,它的主要职责包括:
- 信号整合:它将APB总线的信号(如
PCLK
,PRESETn
,PSELx
等)和UART的物理接口(RX
,Tx
)统一管理。
- 模块实例化:在内部实例化了apb_slave和apb_uart模块,并负责它们之间的互联。
- 信号路由:通过内部信号(如
TX_detect_apb
,RX_detect_apb
等),它在APB接口和UART控制器之间建立了通信桥梁。
关键接口:
- 输入:
PCLK
,PRESETn
,PSELx
,PENABLE
,PWRITE
,PWDATA
,PADDR
,RX
- 输出:
PRDATA
,PREADY
,PSLVERR
,Tx
工作流程:
- 接收来自APB总线的访问请求。
- 将请求传递给apb_slave进行解析。
- 根据解析结果,控制apb_uart模块执行相应的操作(配置更新或数据传输)。
- 将操作结果(如读取的数据或状态信息)通过APB总线返回。
2.2 apb_slave:协议转换器
功能详解:
这个模块是APB总线和UART控制器之间的翻译官,它的核心功能包括:
- 地址解码:根据输入的
PADDR
,确定当前访问的是哪个寄存器或功能单元。
- 操作类型判断:区分读操作和写操作,生成相应的控制信号。
- 数据通路控制:管理数据在APB总线和UART控制器之间的流动。
- 状态报告:生成
PREADY
和PSLVERR
信号,向APB主设备反馈操作状态。
关键接口:
- 输入:
PCLK
,PRESETn
,PSELx
,PENABLE
,PWRITE
,PWDATA
,PADDR
,read_data
,error
,ready
- 输出:
PRDATA
,PREADY
,PSLVERR
,TX_detect
,RX_detect
,config_write_detect
,config_read_detect
,config_address
,write_data
具体实现:
assign config_temp = (PADDR == `baud_config) || (PADDR == `frame_config) || (PADDR == `parity_config) || (PADDR == `stop_bits_config); assign TX_detect = PSELx && PENABLE && PWRITE && (PADDR == `trans_data); assign RX_detect = PSELx && PENABLE && (~PWRITE) && (PADDR == `recv_data);
这些赋值语句展示了如何通过组合逻辑高效地实现地址解码和操作类型判断。
2.3 apb_uart:UART控制器核心
功能详解:
基于提供的代码,这个模块确实是整个UART功能的核心控制单元。它的主要功能包括:
- 配置管理:通过
config_address
和config_write_detect
信号,管理UART的各种配置参数,如波特率、帧长度、奇偶校验和停止位。
- 数据传输控制:使用
TX_detect
和RX_detect
信号来控制数据的发送和接收过程。
- 模块集成:实例化并控制tick_generator、uart_transmitter和uart_rx_BB等子模块。
- 状态报告:通过ready和error信号向APB总线报告操作状态。
关键接口:
- 输入:
PCLK
,PRESETn
,write_data_in
,config_address
,TX_detect
,RX_detect
,config_write_detect
,config_read_detect
,RX
- 输出:
read_data
,ready
,error
,Tx
内部结构:
根据提供的代码,我们可以看到以下关键组件:
- 配置寄存器:
logic [((`BAUD_CONFIG_REG_SIZE)-1):0] BAUD_RATE; logic [3:0] frame_length; logic [1:0] parity_signal; logic stop_bits;
这些寄存器存储了UART的关键配置参数。
- 状态信号:
logic opt_done; logic config_error;
这些信号用于跟踪操作完成状态和配置错误。
- 子模块实例:
tick_generator BRG_instance (...); uart_transmitter transmtr_instance (...); uart_rx_BB receiver_instance (...);
这些实例化语句显示了如何集成各个功能子模块。
- 配置逻辑:模块包含了复杂的always块,用于处理配置更新、数据读写等操作。例如:
always @ (posedge PCLK) begin if (~PRESETn) begin // 初始化配置 end else if (baud_config_write_valid) begin // 更新波特率配置 end else if (frame_config_write_valid) begin // 更新帧格式配置 } // ... 其他配置和数据处理逻辑 end
工作流程:
- 接收来自apb_slave的控制信号和数据。
- 根据控制信号(如
config_write_detect
,TX_detect
等)决定执行配置更新或数据传输。
- 在配置更新时,将新的参数写入相应的配置寄存器。
- 在数据传输时,协调uart_transmitter或uart_rx_BB模块的工作。
- 使用tick_generator提供的时钟信号来同步数据的发送和接收。
- 通过
ready
和error
信号向上层报告操作状态。
这个模块通过精心设计的状态机和控制逻辑,实现了UART配置的灵活管理和数据传输的高效控制,是整个APB UART系统的核心。
2.4 tick_generator:波特率时钟生成器
功能详解:
这个模块负责生成UART通信所需的定时信号,其主要功能包括:
- 时钟分频:根据配置的波特率,对系统时钟进行分频。
- 双时钟生成:分别为发送器和接收器生成独立的时钟信号。
- 动态调整:支持在运行时更改波特率配置。
关键接口:
- 输入:
clk
,resetn
,baud_rate
- 输出:
tx_tick
,rx_tick
工作原理:
假设系统时钟为50MHz,目标波特率为9600bps,那么分频比将是。模块会使用一个计数器来实现这个分频比,每当计数器达到设定值时,生成一个tick信号。
2.5 uart_rx_BB:UART接收器
功能详解:
这个模块负责将串行数据转换为并行数据,它的主要功能包括:
- 起始位检测:识别输入信号中的起始位,开始接收过程。
- 数据采样:在每个比特周期的中间点采样数据。
- 帧同步:根据配置的帧格式,正确解析数据位、校验位和停止位。
- 错误检测:检查奇偶校验错误、帧错误等。
关键接口:
- 输入:
rx_tick
,PRESETn
,RX
,frame_length
,parity
,stop_bit
- 输出:
rx_data_out
,rx_done
,prx_error
状态机示例:
case(p_state) IDLE: n_state = (start_bit_detected) ? RX_START_BIT : IDLE; RX_START_BIT: n_state = (tick_count == 7) ? RX_DATA_BITS : RX_START_BIT; RX_DATA_BITS: n_state = (bit_count == frame_length - 1) ? (parity_enable ? RX_PARITY : RX_STOP_BIT1) : RX_DATA_BITS; // ... 其他状态 endcase
这个状态机清晰地展示了UART接收过程中的各个阶段。
2.6 uart_transmitter:UART发送器
功能详解:
这个模块负责将并行数据转换为串行数据,它的主要功能包括:
- 帧构建:根据配置添加起始位、停止位和校验位。
- 并串转换:将并行输入数据逐位发送。
- 波特率同步:使用
tx_tick
信号确保正确的发送速率。
- 连续发送:支持多字节的连续发送。
关键接口:
- 输入:
tx_tick
,PRESETn
,write_data
,TX_detect
,frame_length
,parity_signal
,stop_bits
- 输出:
TX_done
,TX_ERROR
,Tx
关键代码片段:
always @(*) begin case (current_state) IDLE: Tx = 1'b1; // 空闲时保持高电平 TX_START_BIT: Tx = start_bit; // 发送起始位 TX_DATA_BITS: Tx = TX_DATA_REG[index_count]; // 发送数据位 TX_PARITY_BIT: Tx = parity_bit[parity_count]; // 发送校验位 TX_FIRST_STOP_BIT, TX_SECOND_STOP_BIT: Tx = stop_bit; // 发送停止位 default: Tx = 1'b1; endcase end
这段代码展示了如何根据当前状态控制发送线上的电平,实现UART协议的位级控制。
3. 系统集成与协作
在这个精心设计的APB UART系统中,各个模块通过明确的接口和控制信号紧密协作:
- 当APB主设备发起访问时,apb_slave模块首先进行地址解码和操作类型判断。
- 解码结果通过控制信号(如
TX_detect
,config_write_detect
等)传递给apb_uart模块。
- apb_uart模块根据这些信号,决定是更新配置还是启动数据传输。如果是配置更新,它会修改内部寄存器;如果是数据传输,它会协调uart_transmitter或uart_rx_BB模块的工作。
- 在数据传输过程中,tick_generator模块持续为发送器和接收器提供精确的时钟信号,确保数据的正确发送和接收。
- 操作完成后,结果通过apb_slave模块返回给APB主设备,完成一次完整的交互。
这种模块化的设计不仅使得系统结构清晰,易于理解和维护,还提供了良好的可扩展性。例如,如果将来需要支持新的波特率或帧格式,只需要修改相应的模块,而不会影响整体架构。
4. 结语
这个APB UART系统的设计展现了硬件工程的精髓:模块化、可配置性和高效性。通过将复杂的功能分解为相对独立的模块,并通过标准化的接口连接它们,设计者创造了一个既强大又灵活的通信系统。这不仅满足了当前的需求,还为未来的扩展和优化留下了充足的空间。