跳至主要内容

FPGA design a UART Loopback System

· 閱讀時間約 12 分鐘
w0x7ce
MySelf

发布于 2024-09-05 21:40:27(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 5655 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original we×7ce EI V1ajero 2824年9月5日 21:41 波兰

1.背景信息

本项目使用的是GWINR-9FPGA开发板,其主要特性如下:

  • Logic units (LUT4): 8649

  • Registers (FF): 6480

  • Shadow SRAM (SSRAM) : 17280 bits

  • Block SRAM (BSRAM): 468K bits (26个块)

  • User flash: 608K bits

  • SDR SDRAM: 64M bits

  • 18 × 18 Multiplier: 20

  • SPI FLASH: 32M-b1t

  • PLL: 2

  • Display interface: HDMI, SPI screen, RGB screen

  • Debugger:板载 BL702 芯片提供 USB-JTAG 和 USB-UART 功能

  • I0能力:

  • 支持 4mA、8mA、16mA、24mA 驱动能力

■每个I/0提供独立的总线保持器、上拉/下拉电阻和开漏输出选项

  • 连接器:TF卡播,2x24P2.54mm排针

  • 按钮:2个可编程按钮

  • LED:板载6个可编程LED

这些特性使得该开发板非常适合实现UART回环系统,特别是其丰富的I/0资源和板载LED 可以方便地进行调试和状态显示。

2.I0约束

1.001

I0_PDRT "c1k* PULL_MoDE=UP; ot [e]po. 0n0I I0_Loc “led[1]′ 11; t [z]pa 3001 [≤]po0n0I I0_LOC "led[4]* 15; ,x4ien. oon0I I0_PORT "uart_tx* I0_TYPE=LVCMOS33; gt ,x.1e, 301 01 I0_PORT "uart_rx* IO_TYPE=LVCMoS33; 详细解释: l.时钟(clk): 分配到52号引脚

  • 设置为上拉模式(PULL_MODE-UP)

  • 上拉模式有助于减少硬声干扰,提高信号完整性

2. LED 输出:

  • led[0] 到led[5] 分别分配到 10, 11, 13, 14, 15, 16 号引脚

  • 这些LED将用于显示接收到的数据,提供直观的调试信息

3. UART 接口:

  • 发送(uart_tx)分配到17号引脚

  • 接收(uart_rx)分配到18号引脚

  • 都设置为LVCM0S33标准(3.3V逻辑电平)

  • LVCMOS33是一种常见的低压CMOS逻辑标准,兼容性好,功耗低

知识点:

  • I0约束对于FPGA设计至关重要,它们定义了逻辑设计如何与物理硬件接口。

  • 正确的I0标准(如LVCMOS33)确保了信号的电气特性与外部设备匹配。

  • 上拉/下拉设置可以提高信号稳定性,特别是对于时钟等关键信号。

3.UART 回环模块(uart_loop_back)

3.1模块接口

nodule uart_loop_back ( input clk, output uart_tx, output reg [5:0] led ): 这个模块是整个系统的顶层模块,它连接了UART接收器、发送器和LED显示逻辑。

3.2内部信号

vire rxDatavalid; 1reg txDatavalid; wire txBusy: 这些信号用于模块间的通信和数据传输控制

3.3UART接收器和发送器实例化

uart_rx .DELAY_FRAMES (234) ) uart_rx_inst ( .clk(clk), .uart_rx(uart_rx), , rxData( rxData), ): uart_tx DELAY_FRAMES (234) ) uart_tx_inst ( .clk(clk), . txData(txData), . txBusy(txBusy) uart_tx(uart_tx)

DELAY_FRAHE5参数的计算: DELAY_FRAMES-(系统时钟频率)/《波特率)-27,060,000/ 115,200234

  • 系统时钟频率:27 MHz(27,000,000 Hz)

  • 目标波特率:115,200bps

这个计算确保了UART通信的正确时序。每个比特持续的时钟周期致为234,这样可以精确地 采样和发送数据。

3.4缓冲区和控制变量

reg [7:0] buffer [0:255]: reg [7:0] readPtr = 0; reg sending = ; 这里实现了一个256字节的循环缓冲区,用于暂存接收到的数据。

  • buffcr:存储接收到的数据

writePtr:指向下一个要写入的位置

  • readPtr:指向下一个要读取的位置

  • sending:指示当前是否正在发送数据

循环缓冲区的工作原理: 写人数据 wrtePtr 通冲区活 通年区空 等特新款据

graph TD B->|说取数据|C[发送数据] C -->|增加 readPtr| B D[writePtr ==readPtr]-->|线冲区空|E[等待新数据]

这种设计允许连续接收数据,即使发送这度暂时眼不上接收速度。

3.5主要逻辑

主要逻辑在一个always@(posedgeclk)块中实现:

中区有款

开用发理

新有数报已发坊

graph T0 A[开始]->B{[接收到有效数据?} B-->|是|C[存人螺冲区] B -->|否|D{正在发送?}

  • -> D

C D-->|否|E{线冲区有数据?} E-->|是|F[开始发送】 E -->|否| A }0<- 6->|是|H[发送下一个数据] 5 ->|否| A H-->I{所有数据已发送?} I-->是|J[端束发送过程]

  • >|否|A

这个逻辑确保了数据的连续接收和发送,同时处理了发送器忙绿时的情况。

3.6LED控制

alvays @(posedge clk) beg1n if [rxDatavalid) led <= -rxData[5:]; end 这个块在每次接收到有效数据时更新LED显示,显示接收数据的低6位的反码。这提供了直 观的数据接收指示。

4.UART接收器模块(uart_rx)

4.1模块接口

nodule uart_rx #( parameter DELAY_FRAMESs = 234 )( input clk, input uart_rx, output reg rxDatavalid ) ;

4.2状态定义

localparam RX_STATE_IDLE = 3;

Localparam RX_STATE_STOP_BIT = 5;

4.3接收逻辑流程

IDLE

START_BIT 第特半个比特时间 READ_WAIT 检测到停止位 到达比特中心 末读完 8 位 RFAD 读完8位 STOP_BIT stateD1agral-v2 310I <-- [] IDLE>START_BIT:检测到开始位 START_BIT --> READ_WAIT:等特半个比特时间 READ WAIT -* READ:到达比特中心 READ->READ_WAIT:未说完8位 READ --> STOP_BIT : 读完 8 位 STOP BIT->IDLE:检到停止位 详细说明: L.IDLE状态:等待起始位(低电平)

2.START_BIT状态:确认起始位,准备读取数据

3.READ_WAIT状态:等待到达比特中心

1.READ状态:采样数据位

5.STOP BIT状态:确认停止位,完成接取

知识点:

  • UART协议的基本原理:起始位、数据位、停止位

  • 在比特中心采样以提高可靠性

  • 使用状态机实现率行协议解析

5.UART发送器模块(uart_tx)

5.1模块接口

nodule uart_tx #( parameter DELAY_FRAMES = 234 )( input clk, input txDataValid, output reg uart_tx

5.2状态定义

Local.param TX_STATE_START_BIT - 1; 4localparam TX_STATE_STOP_BIT = 3;

5.3发送逻辑流程

详细说明: L.IDLE状态:等待有效数据

2.START_BIT状态:发送起始位(低电平)

3.WRITE状态:逐位发送8位数据

1.STOP_BIT状态:发送停止位(高电平)

知识点:

  • UART发送过程中的精确时序控制

  • 使用计数器(txCounter)来控制每个位的持续时间

  • txBusy信号的使用,用于招示发送器状态

6.系统整体流程

外部UART设备 发运救据 UART_RX rxData, rxDatavalid 控收数据 回环经辑 LED显不 txData, txDatavalid 存 读取 福环规冲区 UART_TX 发送数据 外部UART设备

graph TD A[外部UART设备]-->|发送效据]B(UART_RX) B -->|rxData, rxDataValid| C{回环逐辑}

  • >|存储|D[循环强冲区]

D -->|读取|C C -->|txData, txDataValid| E(UART_TX]

  • >|发送数据|F[外部UART设务]

B -->|接收数据|G[LED显示]

这个流程图展示了整个系统的数据流: L.外部设备发送数据到UART_RX

2.接收到的数据通过回环逻辑存入缓冲区

3.数据从缓冲区读出并发送到UART_TX

1.UART_TX将数据发送回外部设备

5.同时,接收到的效据会显示在LED上

7.关键设计考虑

5.模块化设计:将功能分解为独立模块(接收器、发送器、回环逻辑),提高代码可读性和可

维护性,这种方法也允许各个模块的独立溯试和重用。

5.错误处理:虽然当前设计没有明确的错误处理机制,但可以考虑添加奇偶校验或赖错误检测

来提高可靠性。

7.LED反馈:使用板我LED显示接收到的数据,为调试和状态监控提供了直现的方法。

3.I0配置:精心选择的I0配置(如LVCMOS33标准和上拉设置)确保了与外部设备的良

好兼容性和信号完整性。

8.性能分析

8.1时序性能

  • 系统时钟:27MHz

  • UART 浪特率:115286 bps

  • 每比特时钟周期:234个系统时钟周期

这意味着系统有足够的时间分辨率来准确采样和发送UART数据。事实上,它可以支持更高的 波特率,理论上最高可达: 最大波特率=27 MHz/ 16×1.6875 Mbps (假设每比特至少需要16个时钟周期来准确采样)

8.2资源利用

基于提供的GWINR-9FPGA规格,我们可以估计资源利用率:

  • 还辑单元(LUT4):该设计可能使用不到100个LUT,占总数8648的约1%.

  • 寄存器(FF):可能使用约50-100个FF,占总数6488的约1-2%

  • 块RAM(BSRAM):此设计不使用块 RAM

  • I/0:使用了9个I/0引脚(1个时钟,6个LED,2个UART),远低于设备的总

1/0 能力。 这表明该设计在资源利用上非常高效,留有大量空间forfutureenhancements。

9.可能的改进和扩展

L.错误检测和处理:

  • 实现奇偶校验

  • 添加帧错误检测(无效的停止位)

  • 实现接收器超时机制

2.缓冲区增强:

  • 实现可配置的缓冲区大小

  • 漆加缓冲区满/空标志

  • 实现中断机制for缓冲区状态变化

3.波特率配置:

  • 实现运行时可配置的波特率

  • 支持自动波特率检测

1.数据处理:

  • 添加简单的命令解析功能

  • 实现数据滤波或格式转换

,诊断功能:

  • 添加更多的状态LED指示

  • 实现环回测试模式

3.接口扩展:

  • 添加 SPI或I2C接口for配置

  • 实现USB-UART桥接功能

01 qde.6 A[UART系统]->B[错误处理] A-->C[缓冲区增强] A·->D[波特率配置】 A--> E[数据处理] A --> F[诊断功能] A--> G[接口扩展] B-->B1[奇校验] B -->B2[帧错误检测] B --> B3[接收超时] C->C1[可配置爆冲区大小] C-->C2[线冲区状态标志] C-->C3[中断机利] D-->D1[可配置波特率] D-->D2[自动退特率检测] E --> E1[命令解析] E--> E2[数据转换] F --> F1[状态LED] F-->F2[环同测试模式] F-->F3[性计数器] 6 --> G1[SPI/I2C配置] G --> G2[USB-UART桥接]

10.测试策略

为确保系统的可靠性和正确性,可以采用以下测试策略:

1.单元测试:

  • 对UART_RX和UART_TX模块进行独立测试

  • 验证不同波特率下的正确操作

  • 测试边界条件(如最大速度数据传输)

1.集成测试:

  • 测试完整的回环功据

  • 验证缓冲区在各种数据流情况下的行为

3.压力测试:

  • 连续发送大量数据

  • 模拟数据突发和间数性传输

1.精误注入剩试:

  • 模拟帧错误、噪声干扰

  • 测试系统在异常情况下的行为

5.实际硬件测试:

  • 使用实际UART设备(如PC串口或微控制器)进行端到端测试

  • 在不同环境条件下进行长时间稳定性测试

graph TD A[测试策略]-->B[单元测试] A-->C[集成测试] A-->D[压力测试] A-->E[错误注入测试] A-->F[实际硬件测试] 6 B-->B2[UART_TX测试] B-->B3[波特率验证] 10 C-->C1[回环功能测试] 11 C-->C2[缓冲区行为测试] D-->D1[大量数据测试] 12 13 14 E-->E1[帧错误模拟] 15 E-->E2[噪声干扰模拟] 16 F-->F1[端到端测试] 17 F-->F2[长期稳定性测试] 18 完整代码 https://github.com/tianrking/TANGNANo9K_FPGA_TEMPLATE/tree/master/uart _loopback 这个UART回环系统展示了如何在FPGA上实现一个基本但功能完整的串行通信接口。通过模 块化设计、状态机实现和缓冲策略,系统能够可靠地接收和发送数据。该设计不仅演示了UART 协议的基本原理,还展示了FPGA设计中的一些重要概念,如时序控制、资源管理和IO配 置。

FPGA·目录三 下一篇·高云FPGALinux下调制PWM>

原始排版图

FPGA design a UART Loopback System:微信公众号导出原始排版图