-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathpmd_dp83223.v
79 lines (63 loc) · 1.46 KB
/
pmd_dp83223.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// SPDX-License-Identifier: AGPL-3.0-Only OR CERN-OHL-S-2.0
/*
* Copyright (C) 2022 Sean Anderson <[email protected]>
*/
`include "common.vh"
`include "io.vh"
`timescale 1ns/1ps
module pmd_dp83223 (
input clk_250,
input clk_125,
/* I/O */
input indicate_data,
input signal_detect,
output reg request_data,
/* "PMD" */
input tx_data,
output [1:0] rx_data,
output [1:0] rx_data_valid,
output reg signal_status,
/* Control */
input loopback
);
wire tx_nrzi;
nrzi_encode encoder (
.clk(clk_125),
.nrz(tx_data),
.nrzi(tx_nrzi)
);
`ifdef SYNTHESIS
SB_IO #(
.PIN_TYPE(`PIN_OUTPUT_ALWAYS | `PIN_OUTPUT_REGISTERED),
) tx_data_pin (
.PACKAGE_PIN(request_data),
.OUTPUT_CLK(clk_125),
.D_OUT_0(loopback ? 1'b0 : tx_nrzi)
);
`else
always @(posedge clk_125)
request_data <= loopback ? 1'b0 : tx_nrzi;
`endif
wire signal_status_nrzi;
wire [1:0] rx_nrzi, rx_nrzi_valid;
pmd_dp83223_rx rx (
.clk_125(clk_125),
.clk_250(clk_250),
.signal_detect(signal_detect),
.indicate_data(indicate_data),
.signal_status(signal_status_nrzi),
.rx_data(rx_nrzi),
.rx_data_valid(rx_nrzi_valid)
);
nrzi_decode decoder (
.clk(clk_125),
.rst(loopback ? 1'b0 : !signal_status_nrzi),
.nrzi(loopback ? { tx_nrzi, 1'bX } : rx_nrzi),
.nrzi_valid(loopback ? 2'b01 : rx_nrzi_valid),
.nrz(rx_data),
.nrz_valid(rx_data_valid)
);
initial signal_status = 0;
always @(posedge clk_125)
signal_status <= loopback ? 1'b1 : signal_status_nrzi;
endmodule