基2时间抽取FFT算法verilog代码编写全过程(128点,流水线结构)

说在前面

FPGA新手想锻炼和督促一下自己,记录自己完成自己第一个verilog万行代码的工程的过程,就打算写这篇博客,边写代码边写博客。
对比卡耐基梅隆大学提供的的verilog代码进行优化。
FFT算法是数字信号处理中很常用的一个算法,但是奈何Xlinx的IP核无法满足我导师高速的要求,所以我打算编写一个流水线结构的128点FFT算法。整个代码将分为7级。介绍就不多说了,还要忙着写代码呢。

第一级:倒序排列

由于我采用基2时间抽取的算法,所以第一步开始时,我们需要将输入数据进行倒序排列,这里说的倒序是编号的倒序排列,由于verilog是硬件描述语言,根本就不存在什么数组类型,所以我们就直接使用映射的关系,用matlab完成倒序代码的编写,再移植到verilog代码中去。
matlab代码编写完成以后发现,不关心底层的matlab代码在处理二进制数时真的不方便,还是C语言香。
以下是代码v1.0,并没有实现verilog代码的编写。对于verilog代码的编写,我还需要思考以下我verilog的结构,毕竟工程量很大,不好维护就完蛋了
top函数

clc;
close all;
clear;

point_num=128;                                                  %输入的点数-1=编号
in_data=  (0 : point_num-1)';                                	%输入数据数组
out_data=step1(in_data,point_num);
%使用以下代码批量生成代码
for i=1:128
disp("   assign  out_data_"+in_data(i)+" = in_data_"+out_data(i)+";");
end

step1函数

function [out_data] = step1(in_data,point_num)
%   步骤1
%  
    out_data=zeros(point_num,1);             %输出数据数组

for t=1:point_num-2                          %由于matlab索引只能是正整数所以,并且倒序排列时第一号元素和最后一号元素位置不变。 
    i=dec2bin(t,7);                          %十进制转二进制        
    j=bin2dec( fliplr(i) );                  %倒序并且转换为十进制
    out_data(j+1)=in_data(t+1);              %数组元素赋值
end  
    out_data(1)=in_data(1);
    out_data(point_num)=in_data(point_num);
end


你可能感兴趣的:(基2时间抽取FFT算法verilog代码编写全过程(128点,流水线结构))