| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- `timescale 1 ns / 1 ps
- module axis_red_pitaya_dac #
- (
- parameter integer DAC_DATA_WIDTH = 14,
- parameter integer AXIS_TDATA_WIDTH = 32
- )
- (
- // PLL signals
- input wire aclk,
- input wire ddr_clk,
- input wire wrt_clk,
- input wire locked,
- // DAC signals
- output wire dac_clk,
- output wire dac_rst,
- output wire dac_sel,
- output wire dac_wrt,
- output wire [DAC_DATA_WIDTH-1:0] dac_dat,
- // Slave side
- output wire s_axis_tready,
- input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
- input wire s_axis_tvalid
- );
- reg [DAC_DATA_WIDTH-1:0] int_dat_a_reg;
- reg [DAC_DATA_WIDTH-1:0] int_dat_b_reg;
- reg [1:0] int_rst_reg;
- wire [DAC_DATA_WIDTH-1:0] int_dat_a_wire;
- wire [DAC_DATA_WIDTH-1:0] int_dat_b_wire;
- assign int_dat_a_wire = s_axis_tdata[DAC_DATA_WIDTH-1:0];
- assign int_dat_b_wire = s_axis_tdata[AXIS_TDATA_WIDTH/2+DAC_DATA_WIDTH-1:AXIS_TDATA_WIDTH/2];
- genvar j;
- always @(posedge aclk)
- begin
- if(~locked | ~s_axis_tvalid)
- begin
- int_dat_a_reg <= {(DAC_DATA_WIDTH){1'b0}};
- int_dat_b_reg <= {(DAC_DATA_WIDTH){1'b0}};
- end
- else
- begin
- int_dat_a_reg <= {int_dat_a_wire[DAC_DATA_WIDTH-1], ~int_dat_a_wire[DAC_DATA_WIDTH-2:0]};
- int_dat_b_reg <= {int_dat_b_wire[DAC_DATA_WIDTH-1], ~int_dat_b_wire[DAC_DATA_WIDTH-2:0]};
- end
- int_rst_reg <= {int_rst_reg[0], ~locked | ~s_axis_tvalid};
- end
- ODDR #(
- .DDR_CLK_EDGE("SAME_EDGE"),
- .INIT(1'b0)
- ) ODDR_rst (
- .Q(dac_rst),
- .D1(int_rst_reg[1]),
- .D2(int_rst_reg[1]),
- .C(aclk),
- .CE(1'b1),
- .R(1'b0),
- .S(1'b0)
- );
- ODDR #(
- .DDR_CLK_EDGE("SAME_EDGE"),
- .INIT(1'b0)
- ) ODDR_sel (
- .Q(dac_sel),
- .D1(1'b1),
- .D2(1'b0),
- .C(aclk),
- .CE(1'b1),
- .R(1'b0),
- .S(1'b0)
- );
- ODDR #(
- .DDR_CLK_EDGE("SAME_EDGE"),
- .INIT(1'b0)
- ) ODDR_wrt (
- .Q(dac_wrt),
- .D1(1'b1),
- .D2(1'b0),
- .C(wrt_clk),
- .CE(1'b1),
- .R(1'b0),
- .S(1'b0)
- );
- ODDR #(
- .DDR_CLK_EDGE("SAME_EDGE"),
- .INIT(1'b0)
- ) ODDR_clk (
- .Q(dac_clk),
- .D1(1'b1),
- .D2(1'b0),
- .C(ddr_clk),
- .CE(1'b1),
- .R(1'b0),
- .S(1'b0)
- );
- generate
- for(j = 0; j < DAC_DATA_WIDTH; j = j + 1)
- begin : DAC_DAT
- ODDR #(
- .DDR_CLK_EDGE("SAME_EDGE"),
- .INIT(1'b0)
- ) ODDR_inst (
- .Q(dac_dat[j]),
- .D1(int_dat_b_reg[j]),
- .D2(int_dat_a_reg[j]),
- .C(aclk),
- .CE(1'b1),
- .R(1'b0),
- .S(1'b0)
- );
- end
- endgenerate
- assign s_axis_tready = 1'b1;
- endmodule
|