aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x300/capture_ddrlvds.v
blob: 193caf6e12aff753f7e24cc7b2f8055aba5e87ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//
// Copyright 2011 Ettus Research LLC
//




module capture_ddrlvds
  #(parameter WIDTH=7,
    parameter X300=0)
   (input clk,
    input reset,
    input ssclk_p,
    input ssclk_n,
    input [WIDTH-1:0] in_p,
    input [WIDTH-1:0] in_n,
    output [(2*WIDTH)-1:0] out);

   wire [WIDTH-1:0] 	   ddr_dat;
   wire 		   ssclk;
   wire [(2*WIDTH)-1:0]    out_pre1;
   wire 		   ssclk_bufio1, ssclk_bufio2, ssclk_bufr, ssclk_bufmr;

   IBUFGDS #(.DIFF_TERM("TRUE"))
   clkbuf (.O(ssclk), .I(ssclk_p), .IB(ssclk_n));

   BUFMR clkbufmr (
		   .I(ssclk),
		   .O(ssclk_bufmr)
		   );

   BUFIO clkbufio1 (
		    .I(ssclk_bufmr),
		    .O(ssclk_bufio1)
		   );
   BUFIO clkbufio2 (
		    .I(ssclk_bufmr),
		    .O(ssclk_bufio2)
		    );

   BUFR
     #(.SIM_DEVICE("7SERIES"),
       .BUFR_DIVIDE("BYPASS"))
   clkbufr (
	    .I(ssclk_bufmr),
	    .O(ssclk_bufr)
	    );


   genvar 		   i;

   generate
      for(i = 0; i < WIDTH; i = i + 1)
	begin : gen_lvds_pins
	   if ((i == 10) && (X300 == 1)) begin
	      IBUFDS #(.DIFF_TERM("FALSE")) ibufds
		(.O(ddr_dat[i]), .I(in_p[i]), .IB(in_n[i]) );
	      IDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED")) iddr
		(.Q1(out_pre1[2*i]), .Q2(out_pre1[(2*i)+1]), .C(ssclk_bufio2),
		 .CE(1'b1), .D(ddr_dat[i]), .R(1'b0), .S(1'b0));
	   end else begin
	      IBUFDS #(.DIFF_TERM("TRUE")) ibufds
		(.O(ddr_dat[i]), .I(in_p[i]), .IB(in_n[i]) );
	      IDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED")) iddr
		(.Q1(out_pre1[2*i]), .Q2(out_pre1[(2*i)+1]), .C(ssclk_bufio1),
		 .CE(1'b1), .D(ddr_dat[i]), .R(1'b0), .S(1'b0));
	   end
	end
   endgenerate



   reg rd_en;
   wire full, empty, almost_empty;


   input_sample_fifo  input_sample_fifo_i
     (
      .rst(reset), // input rst
      .wr_clk(ssclk_bufr), // input wr_clk
      .rd_clk(clk), // input rd_clk
      .din(out_pre1), // input [27 : 0] din
      .wr_en(1'b1), // input wr_en
      .rd_en(rd_en), // input rd_en
      .dout(out), // output [27 : 0] dout
      .full(full), // output full
      .empty(empty), // output empty
      .almost_empty(almost_empty) // output almost_empty
      );


   always @(posedge clk) begin
      if (reset)
	rd_en <= 0;
      else if (~almost_empty)
	rd_en <= 1;
      else if (empty)
	rd_en <= 0;
   end

endmodule // capture_ddrlvds