From d22cd23c8e96fc782aa65bdd6ddd6e9e07c9e0e7 Mon Sep 17 00:00:00 2001 From: antoniovillena Date: Thu, 28 Apr 2016 14:21:08 +0200 Subject: [PATCH] SamCoupe a test4 (final) --- cores/SamCoupe/asic.v | 26 ++-- cores/SamCoupe/pines_zxuno.ucf | 80 ++++++------ cores/SamCoupe/pines_zxuno_Ap.ucf | 82 ++++++++++++ cores/SamCoupe/pines_zxuno_v3.ucf | 107 ++++++++++++++++ cores/SamCoupe/pines_zxuno_v4.ucf | 85 +++++++++++++ cores/SamCoupe/ps2_keyb.v | 12 ++ cores/SamCoupe/ram.v | 53 +------- cores/SamCoupe/relojes.v | 2 +- cores/SamCoupe/saa1099.v | 4 +- cores/SamCoupe/samcoupe.gise | 187 ++++++++++++++++++++++++++++ cores/SamCoupe/samcoupe.v | 2 +- cores/SamCoupe/samcoupe.xise | 114 ++++++++--------- cores/SamCoupe/scancode_to_speccy.v | 101 ++++++++++++--- 13 files changed, 678 insertions(+), 177 deletions(-) create mode 100644 cores/SamCoupe/pines_zxuno_Ap.ucf create mode 100644 cores/SamCoupe/pines_zxuno_v3.ucf create mode 100644 cores/SamCoupe/pines_zxuno_v4.ucf create mode 100644 cores/SamCoupe/samcoupe.gise diff --git a/cores/SamCoupe/asic.v b/cores/SamCoupe/asic.v index 6a60669..af6a145 100644 --- a/cores/SamCoupe/asic.v +++ b/cores/SamCoupe/asic.v @@ -226,23 +226,29 @@ module asic ( mem_contention = 1'b0; io_contention = 1'b0; - if (screen_off == 1'b0 && hc[3:0]<4'd10) - io_contention = 1'b1; - if (screen_off == 1'b1 && (hc[3:0]==4'd0 || - hc[3:0]==4'd1 || - hc[3:0]==4'd8 || - hc[3:0]==4'd9) ) - io_contention = 1'b1; +// if (screen_off == 1'b0 && hc[3:0]<4'd10) +// io_contention = 1'b1; +// if (screen_off == 1'b1 && (hc[3:0]==4'd0 || +// hc[3:0]==4'd1 || +// hc[3:0]==4'd8 || +// hc[3:0]==4'd9) ) +// io_contention = 1'b1; - if (fetching_pixels == 1'b1 && hc[3:0]<4'd10) + if (fetching_pixels == 1'b1 && hc[3:0]<4'd10) begin mem_contention = 1'b1; + //io_contention = 1'b1; + end if (fetching_pixels == 1'b0 && (hc[3:0]==4'd0 || hc[3:0]==4'd1 || hc[3:0]==4'd8 || - hc[3:0]==4'd9) ) + hc[3:0]==4'd9) ) begin mem_contention = 1'b1; - if (screen_mode == 2'b00 && hc[3:0]<4'd10 && (hc<10'd128 || hc>=10'd256)) + //io_contention = 1'b1; + end + if (screen_mode == 2'b00 && hc[3:0]<4'd10 && (hc<10'd128 || hc>=10'd256)) begin mem_contention = 1'b1; // extra contention for MODE 1 + //io_contention = 1'b1; + end end assign asic_is_using_ram = mem_contention & fetching_pixels; diff --git a/cores/SamCoupe/pines_zxuno.ucf b/cores/SamCoupe/pines_zxuno.ucf index 3098d56..9f4219d 100644 --- a/cores/SamCoupe/pines_zxuno.ucf +++ b/cores/SamCoupe/pines_zxuno.ucf @@ -1,34 +1,34 @@ # Clocks & debug NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33; -#NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33; +#NET "testled" LOC="2" | IOSTANDARD = LVCMOS33; NET "clk50mhz" PERIOD=20 ns; NET "clk12" PERIOD=83 ns; # Video output -NET "r<2>" LOC="P93" | IOSTANDARD = LVCMOS33; -NET "r<1>" LOC="P92" | IOSTANDARD = LVCMOS33; -NET "r<0>" LOC="P88" | IOSTANDARD = LVCMOS33; -NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33; -NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33; -NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33; -NET "b<2>" LOC="P81" | IOSTANDARD = LVCMOS33; -NET "b<1>" LOC="P80" | IOSTANDARD = LVCMOS33; -NET "b<0>" LOC="P79" | IOSTANDARD = LVCMOS33; -NET "csync" LOC="P87" | IOSTANDARD = LVCMOS33; -#NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33; -NET "stdn" LOC="P67" | IOSTANDARD = LVCMOS33; -NET "stdnb" LOC="P66" | IOSTANDARD = LVCMOS33; +NET "r<2>" LOC="P97" | IOSTANDARD = LVCMOS33; +NET "r<1>" LOC="P95" | IOSTANDARD = LVCMOS33; +NET "r<0>" LOC="P94" | IOSTANDARD = LVCMOS33; +NET "g<2>" LOC="P88" | IOSTANDARD = LVCMOS33; +NET "g<1>" LOC="P87" | IOSTANDARD = LVCMOS33; +NET "g<0>" LOC="P85" | IOSTANDARD = LVCMOS33; +NET "b<2>" LOC="P84" | IOSTANDARD = LVCMOS33; +NET "b<1>" LOC="P83" | IOSTANDARD = LVCMOS33; +NET "b<0>" LOC="P82" | IOSTANDARD = LVCMOS33; +NET "csync" LOC="P93" | IOSTANDARD = LVCMOS33; +#NET "vsync" LOC="P92" | IOSTANDARD = LVCMOS33; +NET "stdn" LOC="P51" | IOSTANDARD = LVCMOS33; +NET "stdnb" LOC="P50" | IOSTANDARD = LVCMOS33; # Sound input/output -NET "audio_out_left" LOC="P8" | IOSTANDARD = LVCMOS33; -NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33; -NET "ear" LOC="P105" | IOSTANDARD = LVCMOS33; +NET "audio_out_left" LOC="P98" | IOSTANDARD = LVCMOS33; +NET "audio_out_right" LOC="P99" | IOSTANDARD = LVCMOS33; +NET "ear" LOC="P1" | IOSTANDARD = LVCMOS33; # 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 +NET "clkps2" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN +NET "dataps2" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN +#NET "mouseclk" LOC="P57" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN +#NET "mousedata" LOC="P56" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN # SRAM NET "sram_addr<0>" LOC="P115" | IOSTANDARD = LVCMOS33; @@ -51,34 +51,32 @@ NET "sram_addr<16>" LOC="P139" | IOSTANDARD = LVCMOS33; NET "sram_addr<17>" LOC="P141" | IOSTANDARD = LVCMOS33; NET "sram_addr<18>" LOC="P138" | IOSTANDARD = LVCMOS33; -NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33; -NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33; -NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33; -NET "sram_data<3>" LOC="P99" | IOSTANDARD = LVCMOS33; -NET "sram_data<4>" LOC="P100" | IOSTANDARD = LVCMOS33; -NET "sram_data<5>" LOC="P101" | IOSTANDARD = LVCMOS33; -NET "sram_data<6>" LOC="P102" | IOSTANDARD = LVCMOS33; -NET "sram_data<7>" LOC="P104" | IOSTANDARD = LVCMOS33; +NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33; +NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33; +NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33; +NET "sram_data<3>" LOC="P105" | IOSTANDARD = LVCMOS33; +NET "sram_data<4>" LOC="P104" | IOSTANDARD = LVCMOS33; +NET "sram_data<5>" LOC="P102" | IOSTANDARD = LVCMOS33; +NET "sram_data<6>" LOC="P101" | IOSTANDARD = LVCMOS33; +NET "sram_data<7>" LOC="P100" | IOSTANDARD = LVCMOS33; -NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33; +NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33; # SPI Flash #NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33; #NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33; #NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33; #NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33; -#NET "flash_ext1" LOC="P62" | IOSTANDARD = LVCMOS33; -#NET "flash_ext2" LOC="P61" | IOSTANDARD = LVCMOS33; # SD/MMC -#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33; -#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33; -#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33; -#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33; +#NET "sd_cs_n" LOC="P78" | IOSTANDARD = LVCMOS33; +#NET "sd_clk" LOC="P80" | IOSTANDARD = LVCMOS33; +#NET "sd_mosi" LOC="P79" | IOSTANDARD = LVCMOS33; +#NET "sd_miso" LOC="P81" | IOSTANDARD = LVCMOS33; # JOYSTICK -#NET "joyup" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6 -#NET "joydown" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4 -#NET "joyleft" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3 -#NET "joyright" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2 -#NET "joyfire" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7 +#NET "joyup" LOC="P74" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6 +#NET "joydown" LOC="P67" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4 +#NET "joyleft" LOC="P59" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3 +#NET "joyright" LOC="P58" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2 +#NET "joyfire" LOC="P75" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7 diff --git a/cores/SamCoupe/pines_zxuno_Ap.ucf b/cores/SamCoupe/pines_zxuno_Ap.ucf new file mode 100644 index 0000000..9f4219d --- /dev/null +++ b/cores/SamCoupe/pines_zxuno_Ap.ucf @@ -0,0 +1,82 @@ +# Clocks & debug +NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33; +#NET "testled" LOC="2" | IOSTANDARD = LVCMOS33; +NET "clk50mhz" PERIOD=20 ns; +NET "clk12" PERIOD=83 ns; + +# Video output +NET "r<2>" LOC="P97" | IOSTANDARD = LVCMOS33; +NET "r<1>" LOC="P95" | IOSTANDARD = LVCMOS33; +NET "r<0>" LOC="P94" | IOSTANDARD = LVCMOS33; +NET "g<2>" LOC="P88" | IOSTANDARD = LVCMOS33; +NET "g<1>" LOC="P87" | IOSTANDARD = LVCMOS33; +NET "g<0>" LOC="P85" | IOSTANDARD = LVCMOS33; +NET "b<2>" LOC="P84" | IOSTANDARD = LVCMOS33; +NET "b<1>" LOC="P83" | IOSTANDARD = LVCMOS33; +NET "b<0>" LOC="P82" | IOSTANDARD = LVCMOS33; +NET "csync" LOC="P93" | IOSTANDARD = LVCMOS33; +#NET "vsync" LOC="P92" | IOSTANDARD = LVCMOS33; +NET "stdn" LOC="P51" | IOSTANDARD = LVCMOS33; +NET "stdnb" LOC="P50" | IOSTANDARD = LVCMOS33; + +# Sound input/output +NET "audio_out_left" LOC="P98" | IOSTANDARD = LVCMOS33; +NET "audio_out_right" LOC="P99" | IOSTANDARD = LVCMOS33; +NET "ear" LOC="P1" | IOSTANDARD = LVCMOS33; + +# Keyboard and mouse +NET "clkps2" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN +NET "dataps2" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN +#NET "mouseclk" LOC="P57" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN +#NET "mousedata" LOC="P56" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN + +# SRAM +NET "sram_addr<0>" LOC="P115" | IOSTANDARD = LVCMOS33; +NET "sram_addr<1>" LOC="P116" | IOSTANDARD = LVCMOS33; +NET "sram_addr<2>" LOC="P117" | IOSTANDARD = LVCMOS33; +NET "sram_addr<3>" LOC="P119" | IOSTANDARD = LVCMOS33; +NET "sram_addr<4>" LOC="P120" | IOSTANDARD = LVCMOS33; +NET "sram_addr<5>" LOC="P123" | IOSTANDARD = LVCMOS33; +NET "sram_addr<6>" LOC="P126" | IOSTANDARD = LVCMOS33; +NET "sram_addr<7>" LOC="P131" | IOSTANDARD = LVCMOS33; +NET "sram_addr<8>" LOC="P127" | IOSTANDARD = LVCMOS33; +NET "sram_addr<9>" LOC="P124" | IOSTANDARD = LVCMOS33; +NET "sram_addr<10>" LOC="P118" | IOSTANDARD = LVCMOS33; +NET "sram_addr<11>" LOC="P121" | IOSTANDARD = LVCMOS33; +NET "sram_addr<12>" LOC="P133" | IOSTANDARD = LVCMOS33; +NET "sram_addr<13>" LOC="P132" | IOSTANDARD = LVCMOS33; +NET "sram_addr<14>" LOC="P137" | IOSTANDARD = LVCMOS33; +NET "sram_addr<15>" LOC="P140" | IOSTANDARD = LVCMOS33; +NET "sram_addr<16>" LOC="P139" | IOSTANDARD = LVCMOS33; +NET "sram_addr<17>" LOC="P141" | IOSTANDARD = LVCMOS33; +NET "sram_addr<18>" LOC="P138" | IOSTANDARD = LVCMOS33; + +NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33; +NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33; +NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33; +NET "sram_data<3>" LOC="P105" | IOSTANDARD = LVCMOS33; +NET "sram_data<4>" LOC="P104" | IOSTANDARD = LVCMOS33; +NET "sram_data<5>" LOC="P102" | IOSTANDARD = LVCMOS33; +NET "sram_data<6>" LOC="P101" | IOSTANDARD = LVCMOS33; +NET "sram_data<7>" LOC="P100" | IOSTANDARD = LVCMOS33; + +NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33; + +# SPI Flash +#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33; +#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33; +#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33; +#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33; + +# SD/MMC +#NET "sd_cs_n" LOC="P78" | IOSTANDARD = LVCMOS33; +#NET "sd_clk" LOC="P80" | IOSTANDARD = LVCMOS33; +#NET "sd_mosi" LOC="P79" | IOSTANDARD = LVCMOS33; +#NET "sd_miso" LOC="P81" | IOSTANDARD = LVCMOS33; + +# JOYSTICK +#NET "joyup" LOC="P74" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6 +#NET "joydown" LOC="P67" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4 +#NET "joyleft" LOC="P59" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3 +#NET "joyright" LOC="P58" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2 +#NET "joyfire" LOC="P75" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7 diff --git a/cores/SamCoupe/pines_zxuno_v3.ucf b/cores/SamCoupe/pines_zxuno_v3.ucf new file mode 100644 index 0000000..010937a --- /dev/null +++ b/cores/SamCoupe/pines_zxuno_v3.ucf @@ -0,0 +1,107 @@ +# Clocks & debug +NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33; +#NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33; +NET "clk50mhz" PERIOD=20 ns; +NET "clk12" PERIOD=83 ns; + +# Video output +NET "r<2>" LOC="P93" | IOSTANDARD = LVCMOS33; +NET "r<1>" LOC="P92" | IOSTANDARD = LVCMOS33; +NET "r<0>" LOC="P88" | IOSTANDARD = LVCMOS33; +NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33; +NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33; +NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33; +NET "b<2>" LOC="P81" | IOSTANDARD = LVCMOS33; +NET "b<1>" LOC="P80" | IOSTANDARD = LVCMOS33; +NET "b<0>" LOC="P79" | IOSTANDARD = LVCMOS33; +NET "csync" LOC="P87" | IOSTANDARD = LVCMOS33; +#NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33; +NET "stdn" LOC="P67" | IOSTANDARD = LVCMOS33; +NET "stdnb" LOC="P66" | IOSTANDARD = LVCMOS33; + +# Sound input/output +NET "audio_out_left" LOC="P8" | IOSTANDARD = LVCMOS33; +NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33; +NET "ear" LOC="P105" | IOSTANDARD = LVCMOS33; + +# 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="P139" | IOSTANDARD = LVCMOS33; +NET "sram_addr<1>" LOC="P140" | IOSTANDARD = LVCMOS33; +NET "sram_addr<2>" LOC="P141" | IOSTANDARD = LVCMOS33; +NET "sram_addr<3>" LOC="P142" | IOSTANDARD = LVCMOS33; +NET "sram_addr<4>" LOC="P143" | IOSTANDARD = LVCMOS33; +NET "sram_addr<5>" LOC="P137" | IOSTANDARD = LVCMOS33; +NET "sram_addr<6>" LOC="P134" | IOSTANDARD = LVCMOS33; +NET "sram_addr<7>" LOC="P133" | IOSTANDARD = LVCMOS33; +NET "sram_addr<8>" LOC="P131" | IOSTANDARD = LVCMOS33; +NET "sram_addr<9>" LOC="P117" | IOSTANDARD = LVCMOS33; +NET "sram_addr<10>" LOC="P116" | IOSTANDARD = LVCMOS33; +NET "sram_addr<11>" LOC="P115" | IOSTANDARD = LVCMOS33; +NET "sram_addr<12>" LOC="P114" | IOSTANDARD = LVCMOS33; +NET "sram_addr<13>" LOC="P112" | IOSTANDARD = LVCMOS33; +NET "sram_addr<14>" LOC="P99" | IOSTANDARD = LVCMOS33; +NET "sram_addr<15>" LOC="P100" | IOSTANDARD = LVCMOS33; +NET "sram_addr<16>" LOC="P101" | IOSTANDARD = LVCMOS33; +NET "sram_addr<17>" LOC="P102" | IOSTANDARD = LVCMOS33; +NET "sram_addr<18>" LOC="P104" | IOSTANDARD = LVCMOS33; + +#NET "sram_addr<0>" LOC="P143" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<1>" LOC="P142" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<2>" LOC="P141" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<3>" LOC="P140" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<4>" LOC="P139" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<5>" LOC="P104" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<6>" LOC="P102" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<7>" LOC="P101" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<8>" LOC="P100" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<9>" LOC="P99" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<10>" LOC="P112" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<11>" LOC="P114" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<12>" LOC="P115" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<13>" LOC="P116" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<14>" LOC="P117" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<15>" LOC="P131" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<16>" LOC="P133" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<17>" LOC="P134" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<18>" LOC="P137" | IOSTANDARD = LVCMOS33; + +#NET "sram_addr<19>" LOC="P111" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<20>" LOC="P138" | IOSTANDARD = LVCMOS33; + +NET "sram_data<0>" LOC="P132" | IOSTANDARD = LVCMOS33; +NET "sram_data<1>" LOC="P126" | IOSTANDARD = LVCMOS33; +NET "sram_data<2>" LOC="P123" | IOSTANDARD = LVCMOS33; +NET "sram_data<3>" LOC="P120" | IOSTANDARD = LVCMOS33; +NET "sram_data<4>" LOC="P119" | IOSTANDARD = LVCMOS33; +NET "sram_data<5>" LOC="P121" | IOSTANDARD = LVCMOS33; +NET "sram_data<6>" LOC="P124" | IOSTANDARD = LVCMOS33; +NET "sram_data<7>" LOC="P127" | IOSTANDARD = LVCMOS33; + +NET "sram_we_n" LOC="P118" | IOSTANDARD = LVCMOS33; + +# SPI Flash +#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33; +#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33; +#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33; +#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33; +#NET "flash_ext1" LOC="P62" | IOSTANDARD = LVCMOS33; +#NET "flash_ext2" LOC="P61" | IOSTANDARD = LVCMOS33; + +# SD/MMC +#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33; +#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33; +#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33; +#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33; + +# JOYSTICK +#NET "joyup" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6 +#NET "joydown" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4 +#NET "joyleft" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3 +#NET "joyright" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2 +#NET "joyfire" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7 diff --git a/cores/SamCoupe/pines_zxuno_v4.ucf b/cores/SamCoupe/pines_zxuno_v4.ucf new file mode 100644 index 0000000..89a52f2 --- /dev/null +++ b/cores/SamCoupe/pines_zxuno_v4.ucf @@ -0,0 +1,85 @@ +# Clocks & debug +NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33; +NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33; +NET "clk50mhz" PERIOD=20 ns; +NET "clk12" PERIOD=83 ns; + +# Video output +NET "b<2>" LOC="P93" | IOSTANDARD = LVCMOS33; +NET "b<1>" LOC="P92" | IOSTANDARD = LVCMOS33; +NET "b<0>" LOC="P88" | IOSTANDARD = LVCMOS33; +NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33; +NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33; +NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33; +NET "r<2>" LOC="P81" | IOSTANDARD = LVCMOS33; +NET "r<1>" LOC="P80" | IOSTANDARD = LVCMOS33; +NET "r<0>" LOC="P79" | IOSTANDARD = LVCMOS33; +NET "hsync" LOC="P87" | IOSTANDARD = LVCMOS33; +NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33; +NET "stdn" LOC="P66" | IOSTANDARD = LVCMOS33; +NET "stdnb" LOC="P67" | IOSTANDARD = LVCMOS33; + +# Sound input/output +NET "audio_out_left" LOC="P10" | IOSTANDARD = LVCMOS33; +NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33; +NET "ear" LOC="P94" | IOSTANDARD = LVCMOS33; + +# Keyboard and mouse +NET "clkps2" LOC="P99" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN +NET "dataps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN +#NET "mouseclk" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN +#NET "mousedata" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN + +# SRAM +NET "sram_addr<0>" LOC="P141" | IOSTANDARD = LVCMOS33; +NET "sram_addr<1>" LOC="P139" | IOSTANDARD = LVCMOS33; +NET "sram_addr<2>" LOC="P137" | IOSTANDARD = LVCMOS33; +NET "sram_addr<3>" LOC="P134" | IOSTANDARD = LVCMOS33; +NET "sram_addr<4>" LOC="P133" | IOSTANDARD = LVCMOS33; +NET "sram_addr<5>" LOC="P120" | IOSTANDARD = LVCMOS33; +NET "sram_addr<6>" LOC="P118" | IOSTANDARD = LVCMOS33; +NET "sram_addr<7>" LOC="P116" | IOSTANDARD = LVCMOS33; +NET "sram_addr<8>" LOC="P114" | IOSTANDARD = LVCMOS33; +NET "sram_addr<9>" LOC="P112" | IOSTANDARD = LVCMOS33; +NET "sram_addr<10>" LOC="P104" | IOSTANDARD = LVCMOS33; +NET "sram_addr<11>" LOC="P102" | IOSTANDARD = LVCMOS33; +NET "sram_addr<12>" LOC="P101" | IOSTANDARD = LVCMOS33; +NET "sram_addr<13>" LOC="P100" | IOSTANDARD = LVCMOS33; +NET "sram_addr<14>" LOC="P111" | IOSTANDARD = LVCMOS33; +NET "sram_addr<15>" LOC="P131" | IOSTANDARD = LVCMOS33; +NET "sram_addr<16>" LOC="P138" | IOSTANDARD = LVCMOS33; +NET "sram_addr<17>" LOC="P140" | IOSTANDARD = LVCMOS33; +NET "sram_addr<18>" LOC="P142" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<19>" LOC="P105" | IOSTANDARD = LVCMOS33; +#NET "sram_addr<20>" LOC="P143" | IOSTANDARD = LVCMOS33; + +NET "sram_data<0>" LOC="P132" | IOSTANDARD = LVCMOS33; +NET "sram_data<1>" LOC="P127" | IOSTANDARD = LVCMOS33; +NET "sram_data<2>" LOC="P124" | IOSTANDARD = LVCMOS33; +NET "sram_data<3>" LOC="P123" | IOSTANDARD = LVCMOS33; +NET "sram_data<4>" LOC="P115" | IOSTANDARD = LVCMOS33; +NET "sram_data<5>" LOC="P117" | IOSTANDARD = LVCMOS33; +NET "sram_data<6>" LOC="P119" | IOSTANDARD = LVCMOS33; +NET "sram_data<7>" LOC="P126" | IOSTANDARD = LVCMOS33; + +NET "sram_we_n" LOC="P121" | IOSTANDARD = LVCMOS33; + +# SPI Flash +#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33; +#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33; +#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33; +#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33; + +# SD/MMC +#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33; +#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33; +#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33; +#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33; + +# JOYSTICK +#NET "joyup" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6 +#NET "joydown" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4 +#NET "joyleft" LOC="P6" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3 +#NET "joyright" LOC="P7" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2 +#NET "joyfire" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7 +#NET "btn2" LOC="P8" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY5 diff --git a/cores/SamCoupe/ps2_keyb.v b/cores/SamCoupe/ps2_keyb.v index 537ee88..65b43fa 100644 --- a/cores/SamCoupe/ps2_keyb.v +++ b/cores/SamCoupe/ps2_keyb.v @@ -65,6 +65,7 @@ module ps2_keyb( wire extended; wire released; assign scancode_dout = kbcode; + wire teclado_limpio; /* | BSY | x | x | x | ERR | RLS | EXT | PEN | @@ -101,6 +102,7 @@ module ps2_keyb( .scan(kbcode), .extended(extended), .released(released), + .kbclean(teclado_limpio), .sam_row(rows), .sam_col(cols), .master_reset(master_reset), @@ -114,6 +116,16 @@ module ps2_keyb( .rewind(regaddr_changed == 1'b1 && zxuno_addr == KEYMAP) ); + keyboard_pressed_status comprueba_teclado_limpio ( + .clk(clk), + .rst(1'b0), + .scan_received(nueva_tecla), + .scancode(kbcode), + .extended(extended), + .released(released), + .kbclean(teclado_limpio) + ); + ps2_host_to_kb escritura_a_teclado ( .clk(clk), .ps2clk_ext(clkps2), diff --git a/cores/SamCoupe/ram.v b/cores/SamCoupe/ram.v index ba56e85..50792ad 100644 --- a/cores/SamCoupe/ram.v +++ b/cores/SamCoupe/ram.v @@ -35,59 +35,10 @@ module ram_dual_port_turnos ( inout wire [7:0] sram_d ); - parameter ASIC = 2'd0, - CPUADDR = 2'd1, - CPUWRITE = 2'd2; - -// assign sram_d = ((state == CPUADDR && cpu_we_n == 1'b0) || state == CPUWRITE)? data_from_cpu : 8'hZZ; -// assign sram_we_n = (cpu_we_n == 1'b0 && state == CPUWRITE)? 1'b0 : 1'b1; - -// reg [1:0] state = ASIC; -// always @(posedge clk) begin -// case (state) -// ASIC: -// begin -// data_to_asic <= sram_d; -// if (whichturn == 1'b0) begin -// sram_a <= cpuramaddr; -// state <= CPUADDR; -// end -// else -// sram_a <= vramaddr; -// end -// CPUADDR: -// begin -// data_to_cpu <= sram_d; -// if (whichturn == 1'b1) begin -// sram_a <= vramaddr; -// state <= ASIC; -// end -// else begin -// sram_a <= cpuramaddr; -// if (cpu_we_n == 1'b0) begin -// state <= CPUWRITE; -// end -// end -// end -// CPUWRITE: -// begin -// if (whichturn == 1'b1) begin -// sram_a <= vramaddr; -// state <= ASIC; -// end -// else if (cpu_we_n == 1'b1) begin -// sram_a <= cpuramaddr; -// state <= CPUADDR; -// end -// end -// default: state <= ASIC; -// endcase -// end - assign sram_d = (cpu_we_n == 1'b0 && whichturn == 1'b0)? data_from_cpu : 8'hZZ; always @* begin - //data_to_cpu = 8'hFF; - //data_to_asic = 8'hFF; + data_to_cpu = 8'hFF; + data_to_asic = 8'hFF; if (whichturn == 1'b1) begin // ASIC sram_a = vramaddr; sram_we_n = 1'b1; diff --git a/cores/SamCoupe/relojes.v b/cores/SamCoupe/relojes.v index fbb368e..8e26e3f 100644 --- a/cores/SamCoupe/relojes.v +++ b/cores/SamCoupe/relojes.v @@ -114,7 +114,7 @@ module relojes .CLKOUT1_DUTY_CYCLE (0.500), .CLKOUT2_DIVIDE (100), .CLKOUT2_PHASE (0.000), - .CLKOUT3_DUTY_CYCLE (0.500), + .CLKOUT2_DUTY_CYCLE (0.500), .CLKOUT3_DIVIDE (75), .CLKOUT3_PHASE (0.000), .CLKOUT3_DUTY_CYCLE (0.500), diff --git a/cores/SamCoupe/saa1099.v b/cores/SamCoupe/saa1099.v index 649de1f..d20b334 100644 --- a/cores/SamCoupe/saa1099.v +++ b/cores/SamCoupe/saa1099.v @@ -536,8 +536,8 @@ module saa1099_envelope_gen ( stereoshape <= 1'b0; envshape <= 3'b000; envclock <= 1'b0; - write_to_address_prev = 1'b0; - write_to_data_prev = 1'b0; + write_to_address_prev <= 1'b0; + write_to_data_prev <= 1'b0; pending_data <= 1'b0; end else begin diff --git a/cores/SamCoupe/samcoupe.gise b/cores/SamCoupe/samcoupe.gise new file mode 100644 index 0000000..7d25f8f --- /dev/null +++ b/cores/SamCoupe/samcoupe.gise @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + 11.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cores/SamCoupe/samcoupe.v b/cores/SamCoupe/samcoupe.v index e100bc1..9700164 100644 --- a/cores/SamCoupe/samcoupe.v +++ b/cores/SamCoupe/samcoupe.v @@ -159,7 +159,7 @@ module samcoupe ( ); ram_dual_port_turnos ram_512k ( - .clk(clk24), + .clk(1'b0 /*clk24*/), .whichturn(asic_is_using_ram), .vramaddr(vramaddr), .cpuramaddr(cpuramaddr), diff --git a/cores/SamCoupe/samcoupe.xise b/cores/SamCoupe/samcoupe.xise index 1044dca..e46263a 100644 --- a/cores/SamCoupe/samcoupe.xise +++ b/cores/SamCoupe/samcoupe.xise @@ -9,89 +9,89 @@ - + - + - - + + - - - - + + + + - - + + - - + + - - + + - - - - + - - + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -104,6 +104,7 @@ + @@ -115,7 +116,7 @@ - + @@ -126,7 +127,7 @@ - + @@ -143,11 +144,12 @@ + - + @@ -163,6 +165,7 @@ + @@ -185,7 +188,6 @@ - @@ -196,7 +198,7 @@ - + @@ -225,7 +227,9 @@ + + @@ -235,6 +239,7 @@ + @@ -247,7 +252,7 @@ - + @@ -290,7 +295,6 @@ - @@ -321,7 +325,6 @@ - @@ -364,6 +367,7 @@ + @@ -395,7 +399,7 @@ - + @@ -415,9 +419,7 @@ - - - + diff --git a/cores/SamCoupe/scancode_to_speccy.v b/cores/SamCoupe/scancode_to_speccy.v index dc3e81f..51e8688 100644 --- a/cores/SamCoupe/scancode_to_speccy.v +++ b/cores/SamCoupe/scancode_to_speccy.v @@ -26,6 +26,7 @@ module scancode_to_sam ( input wire [7:0] scan, input wire extended, input wire released, + input wire kbclean, //------------------------ input wire [8:0] sam_row, output wire [7:0] sam_col, @@ -118,7 +119,7 @@ module scancode_to_sam ( always @(posedge clk) begin if (scan_received == 1'b1) key_is_pending <= 1'b1; - if (rst == 1'b1) + if (rst == 1'b1 || (kbclean == 1'b1 && state == IDLE && scan_received == 1'b0)) state <= CLEANMATRIX; else begin case (state) @@ -219,7 +220,7 @@ module scancode_to_sam ( end CPUTIME: begin if (rewind == 1'b1) begin - cpuaddr = 14'h0000; + cpuaddr <= 14'h0000; state <= IDLE; end else if (cpuread == 1'b1) begin @@ -247,19 +248,6 @@ module scancode_to_sam ( state <= IDLE; end end - // else if (state == UPDCOUNTERS1) begin - // if (~released) - // keycount <= keycount + 4'b0001; // suma 1 al contador de pulsaciones - // else if (released && keycount != 4'b0000) - // keycount <= keycount + 4'b1111; // o le resta 1 al contador de pulsaciones, pero sin bajar de 0 - // state <= UPDCOUNTERS2; - // end - // else if (state == UPDCOUNTERS2) begin - // if (keycount == 4'b0000) // si es la última tecla soltada, limpia la matriz de teclado del Spectrum - // state <= CLEANMATRIX; - // else - // state <= IDLE; - // end default: begin state <= IDLE; end @@ -267,3 +255,86 @@ module scancode_to_sam ( end end endmodule + +module keyboard_pressed_status ( + input wire clk, + input wire rst, + input wire scan_received, + input wire [7:0] scancode, + input wire extended, + input wire released, + output reg kbclean + ); + + parameter + RESETTING = 2'd0, + UPDATING = 2'd1, + SCANNING = 2'd2; + + reg keybstat_ne[0:255]; // non extended keymap + reg keybstat_ex[0:255]; // extended keymap + reg [7:0] addrscan = 8'h00; // keymap bit address + reg keypressed_ne = 1'b0; // there is at least one key pressed + reg keypressed_ex = 1'b0; // there is at least one extended key pressed + reg [1:0] state = RESETTING; + + integer i; + initial begin + kbclean = 1'b1; + for (i=0;i<256;i=i+1) begin + keybstat_ne[i] = 1'b0; + keybstat_ex[i] = 1'b0; + end + end + + always @(posedge clk) begin + if (rst == 1'b1) begin + state <= RESETTING; + addrscan <= 8'h00; + end + else begin + case (state) + RESETTING: + begin + if (addrscan == 8'hFF) begin + addrscan <= 8'h00; + state <= SCANNING; + kbclean <= 1'b1; + end + else begin + keybstat_ne[addrscan] <= 1'b0; + keybstat_ex[addrscan] <= 1'b0; + addrscan <= addrscan + 8'd1; + end + end + UPDATING: + begin + state <= SCANNING; + addrscan <= 8'h00; + kbclean <= 1'b0; + keypressed_ne <= 1'b0; + keypressed_ex <= 1'b0; + if (extended == 1'b0) + keybstat_ne[scancode] <= ~released; + else + keybstat_ex[scancode] <= ~released; + end + SCANNING: + begin + if (scan_received == 1'b1) + state <= UPDATING; + addrscan <= addrscan + 8'd1; + if (addrscan == 8'hFF) begin + kbclean <= ~(keypressed_ne | keypressed_ex); + keypressed_ne <= 1'b0; + keypressed_ex <= 1'b0; + end + else begin + keypressed_ne <= keypressed_ne | keybstat_ne[addrscan]; + keypressed_ex <= keypressed_ex | keybstat_ex[addrscan]; + end + end + endcase + end + end +endmodule