用 HLS 实现 UART
介绍
UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。
因此,从概念上讲,这是一个微不足道的项目;然而,它对于对 HLS 感兴趣的人来说是有启发性的。
现在项目定义: 下图显示了项目的简单结构。
我们在 FPGA 中的设计UART发送,每当按下按钮时就会将其发送到计算机上的串口调试助手。
FPGA 板上的八个滑动开关用于输入数据字节(例如字母或符号的 ASCII 代码)。此外,UP 按钮用作发送控制键。
设计很简单,程序本身能接受开发板上拨码开关的数据,然后添加一个“0”起始位和一个“1”停止位,最后以9600 bit/s的波特率发送出去。
首先需要根据开发板上的时钟(本例是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 比特流,并验证。
总结
很简单的一个实例,大家可以自行和HDL实现的方式进行对比。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !