欢迎来到纳米网!
首页 > 公众号文章>正文

FPGA DE23-Lite串口通信详解:UART模块设计与仿真

1开发板串口简介

DE23-Lite开发板提供了一个UART通信接口(物理接口是下图的Type C接口),用户能够通过主机与Agilex 3 FPGA进行串口通信。

272e8206-a643-11f0-8c8f-92fbcf53809c.png

该接口使用DE23-Lite板载的USB Blaster III电路中的FT2232H芯片作为UART转USB的桥梁。将USB线连接到DE23-Lite板的Type-C接口和主机之间,即可启用USB Blaster III和FPGA UART功能,此时无需串行驱动程序,但用户在使用UART功能前需要确保已安装USB Blaster III驱动程序。

2790766e-a643-11f0-8c8f-92fbcf53809c.png

连接USB线后,通常在PC设备管理器中会显示USB Blaster III和一个COM端口号。

27f86828-a643-11f0-8c8f-92fbcf53809c.png

2实验任务

设计一个串口回环实验,实现上位机发送数据给开发板串口,串口接收数据后又通过串口发送给上位机。

284feef4-a643-11f0-8c8f-92fbcf53809c.png

串口时序图如下:

28abb928-a643-11f0-8c8f-92fbcf53809c.png

要求:数据位为8位, 停止位1位,无校验位,波特率115200bps。

3模块设计

DE23-Lite的串口回环设计主要是2个模块:串口发送模块(发送数据时将并行的数据转换成串行数据进行传输)和串口接收模块(在接收数据时将接收到的串行数据转换成并行数据)。

291115a2-a643-11f0-8c8f-92fbcf53809c.png

系统时钟是50MHz,波特率是115200bps,那么串口发送和接收时,数据的每个位将占用50000000/115200 ≈ 434个时钟周期。

在串口接收模块设置一个4状态的状态机:

空闲状态:在空闲状态下,检测起始位(低电平)。一旦检测到起始位,进入START状态,并设置计数器在半位时间后采样,这样可以确保在位的中心点采样,提高抗噪能力。

起始位检测状态:等待半个位周期后,再次检查线路状态。如果仍然是低电平,确认是有效的起始位,进入DATA状态;否则认为是噪声干扰,返回IDLE状态。

数据位接收状态:在每个位周期的中心点采样数据位,并存入移位寄存器。接收完8位数据后,进入STOP状态。

停止位处理状态:等待一个完整的位周期(停止位),然后将接收到的数据输出,并产生一个时钟周期的接收完成信号。

296577fa-a643-11f0-8c8f-92fbcf53809c.png

接收模块工程代码:

moduleuart_rx(
 input clk,
 input rst_n,
 input uart_rx,
 output reg [7:0] rx_data,
 output reg rx_done
);


parameterCLK_FREQ=50000000;
parameterBAUD_RATE=115200;
 
 //波特率计数器
 localparam BAUD_CNT_MAX=CLK_FREQ/BAUD_RATE;
 localparam HALF_BAUD_CNT=BAUD_CNT_MAX/2;
 reg [15:0] baud_cnt;
 
 //状态定义
 localparam IDLE=2'd0;
 localparam START = 2'd1;
 localparam DATA=2'd2;
 localparam STOP = 2'd3;
 
 reg [1:0] state;
 reg [2:0] bit_cnt;
 reg [7:0] rx_reg;
 reg uart_rx_sync1, uart_rx_sync2;
 
 //同步输入信号
always @(posedge clkornegedge rst_n)begin
 if(!rst_n)begin
  uart_rx_sync1

串口发送模块同样设置了一个4状态的状态机:

空闲状态:空闲状态保持高电平。

起始位发送状态:发送起始位,低电平。

数据发送状态:数据位从最低位(LSB)开始发送,这是UART的标准格式。

停止位发送状态:发送停止位,高电平。

29bee39e-a643-11f0-8c8f-92fbcf53809c.png

串口发送模块的工程代码:

module uart_tx(
 input clk,
 input rst_n,
 input tx_start,
 input [7:0] tx_data,
 output reg uart_tx,
 output tx_busy
);


parameterCLK_FREQ =50000000;
parameterBAUD_RATE =115200;
 
  // 波特率计数器
 localparam BAUD_CNT_MAX = CLK_FREQ / BAUD_RATE;
 reg [15:0] baud_cnt;
 wire baud_tick = (baud_cnt ==0);
 
  // 状态定义
 localparam IDLE =2'd0;
 localparam START = 2'd1;
 localparamDATA=2'd2;
 localparam STOP = 2'd3;
 
 reg [1:0] state;
 reg [2:0] bit_cnt;
 reg [7:0] tx_reg;
 
  // 波特率计数器
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
  baud_cnt 

top文件代码要完成的任务是:

只有在检测到接收完成信号的上升沿时才启动发送

只有在发送器不忙时才启动新的发送

实现了接收数据到发送数据的无缝衔接

moduleDE23_Lite_uart(
 input clk,
 input rst_n,
 input uart_rx,
 output uart_tx
);


/* synthesis keep */wire [7:0] rx_data;
 wire rx_done;
 wire rx_done_rise,tx_start;
 wire tx_busy;
 
 // UART接收模块
 uart_rx#(
  .CLK_FREQ(50000000),
  .BAUD_RATE(115200)
  ) uart_rx_inst (
  .clk(clk),
  .rst_n(rst_n),
  .uart_rx(uart_rx),
  .rx_data(rx_data),
  .rx_done(rx_done)
 );
 
 // UART发送模块
 uart_tx#(
  .CLK_FREQ(50000000),
  .BAUD_RATE(115200)
 ) uart_tx_inst (
  .clk(clk),
  .rst_n(rst_n),
  .tx_start(tx_start),
  .tx_data(rx_data),
  .uart_tx(uart_tx),
  .tx_busy(tx_busy)
 );
 
 // 回环控制逻辑
 reg rx_done_reg;
 always @(posedge clkornegedge rst_n)begin
 if(!rst_n) begin
   rx_done_reg 

仿真代码:

`timescale1ns/1ps


module DE23_Lite_uart_tb;


 // 输入
 reg clk;
 reg rst_n;
 reg uart_rx;
 
 // 输出
 wire uart_tx;
 
 // 测试参数
 parameter CLK_PERIOD =20; // 50MHz时钟周期
 parameter BIT_PERIOD =8680;// 115200波特率的位周期(1/115200 ≈ 8.68μs)
 
 // 实例化顶层模块
DE23_Lite_uartuut(
 .clk(clk),
 .rst_n(rst_n),
 .uart_rx(uart_rx),
 .uart_tx(uart_tx)
 );
 
 // 时钟生成
 always begin
  clk =0;
 #(CLK_PERIOD/2);
  clk =1;
 #(CLK_PERIOD/2);
 end
 
 // 测试任务:发送一个字节
 task send_byte;
  input [7:0] data;
  integer i;
  begin
     // 发送起始位
   uart_rx =0;
  #(BIT_PERIOD);    
     // 发送8个数据位
  for(i =0; i 

modelsim仿真波形:

2a24923e-a643-11f0-8c8f-92fbcf53809c.png

可以看到:

第一个波特位时间内,rx先发送低电平起始位,然后发送8bit数据01010101(低位在前,8'h55),最后发送高电平停止位;tx则一直是高电平。

第二个波特位时间内,rx先发送低电平起始位,然后rx发送第二个测试数据10101010(低位在前,8'hAA),最后发送高电平停止位;tx则接收到8bit数据01010101。

第三个波特位时间内,rx先发送低电平起始位,然后rx接收第二个测试数据11110000(低位在前,8'hF0),最后发送高电平停止位;tx则接收到8bit数据10101010。

第四个波特位时间内,rx先发送低电平起始位,然后rx接收第二个测试数据00001111(低位在前,8'h0F),最后发送高电平停止位;tx则接收到8bit数据11110000。

第五个波特位时间内,rx保持高电平;tx则接收到8bit数据00001111。

Quartus版本选择:25.1,具体操作参考文章最新版Quartus Prime Pro 25.1 的安装和使用演示(含Questa仿真)

引脚分配:

2a7c8d5e-a643-11f0-8c8f-92fbcf53809c.png

4下板测试

2ad727c8-a643-11f0-8c8f-92fbcf53809c.png

打开串口工具比如Putty或者是下面截图所示的XCOM,然后按照如下操作去测试:

选择正确的COM口

波特率设置为115200

停止位设置为1位

无校验位

点击打开串口

在发送窗口随便发送数据,可以看到上面接收窗口得到同样的数据显示,表示测试成功。

2b3dcad2-a643-11f0-8c8f-92fbcf53809c.png

原文标题:2-基于FPGA开发板DE23-Lite的串口通信设计 (FT2232H)

文章出处:【微信号:友晶FPGA,微信公众号:友晶FPGA】欢迎添加关注!文章转载请注明出处。

猜你喜欢

  • 艾为电子AW9967FSR:高效升压型WLED驱动芯片详解

    艾为电子AW9967FSR:高效升压型WLED驱动芯片详解

    在消费电子持续追求轻薄化与长续航的当下,背光系统能效成为关键瓶颈。传统方案在轻载场景效率低下,散热性能不足,严重制约设备续航并带来可靠性风险。数模龙头艾为电子推出新一代升压型WLED驱动芯片——AW9967FSR,以科学先进的热管理技术,打造卓越的散热...

    2025-12-01
  • Microchip发布MCP服务器:革新AI驱动的产品数据访问方式

    Microchip发布MCP服务器:革新AI驱动的产品数据访问方式

    该服务器支持跨AI平台获取可信产品信息,简化工作流程、加速设计并提高生产力 为进一步兑现公司为嵌入式工程师开发AI解决方案的承诺,Microchip Technology Inc.(微芯科技公司)今日推出模型语境协议(MCP)服务器。作为AI接口,MCP服务器可直接连接兼容的AI...

    2026-01-23
  • Microchip第22届中国技术精英年会北京站成功闭幕,下一站深圳

    Microchip第22届中国技术精英年会北京站成功闭幕,下一

    Microchip第22届中国技术精英年会(MASTERs)北京站于今日圆满落幕!来自各地的技术专家、行业伙伴和客户齐聚一堂,共同探讨前沿技术与创新应用。活动伊始,Microchip大中华区副总裁Edward Ho先生为本站致开幕词,欢迎各位嘉宾的到来,并分享了对行业发展的展望...

    2026-01-23
  • 国星半导体车规级LED芯片获2025年广东省名优高新技术产品

    国星半导体车规级LED芯片获2025年广东省名优高新技术

    近日,广东省高新技术企业协会正式发布《2025年第二批广东省名优高新技术产品名单》,国星半导体自主研发的车规级LED芯片与垂直LED芯片两大系列产品成功入选。该认定严格围绕技术创新性、质量稳定性、市场成熟度及产业化能力四大维度进行评审,是广东省...

    2025-12-02
  • 云英谷科技荣登2025中国半导体企业影响力百强,专注OLED显示驱动芯片

    云英谷科技荣登2025中国半导体企业影响力百强,专注OLED

    11月14日,世界集成电路协会(WICA)主办的“2025全球半导体市场峰会”在上海成功召开。本次峰会发布了2026全球半导体市场趋势展望暨2025中国半导体企业影响力百强及集成电路新锐企业50强报告。云英谷科技股份有限公司荣登“2025中国半导体企业影响力百...

    2026-01-23
^