-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathn64_transmit_bit.v
More file actions
87 lines (80 loc) · 2.02 KB
/
n64_transmit_bit.v
File metadata and controls
87 lines (80 loc) · 2.02 KB
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
80
81
82
83
84
85
86
87
// Ownasaurus
// Designed to turn an input signal into a pulse that fits the N64/GC protocol
// Assumes 50MHz sys_clk
module n64_transmit_bit(
input sys_clk,
input trigger,
input[1:0] digit,
output reg n64d,
output reg transmitting
);
integer clk_cnt;
localparam one_us = 50;
localparam two_us = 100;
localparam three_us = 150;
localparam four_us = 200;
initial begin
n64d = 1'b1;
transmitting = 1'b0;
clk_cnt = 0;
end
always @(posedge sys_clk) begin
if(trigger) begin
transmitting <= 1'b1;
end
case(digit)
2'b01: // send a 1
// low for 1 us, then high for 3 us
if(transmitting) begin
if(clk_cnt == 0) begin
n64d <= 1'b0;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == one_us) begin
n64d <= 1'b1;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == four_us) begin
transmitting <= 1'b0;
clk_cnt <= 0;
end else clk_cnt <= clk_cnt + 1;
end
2'b00: // send a 0
// low for 3 us, then high for 1 us
if(transmitting) begin
if(clk_cnt == 0) begin
n64d <= 1'b0;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == three_us) begin
n64d <= 1'b1;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == four_us) begin
transmitting <= 1'b0;
clk_cnt <= 0;
end else clk_cnt <= clk_cnt + 1;
end
2'b11: // send a controller STOP bit
// low for 1 us, then remain high
if(transmitting) begin
if(clk_cnt == 0) begin
n64d <= 1'b0;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == two_us) begin
n64d <= 1'b1;
transmitting <= 1'b0;
clk_cnt <= 0;
end else clk_cnt <= clk_cnt + 1;
end
2'b10: // send a console STOP bit
// low for 1 us, then remain high
if(transmitting) begin
if(clk_cnt == 0) begin
n64d <= 1'b0;
clk_cnt <= clk_cnt + 1;
end else if(clk_cnt == one_us) begin
n64d <= 1'b1;
transmitting <= 1'b0;
clk_cnt <= 0;
end else clk_cnt <= clk_cnt + 1;
end
endcase
end
endmodule