1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZZeXl5Zy
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
OFDM是一种多载波调制技术,其基本原理是将高速数据流分成若干个低速数据流,然后分别调制到一组正交的子载波上进行传输。在接收端,通过对各个子载波进行解调,可以恢复出原始的高速数据流。具体地,假设OFDM系统的子载波数量为N,符号周期为Ts,则第k个子载波的频率为fk=k/Ts。
4.部分源码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/27 01:35:32
// Design Name:
// Module Name: TEST_OFDM_tops
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module TEST_OFDM_tops;
reg i_clk;
reg i_rst;
reg i_before_fft1;
reg i_last_fft1;
reg i_enable1;
reg signed[15:0]i_real_dat1;
reg signed[15:0]i_imag_dat1;
wire o_enable_ifft;
wire signed[15:0]o_real_ifft;
wire signed[15:0]o_imag_ifft;
wire o_enable_ifftcp;
wire signed[15:0]o_real_ifftcp;
wire signed[15:0]o_imag_ifftcp;
wire o_enable_fftdcp;
wire signed[15:0]o_real_fftdcp;
wire signed[15:0]o_imag_fftdcp;
wire o_enable_fft;
wire signed[15:0]o_real_fft;
wire signed[15:0]o_imag_fft;
OFDM_tops OFDM_tops_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_before_fft1 (i_before_fft1),
.i_last_fft1 (i_last_fft1),
.i_enable1 (i_enable1),
.i_real_dat1 (i_real_dat1),
.i_imag_dat1 (i_imag_dat1),
.o_start_ifft (),
.o_ends_ifft (),
.o_enable_ifft (o_enable_ifft),
.o_real_ifft (o_real_ifft),
.o_imag_ifft (o_imag_ifft),
.o_start_ifftcp (),
.o_ends_ifftcp (),
.o_enable_ifftcp (o_enable_ifftcp),
.o_real_ifftcp (o_real_ifftcp),
.o_imag_ifftcp (o_imag_ifftcp),
.o_start_fftdcp (),
.o_ends_fftdcp (),
.o_enable_fftdcp (o_enable_fftdcp),
.o_real_fftdcp (o_real_fftdcp),
.o_imag_fftdcp (o_imag_fftdcp),
.o_start_fft (),
.o_ends_fft (),
.o_enable_fft (o_enable_fft),
.o_real_fft (o_real_fft),
.o_imag_fft (o_imag_fft)
);
reg [15:0]cnts;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
cnts <= 16'd0;
i_real_dat1 <= 16'b1111110000000000;
i_imag_dat1 <= 16'b0000001111111111;
end
else begin
if(i_enable1 == 1'b1)
begin
cnts <= cnts+16'd1;
if(cnts>=16'd200 & cnts<=16'd1848)
begin
i_real_dat1 <= ~i_real_dat1;
if (cnts[0]==1'b1)
i_imag_dat1 <= ~i_imag_dat1;
else
i_imag_dat1 <= i_imag_dat1;
end
end
else begin
cnts <= 16'd0;
i_real_dat1 <= 16'b1111110000000000;
i_imag_dat1 <= 16'b0000001111111111;
end
end
end
reg [19:0]cnts2;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
cnts2 <= 20'd0;
i_before_fft1<=1'b0;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
else begin
if(cnts2==20'd25000)
cnts2 <= 20'd0;
else
cnts2 <= cnts2 + 20'd1;
if(cnts2==20'd0)
begin
i_before_fft1<=1'b1;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
if(cnts2==20'd1)
begin
i_before_fft1<=1'b1;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
if(cnts2==20'd2)
begin
i_before_fft1<=1'b1;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
if(cnts2==20'd3)
begin
i_before_fft1<=1'b1;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
if(cnts2==20'd4)
begin
i_before_fft1<=1'b0;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
if(cnts2>=20'd5 & cnts2<=20'd4+2047)
begin
i_before_fft1<=1'b0;
i_enable1 <=1'b1;
i_last_fft1 <=1'b0;
end
if(cnts2==20'd4+2048)
begin
i_before_fft1<=1'b0;
i_enable1 <=1'b1;
i_last_fft1 <=1'b1;
end
if(cnts2>20'd4+2048)
begin
i_before_fft1<=1'b0;
i_enable1 <=1'b0;
i_last_fft1 <=1'b0;
end
end
end
initial
begin
i_clk = 1'b1;
i_rst = 1'b1;
#2000
i_rst = 1'b0;
end
always #10 i_clk=~i_clk;
endmodule
00_053m
---