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;

}

}

}

相关推荐
IT_Octopus4 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148115 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
LiuPig刘皮哥5 小时前
2026年开源3D陪玩对比:xiaoke.ai、AIRI、Open-LLM-VTuber、Amica 有什么、没有什么
人工智能·3d·开源
西柚小萌新5 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
Luminbox紫创测控5 小时前
车载LiDAR强光测试的实验设计方法与数据分析
人工智能·数据挖掘·数据分析·车载系统·安全性测试·太阳光模拟器
Navigator_Z6 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy6 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
硅谷秋水6 小时前
CommitFlow:面向长时程机器人操作 VLA 执行的语义承诺验证与局部修正
机器学习·计算机视觉·语言模型·机器人
建筑工程企业管理系统6 小时前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化
唠点键盘之外的6 小时前
27 存量系统接大模型:旁挂一个 AI 微服务,老架构一行不改
人工智能·微服务·架构