在嵌入式系统开发中,UART通信作为最基础的串行通信接口之一,其稳定性和吞吐量直接影响系统整体性能。Microsemi Libero SoC提供的UART IP核通过灵活的FIFO配置选项,为开发者提供了优化通信效率的有效手段。本文将深入探讨TX/RX FIFO的配置差异,并结合Modelsim仿真分析实际应用中的性能表现。
Libero SoC中的UART IP核采用双缓冲设计,这种架构在保证通信可靠性的同时,显著提升了数据传输效率。理解其内部工作机制是进行性能优化的基础。
UART IP核的发送端包含两个独立的缓冲区:
当TX FIFO未启用时,双缓冲的工作流程如下:
verilog复制// 典型双缓冲状态机逻辑示例
always @(posedge CLK or negedge RST_N) begin
if (!RST_N) begin
buffer1 <= 8'h00;
buffer2 <= 8'h00;
tx_state <= IDLE;
end else begin
case (tx_state)
IDLE: if (WEN && TXRDY) begin
buffer1 <= DATA_IN;
tx_state <= BUFFER1_LOADED;
end
BUFFER1_LOADED: if (shift_complete) begin
buffer2 <= buffer1;
tx_state <= BUFFER2_LOADED;
end
// 其他状态转移...
endcase
end
end
这种设计允许在发送当前字节的同时准备下一个字节,实现流水线操作。实际应用中,开发者需要特别注意TXRDY信号的变化时机:
| 信号状态 | 含义 | 可操作时机 |
|---|---|---|
| TXRDY高 | 缓冲区空闲 | 可安全写入新数据 |
| TXRDY低 | 缓冲区满 | 应等待当前传输完成 |
当启用TX FIFO时,IP核内部会增加一个深度可配置的FIFO队列(通常为8/16/32级),这带来三个显著优势:
注意:即使启用FIFO,双缓冲机制仍然存在,FIFO输出端仍会连接到底层的双缓冲结构。
不同的TX FIFO配置会显著影响通信性能,我们通过实际测试数据来量化这种差异。
在不启用TX FIFO的情况下,我们观察到以下关键时序特征:
测试案例:以100Kbps波特率发送5字节数据
verilog复制// 无FIFO模式下的典型发送逻辑
always @(posedge CLK_16M) begin
if (send_counter < 5 && TXRDY) begin
WEN <= 1'b0;
DATA_IN <= data_array[send_counter];
send_counter <= send_counter + 1;
end else begin
WEN <= 1'b1;
end
end
对应的Modelsim波形显示:
启用8级TX FIFO后,相同的发送任务表现出不同特性:
性能对比表格:
| 指标 | 无FIFO模式 | 启用8级FIFO | 提升比例 |
|---|---|---|---|
| 5字节发送时间 | 520μs | 370μs | 28.8% |
| CPU占用时钟数 | ~800 | ~50 | 93.7% |
| 最小字节间隔 | 104μs | 0μs | 100% |
verilog复制// FIFO模式下的发送逻辑简化
always @(posedge CLK_16M) begin
if (send_counter < 5 && !fifo_full) begin
WEN <= 1'b0;
DATA_IN <= data_array[send_counter];
send_counter <= send_counter + 1;
end else begin
WEN <= 1'b1;
end
end
提示:在实际应用中,即使启用FIFO也建议监控TXRDY信号,因为FIFO满时TXRDY也会变低。
接收端的FIFO配置同样对系统性能有重要影响,特别是在连续数据接收场景下。
启用RX FIFO后,IP核会在以下方面表现出不同行为:
关键信号说明:
模拟连续接收两个字节(0x58和0x6C)的测试场景:
verilog复制// 接收测试激励生成
initial begin
// 第一个字节:0x58
#800000 RX=1'b1;
#10000 RX=1'b0; // start
#10000 RX=1'b0; // bit0
#10000 RX=1'b0; // bit1
#10000 RX=1'b1; // bit2
#10000 RX=1'b1; // bit3
#10000 RX=1'b0; // bit4
#10000 RX=1'b1; // bit5
#10000 RX=1'b0; // bit6
#10000 RX=1'b1; // stop
// 第二个字节:0x6C
#10000 RX=1'b0; // start
#10000 RX=1'b0; // bit0
#10000 RX=1'b1; // bit1
#10000 RX=1'b1; // bit2
#10000 RX=1'b0; // bit3
#10000 RX=1'b1; // bit4
#10000 RX=1'b1; // bit5
#10000 RX=1'b0; // bit6
#10000 RX=1'b1; // stop
end
在Modelsim中观察到的关键行为:
准确的仿真设置对于验证UART IP核性能至关重要,以下是一些实用技巧。
在Modelsim中建议监控以下信号组:
时序控制组:
发送状态组:
接收状态组:
FIFO状态组(如果可观察):
为提高测试效率,可以编写TCL脚本自动执行测试序列:
tcl复制# Modelsim自动化测试脚本示例
vsim work.TESTUARTTT
add wave *
force SYSCLK 0 0, 1 31.25ns -repeat 62.5ns
force NSYSRESET 0 0, 1 625ns
run 1ms
# 自动发送测试模式
for {set i 0} {$i < 5} {incr i} {
force WEN 0 0
force DATA_IN [expr {$i + 0x30}]
run 100ns
force WEN 1 0
run 900ns
}
run 10us
在进行仿真性能分析时,建议关注以下指标:
在实际项目中,我们曾遇到一个典型案例:启用16级TX FIFO后,系统在115200bps波特率下的有效吞吐量从78%提升到96%,同时CPU占用率从15%降至3%。这种优化对于电池供电设备尤其重要。