【3.5】固定旋转因子系数乘法模块的FPGA实现1——45°旋转因子和高阶蝶形修正因子

目录

1.引言

2.FFT旋转因子核心系数

[2.1 45°旋转因子](#2.1 45°旋转因子)

[2.2 高阶蝶形修正因子参数](#2.2 高阶蝶形修正因子参数)


1.引言

由于FFT16顶层一共例化了4个专用常数复数乘法子模块,全部是定点复数旋转因子乘法器,专为16点/256点FFT蝶形运算定制,无通用乘法,全部为固定系数常数乘,节省FPGA资源。

2.FFT旋转因子核心系数

2.1 45°旋转因子

FFT旋转因子核心系数:

上述公式用于FFT中45°旋转因子的乘法运算,其负责FFT蝶形中√2/2衰减+45°相位旋转运算。

因此,我们通过verilog编写如下的程序,完成这个部分的复数运算:

module MPUC707 ( CLK,EI ,ED, MPYJ,DR,DI ,DOR ,DOI);

parameter nb=10;

input CLK ;

wire CLK ;

input EI ; //slowdown

wire EI ;

input ED; //data strobe

input MPYJ ; //the result is multiplied by -j

wire MPYJ ;

input nb-1:0 DR ;

wire signed nb-1:0 DR ;

input nb-1:0 DI ;

wire signed nb-1:0 DI ;

output nb-1:0 DOR ;

reg nb-1:0 DOR ;

output nb-1:0 DOI ;

reg nb-1:0 DOI ;

reg signed nb+1 :0 dx5;

reg signed nb : 0 dt;

reg signed nb-1 : 0 dii;

wire signed nb+2 : 0 dx5p;

wire signed nb+3 : 0 dot;

reg edd,edd2, edd3; //delayed data enable impulse

reg mpyjd,mpyjd2,mpyjd3;

reg nb-1:0 doo ;

reg nb-1:0 droo ;

always @(posedge CLK)

begin

if (EI) begin

edd<=ED;

edd2<=edd;

edd3<=edd2;

mpyjd<=MPYJ;

mpyjd2<=mpyjd;

mpyjd3<=mpyjd2;

if (ED) begin

dx5<=DR+(DR <<2); //multiply by 5

dt<=DR;

dii<=DI;

end

else begin

dx5<=dii+(dii <<2); //multiply by 5

dt<=dii;

end

doo<=(dot >>>4) ;

droo<=doo;

if (edd3)

if (mpyjd3) begin

DOR<=doo;

DOI<= - droo; end

else begin

DOR<=droo;

DOI<= doo; end

end

end

assign dx5p=(dx5<<1)+(dx5>>>2); // multiply by 101101

`ifdef FFT256bitwidth_coef_high

assign dot= dx5p+(dt>>>4)+(dx5>>>13); // multiply by 10110101000000101

`else

assign dot= dx5p+(dt>>>4) ; // multiply by 10110101

`endif

endmodule

上面程序中,把0.7071分解成(5×2+5/4+1/16)/16≈0.70703125

2.2 高阶蝶形修正因子参数

在FFT中,对应16点FFT细分旋转因子:

那么,0.924-0.383=0.541,即16点FFT八分区细分角度合成系数,用于高阶蝶形修正。

因此,我们通过verilog编写如下的程序,完成这个部分的复数运算:

module MPUC541 ( CLK,EI ,ED, MPYJ,DR,DI ,DOR ,DOI);

parameter nb=10;

input CLK ;

wire CLK ;

input EI ;

wire EI ;

input ED; //data strobe

input MPYJ ; //the result is multiplied by -j

wire MPYJ ;

input nb-1:0 DR ;

wire signed nb-1:0 DR ;

input nb-1:0 DI ;

wire signed nb-1:0 DI ;

output nb-1:0 DOR ;

reg nb-1:0 DOR ;

output nb-1:0 DOI ;

reg nb-1:0 DOI ;

reg signed nb :0 dx5;

reg signed nb :0 dx3;

reg signed nb-1 :0 dii;

reg signed nb-1 : 0 dt;

wire signed nb+1 : 0 dx5p;

wire signed nb+1 : 0 dot;

reg edd,edd2, edd3; //delayed data enable impulse

reg mpyjd,mpyjd2,mpyjd3;

reg nb-1:0 doo ;

reg nb-1:0 droo ;

always @(posedge CLK)

begin

if (EI) begin

edd<=ED;

edd2<=edd;

edd3<=edd2;

mpyjd<=MPYJ;

mpyjd2<=mpyjd;

mpyjd3<=mpyjd2;

if (ED) begin // 0_1000_1010_1000_11

dx5<=DR+(DR >>>2); //multiply by 5

dx3<=DR+(DR >>>1); //multiply by 3,

dt<=DR;

dii<=DI;

end

else begin

dx5<=dii+(dii >>>2); //multiply by 5

dx3<=dii +(dii >>>1); //multiply by 3

dt<=dii;

end

doo<=dot >>>2;

droo<=doo;

if (edd3)

if (mpyjd3) begin

DOR<=doo;

DOI<= - droo; end

else begin

DOR<=droo;

DOI<= doo; end

end

end

assign dx5p=(dt<<1)+(dx5>>>3); // multiply by 0_1000_101

`ifdef FFT256bitwidth_coef_high

assign dot= (dx5p+(dt>>>7) +(dx3>>>11));// multiply by // 0_1000_1010_1000_11

`else

assign dot= dx5p+(dt>>>7);

`endif

endmodule

在上述程序中,0.5411的二进制移位运算方式如下:

0.5411 ≈ 0.5410

=2.1640625/4

=(2 + 0.15625 + 0.0078125)/4

=(2 + 1.25/8 + 1/128)/4

相关推荐
FPGA小迷弟18 小时前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
NamoAmitabha12818 小时前
CPU 内部结构是什么?---deepseek
fpga开发
abc light19 小时前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
156082072191 天前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot1 天前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長2 天前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟2 天前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav2 天前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
szxinmai主板定制专家2 天前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
女神下凡2 天前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范