verlog 语言编写 前访真通过.........
// 1. 无符号--> 有符号
// 2. 正交解调 --> 1. 乘上 cos 2. 乘上SIN
// 3. 正交解调 --> 低通滤波
module Demodulation(input wire clk,
input wire clk_enable,
input wire reset_n,
input wire[9:0] din_data,
output wire[9:0] dout_data
);
//
// 无符号--> 有符号
wire [9:0] SigData;
assign SigData = din_data - 10'd512;
//
// Sig_I = 信号 * cos
// Sig_Q = 信号 * sin
reg[9:0] value_cos;
reg[9:0] value_sin;
reg[1:0] value_num;
always @(posedge clk or negedge reset_n)
begin
if(!reset_n) begin
value_num <= 0;
end else begin
value_num <= value_num + 2'd1;
end
end
always @(posedge clk or negedge reset_n)
begin
if(!reset_n) begin
value_cos <= 1;
end else begin
case (value_num)
00: value_cos <= 1;
01: value_cos <= 0;
10: value_cos <= -1;
11: value_cos <= 0;
endcase
end
end
always @(posedge clk or negedge reset_n)
begin
if(!reset_n) begin
value_sin <= 0;
end else begin
case (value_num)
00: value_sin <= 0;
01: value_sin <= 1;
10: value_sin <= 0;
11: value_sin <= -1;
endcase
end
end
wire [9:0] Sig_I;
wire [9:0] Sig_Q;
assign Sig_I = SigData * value_cos;
assign Sig_Q = SigData * value_sin;
// 对 I Q 信号分别进行低通滤波
wire [9:0] Sig_out_I;
wire [9:0] Sig_out_Q;
LPF_Filter low1( .clk(clk),
.clk_enable(1),
.reset(reset_n),
.filter_din(Sig_I),
.filter_dout(Sig_out_I)
);
LPF_Filter low2( .clk(clk),
.clk_enable(1),
.reset(reset_n),
.filter_din(Sig_Q),
.filter_dout(Sig_out_Q)
);
// 求平方和的平方根
sqrt sq1( .clk(clk),
.clk_enable(1),
.reset_n(reset_n),
.sqrt_x(Sig_out_I),
.sqrt_y(Sig_out_Q),
.out_data(dout_data));
// 进行平滑...似乎不需要
endmodule
// wire [19:0] tmp_x;
// wire [19:0] tmp_y;
// assign tmp_x = sqrt_x[9]?({sqrt_x[9],10'b11111_11111,sqrt_x[8:0]}):({sqrt_x[9],10'b00000_00000,sqrt_x[8:0]});
// assign tmp_y = sqrt_y[9]?({sqrt_y[9],10'b11111_11111,sqrt_y[8:0]}):({sqrt_y[9],10'b00000_00000,sqrt_y[8:0]});
module LPF_Filter( input wire clk,
input wire clk_enable,
input wire reset,
input wire[31:0] DinTick,
output wire[31:0] OutTick,
input wire [9:0] filter_din,
output wire [9:0] filter_dout);
wire [31:0] filter_in;
wire [31:0] filter_out;
assign filter_in = filter_din[9]?({filter_din[9],22'b11_11111_11111_11111_11111,filter_din[8:0]}):({filter_din[9]