blob: 1c27e3177c574e321ab45dcb7651eb4de2594375 (
plain) (
blame)
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
|
`include "defs.svh"
module echo_arbiter
( input bit clock
, input bit reset
, output bit in0_ready
, input bit in0_valid
, input uart_byte_t in0_data
, output bit in1_ready
, input bit in1_valid
, input uart_byte_t in1_data
, input bit out_ready
, output bit out_valid
, output uart_byte_t out_data
);
bit in0_hold_valid;
uart_byte_t in0_hold;
bit in1_hold_valid;
uart_byte_t in1_hold;
always @(posedge clock) begin
if (reset) begin
in0_ready = 0;
in1_ready = 0;
out_valid = 0;
out_data = 0;
in0_hold_valid = 0;
in0_hold = 0;
in1_hold_valid = 0;
in1_hold = 0;
end else begin
if (out_ready) out_valid = 0;
if (in0_ready && in0_valid) begin
in0_hold_valid = 1;
in0_hold = in0_data;
end
if (in1_ready && in1_valid) begin
in1_hold_valid = 1;
in1_hold = in1_data;
end
if (!out_valid) begin
if (in0_hold_valid) begin
out_valid = 1;
out_data = in0_hold;
in0_hold_valid = 0;
end else if (in1_hold_valid) begin
out_valid = 1;
out_data = in1_hold;
in1_hold_valid = 0;
end
end
in0_ready = !in0_hold_valid;
in1_ready = !in1_hold_valid;
end
end
endmodule
|