SprinterJoy/Firmware/SegaJoy.sv
2024-01-29 22:49:58 +03:00

131 lines
2.5 KiB
Systemverilog
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Модуль опроса джойстиков
*/
module SegaJoy(
input reg clk,
input wire reset,
output reg sel1,
output reg sel2,
input wire [5:0] sj1,
input wire [5:0] sj2,
output reg [11:0] status1,
output reg [11:0] status2,
output reg [1:0] sj_type1,
output reg [1:0] sj_type2
);
localparam [7:0] divisor = 180;
reg [7:0] cycle;
reg [5:0] s0;
reg [5:0] s1;
reg [5:0] s4;
reg [5:0] s5;
reg [5:0] s6;
reg [11:0] combo;
always_ff @ (posedge clk, posedge reset)
if (reset) begin
cycle <= 8'h00;
sel1 <= 1'b0;
sel2 <= 1'b0;
status1 <= 12'h000;
status2 <= 12'h000;
end else begin
case (cycle)
// JOY 1
0: sel1 <= 0;
1: s0 <= sj1;
2: sel1 <= 1;
3: s1 <= sj1;
4: sel1 <= 0;
//8: s2 <= sj1;
6: sel1 <= 1;
//11: s3 <= sj1;
8: sel1 <= 0;
9: s4 <= sj1;
10: sel1 <= 1;
11: s5 <= sj1;
12: sel1 <= 0;
13: s6 <= sj1;
14: begin
//sj_dbg <= s4;
combo <= ~({s5[3:0], s0[5:4], s1});
if (s4[1:0] == 2'b00 && s6[3:0] == 4'b1111) sj_type1 <= 2'b10;
else if (s6[3:2] == 2'b00) sj_type1 <= 2'b01;
else sj_type1 <= 2'b00;
end
15:
/* Все значения получены, фиксируем результаты */
case (sj_type1)
2'b10: status1 <= combo;
2'b01: status1 <= {4'b0000, combo[7:0]};
default:
status1 <= {6'b000000, combo[5:0]};
endcase
// JOY 2
16: sel2 <= 0;
17: s0 <= sj2;
18: sel2 <= 1;
19: s1 <= sj2;
20: sel2 <= 0;
//8: s2 <= sj2;
22: sel2 <= 1;
//11: s3 <= sj2;
24: sel2 <= 0;
25: s4 <= sj2;
26: sel2 <= 1;
27: s5 <= sj2;
28: sel2 <= 0;
29: s6 <= sj2;
30: begin
//sj_dbg <= s4;
combo <= ~({s5[3:0], s0[5:4], s1});
if (s4[1:0] == 2'b00 && s6[3:0] == 4'b1111) sj_type2 <= 2'b10;
else if (s6[3:2] == 2'b00) sj_type2 <= 2'b01;
else sj_type2 <= 2'b00;
end
31:
/* Все значения получены, фиксируем результаты */
case (sj_type2)
2'b10: status2 <= combo;
2'b01: status2 <= {4'b0000, combo[7:0]};
default:
status2 <= {6'b000000, combo[5:0]};
endcase
endcase
if (cycle == divisor) cycle <= 8'hff;
else cycle <= cycle + 1'b1;
end
endmodule