| 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_shr <= {dout_shr, din_shr[DIN_N-1]}; | |
| if (stb) begin | |
| din <= din_shr; | |
| end | |
| end | |
| assign do = dout[DOUT_N-1]; | |
| roi roi ( | |
| .clk(clk), | |
| .din(din), | |
| .dout(dout) | |
| ); | |
| endmodule | |
| module roi(input clk, input [159:0] din, output [159:0] dout); | |
| my_OSERDES | |
| #( | |
| .LOC("BITSLICE_RX_TX_X0Y305"), | |
| .DATA_WIDTH(8), | |
| .INIT(1'b0), | |
| .IS_CLKDIV_INVERTED(1'b0), | |
| .IS_CLK_INVERTED(1'b0), | |
| .IS_RST_INVERTED(1'b0), | |
| .SIM_DEVICE("ULTRASCALE_PLUS") | |
| ) | |
| inst_0 ( | |
| .clk(clk), | |
| .din(din[ 0 +: 4]), | |
| .dout(dout[ 0 +: 2]) | |
| ); | |
| endmodule | |
| // --------------------------------------------------------------------- | |
| module my_OSERDES (input clk, input [3:0] din, output [1:0] dout); | |
| parameter LOC = ""; | |
| parameter DATA_WIDTH = 1; | |
| parameter INIT = 1'b0; | |
| parameter IS_CLKDIV_INVERTED = 1'b0; | |
| parameter IS_CLK_INVERTED = 1'b0; | |
| parameter IS_RST_INVERTED = 1'b0; | |
| parameter SIM_DEVICE = "ULTRASCALE_PLUS"; | |
| (* LOC=LOC *) | |
| OSERDESE3 #( | |
| .DATA_WIDTH(DATA_WIDTH), // Parallel data width (4,8) | |
| .INIT(INIT), // Initialization value of the OSERDES flip-flops | |
| .IS_CLKDIV_INVERTED(IS_CLKDIV_INVERTED),// Optional inversion for CLKDIV | |
| .IS_CLK_INVERTED(IS_CLK_INVERTED), // Optional inversion for CLK | |
| .IS_RST_INVERTED(IS_RST_INVERTED), // Optional inversion for RST | |
| .SIM_DEVICE(SIM_DEVICE) // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, | |
| // ULTRASCALE_PLUS_ES2) | |
| ) | |
| OSERDESE3_inst ( | |
| .OQ(oq), // 1-bit output: Serial Output Data | |
| .T_OUT(t), // 1-bit output: 3-state control output to IOB | |
| .CLK(clk), // 1-bit input: High-speed clock | |
| .CLKDIV(din[0]), // 1-bit input: Divided Clock | |
| .D(din[1]), // 8-bit input: Parallel Data Input | |
| .RST(din[2]), // 1-bit input: Asynchronous Reset | |
| .T(din[3]) // 1-bit input: Tristate input from fabric | |
| ); | |
| OBUFT OBUFT_inst ( | |
| .O(dout[0]), // 1-bit output: Buffer output (connect directly to top-level port) | |
| .I(oq), // 1-bit input: Buffer input | |
| .T(t) // 1-bit input: 3-state enable input | |
| ); | |
| endmodule |