diff --git a/cores/Spectrum/coreid.v b/cores/Spectrum/coreid.v index d4877ec..48efb2d 100644 --- a/cores/Spectrum/coreid.v +++ b/cores/Spectrum/coreid.v @@ -37,12 +37,12 @@ module coreid ( text[i] = 8'h00; text[ 0] = "T"; text[ 1] = "1"; - text[ 2] = "7"; + text[ 2] = "8"; text[ 3] = "-"; - text[ 4] = "2"; - text[ 5] = "9"; + text[ 4] = "0"; + text[ 5] = "3"; text[ 6] = "0"; - text[ 7] = "6"; + text[ 7] = "7"; text[ 8] = "2"; text[ 9] = "0"; text[10] = "1"; diff --git a/cores/Spectrum/pines_zxuno.ucf b/cores/Spectrum/pines_zxuno.ucf index 0856bc6..5c8c899 100644 --- a/cores/Spectrum/pines_zxuno.ucf +++ b/cores/Spectrum/pines_zxuno.ucf @@ -24,11 +24,11 @@ NET "audio_out_left" LOC="P8" | IOSTANDARD = LVCMOS33; NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33; NET "ear" LOC="P105" | IOSTANDARD = LVCMOS33; -# Keyboard -NET "clkps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; -NET "dataps2" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; -#NET "clkmouse" LOC="P94" | IOSTANDARD = LVCMOS33 | PULLUP; # comprobar estos pines -#NET "datamouse" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # los he asignado a voleo +# Keyboard and mouse +NET "clkps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN +NET "dataps2" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN +NET "mouseclk" LOC="P94" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN +NET "mousedata" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN # SRAM NET "sram_addr<0>" LOC="P115" | IOSTANDARD = LVCMOS33; diff --git a/cores/Spectrum/ps2_keyb.v b/cores/Spectrum/ps2_keyb.v index 8f01bc7..b7f243a 100644 --- a/cores/Spectrum/ps2_keyb.v +++ b/cores/Spectrum/ps2_keyb.v @@ -86,6 +86,7 @@ module ps2_keyb( ps2_port lectura_de_teclado ( .clk(clk), .enable_rcv(~ps2busy), + .kb_or_mouse(1'b0), .ps2clk_ext(clkps2), .ps2data_ext(dataps2), .kb_interrupt(nueva_tecla), diff --git a/cores/Spectrum/ps2_mouse_kempston.v b/cores/Spectrum/ps2_mouse_kempston.v new file mode 100644 index 0000000..973a23e --- /dev/null +++ b/cores/Spectrum/ps2_mouse_kempston.v @@ -0,0 +1,116 @@ +`timescale 1ns / 1ps +`default_nettype none + +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 17:14:21 06/30/2015 +// Design Name: +// Module Name: ps2_mouse_kempston +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module ps2_mouse_kempston ( + input wire clk, + input wire rst_n, + inout wire clkps2, + inout wire dataps2, + //--------------------------------- + input wire [15:0] a, + input wire iorq_n, + input wire rd_n, + output wire [7:0] kmouse_dout, + output wire oe_n_kmouse, + //--------------------------------- + input wire [7:0] zxuno_addr, + input wire zxuno_regrd, + input wire zxuno_regwr, + input wire [7:0] din, + output wire [7:0] mousedata_dout, + output wire oe_n_mousedata, + output reg [7:0] mousestatus_dout, + output wire oe_n_mousestatus + ); + + parameter MOUSEDATA = 8'h09; + parameter MOUSESTATUS = 8'h0A; + + assign oe_n_mousedata = ~(zxuno_addr == MOUSEDATA && zxuno_regrd == 1'b1); + assign oe_n_mousestatus = ~(zxuno_addr == MOUSESTATUS && zxuno_regrd == 1'b1); + + wire [7:0] mousedata; + wire [7:0] kmouse_x, kmouse_y, kmouse_buttons; + wire ps2busy; + wire ps2error; + wire nuevo_evento; + wire [1:0] state_out; + assign mousedata_dout = mousedata; + + wire kmouse_x_req_n = ~(!iorq_n && !rd_n && a[7:0]==8'hDF && a[8]==1'b1 && a[9]==1'b1 && a[10]==1'b0); + wire kmouse_y_req_n = ~(!iorq_n && !rd_n && a[7:0]==8'hDF && a[8]==1'b1 && a[9]==1'b1 && a[10]==1'b1); + wire kmouse_butt_req_n = ~(!iorq_n && !rd_n && a[7:0]==8'hDF && a[8]==1'b0); + assign kmouse_dout = (kmouse_x_req_n==1'b0)? kmouse_x : + (kmouse_y_req_n==1'b0)? kmouse_y : + (kmouse_butt_req_n==1'b0)? kmouse_buttons : + 8'hZZ; + assign oe_n_kmouse = kmouse_x_req_n & kmouse_y_req_n & kmouse_butt_req_n; + + /* + | BSY | x | x | x | ERR | RLS | EXT | PEN | + */ + reg reading_mousestatus = 1'b0; + always @(posedge clk) begin + mousestatus_dout[7:1] <= {ps2busy, 3'b000, ps2error, 2'b00}; + if (nuevo_evento == 1'b1) + mousestatus_dout[0] <= 1'b1; + if (oe_n_mousestatus == 1'b0) + reading_mousestatus <= 1'b1; + else if (reading_mousestatus == 1'b1) begin + mousestatus_dout[0] <= 1'b0; + reading_mousestatus <= 1'b0; + end + end + + ps2_port lectura_de_raton ( + .clk(clk), + .enable_rcv(~ps2busy), + .kb_or_mouse(1'b1), + .ps2clk_ext(clkps2), + .ps2data_ext(dataps2), + .kb_interrupt(nuevo_evento), + .scancode(mousedata), + .released(), + .extended() + ); + + ps2mouse_to_kmouse traductor_raton ( + .clk(clk), + .rst_n(rst_n), + .data(mousedata), + .data_valid(nuevo_evento), + .kmouse_x(kmouse_x), + .kmouse_y(kmouse_y), + .kmouse_buttons(kmouse_buttons) + ); + + ps2_host_to_kb escritura_a_raton ( + .clk(clk), + .ps2clk_ext(clkps2), + .ps2data_ext(dataps2), + .data(din), + .dataload(zxuno_addr == MOUSEDATA && zxuno_regwr== 1'b1), + .ps2busy(ps2busy), + .ps2error(ps2error) + ); +endmodule diff --git a/cores/Spectrum/ps2_port.v b/cores/Spectrum/ps2_port.v index 5fd47ff..039a59f 100644 --- a/cores/Spectrum/ps2_port.v +++ b/cores/Spectrum/ps2_port.v @@ -23,6 +23,7 @@ module ps2_port ( input wire clk, // se recomienda 1 MHz <= clk <= 600 MHz input wire enable_rcv, // habilitar la maquina de estados de recepcion + input wire kb_or_mouse, // 0: kb, 1: mouse input wire ps2clk_ext, input wire ps2data_ext, output wire kb_interrupt, // a 1 durante 1 clk para indicar nueva tecla recibida @@ -55,7 +56,7 @@ module ps2_port ( always @(posedge clk) begin negedgedetect <= {negedgedetect[14:0], ps2clk}; end - wire ps2clkedge = (negedgedetect == 16'hFF00)? 1'b1 : 1'b0; + wire ps2clkedge = (negedgedetect == 16'hF000)? 1'b1 : 1'b0; // Paridad instantánea de los bits recibidos wire paritycalculated = ^key; @@ -83,7 +84,6 @@ module ps2_port ( if (ps2data == 1'b0) begin state <= `RCVDATA; key <= 8'h80; - //rkb_interrupt <= 1'b0; end end `RCVDATA: begin @@ -102,18 +102,23 @@ module ps2_port ( end `RCVSTOP: begin state <= `RCVSTART; - if (ps2data == 1'b1) begin + if (ps2data == 1'b1) begin scancode <= key; - if (key == 8'hE0) begin - regextended <= 2'b01; - end - else if (key == 8'hF0) begin - regreleased <= 2'b01; + if (kb_or_mouse == 1'b1) begin + rkb_interrupt <= 1'b1; // no se requiere mirar E0 o F0 end else begin - regextended <= {regextended[0], 1'b0}; - regreleased <= {regreleased[0], 1'b0}; - rkb_interrupt <= 1'b1; + if (key == 8'hE0) begin + regextended <= 2'b01; + end + else if (key == 8'hF0) begin + regreleased <= 2'b01; + end + else begin + regextended <= {regextended[0], 1'b0}; + regreleased <= {regreleased[0], 1'b0}; + rkb_interrupt <= 1'b1; + end end end end diff --git a/cores/Spectrum/ps2mouse_to_kmouse.v b/cores/Spectrum/ps2mouse_to_kmouse.v new file mode 100644 index 0000000..fa81576 --- /dev/null +++ b/cores/Spectrum/ps2mouse_to_kmouse.v @@ -0,0 +1,82 @@ +`timescale 1ns / 1ps +`default_nettype none + +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 18:52:22 06/30/2015 +// Design Name: +// Module Name: ps2mouse_to_kmouse +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module ps2mouse_to_kmouse ( + input wire clk, + input wire rst_n, + input wire [7:0] data, + input wire data_valid, + output reg [7:0] kmouse_x, + output reg [7:0] kmouse_y, + output reg [7:0] kmouse_buttons + ); + + parameter FIRST_FRAME = 2'd0, + SECOND_FRAME = 2'd1, + THIRD_FRAME = 2'd2, + CALCULATE_NEWXY = 2'd3; + + initial begin + kmouse_x = 8'h00; + kmouse_y = 8'h00; + kmouse_buttons = 8'hFF; + end + + reg [7:0] deltax, deltay; + reg [1:0] state = FIRST_FRAME; + + always @(posedge clk) begin + if (rst_n == 1'b0) begin + kmouse_x <= 8'h00; + kmouse_y <= 8'h00; + kmouse_buttons <= 8'hFF; + state <= FIRST_FRAME; + end + else begin + case (state) + FIRST_FRAME: + if (data_valid == 1'b1) begin + if (data[3] == 1'b1) begin + kmouse_buttons <= {5'b11111,~data[2],~data[0],~data[1]}; + state <= SECOND_FRAME; + end + end + SECOND_FRAME: + if (data_valid == 1'b1) begin + deltax <= data; + state <= THIRD_FRAME; + end + THIRD_FRAME: + if (data_valid == 1'b1) begin + deltay <= data; + state <= CALCULATE_NEWXY; + end + CALCULATE_NEWXY: + begin + kmouse_x <= kmouse_x + deltax; + kmouse_y <= kmouse_y + deltay; + state <= FIRST_FRAME; + end + endcase + end + end +endmodule diff --git a/cores/Spectrum/tld_zxuno.v b/cores/Spectrum/tld_zxuno.v index 649fdf7..624b6aa 100644 --- a/cores/Spectrum/tld_zxuno.v +++ b/cores/Spectrum/tld_zxuno.v @@ -31,6 +31,8 @@ module tld_zxuno ( input wire ear, inout wire clkps2, inout wire dataps2, + inout wire mouseclk, + inout wire mousedata, output wire audio_out_left, output wire audio_out_right, output wire stdn, @@ -71,6 +73,7 @@ module tld_zxuno ( assign wssclk = 1'b0; // de momento, sin WSS assign stdn = 1'b0; // fijar norma PAL assign stdnb = 1'b1; // y conectamos reloj PAL + // pll reloj_maestro // (// Clock in ports // .CLK_IN1 (clk50mhz), // IN @@ -81,16 +84,24 @@ module tld_zxuno ( // .PROGDATA (1'b0), // IN // .PROGEN (1'b0), // IN // .PROGDONE ()); // OUT +// +// reg [2:0] divclk = 3'b000; +// always @(posedge sysclk) +// divclk <= divclk + 1; +// assign clk14 = divclk[0]; +// assign clk7 = divclk[1]; +// assign clk3d5 = divclk[2]; cuatro_relojes relojes_maestros (// Clock in ports .CLK_IN1 (clk50mhz), // IN // Clock out ports - .CLK_OUT1 (sysclk), // OUT + .CLK_OUT1 (sysclk) , // OUT .CLK_OUT2 (clk14), // OUT .CLK_OUT3 (clk7), // OUT .CLK_OUT4 (clk3d5)); // OUT + wire audio_out; assign audio_out_left = audio_out; assign audio_out_right = audio_out; @@ -129,7 +140,10 @@ module tld_zxuno ( .joydown(joydown), .joyleft(joyleft), .joyright(joyright), - .joyfire(joyfire) + .joyfire(joyfire), + + .mouseclk(mouseclk), + .mousedata(mousedata) ); assign testled = (!flash_cs_n || !sd_cs_n); diff --git a/cores/Spectrum/zxuno.v b/cores/Spectrum/zxuno.v index 9f2ccfa..73fd9a8 100644 --- a/cores/Spectrum/zxuno.v +++ b/cores/Spectrum/zxuno.v @@ -57,11 +57,15 @@ module zxuno ( input wire sd_miso, // DB9 JOYSTICK - input wire joyup, - input wire joydown, - input wire joyleft, - input wire joyright, - input wire joyfire + input wire joyup, + input wire joydown, + input wire joyleft, + input wire joyright, + input wire joyfire, + + // MOUSE + inout wire mouseclk, + inout wire mousedata ); // Señales de la CPU @@ -142,6 +146,12 @@ module zxuno ( wire oe_n_nmievents; wire nmispecial_n; wire page_configrom_active; + + // Kempston mouse + wire [7:0] kmouse_dout; + wire [7:0] mousedata_dout; + wire [7:0] mousestatus_dout; + wire oe_n_kmouse, oe_n_mousedata, oe_n_mousestatus; // Asignación de dato para la CPU segun la decodificación de todos los dispositivos // conectados a ella. @@ -156,6 +166,9 @@ module zxuno ( (oe_n_keymap==1'b0)? keymap_dout : (oe_n_scratch==1'b0)? scratch_dout : (oe_n_nmievents==1'b0)? nmievents_dout : + (oe_n_kmouse==1'b0)? kmouse_dout : + (oe_n_mousedata==1'b0)? mousedata_dout : + (oe_n_mousestatus==1'b0)? mousestatus_dout : ula_dout; tv80n_wrapper el_z80 ( @@ -386,6 +399,27 @@ module zxuno ( .page_configrom_active(page_configrom_active) ); + ps2_mouse_kempston el_raton ( + .clk(clk), + .rst_n(rst_n & mrst_n & power_on_reset_n), + .clkps2(mouseclk), + .dataps2(mousedata), + //--------------------------------- + .a(cpuaddr), + .iorq_n(iorq_n), + .rd_n(rd_n), + .kmouse_dout(kmouse_dout), + .oe_n_kmouse(oe_n_kmouse), + //--------------------------------- + .zxuno_addr(zxuno_addr), + .zxuno_regrd(zxuno_regrd), + .zxuno_regwr(zxuno_regwr), + .din(cpudout), + .mousedata_dout(mousedata_dout), + .oe_n_mousedata(oe_n_mousedata), + .mousestatus_dout(mousestatus_dout), + .oe_n_mousestatus(oe_n_mousestatus) + ); /////////////////////////////////// // AY-3-8912 SOUND diff --git a/cores/Spectrum/zxuno.xise b/cores/Spectrum/zxuno.xise index 276fd36..701b0a2 100644 --- a/cores/Spectrum/zxuno.xise +++ b/cores/Spectrum/zxuno.xise @@ -155,6 +155,14 @@ + + + + + + + +