axis_red_pitaya_dac.v 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. `timescale 1 ns / 1 ps
  2. module axis_red_pitaya_dac #
  3. (
  4. parameter integer DAC_DATA_WIDTH = 14,
  5. parameter integer AXIS_TDATA_WIDTH = 32
  6. )
  7. (
  8. // PLL signals
  9. input wire aclk,
  10. input wire ddr_clk,
  11. input wire wrt_clk,
  12. input wire locked,
  13. // DAC signals
  14. output wire dac_clk,
  15. output wire dac_rst,
  16. output wire dac_sel,
  17. output wire dac_wrt,
  18. output wire [DAC_DATA_WIDTH-1:0] dac_dat,
  19. // Slave side
  20. output wire s_axis_tready,
  21. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  22. input wire s_axis_tvalid
  23. );
  24. reg [DAC_DATA_WIDTH-1:0] int_dat_a_reg;
  25. reg [DAC_DATA_WIDTH-1:0] int_dat_b_reg;
  26. reg [1:0] int_rst_reg;
  27. wire [DAC_DATA_WIDTH-1:0] int_dat_a_wire;
  28. wire [DAC_DATA_WIDTH-1:0] int_dat_b_wire;
  29. assign int_dat_a_wire = s_axis_tdata[DAC_DATA_WIDTH-1:0];
  30. assign int_dat_b_wire = s_axis_tdata[AXIS_TDATA_WIDTH/2+DAC_DATA_WIDTH-1:AXIS_TDATA_WIDTH/2];
  31. genvar j;
  32. always @(posedge aclk)
  33. begin
  34. if(~locked | ~s_axis_tvalid)
  35. begin
  36. int_dat_a_reg <= {(DAC_DATA_WIDTH){1'b0}};
  37. int_dat_b_reg <= {(DAC_DATA_WIDTH){1'b0}};
  38. end
  39. else
  40. begin
  41. int_dat_a_reg <= {int_dat_a_wire[DAC_DATA_WIDTH-1], ~int_dat_a_wire[DAC_DATA_WIDTH-2:0]};
  42. int_dat_b_reg <= {int_dat_b_wire[DAC_DATA_WIDTH-1], ~int_dat_b_wire[DAC_DATA_WIDTH-2:0]};
  43. end
  44. int_rst_reg <= {int_rst_reg[0], ~locked | ~s_axis_tvalid};
  45. end
  46. ODDR #(
  47. .DDR_CLK_EDGE("SAME_EDGE"),
  48. .INIT(1'b0)
  49. ) ODDR_rst (
  50. .Q(dac_rst),
  51. .D1(int_rst_reg[1]),
  52. .D2(int_rst_reg[1]),
  53. .C(aclk),
  54. .CE(1'b1),
  55. .R(1'b0),
  56. .S(1'b0)
  57. );
  58. ODDR #(
  59. .DDR_CLK_EDGE("SAME_EDGE"),
  60. .INIT(1'b0)
  61. ) ODDR_sel (
  62. .Q(dac_sel),
  63. .D1(1'b1),
  64. .D2(1'b0),
  65. .C(aclk),
  66. .CE(1'b1),
  67. .R(1'b0),
  68. .S(1'b0)
  69. );
  70. ODDR #(
  71. .DDR_CLK_EDGE("SAME_EDGE"),
  72. .INIT(1'b0)
  73. ) ODDR_wrt (
  74. .Q(dac_wrt),
  75. .D1(1'b1),
  76. .D2(1'b0),
  77. .C(wrt_clk),
  78. .CE(1'b1),
  79. .R(1'b0),
  80. .S(1'b0)
  81. );
  82. ODDR #(
  83. .DDR_CLK_EDGE("SAME_EDGE"),
  84. .INIT(1'b0)
  85. ) ODDR_clk (
  86. .Q(dac_clk),
  87. .D1(1'b1),
  88. .D2(1'b0),
  89. .C(ddr_clk),
  90. .CE(1'b1),
  91. .R(1'b0),
  92. .S(1'b0)
  93. );
  94. generate
  95. for(j = 0; j < DAC_DATA_WIDTH; j = j + 1)
  96. begin : DAC_DAT
  97. ODDR #(
  98. .DDR_CLK_EDGE("SAME_EDGE"),
  99. .INIT(1'b0)
  100. ) ODDR_inst (
  101. .Q(dac_dat[j]),
  102. .D1(int_dat_b_reg[j]),
  103. .D2(int_dat_a_reg[j]),
  104. .C(aclk),
  105. .CE(1'b1),
  106. .R(1'b0),
  107. .S(1'b0)
  108. );
  109. end
  110. endgenerate
  111. assign s_axis_tready = 1'b1;
  112. endmodule