| module top(input clk, stb, di, output do); |
| localparam integer DIN_N = 160; |
| localparam integer DOUT_N = 160; |
| |
| reg [DIN_N-1:0] din; |
| wire [DOUT_N-1:0] dout; |
| |
| reg [DIN_N-1:0] din_shr; |
| reg [DOUT_N-1:0] dout_shr; |
| |
| always @(posedge clk) begin |
| din_shr <= {din_shr, di, dout[0]}; |
| dout_shr <= {dout_shr, din_shr[DIN_N-1]}; |
| if (stb) begin |
| din <= din_shr; |
| end |
| end |
| assign do = dout_shr[0]; |
| roi roi ( |
| .clk(clk), |
| .din(din), |
| .dout(dout) |
| ); |
| endmodule |
| |
| module roi(input clk, input [159:0] din, output [159:0] dout); |
| |
| IDELAYCTRL #( |
| .SIM_DEVICE("ULTRASCALE") // Must be set to "ULTRASCALE" |
| ) |
| IDELAYCTRL_inst ( |
| .RDY(dout[159]), // 1-bit output: Ready output |
| .REFCLK(clk), // 1-bit input: Reference clock input |
| .RST(din[159]) // 1-bit input: Active high reset input. Asynchronous assert, synchronous deassert to |
| // REFCLK. |
| ); |
| |
| my_IDELAY |
| #( |
| .LOC("BITSLICE_RX_TX_X0Y305"), |
| .CASCADE("NONE"), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE) |
| .DELAY_FORMAT("TIME"), // Units of the DELAY_VALUE (COUNT, TIME) |
| .DELAY_SRC("DATAIN"), // Delay input (DATAIN, IDATAIN) |
| .DELAY_TYPE("FIXED"), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD) |
| .DELAY_VALUE(0), // Input delay value setting |
| .IS_CLK_INVERTED(1'b0), // Optional inversion for CLK |
| .IS_RST_INVERTED(1'b0), // Optional inversion for RST |
| .REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0) |
| .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, |
| // ULTRASCALE_PLUS_ES2) |
| .UPDATE_MODE("ASYNC") // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC) |
| ) |
| inst_0 ( |
| .clk(clk), |
| .din(din[1:0]), |
| .dout(dout[0]) |
| ); |
| |
| my_ODELAY |
| #( |
| .LOC("BITSLICE_RX_TX_X0Y306"), |
| .CASCADE("NONE"), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE) |
| .DELAY_FORMAT("TIME"), // Units of the DELAY_VALUE (COUNT, TIME) |
| .DELAY_TYPE("FIXED"), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD) |
| .DELAY_VALUE(0), // Input delay value setting |
| .IS_CLK_INVERTED(1'b0), // Optional inversion for CLK |
| .IS_RST_INVERTED(1'b0), // Optional inversion for RST |
| .REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0) |
| .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, |
| // ULTRASCALE_PLUS_ES2) |
| .UPDATE_MODE("ASYNC") // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC) |
| ) |
| inst_1 ( |
| .clk(clk), |
| .din(din[ 2 +: 2]), |
| .dout() |
| ); |
| |
| endmodule |
| |
| // --------------------------------------------------------------------- |
| module my_IDELAY (input clk, input [1:0] din, output dout); |
| parameter LOC = ""; |
| parameter CASCADE = "NONE"; |
| parameter DELAY_FORMAT = "TIME"; |
| parameter DELAY_SRC = "DATAIN"; |
| parameter DELAY_TYPE = "FIXED"; |
| parameter DELAY_VALUE = 0; |
| parameter IS_CLK_INVERTED = 1'b0; |
| parameter IS_RST_INVERTED = 1'b0; |
| parameter REFCLK_FREQUENCY = 300.0; |
| parameter SIM_DEVICE = "ULTRASCALE_PLUS"; |
| parameter UPDATE_MODE = "ASYNC"; |
| |
| (* LOC=LOC *) |
| IDELAYE3 #( |
| .CASCADE(CASCADE), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE) |
| .DELAY_FORMAT(DELAY_FORMAT), // Units of the DELAY_VALUE (COUNT, TIME) |
| .DELAY_SRC(DELAY_SRC), // Delay input (DATAIN, IDATAIN) |
| .DELAY_TYPE(DELAY_TYPE), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD) |
| .DELAY_VALUE(DELAY_VALUE), // Input delay value setting |
| .IS_CLK_INVERTED(IS_CLK_INVERTED), // Optional inversion for CLK |
| .IS_RST_INVERTED(IS_RST_INVERTED), // Optional inversion for RST |
| .REFCLK_FREQUENCY(REFCLK_FREQUENCY), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0) |
| .SIM_DEVICE(SIM_DEVICE), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, |
| // ULTRASCALE_PLUS_ES2) |
| .UPDATE_MODE(UPDATE_MODE) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC) |
| ) |
| IDELAYE3_inst ( |
| .CASC_OUT(), // 1-bit output: Cascade delay output to ODELAY input cascade |
| .CNTVALUEOUT(), // 9-bit output: Counter value output |
| .DATAOUT(dout), // 1-bit output: Delayed data output |
| .CASC_IN(), // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT |
| .CASC_RETURN(), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT |
| .CE(1'b0), // 1-bit input: Active high enable increment/decrement input |
| .CLK(clk), // 1-bit input: Clock input |
| .CNTVALUEIN(), // 9-bit input: Counter value input |
| .DATAIN(din[0]), // 1-bit input: Data input from the logic |
| .EN_VTC(1'b1), // 1-bit input: Keep delay constant over VT |
| .IDATAIN(), // 1-bit input: Data input from the IOBUF |
| .INC(1'b0), // 1-bit input: Increment / Decrement tap delay input |
| .LOAD(1'b0), // 1-bit input: Load DELAY_VALUE input |
| .RST(din[1]) // 1-bit input: Asynchronous Reset to the DELAY_VALUE |
| ); |
| endmodule |
| |
| module my_ODELAY (input clk, input [1:0] din, output dout); |
| parameter LOC = ""; |
| parameter CASCADE = "NONE"; |
| parameter DELAY_FORMAT = "TIME"; |
| parameter DELAY_TYPE = "FIXED"; |
| parameter DELAY_VALUE = 0; |
| parameter IS_CLK_INVERTED = 1'b0; |
| parameter IS_RST_INVERTED = 1'b0; |
| parameter REFCLK_FREQUENCY = 300.0; |
| parameter SIM_DEVICE = "ULTRASCALE_PLUS"; |
| parameter UPDATE_MODE = "ASYNC"; |
| |
| (* KEEP, DONT_TOUCH, LOC=LOC *) |
| ODELAYE3 #( |
| .CASCADE(CASCADE), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE) |
| .DELAY_FORMAT(DELAY_FORMAT), // Units of the DELAY_VALUE (COUNT, TIME) |
| .DELAY_TYPE(DELAY_TYPE), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD) |
| .DELAY_VALUE(DELAY_VALUE), // Input delay value setting |
| .IS_CLK_INVERTED(IS_CLK_INVERTED), // Optional inversion for CLK |
| .IS_RST_INVERTED(IS_RST_INVERTED), // Optional inversion for RST |
| .REFCLK_FREQUENCY(REFCLK_FREQUENCY), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0) |
| .SIM_DEVICE(SIM_DEVICE), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, |
| // ULTRASCALE_PLUS_ES2) |
| .UPDATE_MODE(UPDATE_MODE) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC) |
| ) |
| ODELAYE3_inst ( |
| .CASC_OUT(), // 1-bit output: Cascade delay output to ODELAY input cascade |
| .CNTVALUEOUT(), // 9-bit output: Counter value output |
| .DATAOUT(dout), // 1-bit output: Delayed data output |
| .CASC_IN(), // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT |
| .CASC_RETURN(), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT |
| .CE(1'b0), // 1-bit input: Active high enable increment/decrement input |
| .CLK(clk), // 1-bit input: Clock input |
| .CNTVALUEIN(), // 9-bit input: Counter value input |
| .EN_VTC(1'b1), // 1-bit input: Keep delay constant over VT |
| .INC(1'b0), // 1-bit input: Increment / Decrement tap delay input |
| .LOAD(1'b0), // 1-bit input: Load DELAY_VALUE input |
| .ODATAIN(din[0]), // 1-bit input: Data input |
| .RST(din[1]) // 1-bit input: Asynchronous Reset to the DELAY_VALUE |
| ); |
| endmodule |
| |