Комплексное накопление чисел с плавающей запятой Vivado IP core Функция с плавающей запятой быстро реализует добавление нескольких данных
предисловие
В FPGA часто предусмотрено накопление чисел с плавающей запятой.Простое сложение двух или двух займет много тактов.Очень удобно обнаружить, что IP-ядро с плавающей запятой, предоставляемое xilinx, имеет функцию накопления ., может сэкономить много тактов. В прошлый раз долго искал в интернете, не нашел конфигурацию ядра аккумулирования IP, поэтому планирую записывать процесс работы ядра аккумулирования IP.
Совет:Далее текст этой статьи,все оригиналы самого автора.Написать статью не просто.Надеюсь вы прикрепите ссылку на эту статью при репосте.
1. Этапы настройки ядра IP с плавающей запятой
Рисунок выше является объяснением конфигурации этих цифр Причина их настройки заключается в том, что это IP-ядро не накапливает числа с плавающей запятой напрямую, а преобразует их в числа с фиксированной запятой, а затем преобразует их обратно в числа с плавающей запятой. после завершения накопления. На картинке сказано, что вы можете настроить количество цифр, которые он рекомендует накапливать.Хотя есть процесс преобразования в числа с фиксированной запятой, он такой же, как и использование для накопления чисел с плавающей запятой одинарной точности. То есть, когда количество цифр достигает определенного требования, точность может быть полностью гарантирована. Здесь я не настроил количество бит так высоко, если конфигурация слишком высока, это потребует много ресурсов DSP.
2. Моделирование
1. Код верхнего уровня
код показывает, как показано ниже:
`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/15 19:55:41
// Design Name:
// Module Name: complex_accumulator_ip
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module complex_accumulator_ip(
input clk ,
input valid ,//执行加法有效信号
input [ 31:0] re_a ,//复数a的实部
input [ 31:0] im_a ,//复数a的虚部
input last ,//累加最后一个数据标志信号
output res_valid ,//结果有效信号
output res_last ,//全部数据累加完标志信号
output [ 31:0] re_res ,//运算结果实部
output [ 31:0] im_res //运算结果虚部
);
float_accumulator_ip u1_float_accumulator_ip( //实部累加
.aclk (clk ),
.s_axis_a_tvalid (valid ),
.s_axis_a_tdata (re_a ),
.s_axis_a_tlast (last ),
.m_axis_result_tvalid (res_valid ),
.m_axis_result_tdata (re_res ),
.m_axis_result_tlast (res_last )
);
float_accumulator_ip u2_float_accumulator_ip( //虚部累加
.aclk (clk ),
.s_axis_a_tvalid (valid ),
.s_axis_a_tdata (im_a ),
.s_axis_a_tlast (last ),
.m_axis_result_tvalid ( ),
.m_axis_result_tdata (im_res ),
.m_axis_result_tlast ( )
);
endmodule
2. Код моделирования
код показывает, как показано ниже:
`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/15 19:56:43
// Design Name:
// Module Name: complex_accumulator_ip_tb
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module complex_accumulator_ip_tb();
reg clk ;
reg valid ;
reg [ 31:0] re_a ;
reg [ 31:0] im_a ;
reg last ;
wire [ 31:0] re_res ;
wire [ 31:0] im_res ;
wire res_valid ;
wire res_last ;
always #1 clk=!clk;
initial begin clk=0;valid=0;last=0;re_a=0;im_a=0;
#1 last=0;
#2 re_a=32'b00111111100000000000000000000000; //1
im_a=32'b00111111100000000000000000000000; //1
valid=1;
#2 re_a=32'b01000000000000000000000000000000; //2
im_a=32'b01000000000000000000000000000000; //2
#2 re_a=32'b01000000010000000000000000000000; //3
im_a=32'b01000000010000000000000000000000; //3
last=1;
#2 last=0;valid=0;
//#3 valid=0;
end
complex_accumulator_ip u1_complex_accumulator_ip(
.clk (clk ),
.last (last ),
.valid (valid ),//执行加法有效信号
.re_a (re_a ),//复数a的实部
.im_a (im_a ),//复数a的虚部
.re_res (re_res ),//运算结果实部
.im_res (im_res ),//运算结果虚部
.res_valid (res_valid ),
.res_last (res_last )
);
endmodule
3. Анализ результатов моделирования
Результаты моделирования представлены на рисунке.Видно , что модуль успешно реализует накопление 3-х комплексных чисел с плавающей запятой, а задержка вывода результата составляет 26 тактов, что согласуется с задержкой предыдущего ИП конфигурация ядра.
Подведем итог
Это то, о чем я хочу поговорить сегодня. В этой статье только кратко рассказывается, как использовать IP-ядро для быстрой реализации базовой операции сложного накопления чисел с плавающей запятой. Если вы хотите использовать его для завершения большего накопления данных, у вас есть изменить код или разобраться в работе самостоятельно. Напишите код.