• 用 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实现的方式进行对比。

  • 相关阅读:
    linux驱动开发 使用设备树编写一个led驱动程序
    CSDN编程竞赛第四期 及部分解题思路及参赛经历分享
    技术分享 | 静态扫描体系集成
    golang的切片使用总结一
    安全狗云原生安全能力全面亮相全球数字经济大会暨ISC互联网安全大会
    sklearn学习笔记之线性回归
    HTML静态网页成品作业(HTML+CSS)—— 香奈儿香水介绍网页(1个页面)
    上海数字经济 “十四五” | 原生信仰者听见的历史潮流轰鸣声
    Unity的碰撞检测(二)
    计算机二级WPS 选择题(模拟和解析五)
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/134522427