用 HLS 实现 UART
介绍
UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。
因此,从概念上讲,这是一个微不足道的项目;然而,它对于对 HLS 感兴趣的人来说是有启发性的。
现在项目定义: 下图显示了项目的简单结构。
我们在 FPGA 中的设计UART发送,每当按下按钮时就会将其发送到计算机上的串口调试助手。
FPGA 板上的八个滑动开关用于输入数据字节(例如字母或符号的 ASCII 代码)。此外,UP 按钮用作发送控制键。
设计很简单,程序本身能接受开发板上拨码开关的数据,然后添加一个“0”起始位和一个“1”停止位,最后以9600 bit/s的波特率发送出去。
首先需要根据开发板上的时钟(本例是100MHz),进行分频,生成串口发送所需的时钟。
booldelay(longlongintn){ staticbooldummy=0; for(longlongintj=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); }
生成速率时钟后,简单的状态机可以将数据发送出去。
voiduart_data_transfer(bool&uart_tx,ap_uint<8>data,boolbaud_rate_clock,boolstart){ staticboolsend_bit=1; staticboolstart_state=0; staticbooltransfer=0; staticunsignedintcount=0; staticintstate=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
+关注
关注
1629文章
21748浏览量
603927 -
计算机
+关注
关注
19文章
7511浏览量
88078 -
uart
+关注
关注
22文章
1237浏览量
101448 -
串行通信
+关注
关注
4文章
576浏览量
35426 -
HLS
+关注
关注
1文章
129浏览量
24136
发布评论请先 登录
相关推荐
评论