碎碎思 · 2023年11月20日

用 HLS 实现 UART

image.png

介绍

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

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

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

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

image.png

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

image.png

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

image.png

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

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);  
}  

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

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 比特流,并验证。

image.png

总结

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

原文:OpenFPGA
作者:碎碎思

相关文章推荐

更多FPGA干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10525
内容数
516
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息