请完整描述如何用vivado2018.3实现一个8位FFT运算器从工程建立到仿真实现的全过程
时间: 2024-03-06 11:48:34 浏览: 156
下面是一个使用 Vivado 2018.3 实现一个 8 位 FFT 运算器的全过程:
1. 创建 Vivado 工程
打开 Vivado 2018.3,点击 "Create Project" 创建一个新的工程,输入工程名和工程路径,选择 RTL 项目类型,选择一个默认的工程目录,然后点击 "Next"。
在 "Add Sources" 步骤中,选择 "Create File",输入文件名和文件路径,选择 Verilog 文件类型,然后点击 "Finish"。在弹出的对话框中,选择 "Add to Project",然后点击 "OK"。
在 "Add Constraints" 步骤中,选择 "Create File",输入文件名和文件路径,选择 XDC 文件类型,然后点击 "Finish"。在弹出的对话框中,选择 "Add to Project",然后点击 "OK"。
在 "Default Part" 步骤中,选择你所使用的 FPGA 型号,然后点击 "Next"。
在 "New Project Summary" 步骤中,确认工程信息,然后点击 "Finish"。
2. 编写 FFT 运算器代码
在 Vivado 中,我们可以使用 IP 核实现 FFT 运算器,也可以手动编写 FFT 运算器的 Verilog 代码。下面是一个手动编写 8 位 FFT 运算器的 Verilog 代码示例:
```verilog
module fft_8(input clk,
input rst,
input signed [7:0] din_real,
input signed [7:0] din_imag,
output reg signed [7:0] dout_real,
output reg signed [7:0] dout_imag);
parameter N = 8;
// 定义旋转因子
complex signed [7:0] w[N/2];
// 定义蝴蝶运算
task butterfly;
input signed [7:0] x_real;
input signed [7:0] x_imag;
input signed [7:0] y_real;
input signed [7:0] y_imag;
output reg signed [7:0] out_real;
output reg signed [7:0] out_imag;
input signed [7:0] wr_real;
input signed [7:0] wr_imag;
begin
out_real = x_real + y_real * wr_real - y_imag * wr_imag;
out_imag = x_imag + y_real * wr_imag + y_imag * wr_real;
end
endtask
// 初始化旋转因子
initial begin
for (int i = 0; i < N/2; i++) begin
w[i] = exp(-2 * $realtime * i * $clog2(N) / N);
end
end
// FFT 运算
always @(posedge clk) begin
if (rst) begin
dout_real <= 0;
dout_imag <= 0;
end
else begin
complex signed [7:0] x[N];
complex signed [7:0] y[N];
// 输入数据重排
for (int i = 0; i < N; i++) begin
x[i] = {din_real, din_imag};
end
for (int i = 0; i < N; i += 2) begin
y[i/2] = x[i];
y[i/2 + N/2] = x[i+1];
end
// 蝴蝶运算
for (int i = 0; i < N/2; i++) begin
butterfly(y[i].real, y[i].imag, y[i+N/2].real, y[i+N/2].imag, y[i].real, y[i].imag, w[i].real, w[i].imag);
end
// 输出数据重排
for (int i = 0; i < N; i += 2) begin
dout_real <= y[i].real;
dout_imag <= y[i].imag;
end
end
end
endmodule
```
以上代码中,我们手动编写了一个 8 位 FFT 运算器,使用了 Verilog 的复杂数类型 `complex signed [7:0]`。在 `initial` 块中,我们初始化了旋转因子 `w`,在 `always` 块中,我们实现了 FFT 运算的主要逻辑,包括输入数据重排、蝴蝶运算和输出数据重排。
3. 添加测试代码
为了测试 FFT 运算器的功能,我们需要添加一些测试代码。下面是一个简单的测试代码示例:
```verilog
module fft_8_tb;
// 定义时钟和复位信号
reg clk;
reg rst;
// 定义输入和输出信号
reg signed [7:0] din_real;
reg signed [7:0] din_imag;
wire signed [7:0] dout_real;
wire signed [7:0] dout_imag;
// 实例化被测试的模块
fft_8 dut(
.clk(clk),
.rst(rst),
.din_real(din_real),
.din_imag(din_imag),
.dout_real(dout_real),
.dout_imag(dout_imag)
);
// 时钟生成器
always #10 clk = ~clk;
// 复位信号生成器
initial begin
rst = 1;
#100;
rst = 0;
end
// 输入数据生成器
initial begin
din_real = 8'sb00000001;
din_imag = 8'sb00000000;
#10;
din_real = 8'sb00000000;
din_imag = 8'sb00000001;
#10;
din_real = 8'sb00000001;
din_imag = 8'sb00000001;
#10;
din_real = 8'sb11111111;
din_imag = 8'sb11111111;
#10;
end
// 输出数据检查
always @(posedge clk) begin
case (dout_real)
8'sb00000001: $display("FFT result is correct!");
default: $display("FFT result is incorrect!");
endcase
end
endmodule
```
以上代码中,我们定义了时钟信号 `clk` 和复位信号 `rst`,以及输入信号 `din_real` 和 `din_imag`,以及输出信号 `dout_real` 和 `dout_imag`。我们将被测试的模块 `fft_8` 实例化为 `dut`,并将输入和输出信号连接到 `dut` 的输入输出端口上。
在测试代码中,我们使用了一个简单的时钟生成器和复位信号生成器,以及一个输入数据生成器,生成了一些输入数据用于测试。在输出数据检查部分,我们通过检查 `dout_real` 的值是否等于 `8'sb00000001` 来判断 FFT 运算的结果是否正确。
4. 运行仿真
在 Vivado 中,我们可以使用仿真工具验证我们的设计是否正确。在此之前,我们需要进行一些设置。
首先,我们需要设置仿真工具。在 Vivado 的主界面上,点击 "Open Simulator" 打开仿真工具。然后,选择 "Xsim" 仿真器,并选择 "Create New Simulation Set"。在弹出的对话框中,输入仿真集名称和仿真文件路径,然后点击 "OK"。
接下来,我们需要设置仿真波形。在仿真工具界面上,点击 "Add Waveform" 添加一个新的波形,然后选择我们要仿真的信号,包括时钟信号 `clk`,复位信号 `rst`,输入信号 `din_real` 和 `din_imag`,以及输出信号 `dout_real` 和 `dout_imag`。
最后,我们可以运行仿真。在仿真工具界面上,点击 "Run Simulation" 开始仿真。在仿真过程中,我们可以观察信号的波形,以确定设计是否正确。
5. 生成比特流文件
当我们确认设计正确无误后,我们就可以生成比特流文件,用于烧录到 FPGA 中运行。在 Vivado 中,我们可以使用 "Generate Bitstream" 工具生成比特流文件。
在 Vivado 的主界面上,点击 "Generate Bitstream",然后选择 "Open Implemented Design"。在弹出的对话框中,选择 "Yes",然后点击 "OK"。在比特流生成完成后,可以在 "Project Manager" 界面上的 "Generated Sources" 中找到生成的比特流文件。
6. 烧录到 FPGA 中运行
最后,我们需要将生成的比特流文件烧录到 FPGA 中运行。这个过程可以使用 Vivado 中的烧录工具完成。具体步骤如下:
- 连接 FPGA 开发板和计算机,并将开发板设置为烧录模式;
- 在 Vivado 的主界面上,选择 "Open Hardware Manager";
- 在 "Hardware Manager" 界面上,点击 "Open Target",选择连接的 FPGA 开发板;
- 在 "Hardware Manager" 界面上,点击 "Program Device",选择生成的比特流文件,然后开始烧录;
- 等待烧录完成后,可以使用开发板上的 LED 灯等外设验证 FFT 运算器的功能。
以上就是使用 Vivado 2018.3 实现一个 8 位 FFT 运算器的全过程。需要注意的是,实际设计过程中需要根据具体情况进行调整,比如根据实际需求选择不同的 FFT 算法、数据位宽等等。
阅读全文