Learn ZYNQ (7)
矩阵相乘的例子
参考博客:http://blog.csdn.net/kkk584520/article/details/18812321
MatrixMultiply.c
typedef int data_type;#define N 5void MatrixMultiply(data_type AA[N*N],data_type bb[N],data_type cc[N]){int i,j;for(i = 0;i<N;i++){data_type sum = 0;for(j = 0;j<N;j++){sum += AA[i*N+j]*bb[j];}cc[i] = sum;}}
修改后:
#include <ap_cint.h>
typedef uint15 data_type;#define N 5void MatrixMultiply(data_type AA[N*N],data_type bb[N],data_type cc[N]){int i,j;MatrixMultiply_label2:for(i = 0;i<N;i++){data_type sum = 0;MatrixMultiply_label1:for(j = 0;j<N;j++){sum += AA[i*N+j]*bb[j];}cc[i] = sum;}}
测试文件:TestMatrixMultiply.c:
#include <stdio.h>
#include <ap_cint.h>
typedef uint15 data_type;
#define N 5
const data_type MatrixA[] = {#include "a.h"
};
const data_type Vector_b[] = {#include "b.h"
};
const data_type MatlabResult_c[] = {#include "c.h"
};
data_type HLS_Result_c[N] = {0};
void CheckResult(data_type * matlab_result,data_type * your_result);int main(void)
{int i;printf("Checking Results:\r\n");MatrixMultiply(MatrixA,Vector_b,HLS_Result_c);CheckResult(MatlabResult_c,HLS_Result_c);return 0;
}
void CheckResult(data_type * matlab_result,data_type * your_result)
{int i;for(i = 0;i<N;i++){printf("Idx %d: Error = %d \r\n",i,matlab_result[i]-your_result[i]);}
}
a.h
{82}, {10}, {16}, {15}, {66},
{91}, {28}, {98}, {43}, {4},
{13}, {55}, {96}, {92}, {85},
{92}, {96}, {49}, {80}, {94},
{64}, {97}, {81}, {96}, {68}
b.h
{76},
{75},
{40},
{66},
{18}
c.h
{9800},
{15846},
{16555},
{23124},
{22939}
ip核顶层:
module test_multiply_v1_0 #(// Users to add parameters here// User parameters ends// Do not modify the parameters beyond this line// Parameters of Axi Slave Bus Interface S00_AXISparameter integer C_S00_AXIS_TDATA_WIDTH = 32,// Parameters of Axi Master Bus Interface M00_AXISparameter integer C_M00_AXIS_TDATA_WIDTH = 32,parameter integer C_M00_AXIS_START_COUNT = 32)(// Users to add ports here// User ports ends// Do not modify the ports beyond this line// Ports of Axi Slave Bus Interface S00_AXISinput wire s00_axis_aclk,input wire s00_axis_aresetn,output wire s00_axis_tready,input wire [C_S00_AXIS_TDATA_WIDTH-1 : 0] s00_axis_tdata,input wire [(C_S00_AXIS_TDATA_WIDTH/8)-1 : 0] s00_axis_tstrb,input wire s00_axis_tlast,input wire s00_axis_tvalid,// Ports of Axi Master Bus Interface M00_AXISinput wire m00_axis_aclk,input wire m00_axis_aresetn,output wire m00_axis_tvalid,output wire [C_M00_AXIS_TDATA_WIDTH-1 : 0] m00_axis_tdata,output wire [(C_M00_AXIS_TDATA_WIDTH/8)-1 : 0] m00_axis_tstrb,output wire m00_axis_tlast,input wire m00_axis_tready);
// Instantiation of Axi Bus Interface S00_AXIS// Add user logic heremy_stream_ip my_stream_ip_v1_0_S01_AXIS_inst (.ACLK(s00_axis_aclk),.ARESETN(s00_axis_aresetn),.S_AXIS_TREADY(s00_axis_tready),.S_AXIS_TDATA(s00_axis_tdata),.S_AXIS_TLAST(s00_axis_tlast),.S_AXIS_TVALID(s00_axis_tvalid),.M_AXIS_TVALID(m00_axis_tvalid),.M_AXIS_TDATA(m00_axis_tdata),.M_AXIS_TLAST(m00_axis_tlast),.M_AXIS_TREADY(m00_axis_tready)); // User logic endsendmodule
ip核:(未完成)
`timescale 1ns / 1ps
module my_stream_ip ( ACLK, ARESETN, S_AXIS_TREADY, S_AXIS_TDATA, S_AXIS_TLAST, S_AXIS_TVALID, M_AXIS_TVALID, M_AXIS_TDATA, M_AXIS_TLAST, M_AXIS_TREADY, ); input ACLK;
input ARESETN;
output S_AXIS_TREADY;
input [31 :0] S_AXIS_TDATA;
input S_AXIS_TLAST;
input S_AXIS_TVALID;
output M_AXIS_TVALID;
output [31 :0] M_AXIS_TDATA;
output M_AXIS_TLAST;
input M_AXIS_TREADY; localparam NUMBER_OF_INPUT_WORDS = 30; localparam NUMBER_OF_OUTPUT_WORDS = 30; localparam Idle =3'b100; localparam Read_Inputs = 3'b010; localparam Write_Outputs = 3'b001; localparam Wait_Calculate = 3'b000;//my add//send...reg start2;reg reset2;//get...wire done2;wire idle2;wire ready2;//data reg [31:0] AA [0:29];reg [31:0] bb [0:4];wire [31:0] cc [0:4];wire cc_val [0:4];reg [31:0] AA_index;reg [31:0] bb_index;reg [31:0] cc_index;reg [2:0] state; reg [31:0] sum; reg [NUMBER_OF_INPUT_WORDS -1:0] nr_of_reads; reg [NUMBER_OF_OUTPUT_WORDS - 1:0] nr_of_writes; assign S_AXIS_TREADY =(state == Read_Inputs); assign M_AXIS_TVALID = (state == Write_Outputs); assign M_AXIS_TDATA = sum; assign M_AXIS_TLAST = (nr_of_writes == 1); always @(posedge ACLK) begin // process The_SW_accelerator if(!ARESETN) // Synchronous reset (active low) begin state <= Idle; nr_of_reads <= 0; nr_of_writes <=0; sum <= 0; AA_index <= 0;bb_index <= 0;reset2 <= 1;start2 <= 0;end else case (state) Idle: if (S_AXIS_TVALID== 1) begin state <= Read_Inputs; nr_of_reads <= NUMBER_OF_INPUT_WORDS - 1; sum <= 0; end Read_Inputs: if(S_AXIS_TVALID == 1) begin if(nr_of_reads >= 5)beginAA[AA_index] <= S_AXIS_TDATA;AA_index <= AA_index + 1;endelsebeginbb[bb_index] <= S_AXIS_TDATA;bb_index <= bb_index + 1;endif (nr_of_reads == 0) begin state <= Write_Outputs; reset2 <= 0;start2 <= 1;nr_of_writes <= NUMBER_OF_OUTPUT_WORDS - 1; end else nr_of_reads <= nr_of_reads - 1; end Wait_Calculate:if(done2 == 0)beginsum <= cc[0];state <= Write_Outputs;endWrite_Outputs: if(M_AXIS_TREADY == 1) begin if (nr_of_writes == 0) state <= Idle; else sum <= done2;nr_of_writes <= nr_of_writes - 1; end endcase end MatrixMultiply U1 (.ap_clk(S_AXI_ACLK),.ap_rst(reset2),.ap_start(start2),.ap_done(done2),.ap_idle(idle2),.ap_ready(ready2),.AA_0(AA[0]),.AA_1(AA[1]),.AA_2(AA[2]),.AA_3(AA[3]),.AA_4(AA[4]),.AA_5(AA[5]),.AA_6(AA[6]),.AA_7(AA[7]),.AA_8(AA[8]),.AA_9(AA[9]),.AA_10(AA[10]),.AA_11(AA[11]),.AA_12(AA[12]),.AA_13(AA[13]),.AA_14(AA[14]),.AA_15(AA[15]),.AA_16(AA[16]),.AA_17(AA[17]),.AA_18(AA[18]),.AA_19(AA[19]),.AA_20(AA[20]),.AA_21(AA[21]),.AA_22(AA[22]),.AA_23(AA[23]),.AA_24(AA[24]),.bb_0(bb[0]),.bb_1(bb[1]),.bb_2(bb[2]),.bb_3(bb[3]),.bb_4(bb[4]),.cc_0(cc[0]),.cc_0_ap_vld(cc_val[0]),.cc_1(cc[1]),.cc_1_ap_vld(cc_val[1]),.cc_2(cc[2]),.cc_2_ap_vld(cc_val[2]),.cc_3(cc[3]),.cc_3_ap_vld(cc_val[3]),.cc_4(cc[4]),.cc_4_ap_vld(cc_val[4]));
endmodule
ip核引用的为HLS从c语言生成的verylog代码。
转载于:https://www.cnblogs.com/shenerguang/p/3797144.html
Learn ZYNQ (7)相关推荐
- 【Kaggle Learn】Python 1-4
[Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...
- Xilinx Zynq FPGA Boards板
Xilinx Zynq FPGA Boards板 Xilinx Zynq FPGA Boards 介绍 Styx是一个易于使用的Zynq开发模块,具有Xilinx的Zynq ZC7020 SoC和FT ...
- Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender.免费下载和免费用于任何 ...
- Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)
要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...
- Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#
游戏开发变得容易了.使用Unity学习C#并创建您自己的3D平台! 你会学到什么 学习现代通用编程语言C#. 了解Unity中3D开发的功能 发展强大的可转移的解决问题的技能 了解游戏开发过程 了解面 ...
- 学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:48场讲座(6h 38m) |大小解压后:2.8 G ...
- Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity MP4 |视频:h264,1280x720 |音频:A ...
- Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...
- 利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
一.前言 利用FPGA设计算法一直以来都是热点,同样也是难点.将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期.Xilinx公司的sysGen(sys ...
- linux zynq ps dma,Zynq PS侧DMA驱动
Linux中,驱动必然会有驱动对应的设备类型.在linux4.4版本中,其设备是以设备树的形式展现的. PS端设备树的devicetree表示如下 324 dmac_s: dmac@f8003000 ...
最新文章
- wps图表xy轴颠倒_还在嫌自己的图表丑?50+种可视化图表随你选
- 被英特尔“冷落”的Knights Mill 悄然发布了
- linux下内存测试mbw,【转帖】MBW内存测试
- J2EE dynamic web工程搭建 struts2
- python if else用法同一行_在Python的同一行中使用if else for和del吗?-问答-阿里云开发者社区-阿里云...
- 输入挂(bzoj 2901: 矩阵求和)
- ubuntu下的vim与ctags
- 在Python中从头开始模拟退火
- Echarts教程篇:概览
- “出色”IT项目经理的5大关键能力
- JAVA_OPTS设置详解
- 代写php代码作业,C++代写 CS 100 Project Two代做php实验作业
- Java如何解决模糊查询(数据库SQL语句,报表开发工具)
- Java自由虾旅行平台菜单功能
- EMAC和PHY层之间的关系以及在通信架构划分情况
- .NET Interop 互操作 COM+
- 近视眼用什么台灯比较好?防近视眼护眼台灯排名
- 查询IP信息接口罗列
- 鹰眸安全帽识别系统对施工现场管理水平的提升
- 中兴c300业务板_中兴OLT C300板卡添加