- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用Vivado-HLS实现浮点复数矩阵分解-XilinxForums
使用Vivado-HLS实现浮点复数矩阵分解
George Wang – Xilinx DSP Specialist
浮点具有更大的数据动态范围,从而在很多算法中只需要一种数据类型的优势。
本文介绍如何使用Vivado-HLS实现浮点复数矩阵分解。使用HLS可以快速,高
效地实现各种矩阵分解算法,极大地提高生产效率, 降低开发者的算法FPGA
实现难度。
1. 矩阵分解算法简介
矩阵分解是将一个矩阵A分解成Q与R相乘,
其中R是个上三角矩阵, Q是个正交矩阵,
Q = 1
是Q的转置共轭矩阵
2. 矩阵分解Vivado-HLS实现c++代码构架
矩阵分解由顶层matrix_dcmp.cpp,下面调用cal_core.cpp, coef_cal.cpp及浮点
加,减,乘,除法等子函数。
void matrix_dcmp
(
cf_t in_u[(R_DIM+Y_DIM)/DIV_NUM][DIV_NUM],
cf_t pd_err_in,
float lamda,
float lamda_sqrt,
float diag[R_DIM],
cf_t r[R_DIM][X_DIM],
cf_t p[R_DIM]
)
{
coef_cal(lamda_sqrt,lamda,diag[i],pre_in_u,pd_err_in,s_o,s_conj_o,la
mda_sqrtxs_o,c_o,lamda_sqrtxc_o,diag_out,p_o,pd_err);
cal_core(u_tmp, r_tmp, s_n, i, j, k, c_o, lamda_sqrtxc_o, lamda_sqrtxs_o,
s_conj_o, in_u_w2, r[i][r_addr]);
}
void coef_calc
(
float lamda_sqrt,
float lamda,
float r_diag,
cf_t u_diag,
cf_t pd_err_in,
cf_t *s,
cf_t *s_conj,
cf_t *lamda_sqrtxs,
float *c,
float *lamda_sqrtxc,
float *diag,
cf_t *p_o,
cf_t *pd_err
)
void calc_core
(
cf_t in_u,
cf_t r,
int s_n,
int i,
unsigned char j,
unsigned char k,
float c_o,
float lamda_sqrtxc_o,
cf_t lamda_sqrtxs_o,
cf_t s_conj_o,
cf_t* u_ret,
cf_t* r_ret
)
Vivado-HLS生成的RTL代码在默认情况下保留原有c代码的层次结构,在构建c
代码层次时,可以采用由上至下,从下至上相结合的模块划分方式。对基本的浮
点运算如加,减,乘,除,平方根等写成最底层的子函数,并对其加pipeline,甚
至对输出打一拍register以获得更好的时序性能。如下例:
template class T T reg(T x) {
#pragma HLS inline self off
#pragma HLS interface ap_none register port=return
return x;
}
cf_t mult( cf_t in1, cf_t in2 ) {
#pragma HLS PIPELINE
cf_t out;
float in1_re_in2_re, in1_im_in2_im, in1_re_in2_im, in1_im_in2_re;
in1_re_in2_re = hfmult(in1.re,in2.re);
i
原创力文档


文档评论(0)