81 lines
2.5 KiB
Verilog
81 lines
2.5 KiB
Verilog
module dac_interface_enhanced (
|
|
input wire clk_120m,
|
|
input wire reset_n,
|
|
input wire [7:0] chirp_data,
|
|
input wire chirp_valid,
|
|
output wire [7:0] dac_data,
|
|
output wire dac_clk,
|
|
output wire dac_sleep
|
|
);
|
|
|
|
// ============================================================================
|
|
// DAC data register (fabric FF — feeds ODDR D1/D2 inputs)
|
|
// ============================================================================
|
|
reg [7:0] dac_data_reg;
|
|
|
|
always @(posedge clk_120m or negedge reset_n) begin
|
|
if (!reset_n) begin
|
|
dac_data_reg <= 8'd128; // Center value
|
|
end else if (chirp_valid) begin
|
|
dac_data_reg <= chirp_data;
|
|
end else begin
|
|
dac_data_reg <= 8'd128; // Default to center when no chirp
|
|
end
|
|
end
|
|
|
|
`ifndef SIMULATION
|
|
// ============================================================================
|
|
// ODDR for dac_clk forwarding (Xilinx 7-series)
|
|
// D1=1, D2=0 produces a clock replica aligned to clk_120m rising edge.
|
|
// The ODDR is placed in the IOB, giving near-zero skew between the
|
|
// forwarded clock and ODDR data outputs in the same bank.
|
|
// ============================================================================
|
|
ODDR #(
|
|
.DDR_CLK_EDGE("OPPOSITE_EDGE"),
|
|
.INIT(1'b0),
|
|
.SRTYPE("SYNC")
|
|
) oddr_dac_clk (
|
|
.Q(dac_clk),
|
|
.C(clk_120m),
|
|
.CE(1'b1),
|
|
.D1(1'b1),
|
|
.D2(1'b0),
|
|
.R(1'b0),
|
|
.S(1'b0)
|
|
);
|
|
|
|
// ============================================================================
|
|
// ODDR for dac_data[7:0] — packs output FFs into IOBs
|
|
// D1=D2=same value → SDR behavior through ODDR, but placed in IOB.
|
|
// This eliminates fabric routing delay to the output pad.
|
|
// ============================================================================
|
|
genvar i;
|
|
generate
|
|
for (i = 0; i < 8; i = i + 1) begin : oddr_dac_data_gen
|
|
ODDR #(
|
|
.DDR_CLK_EDGE("OPPOSITE_EDGE"),
|
|
.INIT(1'b0),
|
|
.SRTYPE("SYNC")
|
|
) oddr_dac_data (
|
|
.Q(dac_data[i]),
|
|
.C(clk_120m),
|
|
.CE(1'b1),
|
|
.D1(dac_data_reg[i]),
|
|
.D2(dac_data_reg[i]),
|
|
.R(1'b0),
|
|
.S(1'b0)
|
|
);
|
|
end
|
|
endgenerate
|
|
|
|
`else
|
|
// ============================================================================
|
|
// Simulation behavioral equivalent
|
|
// ============================================================================
|
|
assign dac_clk = clk_120m;
|
|
assign dac_data = dac_data_reg;
|
|
`endif
|
|
|
|
assign dac_sleep = 1'b0;
|
|
|
|
endmodule |