HLS高层次综合设计技巧--UART_TX接收模块设计案例

设计一:

#include "ap_int.h"

#define DATA_WIDTH 8

void uart_tx(

ap_uint<DATA_WIDTH> s_axis_tdata, // AXI Stream 数据

ap_uint<1> s_axis_tvalid, // AXI Stream 有效

ap_uint<1> &s_axis_tready, // AXI Stream 就绪

ap_uint<1> &txd, // UART 发送

ap_uint<1> &busy, // 忙标志

ap_uint<16> prescale // 波特率分频因子(每个位周期 = prescale * 8 个时钟)

) {

#pragma HLS INTERFACE ap_none port=s_axis_tdata

#pragma HLS INTERFACE ap_none port=s_axis_tvalid

#pragma HLS INTERFACE ap_none port=s_axis_tready

#pragma HLS INTERFACE ap_none port=txd

#pragma HLS INTERFACE ap_none port=busy

#pragma HLS INTERFACE ap_none port=prescale

#pragma HLS INTERFACE ap_ctrl_none port=return

static ap_uint<1> s_axis_tready_reg = 0;

static ap_uint<1> txd_reg = 1;

static ap_uint<1> busy_reg = 0;

static ap_uint<DATA_WIDTH+1> data_reg = 0;

static ap_uint<19> prescale_reg = 0; // 支持 prescale<<3

static ap_uint<4> bit_cnt = 0;

// 组合输出

s_axis_tready = s_axis_tready_reg;

txd = txd_reg;

busy = busy_reg;

if (prescale_reg > 0) {

// 位周期计数中

s_axis_tready_reg = 0;

prescale_reg = prescale_reg - 1;

} else if (bit_cnt == 0) {

s_axis_tready_reg = 1;

busy_reg = 0;

if (s_axis_tvalid) {

s_axis_tready_reg = 0;

prescale_reg = (prescale << 3) - 1;

bit_cnt = DATA_WIDTH + 1;

data_reg = (1 << DATA_WIDTH) | s_axis_tdata;

txd_reg = 0;

busy_reg = 1;

}

} else {

if (bit_cnt > 1) {

bit_cnt = bit_cnt - 1;

prescale_reg = (prescale << 3) - 1;

txd_reg = data_reg0;

data_reg = data_reg >> 1;

} else if (bit_cnt == 1) {

// 发送停止位

bit_cnt = bit_cnt - 1;

prescale_reg = prescale << 3;

txd_reg = 1;

}

}

}

设计二:

#include <hls_stream.h>

#include <ap_int.h>

#define DATA_WIDTH 8

void uart_tx(

hls::stream<ap_uint<DATA_WIDTH> >& s_axis, // AXI4-Stream 输入(数据)

ap_uint<1> &txd, // UART 发送线

ap_uint<1> &busy, // 忙标志

ap_uint<16> prescale // 波特率分频因子(每个位周期 = prescale * 8 个时钟)

) {

#pragma HLS INTERFACE axis port=s_axis

#pragma HLS INTERFACE ap_none port=txd

#pragma HLS INTERFACE ap_none port=busy

#pragma HLS INTERFACE ap_none port=prescale

#pragma HLS INTERFACE ap_ctrl_none port=return

static ap_uint<1> txd_reg = 1;

static ap_uint<1> busy_reg = 0;

static ap_uint<DATA_WIDTH+1> data_reg = 0;

static ap_uint<19> prescale_reg = 0;

static ap_uint<4> bit_cnt = 0;

txd = txd_reg;

busy = busy_reg;

if (prescale_reg > 0) {

prescale_reg = prescale_reg - 1;

} else if (bit_cnt == 0) {

busy_reg = 0;

txd_reg = 1;

ap_uint<DATA_WIDTH> rx_data;

if (s_axis.read_nb(rx_data)) {

prescale_reg = (prescale << 3) - 1;

bit_cnt = DATA_WIDTH + 1;

data_reg = (1 << DATA_WIDTH) | rx_data;

txd_reg = 0;

busy_reg = 1;

}

} else {

if (bit_cnt > 1) {

bit_cnt = bit_cnt - 1;

prescale_reg = (prescale << 3) - 1;

txd_reg = data_reg0;

data_reg = data_reg >> 1;

} else if (bit_cnt == 1) {

bit_cnt = bit_cnt - 1;

prescale_reg = prescale << 3;

txd_reg = 1;

}

}

}

相关推荐
Autumn_ing1 分钟前
Pixso AI 如何按团队设计规范生成 UI?以消息设置页说明选库与验收
人工智能·ui·设计规范·pixso
ccbw162 分钟前
从一颗录音豆说起:AI会议转写的端侧方案与选型
人工智能·接口隔离原则·码率·采集
QXWZ_IA10 分钟前
低空经济下电力无人机巡检定位的能力演进与应用趋势
人工智能·安全
田里的水稻13 分钟前
FA_CNN卷积神经网络二十四---层\块\参数管理PyTorch
人工智能·pytorch·cnn
AiNightVision17 分钟前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
Java后端的Ai之路26 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
Flynn Liang42 分钟前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
飞猫的边缘AI1 小时前
边缘AI芯片的规则变了:从跑CNN到跑LLM和VLM
人工智能·语言模型·cnn·transformer·边缘ai
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
牧羊人.3331 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn