基2蝶算模块(fft8)

满眼的管脚线看得眼晕,尤其是在测试的时候,才发现测试对象的思考更纠结。

对于蝶算模块,其功能是由控制器输出4个控制计数,butter_fly在每一个时钟接收一组数。内部设两级缓存交替存储输入,同时计算出结果按原址存到ram里。如下图所示:

对于cmul,每个时钟接收8个数据,异步得出结果。基二的蝶型公式是 A=A+B*Wn, A=A-B*Wn,涉及到小数运算,将小数定标,提高64倍,考虑到溢出,每一步计算之后回退128倍,公式如下:

assign R=(A_r*64 +B_r*wn1a +B_i*wn1b) /128;
assign I=(A_i*64 +B_r*wn2a +B_i*wn2b) /128;



对于bf模块,其作用是控制给cmul的数据传送,如下:

	case(cnt4_buf)
	2'b00:begin TA_r1<=q_r;	TA_i1<=q_i; Twn11<=sin; Twn21<=cos;		A_r<=TA_r2; A_i<=TA_i2; B_r<=TB_r2; B_i<=TB_i2; wn1a<=Twn22; wn1b<=-Twn12; wn2a<=Twn12; wn2b<=Twn22; end
	2'b01:begin TB_r1<=q_r;	TB_i1<=q_i; 							A_r<=TA_r2; A_i<=TA_i2; B_r<=TB_r2; B_i<=TB_i2; wn1a<=-Twn22; wn1b<=Twn12; wn2a<=-Twn12; wn2b<=-Twn22; end	
	2'b10:begin TA_r2<=q_r; TA_i2<=q_i; Twn12<=sin; Twn22<=cos;		A_r<=TA_r1; A_i<=TA_i1; B_r<=TB_r1; B_i<=TB_i1; wn1a<=Twn21; wn1b<=-Twn11; wn2a<=Twn11; wn2b<=Twn21;  end
	2'b11:begin TB_r2<=q_r; TB_i2<=q_i;

 

测试该模块,验证其波形结果:


单独的模块其实是一个基2,2点fft,q_r是输入数据,当输入当别是16,8时,fft结果应该是:24,8。从图中可以看到R作为结果,缩小了1/2,是因为防止溢出时的退位造成的。从而证明模块的正确性。

 

思考:

1.计算时采用符号与直接调用lpm模块性能有什么差异

2.溢出的判断根据最后实际输入数据来调整,实际使用中,若信号并不常处在最大值,就没有必要牺牲精度来换范围。

你可能感兴趣的:(FPGA,fft)