| `include "src/lfsr.v" |
| `include "src/oserdes_test.v" |
| `include "src/comparator.v" |
| |
| `default_nettype none |
| |
| // ============================================================================ |
| |
| module top |
| ( |
| input wire clk, |
| |
| input wire rx, |
| output wire tx, |
| |
| input wire [15:0] sw, |
| output wire [15:0] led, |
| |
| inout wire [9:0] io |
| ); |
| |
| // ============================================================================ |
| // Clock & reset |
| reg [3:0] rst_sr; |
| |
| initial rst_sr <= 4'hF; |
| |
| always @(posedge clk) |
| if (sw[0]) |
| rst_sr <= 4'hF; |
| else |
| rst_sr <= rst_sr >> 1; |
| |
| wire CLK = clk; |
| wire RST = rst_sr[0]; |
| |
| // ============================================================================ |
| // Clocks for OSERDES |
| |
| wire CLK1_X0Y0; |
| wire CLK2_X0Y0; |
| |
| wire CLK1_X0Y2; |
| wire CLK2_X0Y2; |
| |
| wire CLK1_X1Y1; |
| wire CLK2_X1Y1; |
| |
| reg clk_r; |
| always @(posedge CLK) |
| if (RST) clk_r <= 1'b0; |
| else clk_r <= !clk_r; |
| |
| BUFMR mr_buf_x1y1_1 (.I(CLK), .O(CLK1_X1Y1)); |
| BUFMR mr_buf_x1y1_2 (.I(clk_r), .O(CLK2_X1Y1)); |
| |
| BUFMR mr_buf_x0y2_1 (.I(CLK), .O(CLK1_X0Y2)); |
| BUFMR mr_buf_x0y2_2 (.I(clk_r), .O(CLK2_X0Y2)); |
| |
| BUFMR mr_buf_x0y0_1 (.I(CLK), .O(CLK1_X0Y0)); |
| BUFMR mr_buf_x0y0_2 (.I(clk_r), .O(CLK2_X0Y0)); |
| |
| // ============================================================================ |
| // Test uints |
| wire [9:0] error; |
| |
| genvar i; |
| generate for (i=0; i<10; i=i+1) begin |
| |
| localparam DATA_WIDTH = (i == 0) ? 2 : |
| (i == 1) ? 3 : |
| (i == 2) ? 4 : |
| (i == 3) ? 5 : |
| (i == 4) ? 6 : |
| (i == 5) ? 7 : |
| (i == 6) ? 8 : |
| (i == 7) ? 4 : |
| (i == 8) ? 6 : |
| /*(i == 9) ?*/ 8; |
| |
| localparam DATA_RATE = (i < 7) ? "SDR" : "DDR"; |
| |
| wire CLK1 = (i >= 0 && i < 4) ? CLK1_X1Y1 : |
| (i >= 4 && i < 7) ? CLK1_X0Y2 : |
| CLK1_X0Y0; |
| |
| wire CLK2 = (i >= 0 && i < 4) ? CLK2_X1Y1 : |
| (i >= 4 && i < 7) ? CLK2_X0Y2 : |
| CLK2_X0Y0; |
| |
| oserdes_test # |
| ( |
| .DATA_WIDTH (DATA_WIDTH), |
| .DATA_RATE (DATA_RATE) |
| ) |
| oserdes_test |
| ( |
| .CLK (CLK), |
| .CLK1 (CLK1), |
| .CLK2 (CLK2), |
| .RST (RST), |
| |
| .IO_DAT (io[i]), |
| .O_ERROR (error[i]) |
| ); |
| |
| end endgenerate |
| |
| // ============================================================================ |
| // IOs |
| reg [24:0] heartbeat_cnt; |
| |
| always @(posedge CLK) |
| heartbeat_cnt <= heartbeat_cnt + 1; |
| |
| assign led[ 0] = !error[0]; |
| assign led[ 1] = !error[1]; |
| assign led[ 2] = !error[2]; |
| assign led[ 3] = !error[3]; |
| assign led[ 4] = !error[4]; |
| assign led[ 5] = !error[5]; |
| assign led[ 6] = !error[6]; |
| assign led[ 7] = !error[7]; |
| assign led[ 8] = !error[8]; |
| assign led[ 9] = !error[9]; |
| assign led[10] = heartbeat_cnt[23]; |
| assign led[11] = 1'b0; |
| assign led[12] = 1'b0; |
| assign led[13] = 1'b0; |
| assign led[14] = 1'b0; |
| assign led[15] = 1'b0; |
| |
| endmodule |
| |