Archived
214 lines
5.6 KiB
Verilog
214 lines
5.6 KiB
Verilog
`timescale 1ns / 1ps
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
// Company:
|
|
// Engineer:
|
|
//
|
|
// Create Date: 2022/07/11 15:13:23
|
|
// Design Name:
|
|
// Module Name: GMSK_send
|
|
// Project Name:
|
|
// Target Devices:
|
|
// Tool Versions:
|
|
// Description:
|
|
//
|
|
// Dependencies:
|
|
//
|
|
// Revision:
|
|
// Revision 0.01 - File Created
|
|
// Additional Comments:
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
module GMSK_send(
|
|
input clk_48M ,
|
|
input rst ,
|
|
output [11:0] gmsk_12M_i,
|
|
output [11:0] gmsk_12M_q,
|
|
output [11:0] gmsk_1p5m_i,
|
|
output [11:0] gmsk_1p5m_q
|
|
);
|
|
|
|
wire [17:0] gmsk_send1p5M_I ;
|
|
wire [17:0] gmsk_send1p5M_Q ;
|
|
wire [17:0] gmsk_send12M_I ;
|
|
wire [17:0] gmsk_send12M_Q ;
|
|
//ROM核输出数据 1.5M基带数据
|
|
reg [4:0] cnt_32_data = 5'd0 ;
|
|
reg [10:0] addra_1p5m = 11'd0 ;
|
|
wire data_bio_1p5M;
|
|
reg Rc_nd;
|
|
data_1p5m data_1p5m (
|
|
.clka(clk_48M), // input wire clka
|
|
.ena(1'b1), // input wire ena
|
|
.addra(addra_1p5m), // input wire [10 : 0] addra
|
|
.douta(data_bio_1p5M) // output wire [0 : 0] douta
|
|
);
|
|
|
|
always @(posedge clk_48M)begin
|
|
if(cnt_32_data == 5'd31)begin
|
|
cnt_32_data <= 5'd0;
|
|
addra_1p5m <= addra_1p5m + 11'd1;
|
|
Rc_nd <= 1'b1;
|
|
end
|
|
else begin
|
|
addra_1p5m <= addra_1p5m;
|
|
cnt_32_data <= cnt_32_data + 5'd1;
|
|
Rc_nd <= 1'b0;
|
|
end
|
|
end
|
|
|
|
|
|
//
|
|
reg Rc_data_buff = 0;
|
|
reg Minus_1_Npower = 0;
|
|
always @(posedge clk_48M)begin
|
|
if(Rc_nd)
|
|
Rc_data_buff <= data_bio_1p5M;
|
|
Minus_1_Npower <= !Minus_1_Npower;
|
|
end
|
|
|
|
//预编码
|
|
reg precode_nd = 1'b0 ;
|
|
reg [1:0] precode_data = 2'd0 ;
|
|
always @(posedge clk_48M)begin
|
|
if(Rc_nd)begin
|
|
precode_nd <= 1'b1;
|
|
precode_data <= {data_bio_1p5M ^ Rc_data_buff ^ Minus_1_Npower,1'b1} ;
|
|
end
|
|
else begin
|
|
precode_nd <= 1'b0;
|
|
precode_data <= precode_data;
|
|
end
|
|
end
|
|
|
|
//高斯滤波器基带数据成型
|
|
wire precode_tready_1mp5;
|
|
wire GaussFir_dout_valid_1mp5;
|
|
wire [15:0] GaussFir_dout_1mp5;
|
|
GaussFir_1mp5 GaussFir_1mp5 (
|
|
.aclk(clk_48M), // input wire aclk
|
|
.s_axis_data_tvalid(precode_nd), // input wire s_axis_data_tvalid
|
|
.s_axis_data_tready(precode_tready_1mp5), // output wire s_axis_data_tready
|
|
.s_axis_data_tdata({{6{precode_data[1]}},precode_data}), // input wire [7 : 0] s_axis_data_tdata
|
|
.m_axis_data_tvalid(GaussFir_dout_valid_1mp5), // output wire m_axis_data_tvalid
|
|
.m_axis_data_tdata(GaussFir_dout_1mp5[15:0]) // output wire [15 : 0] m_axis_data_tdata
|
|
);
|
|
|
|
//存储相位地址
|
|
reg signed [15:0] DDS_addra=16'd0;
|
|
always @ (posedge clk_48M) begin
|
|
if(rst)
|
|
DDS_addra[15:0] <= 15'd0;
|
|
else
|
|
DDS_addra[15:0] <= GaussFir_dout_1mp5[15:0];
|
|
end
|
|
|
|
reg [17:0] phase_addr = 18'd0;
|
|
always @ (posedge clk_48M)begin
|
|
phase_addr[17:0] <= phase_addr[17:0] + {{2{DDS_addra[15]}},DDS_addra[15:0]};
|
|
end
|
|
|
|
//相位累积进行基带调制1pm5
|
|
AddrtoWaveform AddrtoWaveform(
|
|
.clk ( clk_48M) ,
|
|
.rst ( rst ) ,
|
|
|
|
.Phase_addr (phase_addr[17:2]) ,
|
|
.Cos_Wave ( gmsk_send1p5M_I[17:0] ),
|
|
.Sin_Wave ( gmsk_send1p5M_Q[17:0] )
|
|
);
|
|
|
|
//ROM核输出数据 12M
|
|
reg [2:0] cnt_4_data = 3'd0;
|
|
reg [10:0] addra_12m = 11'd0;
|
|
wire data_bio_12M;
|
|
reg Rc_nd_12m = 1'b0;
|
|
data_1p5m data_12m (
|
|
.clka(clk_48M), // input wire clka
|
|
.ena(1'b1), // input wire ena
|
|
.addra(addra_12m), // input wire [10 : 0] addra
|
|
.douta(data_bio_12M) // output wire [0 : 0] douta
|
|
);
|
|
always @(posedge clk_48M)begin
|
|
if(cnt_4_data == 3'd3)begin
|
|
cnt_4_data <= 3'd0;
|
|
addra_12m <= addra_12m + 11'd1;
|
|
Rc_nd_12m <= 1'b1;
|
|
end
|
|
else begin
|
|
addra_12m <= addra_12m;
|
|
cnt_4_data <= cnt_4_data + 3'd1;
|
|
Rc_nd_12m <= 1'b0;
|
|
end
|
|
end
|
|
|
|
|
|
reg Rc_data_buff_12m = 0;
|
|
reg Minus_1_Npower_12m = 0;
|
|
always @(posedge clk_48M)begin
|
|
if(Rc_nd_12m)
|
|
Rc_data_buff_12m <= data_bio_12M;
|
|
Minus_1_Npower_12m <= !Minus_1_Npower_12m;
|
|
end
|
|
//预编码
|
|
reg precode_nd_12m = 1'b0 ;
|
|
reg [1:0] precode_data_12m = 2'd0 ;
|
|
|
|
always @(posedge clk_48M)begin
|
|
if(Rc_nd_12m)begin
|
|
precode_nd_12m <= 1'b1;
|
|
precode_data_12m <= {data_bio_12M ^ Rc_data_buff_12m ^ Minus_1_Npower_12m,1'b1};
|
|
end
|
|
else begin
|
|
precode_nd_12m <= 1'b0;
|
|
precode_data_12m <= precode_data_12m;
|
|
end
|
|
end
|
|
|
|
//经过高斯低通滤波器
|
|
wire precode_tready_12m;
|
|
wire GaussFir_dout_valid_12m;
|
|
wire [15:0] GaussFir_dout_12m;
|
|
GaussFir_12m GaussFir_12m(
|
|
.aclk(clk_48M), // input wire aclk
|
|
.s_axis_data_tvalid(precode_nd_12m), // input wire s_axis_data_tvalid
|
|
.s_axis_data_tready(precode_tready_12m), // output wire s_axis_data_tready
|
|
.s_axis_data_tdata({{6{precode_data_12m[1]}},precode_data_12m}), // input wire [7 : 0] s_axis_data_tdata
|
|
.m_axis_data_tvalid(GaussFir_dout_valid_12m), // output wire m_axis_data_tvalid
|
|
.m_axis_data_tdata(GaussFir_dout_12m[15:0]) // output wire [15 : 0] m_axis_data_tdata
|
|
);
|
|
|
|
//相位累积进行基带调制1pm5
|
|
reg signed [15:0] DDS_addra_12M=16'd0;
|
|
always @ (posedge clk_48M) begin
|
|
if(rst)
|
|
DDS_addra_12M[15:0] <= 15'd0;
|
|
else
|
|
DDS_addra_12M[15:0] <= {GaussFir_dout_12m[15:0]};
|
|
end
|
|
|
|
reg [17:0] phase_addr_12M = 18'd0;
|
|
always @ (posedge clk_48M)begin
|
|
phase_addr_12M[17:0] <= phase_addr_12M[17:0] + {{2{DDS_addra_12M[15]}},DDS_addra_12M[15:0]};
|
|
end
|
|
|
|
AddrtoWaveform AddrtoWaveform_12M(
|
|
.clk ( clk_48M) ,
|
|
.rst ( rst ) ,
|
|
|
|
.Phase_addr ( phase_addr_12M[17:2]) ,
|
|
.Cos_Wave ( gmsk_send12M_I[17:0] ),
|
|
.Sin_Wave ( gmsk_send12M_Q[17:0] )
|
|
);
|
|
|
|
//截位输出数据
|
|
assign gmsk_12M_i [11:0] = gmsk_send12M_I [17:6];
|
|
assign gmsk_12M_q [11:0] = gmsk_send12M_Q [17:6];
|
|
assign gmsk_1p5m_i [11:0] = gmsk_send1p5M_I [17:6];
|
|
assign gmsk_1p5m_q [11:0] = gmsk_send1p5M_Q [17:6];
|
|
|
|
|
|
|
|
endmodule
|