FPGA 矩阵转置

1 功能

通过tb读取本地数据保存到FIFO,通过coe文件将转置后的地址数据保存在ROM中,读取FIFO的文件作为输入,读取ROM作为地址。通过地址变换,对矩阵进行转置,最终将转置后的矩阵保存在RAM中。

2 开发环境

Vivado

3 框架

在这里插入图片描述
包含IP:FIFO、RAM和ROM

4 转置公式

来源见 Reference
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 Simulation

在这里插入图片描述

第一部分

通过tb将数据写到FIFO中,此部分数据为两路(1:32)*32。
这里的数据也就是转置前的数据,每行从1增长到32,总共32行。

第二部分

从FIFO中读取数据。
从ROM中读取地址,此地址为转置后的地址。
将FIFO中的数据按ROM中的地址写入到RAM中。

第三部分

读取RAM,可以从波形上看到转置的效果。
本来每行是1到32逐渐增加,现在每行为1到32中的一个数。
转置成功!

6 Matlab代码

产生FIFO数据

%% export to bin file

% specifying a signed, fixed-point data type, rounding towards negative infinity, and saturate on overflow.
struct.mode = 'fixed'; 
struct.roundmode = 'floor'; 
struct.overflowmode = 'saturate'; 
struct.format = [8 0];    % 8位二进制数,0位小数,默认1位符号位
q=quantizer(struct);

miu1_real = zeros(32,32);
for i = 1:32
    miu1_real(:,i) = i;
end
miu1_imag = miu1_real;

% 量化值与实际值的误差
q_miu1_real = quantize(q,miu1_real);
q_miu1_imag = quantize(q,miu1_imag);
disp("最大量化误差");
disp(max(max([abs(miu1_real-q_miu1_real),abs(miu1_imag-q_miu1_imag)])));

% 按行转为列向量
real_o = num2bin(q, reshape(miu1_real', [], 1));
imag_o = num2bin(q, reshape(miu1_imag', [], 1));
% 按列转为列向量
% real_o = num2bin(q,miu1_real(:)); 
% imag_o = num2bin(q,miu1_imag(:)); 

%% 将数据写入TXT
fid1=fopen('F:\MyTest\FPGA\IPFFT2\IPFFT2.srcs\sources_1\script/real_order.txt','wt');
fid2=fopen('F:\MyTest\FPGA\IPFFT2\IPFFT2.srcs\sources_1\script/imag_order.txt','wt');

for i=1:32*32
    fwrite(fid1,real_o(i,:));
    fprintf(fid1,'\n');
    fwrite(fid2,imag_o(i,:));
    fprintf(fid2,'\n');
end
fclose(fid1);
fclose(fid2);

数据
在这里插入图片描述
imag_order内容一致

产生转置矩阵

close all; clear; clc
%% 生成方阵
a = 1:32*32;
a_exp = reshape(a, 32, 32);
a_exp = a_exp';
disp(a_exp);
%% 产生转置系数
m = 32;
n = 32;
% addr = (i-1)*n+j;
addr = 1:32*32;
% disp(addr);
i = floor((addr-1)/n) + 1;
j = mod((addr-1),n) + 1;
addr_t = (j-1)*m+i;
addr_t = addr_t-1;  %0开始
%% 利用转置系数对方阵进行转置
b = zeros(1, 32*32);
for i = 1:32*32
    b(i) = a(addr_t(i)+1);
end
b_shrink = reshape(b, 32, 32);
b_shrink = b_shrink';
disp(
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值