AD9361收数 LVDS接口

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

结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值