用 HLS 实现 UART

用 HLS 实现 UART

介绍

UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。

因此,从概念上讲,这是一个微不足道的项目;然而,它对于对 HLS 感兴趣的人来说是有启发性的。

现在项目定义: 下图显示了项目的简单结构。

我们在 FPGA 中的设计UART发送,每当按下按钮时就会将其发送到计算机上的串口调试助手。

FPGA 板上的八个滑动开关用于输入数据字节(例如字母或符号的 ASCII 代码)。此外,UP 按钮用作发送控制键。

设计很简单,程序本身能接受开发板上拨码开关的数据,然后添加一个"0"起始位和一个"1"停止位,最后以9600 bit/s的波特率发送出去。

首先需要根据开发板上的时钟(本例是100MHz),进行分频,生成串口发送所需的时钟。

go 复制代码
bool delay(long long int n) {
  static bool dummy = 0;
  for (long long int j = 0; j < n; j++) {
#pragma HLS pipeline
    dummy = !dummy;
  }
  return dummy;
}
void uart_baudrate_clock(bool &baudrate_clk) {
  static bool s = 0;
  s=!s;
  baudrate_clk = s;
  delay(5208);
}

生成速率时钟后,简单的状态机可以将数据发送出去。

go 复制代码
void uart_data_transfer(bool &uart_tx, ap_uint<8> data, bool baud_rate_clock, bool start) {
  static bool send_bit = 1;
  static bool start_state = 0;
  static bool transfer = 0;
  static unsigned int count = 0;
  static int state = 0;
  ap_uint<10> d= ((bool)0b1, (ap_int<8>)data, (bool)0b0);
  if (start == 1 && start_state == 0) {
    transfer = 1;
    start_state = 1;
    count = 0;
  }
  if (start == 0 && start_state == 1) {
    start_state = 0;
  }
  if (baud_rate_clock == 1 && state == 0 && transfer == 1) {
    send_bit = d[count++];
    if (count == 10) {
      transfer = 0;
    }
    state = 1;
  }
  if (baud_rate_clock == 0 && state == 1) {
    state = 0;
  }
  uart_tx = send_bit;
}

将这些代码综合到 RTL 模块后,我们可以创建 Vivado 项目并生成 FPGA 比特流,并验证。

总结

很简单的一个实例,大家可以自行和HDL实现的方式进行对比。

相关推荐
FPGA小徐20 小时前
数字IC/FPGA设计基础_ILA原理与使用
fpga开发
FPGA小徐1 天前
FPGA 部署 YOLO 完整指南:从模型量化到 Zynq PS+PL 硬件加速
yolo·fpga开发
dadaobusi1 天前
学习:chiesel,scala
学习·fpga开发·scala
爱吃汽的小橘1 天前
异步FIFO核心揭秘:格雷码与指针同步
fpga开发
璞致电子1 天前
基于 P201Pro | 接收端基础知识——Costas环锁定后为何仍会错?DQPSK与前导码相位校正(6)
经验分享·fpga开发·ad9361·软件无线电·sdr·qpsk·pzsdr
璞致电子2 天前
基于 AD9361 (PZSDR‑P201Pro) 软件无线电实战综述:从板卡选型、硬件平台升级到 GNU Radio QPSK 完整收发链路
经验分享·嵌入式硬件·fpga开发·软件无线电·sdr·璞致电子
炎龙铠甲会合体2 天前
从 SPEC 到上板:在 Zynq-7020 上用 RTL 手写一个 YOLO 卷积加速器(完整教程)
yolo·fpga开发·axi·芯片验证
FPGA小徐2 天前
Vivado 按键消抖与复位模块代码修复详解:KEY_TOP、key、rst_gen 完整实战
fpga开发
炎龙铠甲会合体2 天前
AXI2ICACHE— AXI4-Full 四路组相联指令 Cache 设计与 UVM 验证
fpga开发·面试·芯片验证
bingcheby2 天前
FMQL15/20/45 (复旦微青龙系列 PSOC)新手使用说明
fpga开发