2发2收模式
将rx_data_frame 转成I1,Q1,I2,Q2四路数据
编写Verilog代码如下
思路:
rx_data_frame7位由最低位RX_FRAME和6位数据位组成
差分RX_FRAME转单端后,
RX_frame为高时,传:
{I1[11:6],Q1[11:6],I1[5:0],Q1[5:0]}
RX_frame为低时,传:
{I2[11:6],Q2[11:6],I2[5:0],Q2[5:0]}
用状态机,定义frame_cnt记八个数,表示传I1高,Q1高,I1低,Q1低,I2高,Q2高,I2低,Q2低
`timescale 1ns / 1ps
//
// Company:
// Engineer:
// 这是缓存数据的程序,响应pps信号。
//
module rx_data(
output [255:0] fifo_wr_data,
output rx_en,
output rx_sign,
input clk_out_24576,
input clk_out_3072,
input clk_out_6144,
input clk_out_12288,
output rx_or_tx,
input res,
input tx_en,
input dma_irq,
input gps_pps,
input fifo_wr_overflow,
output gps_pps_cnt,
input GPIO_O,
output led_signal,
input [6:0] rx_data_frame
);
(*mark_debug = "true"*)reg [2:0] frame_cnt;
//7位rx_data_frame由6位rx_data_usr和最低位rx_frame_usr组成
(*mark_debug = "true"*)wire [6:0] rx_data_frame;
(*mark_debug = "true"*)reg [11:0] i1;
(*mark_debug = "true"*)reg [11:0] i2;
(*mark_debug = "true"*)reg [11:0] q1;
(*mark_debug = "true"*)reg [11:0] q2;
reg wr_en;
reg rd_en;
(*mark_debug = "true"*)reg [7:0] din;
(*mark_debug = "true"*)wire [63:0] dout;
always @( posedge clk_out_24576 or posedge res ) begin
if (res)begin
frame_cnt<=3'b0;
wr_en<=1'b0;
end
else begin
case(rx_data_frame[0:0]) //rx_frame_usr为1时传4个6位数据
//分别为I1高6位、Q1高6位、I1低6位、Q1低6位
1:begin
case(frame_cnt) //0~3
3'b000:begin
frame_cnt <= frame_cnt + 1'b1;
din <= {2'b01,rx_data_frame[6:1]};
wr_en <= 1'b1;
end
3'b001:begin
frame_cnt <= frame_cnt + 1'b1;
din <= {2'b01,rx_data_frame[6:1]};
wr_en <= 1'b1;
end
3'b010:begin
frame_cnt <= frame_cnt + 1'b1;
din <= {2'b01,rx_data_frame[6:1]};
wr_en <= 1'b1;
end
3'b011:begin
frame_cnt <= frame_cnt + 1'b1;
din <= {2'b01,rx_data_frame[6:1]};
wr_en <= 1'b1;
end
default:begin
din <={2'b01,rx_data_frame[6:1]};
frame_cnt <=3'b100;
wr_en <= 1'b1;
end
endcase
end
0:begin //rx_frame_usr为0时传4个6位数据
//分别为I2高6位、Q2高6位、I2低6位、Q2低6位
case(frame_cnt)
3'b100:begin
din <={2'b00,rx_data_frame[6:1]};
frame_cnt <= 1+frame_cnt;
wr_en <= 1'b1;
end
3'b101:begin
din <={2'b00,rx_data_frame[6:1]};
frame_cnt <= 1+frame_cnt;
wr_en <= 1'b1;
end
3'b110:begin
din <={2'b00,rx_data_frame[6:1]};
frame_cnt <=1+frame_cnt;
wr_en <= 1'b1;
end
3'b111:begin
din <={2'b00,rx_data_frame[6:1]};
frame_cnt <=1+frame_cnt;
wr_en <= 1'b1;
end
default:begin
din <={2'b00,rx_data_frame[6:1]};
frame_cnt <=3'b000;
wr_en <= 1'b1;
end
endcase
end
endcase
end
end
wire empty;
wire full;
fifo_6to24 u_fifo_6to24
(
.rst(res), // input wire rst
.wr_clk(clk_out_24576), // input wire wr_clk
.rd_clk(clk_out_3072), // input wire rd_clk
.din(din), // input wire [7 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(~empty), // input wire rd_en
.dout(dout), // output wire [63 : 0] dout
.full(full), // output wire full
.empty(empty) // output wire empty
);
//将FIFO8to64后的dout分解成I1,Q1,I2,Q2
always@(posedge clk_out_3072 or posedge res)begin
if(res)
begin
i1 <= 12'b0;
q1 <= 12'b0;
i2 <= 12'b0;
q2 <= 12'b0;
end
else if(~empty)
begin
i1 <= {dout[61:56],dout[45:40]};
q1 <= {dout[53:48],dout[37:32]};
i2 <= {dout[29:24],dout[13: 8]};
q2 <= {dout[21:16],dout[ 5: 0]};
end
end
endmodule
结果: