块级接口综合类型
- 在 Vitis HLS(High-Level Synthesis)中,块级接口类型用于指定模块的控制信号和通信方式,从而影响硬件实现时的控制逻辑、时序以及数据传输方式。Vitis HLS 使用以下接口类型
ap_ctrl_none,ap_ctrl_hs,ap_ctrl_chain 和s_axilite
来指定 RTL IP 是否使用模块级握手信号实现。
- 注:默认情况下,block-level interface protocol 被添加到 design中。且块级接口的端口格式为ap_ctrl_hs。
块级:可以在函数或函数返回上指定块级 I/O 协议
- 如果 C/C++ 代码未返回值,您仍然可以在函数返回时指定块级 I/O 协议。如果 C/C++ 代码使用函数返回,则 Vitis HLS 会为返回值创建一个输出端口 ap_return。
ap_ctrl_none(No Control)
-
ap_ctrl_none
是一种不带握手信号的控制方式,通常用于不需要显式同步控制信号的设计场景。模块之间的数据流通常是基于时序控制的,在这种模式下,控制信号的依赖关系相对较少或不存在。 -
适用场景:无需复杂控制信号,设计中可能只是简单的模块调用。
-
工作原理:不涉及复杂的握手或数据同步信号,控制信号可能是基于时钟的触发,或者是一次性数据传输。
代码效果
// LED控制函数
void hlsv1(ap_uint<1> &led) {
#pragma HLS INTERFACE ap_ctrl_none port=return
}
⇓ \Downarrow ⇓
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="hlsv1_hlsv1,hls_ip_2020_2,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z010-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=0.000000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=0,HLS_VERSION=2020_2}" *)
module hlsv1 (
led
);
input [511:0] led;
endmodule //hlsv1
ap_ctrl_hs (Handshaking Control)
-
ap_ctrl_hs
模式是基于握手信号的控制方式,通常用于数据流的处理。在这种模式下,模块会通过握手信号来实现数据的同步传输。它是最常见的流式数据处理方式,特别适用于流水线设计和数据流控制。 -
握手信号:
- 控制块何时可以开始处理数据 (ap_start)
- 指示模块是空闲,非处理数据阶段 (ap_idle)
- 指示准备好接受新输入 (ap_ready)
- 模块已完成操作 (ap_done)
-
使用场景:适用于需要数据同步或流水线控制的设计。图像处理、音频信号处理等流式数据处理任务。例如,一个模块的输出端如果准备好给下游模块传输数据时,它会通过
valid
信号通知下游模块;下游模块通过ready
信号确认可以接受数据。
代码效果
// LED控制函数
void hlsv1(ap_uint<1> &led) {
#pragma HLS INTERFACE ap_ctrl_hs port=return
}
⇓ \Downarrow ⇓
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="hlsv1_hlsv1,hls_ip_2020_2,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z010-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=0.000000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=0,HLS_VERSION=2020_2}" *)
module hlsv1 (
ap_start,
ap_done,
ap_idle,
ap_ready,
led
);
input ap_start;
output ap_done;
output ap_idle;
output ap_ready;
input [511:0