FPGA 矩阵转置

您所在的位置:网站首页 矩阵转置的代码是什么 FPGA 矩阵转置

FPGA 矩阵转置

2023-08-07 06:53| 来源: 网络整理| 查看: 265

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference

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(b_shrink); %% 生成coe N = 32*32; fid = fopen('F:\MyTest\FPGA\IPFFT2\IPFFT2.srcs\sources_1\script/tran_matrix_para_1024.coe','wt'); %- standard format fprintf( fid, 'memory_initialization_radix = 10;\n'); fprintf( fid, 'memory_initialization_vector =\n'); %- write data in coe file for i = 1:1:N if(i == N) fprintf(fid,'%d;',addr_t(i)); else fprintf(fid,'%d,\n',addr_t(i)); end end fclose(fid);

数据 在这里插入图片描述

7 HDL 仿真文件 module tb_ip_fft2; reg clk; reg rst_n; reg [7:0] data_real [1023:0]; reg [7:0] data_imag [1023:0]; reg [7:0] dati_in; reg [7:0] datq_in; wire [15:0] fifo_din; reg [9:0] count=0; integer i; initial begin clk=1; rst_n=0; dati_in=0; datq_in=0; // (1:32)*32 $readmemb("F:/MyTest/FPGA/IPFFT2/IPFFT2.srcs/sources_1/script/real_order.txt",data_real); $readmemb("F:/MyTest/FPGA/IPFFT2/IPFFT2.srcs/sources_1/script/imag_order.txt",data_imag); // for(i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3