• 用 HLS 实现 UART


    HLS 实现 UART

    b77ae55d56d1488b65c49e31135b9b25.png

    介绍

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

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

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

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

    b993bb07d6951968fe5842af169f73cb.png

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

    d43c741a402843c097ba7acc3769eaf3.png

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

    9bba272b0516fee47e0ddb1768acd4b4.png

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

    1. bool delay(long long int n) {
    2.   static bool dummy = 0;
    3.   for (long long int j = 0; j < n; j++) {
    4. #pragma HLS pipeline
    5.     dummy = !dummy;
    6.   }
    7.   return dummy;
    8. }
    9. void uart_baudrate_clock(bool &baudrate_clk) {
    10.   static bool s = 0;
    11.   s=!s;
    12.   baudrate_clk = s;
    13.   delay(5208);
    14. }

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

    1. void uart_data_transfer(bool &uart_tx, ap_uint<8> data, bool baud_rate_clock, bool start) {
    2.   static bool send_bit = 1;
    3.   static bool start_state = 0;
    4.   static bool transfer = 0;
    5.   static unsigned int count = 0;
    6.   static int state = 0;
    7.   ap_uint<10> d= ((bool)0b1, (ap_int<8>)data, (bool)0b0);
    8.   if (start == 1 && start_state == 0) {
    9.     transfer = 1;
    10.     start_state = 1;
    11.     count = 0;
    12.   }
    13.   if (start == 0 && start_state == 1) {
    14.     start_state = 0;
    15.   }
    16.   if (baud_rate_clock == 1 && state == 0 && transfer == 1) {
    17.     send_bit = d[count++];
    18.     if (count == 10) {
    19.       transfer = 0;
    20.     }
    21.     state = 1;
    22.   }
    23.   if (baud_rate_clock == 0 && state == 1) {
    24.     state = 0;
    25.   }
    26.   uart_tx = send_bit;
    27. }

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

    cb2dc6bf914980274c8aedc92ece0e79.png

    总结

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

  • 相关阅读:
    【BOOST C++ 10 时间数据】(1)日历日期(11-9)
    嵌入式软件开发常用工具有哪些?
    多线程(二)多线程的锁机制(java)
    java中ioc和aop是什么?【杭州多测师】【杭州多测师_王sir】
    TLS及HTTP2.0指纹的修改实现
    将钉钉机器人小程序从一个公司迁移至另一个公司的步骤
    VR元宇宙的概念|VR体验店加盟|虚拟现实设备销售
    【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现
    链栈的基本操作(c语言实现)
    【LVGL】SquareLine Studio入门基础操作
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/134522427