AMD/Xilinx Versal - Insert AI Engine into your custom PL design and take it to hardware in 15 min

AMD/Xilinx Versal - Insert AI Engine into your custom PL design and take it to hardware in 15 min

AMD/Xilinx Versal - Insert AI Engine into your custom PL design and take it to hardware in 15 min

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

`timescale 1ns/ 1ps





module axis_adder(

input aclk,

input resetn,



/*

 (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TID" *)

  // Uncomment the following to set interface specific parameter on the bus interface.

  //  (* X_INTERFACE_PARAMETER = "CLK_DOMAIN <value>,PHASE <value>,FREQ_HZ <value>,LAYERED_METADATA <value>,HAS_TLAST <value>,HAS_TKEEP <value>,HAS_TSTRB <value>,HAS_TREADY <value>,TUSER_WIDTH <value>,TID_WIDTH <value>,TDEST_WIDTH <value>,TDATA_NUM_BYTES <value>" *)

  input [<left_bound>:0] <s_tid>, // Transfer ID tag (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TDEST" *)

  input [<left_bound>:0] <s_tdest>, // Transfer Destination (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TDATA" *)

  input [<left_bound>:0] <s_tdata>, // Transfer Data (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TSTRB" *)

  input [<left_bound>:0] <s_tstrb>, // Transfer Data Byte Strobes (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TKEEP" *)

  input [<left_bound>:0] <s_tkeep>, // Transfer Null Byte Indicators (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TLAST" *)

  input <s_tlast>, // Packet Boundary Indicator (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TUSER" *)

  input [<left_bound>:0] <s_tuser>, // Transfer user sideband (optional)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TVALID" *)

  input <s_tvalid>, // Transfer valid (required)

  (* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 <interface_name> TREADY" *)

  output <s_tready>, // Transfer ready (optional)

  */

  

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis1 TVALID" *) input s_axis1_tvalid,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis1 TREADY" *) output s_axis1_tready,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis1 TDATA" *)  input signed[15:0] s_axis1_tdata,



(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis2 TVALID" *) input s_axis2_tvalid,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis2 TREADY" *) output s_axis2_tready,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 s_axis2 TDATA" *)  input signed[15:0] s_axis2_tdata,



(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 m_axis TVALID" *) output m_axis_tvalid,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 m_axis TREADY" *) input m_axis_tready,

(* X_INTERFACE_INFO = "xilinx.com:interface:axis:1.0 m_axis TDATA" *)  output signed[15:0] m_axis_tdata



);





assign m_axis_tvalid = s_axis1_tvalid && s_axis2_tvalid;

assign s_axis1_tready = m_axis_tready;

assign s_axis2_tready = m_axis_tready;



assign m_axis_tdata = s_axis1_tdata + s_axis2_tdata;



endmodule

在这里插入图片描述
在这里插入图片描述


platform setup

axi 列表里的port都是 bd里边没有的编号, 也不用在bd里边手动增加这些编号的port

#include "graph.h"

fir_filter uut;

int main(int argc, char ** argv)
{
	uut.init();
	uut.run();
	uut.end();
	return 0;
}

//

#pragma once

#include <adf.h>
#include "fir_sr_sym_graph.hpp"

using namespace adf;

#define TT_DATA int16
#define TT_COEF int16
#define TP_FIR_LEN 33
#define TP_SHIFT 15
#define TP_RND 0
#define TP_INPUT_WINDOW_VSIZE 512

class fir_filter : public graph
{
	private:
		std::vector<TT_COEF> m_taps_v = std::vector<TT_COEF>{
			-12,  -147,  -153,  -84,  121,  377, 505, 321,
			-220, -921, -1356, -1040, 304, 2537,5076,7089,
			7856
		};

		xf::dsp::aie::fir::sr_sym::fir_sr_sym_graph
		<   TT_DATA,
			TT_COEF,
			TP_FIR_LEN,
			TP_SHIFT,
			TP_RND,
			TP_INPUT_WINDOW_VSIZE
		> fir_kernel;

	public:
		input_plio in;
		output_plio out;

		fir_filter() : fir_kernel(m_taps_v)
		{
			in = input_plio::create("DataIn1", plio_64_bits, "data/input.txt");
			out = output_plio::create("DataOut1", plio_64_bits, "data/output.txt");

			auto kernels = fir_kernel.getKernels();
			adf::runtime<adf::ratio>(kernels[0])= 0.99;

			connect<>(in.out[0], fir_kernel.in);
			connect<>(fir_kernel.out, out.in[0]);
			//connect<>(in.out[0], fir_kernel.in[0]);
			//connect<>(fir_kernel.out[0], out.in[0]);
			//connect<>(in.out[0], kernels[0].in[0]);
			//connect<>(kernels[0].out[0], out.in[0]);
		};
};

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值