FFT IP核的设置
这里做最简单的设置,打开Vivado,点开IP Catalog,找到FFT IP核。设置界面如下:
Configuration 设置
设置的参数意义如下:
- Numbers of Channels: 通道数,FFT IP核可以设置多个数据通道,进行多路FFT操作
- Transform Length: 传输的数据长度,就是FFT中的点数,决定输出的频谱分辨率
- Architecture Configuration:如果Architecture Choice选择Automatically Select,IP核会根据你填的时钟频率和数据吞吐量选择适合的架构
Implementation
设置的参数意义如下:
- Data Format: 数据格式,定点数或浮点数,浮点数不能使用多个通道同时进行FFT操作
- Scaling Options: 对输出的数据进行等比例缩小,如果选Scaled,则在控制IP核时需要设置缩小比例,详情见: 资料1
- Input Data Width:输入数据位宽,这里只用输入I,Q一路的位宽,不需要输入组合起来的位宽
- Phase Factor Width:因为进行FFT 操作涉及乘加操作,肯定会有精度损失,这里可以设置一个合适的值平衡精度和面积的要求。
- 控制信号:时钟使能跟复位信号,复位信号拉低最少要保持两个时钟周期。
- Output Ordering: Natural Order输出的频谱数据还要做fftshift,这个跟fft算法流程有关系
- Optional Output Fields: 输出的索引信号和overflow信号,勾选后这些信息会跟频谱数据一起输出
Detail Implementation
直接默认跳过。
IP核生成后可以看到有很多信号,这些信号代表的意义又是怎么样的。可以在IP核设置界面的左侧Implementation Detail看到下图内容
从图中可以看出:
- Output Data Width: 输出数据的位宽,当然也是I,Q一路信号的位宽
- S_AXIS_DATA_TDATA: 这是把时域信号往FFT IP核传输的数据通道,通过图中可以看到,57:32传输Q路信号,25:0传输I路信号。
- S_AXIS_CONFIG_TDATA: 这是对FFT IP核设置参数内容;图中很明显告知,16:1传输SCALE_SCH信号,这个信号决定输出的数据等比例缩小多少倍,具体参数设置可以看: 资料1的内容;0位传输的控制信号,为1时IP核做FFT运算,为0时做IFFT运算。
- M_AXIS_DATA_TDATA: 这是FFT输出的频谱数据,从图中可以看到,57:32对应的是虚部数据,25:0对应的是实部数据。
- M_AXIS_DATA_TUSER: 这个信号根据图中可知,传输的是输出频谱的索引,有一定的作用。这里输出的具体内容根据上述的FFT IP核设置决定
大概的运算时间
这些信号其实都是AXI4-Stream的相关信号
AXI4-Stream协议
除了AXI4-Lite的信号,AXI4-Stream还增加了以下信号:
- TKEEP:指示信号,指明当前数据数据类型,发送数据方控制该信号;为低电平表明对应字节数据是空字节,可以移除;与TSTRB一同发挥作用,两个信号都是可选非必需信号
当去掉TKEEP信号,TKEEP视作全高电平
当去掉TSTRB信号,TSTRB的值等同TKEEP
两个信号都被选择后作用如下图:
- TLAST:指示信号,指明当前是最后一次数据传输,发送数据方控制该信号;只有在最后一次数据传输时该信号会拉高一次,信号一直拉高表明数据都是独立的而不是来自同一个数据包,可选非必需信号;
发送方(Master)不要求一定要支持该信号
接受方(Slave)的该信号固定为低电平
- TID: 指示信号,指明当前数据流的ID,标明不同的数据流,发送数据方控制该信号,可选非必需信号,内容见TLAST;
- TDEST:指示信号,提供数据流的路由信息,发送数据方控制该信号,可选非必需信号,内容见TLAST;
- TUSER:可以自定义的数据信息,发送方跟接收方协商好,数据内容根据双方协商确定,起传输辅助信息内容,发送数据方控制该信号,并且跟随发送方的数据流一同发送,双方的TUSER数据位宽确定规则如下:
MIN(MAX[TUSER bits per byte of masters], MAX[TUSER bits per byte of slaves])
- TREADY,TDATA也是可选非必需信号;去掉TREADY信号,TREADY视作为高电平;去掉TDATA,TSTRB也被视作去掉
而在FFT IP核中,一共出现了下列信号:
- s_axis_data: FFT IP核的时域数据输入通道,这个传输过程中,FFT IP核作为接收方(Slave)
- s_axis_config: FFT IP核的配置数据输入通道,这个传输过程中,FFT IP核作为接收方(Slave)
- m_axis_data: FFT IP核的频谱数据输出通道,这个传输过程中,FFT IP核作为发送方(Master)
而且,s_axis_config只使用了TDATA,TREADY,TVALID; s_axis_data使用了TDATA,TREADY,TVALID, TLAST; m_axis_data使用TDATA,TREADY,TVALID, TLAST, TUSER;相对来说控制并不复杂;
FFT IP核的控制流程如下:
- 配置好s_axis_config_tdata, s_axis_config_tready跟s_axis_config_tvalid握手(都为高)后,配置数据传入;
- 等待s_axis_data_tready和s_axis_data_tvalid拉高,通过s_axis_data_tdata传入数据至FFT IP核,等到最后一次数据传输,同时拉高s_axis_data_tlast;
- 等待m_axis_data_tvalid和m_axis_data_tready拉高,接收m_axis_data_tdata的数据,m_axis_data_tuser的数据是频谱数据的索引,根据这个索引可以知道当前频谱数据的位置;等到m_axis_data_tlast拉高,数据传输结束。
最终结果图: