From bfb03521884eec987776d393f467706d7a30cca1 Mon Sep 17 00:00:00 2001 From: Eugene Lozovoy Date: Tue, 10 Sep 2024 13:04:42 +0300 Subject: [PATCH] cleanup gs signals --- TSConf.sv | 37 ------- rtl/sound/gs.v | 276 ++++++++++++++++++++++++------------------------- rtl/tsconf.v | 35 +++---- 3 files changed, 150 insertions(+), 198 deletions(-) diff --git a/TSConf.sv b/TSConf.sv index 975f132..307d255 100644 --- a/TSConf.sv +++ b/TSConf.sv @@ -71,9 +71,6 @@ localparam CONF_STR = { "TSConf;;", "O12,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", "-;", - "O34,Stereo mix,None,25%,50%,100%;", - "OST,General Sound,512KB,1MB,2MB;", - "-;", "OU,CPU Type,NMOS,CMOS;", "O67,CPU Speed,3.5MHz,7MHz,14MHz;", "O8,CPU Cache,On,Off;", @@ -341,12 +338,6 @@ tsconf tsconf .SD_CLK(sdclk), .SD_CS_N(sdss), - .GS_ADDR(gs_mem_addr), - .GS_DI(gs_mem_din), - .GS_DO(gs_mem_dout | gs_mem_mask), - .GS_RD(gs_mem_rd), - .GS_WR(gs_mem_wr), - .GS_WAIT(~gs_mem_ready), .SOUND_L(SOUND_L), .SOUND_R(SOUND_R), @@ -367,34 +358,6 @@ tsconf tsconf .loader_wr(ioctl_wr && ioctl_download && !ioctl_index && !ioctl_addr[24:16]) ); -wire [20:0] gs_mem_addr; -wire [7:0] gs_mem_dout; -wire [7:0] gs_mem_din; -wire gs_mem_rd; -wire gs_mem_wr; -wire gs_mem_ready; -reg [7:0] gs_mem_mask; - -always_comb begin - gs_mem_mask = 0; - case(status[29:28]) - 0: if(gs_mem_addr[20:19]) gs_mem_mask = 8'hFF; - 1: if(gs_mem_addr[20]) gs_mem_mask = 8'hFF; - 2,3: gs_mem_mask = 0; - endcase -end - -// ddram ddram -// ( -// .*, -// .addr(gs_mem_addr), -// .dout(gs_mem_dout), -// .din(gs_mem_din), -// .we(gs_mem_wr), -// .rd(gs_mem_rd), -// .ready(gs_mem_ready) -// ); - reg VSync, HSync; always @(posedge clk_sys) begin diff --git a/rtl/sound/gs.v b/rtl/sound/gs.v index bbf09c9..ef43d2f 100644 --- a/rtl/sound/gs.v +++ b/rtl/sound/gs.v @@ -1,100 +1,101 @@ -/* - +/* + ----------------------------------------------------------------------------- - General Sound - ----------------------------------------------------------------------------- - 18.08.2018 Reworked first verilog version + General Sound + ----------------------------------------------------------------------------- + 18.08.2018 Reworked first verilog version 19.08.2018 Produce proper signed output 20.08.2018 Use external SDR/DDR RAM for page 2 and up - - CPU: Z80 @ 28MHz - ROM: 32K - RAM: up to 4096KB - INT: 37.5KHz - - #xxBB Command register - регистр команд, доступный для записи - #xxBB Status register - регистр состояния, доступный для чтения - bit 7 флаг данных - bit <6:1> Не определен - bit 0 флаг команд. Этот регистр позволяет определить состояние GS, в частности можно ли прочитать или записать очередной байт данных, или подать очередную команду, и т.п. - #xxB3 Data register - регистр данных, доступный для записи. В этот регистр Спектрум записывает данные, например, это могут быть аргументы команд. - #xxB3 Output register - регистр вывода, доступный для чтения. Из этого регистра Спектрум читает данные, идущие от GS - - Внутренние порта: - #xx00 "расширенная память" - регистр доступный для записи - bit <3:0> переключают страницы по 32Kb, страница 0 - ПЗУ - bit <7:0> не используются - - порты 1 - 5 "обеспечивают связь с SPECTRUM'ом" - #xx01 чтение команды General Sound'ом - bit <7:0> код команды - #xx02 чтение данных General Sound'ом - bit <7:0> данные - #xx03 запись данных General Sound'ом для SPECTRUM'a - bit <7:0> данные - #xx04 чтение слова состояния General Sound'ом - bit 0 флаг команд - bit 7 флаг данных - #xx05 сбрасывает бит D0 (флаг команд) слова состояния - - порты 6 - 9 "регулировка громкости" в каналах 1 - 4 - #xx06 "регулировка громкости" в канале 1 - bit <5:0> громкость - bit <7:6> не используются - #xx07 "регулировка громкости" в канале 2 - bit <5:0> громкость - bit <7:6> не используются - #xx08 "регулировка громкости" в канале 3 - bit <5:0> громкость - bit <7:6> не используются - #xx09 "регулировка громкости" в канале 4 - bit <5:0> громкость - bit <7:6> не используются - - #xx0A устанавливает бит 7 слова состояния не равным биту 0 порта #xx00 - #xx0B устанавливает бит 0 слова состояния равным биту 5 порта #xx06 - - Распределение памяти - #0000 - #3FFF - первые 16Kb ПЗУ - #4000 - #7FFF - первые 16Kb первой страницы ОЗУ - #8000 - #FFFF - листаемые страницы по 32Kb - страница 0 - ПЗУ, - страница 1 - первая страница ОЗУ - страницы 2... ОЗУ - - Данные в каналы заносятся при чтении процессором ОЗУ по адресам #6000 - #7FFF автоматически. - -*/ -module gs #(parameter ROMFILE="gs105b.mif") + CPU: Z80 @ 28MHz + ROM: 32K + RAM: up to 4096KB + INT: 37.5KHz + + #xxBB Command register - регистр команд, доступный для записи + #xxBB Status register - регистр состояния, доступный для чтения + bit 7 флаг данных + bit <6:1> Не определен + bit 0 флаг команд. Этот регистр позволяет определить состояние GS, в частности можно ли прочитать или записать очередной байт данных, или подать очередную команду, и т.п. + #xxB3 Data register - регистр данных, доступный для записи. В этот регистр Спектрум записывает данные, например, это могут быть аргументы команд. + #xxB3 Output register - регистр вывода, доступный для чтения. Из этого регистра Спектрум читает данные, идущие от GS + + Внутренние порта: + #xx00 "расширенная память" - регистр доступный для записи + bit <3:0> переключают страницы по 32Kb, страница 0 - ПЗУ + bit <7:0> не используются + + порты 1 - 5 "обеспечивают связь с SPECTRUM'ом" + #xx01 чтение команды General Sound'ом + bit <7:0> код команды + #xx02 чтение данных General Sound'ом + bit <7:0> данные + #xx03 запись данных General Sound'ом для SPECTRUM'a + bit <7:0> данные + #xx04 чтение слова состояния General Sound'ом + bit 0 флаг команд + bit 7 флаг данных + #xx05 сбрасывает бит D0 (флаг команд) слова состояния + + порты 6 - 9 "регулировка громкости" в каналах 1 - 4 + #xx06 "регулировка громкости" в канале 1 + bit <5:0> громкость + bit <7:6> не используются + #xx07 "регулировка громкости" в канале 2 + bit <5:0> громкость + bit <7:6> не используются + #xx08 "регулировка громкости" в канале 3 + bit <5:0> громкость + bit <7:6> не используются + #xx09 "регулировка громкости" в канале 4 + bit <5:0> громкость + bit <7:6> не используются + + #xx0A устанавливает бит 7 слова состояния не равным биту 0 порта #xx00 + #xx0B устанавливает бит 0 слова состояния равным биту 5 порта #xx06 + + Распределение памяти + #0000 - #3FFF - первые 16Kb ПЗУ + #4000 - #7FFF - первые 16Kb первой страницы ОЗУ + #8000 - #FFFF - листаемые страницы по 32Kb + страница 0 - ПЗУ, + страница 1 - первая страница ОЗУ + страницы 2... ОЗУ + + Данные в каналы заносятся при чтении процессором ОЗУ по адресам #6000 - #7FFF автоматически. + +*/ + +module gs ( input RESET, input CLK, input CE, - + input A, input [7:0] DI, output [7:0] DO, - input CS_n, + input CS_n, input WR_n, input RD_n, - output [20:0] MEM_ADDR, - output [7:0] MEM_DI, - input [7:0] MEM_DO, - output MEM_RD, - output MEM_WR, - input MEM_WAIT, + output [20:0] MEM_ADDR, + output [7:0] MEM_DI, + input [7:0] MEM_DO, + output MEM_RD, + output MEM_WR, + input MEM_WAIT, + output MEM_ROM, output [14:0] OUTL, output [14:0] OUTR ); - -// port #xxBB : #xxB3 -assign DO = A ? {bit7, 6'b111111, bit0} : port_03; - + +// port #xxBB : #xxB3 +assign DO = A ? {bit7, 6'b111111, bit0} : port_03; + // CPU -reg int_n; +reg int_n; wire cpu_m1_n; wire cpu_mreq_n; wire cpu_iorq_n; @@ -119,58 +120,58 @@ T80pa cpu .DI(cpu_di_bus) ); -// INT# +// INT# always @(posedge CLK) begin - reg [9:0] cnt; + reg [9:0] cnt; - if(CE) begin + if(CE) begin cnt <= cnt + 1'b1; - if (cnt == 746) begin // 37.48kHz - cnt <= 0; - int_n <= 0; + if (cnt == 746) begin // 37.48kHz + cnt <= 0; + int_n <= 0; end - end + end if (~cpu_iorq_n & ~cpu_m1_n) int_n <= 1; end - -reg bit7; -reg bit0; + +reg bit7; +reg bit0; always @(posedge CLK) begin - if (~cpu_iorq_n & cpu_m1_n) begin - case(cpu_a_bus[3:0]) - 'h2: bit7 <= 0; - 'h3: bit7 <= 1; - 'h5: bit0 <= 0; - 'hA: bit7 <= ~port_00[0]; - 'hB: bit0 <= port_09[5]; - endcase - end - else if (~CS_n) begin - if (~A & ~RD_n) bit7 <= 0; - if (~A & ~WR_n) bit7 <= 1; - if ( A & ~WR_n) bit0 <= 1; - end -end - + if (~cpu_iorq_n & cpu_m1_n) begin + case(cpu_a_bus[3:0]) + 'h2: bit7 <= 0; + 'h3: bit7 <= 1; + 'h5: bit0 <= 0; + 'hA: bit7 <= ~port_00[0]; + 'hB: bit0 <= port_09[5]; + endcase + end + else if (~CS_n) begin + if (~A & ~RD_n) bit7 <= 0; + if (~A & ~WR_n) bit7 <= 1; + if ( A & ~WR_n) bit0 <= 1; + end +end -reg [7:0] port_BB; -reg [7:0] port_B3; + +reg [7:0] port_BB; +reg [7:0] port_B3; always @(posedge CLK) begin if (RESET) begin port_BB <= 0; port_B3 <= 0; end - else if (~CS_n && ~WR_n) begin + else if (~CS_n && ~WR_n) begin if(A) port_BB <= DI; else port_B3 <= DI; end -end - -reg [5:0] port_00; -reg [7:0] port_03; -reg signed [6:0] port_06, port_07, port_08, port_09; +end + +reg [5:0] port_00; +reg [7:0] port_03; +reg signed [6:0] port_06 = 0, port_07 = 0, port_08 = 0, port_09 = 0; reg signed [7:0] ch_a, ch_b, ch_c, ch_d; always @(posedge CLK) begin @@ -178,56 +179,45 @@ always @(posedge CLK) begin port_00 <= 0; port_03 <= 0; end - else begin - if (~cpu_iorq_n & ~cpu_wr_n) begin + else begin + if (~cpu_iorq_n & ~cpu_wr_n) begin case(cpu_a_bus[3:0]) 0: port_00 <= cpu_do_bus[5:0]; 3: port_03 <= cpu_do_bus; 6: port_06 <= cpu_do_bus[5:0]; 7: port_07 <= cpu_do_bus[5:0]; 8: port_08 <= cpu_do_bus[5:0]; - 9: port_09 <= cpu_do_bus[5:0]; - endcase + 9: port_09 <= cpu_do_bus[5:0]; + endcase end - - if (~cpu_mreq_n && ~cpu_rd_n && cpu_a_bus[15:13] == 3) begin + + if (~cpu_mreq_n && ~cpu_rd_n && cpu_a_bus[15:13] == 3 && ~MEM_WAIT) begin case(cpu_a_bus[9:8]) - 0: ch_a <= {~mem_do[7],mem_do[6:0]}; - 1: ch_b <= {~mem_do[7],mem_do[6:0]}; - 2: ch_c <= {~mem_do[7],mem_do[6:0]}; - 3: ch_d <= {~mem_do[7],mem_do[6:0]}; - endcase + 0: ch_a <= {~MEM_DO[7],MEM_DO[6:0]}; + 1: ch_b <= {~MEM_DO[7],MEM_DO[6:0]}; + 2: ch_c <= {~MEM_DO[7],MEM_DO[6:0]}; + 3: ch_d <= {~MEM_DO[7],MEM_DO[6:0]}; + endcase end end -end +end -wire [7:0] cpu_di_bus = - (~cpu_mreq_n && ~cpu_rd_n && !page_addr[5:1]) ? mem_do : - (~cpu_mreq_n && ~cpu_rd_n) ? MEM_DO : - (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 1) ? port_BB : - (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 2) ? port_B3 : - (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 4) ? {bit7, 6'b111111, bit0} : +wire [7:0] cpu_di_bus = + (~cpu_mreq_n && ~cpu_rd_n) ? MEM_DO : + (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 1) ? port_BB : + (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 2) ? port_B3 : + (~cpu_iorq_n && ~cpu_rd_n && cpu_a_bus[3:0] == 4) ? {bit7, 6'b111111, bit0} : 8'hFF; -wire mem_wr = ~cpu_wr_n & ~cpu_mreq_n & |page_addr; -wire mem_rd = ~cpu_rd_n & ~cpu_mreq_n; wire [5:0] page_addr = cpu_a_bus[15] ? port_00 : cpu_a_bus[14]; assign MEM_ADDR = {page_addr, &cpu_a_bus[15:14], cpu_a_bus[13:0]}; -assign MEM_RD = mem_rd && |page_addr[5:1]; -assign MEM_WR = mem_wr && |page_addr[5:1]; +assign MEM_RD = ~cpu_rd_n & ~cpu_mreq_n; +assign MEM_WR = ~cpu_wr_n & ~cpu_mreq_n & ~MEM_ROM; assign MEM_DI = cpu_do_bus; +assign MEM_ROM = ~|page_addr; -wire [7:0] mem_do; -dpram #(.ADDRWIDTH(16), .MEM_INIT_FILE(ROMFILE)) mem -( - .clock(CLK), - .address_a(MEM_ADDR[15:0]), - .wren_a(mem_wr && !page_addr[5:1]), - .data_a(cpu_do_bus), - .q_a(mem_do) -); reg signed [14:0] out_a,out_b,out_c,out_d; always @(posedge CLK) begin diff --git a/rtl/tsconf.v b/rtl/tsconf.v index 29c9b64..623a581 100644 --- a/rtl/tsconf.v +++ b/rtl/tsconf.v @@ -88,14 +88,6 @@ module tsconf output SD_CLK, output SD_CS_N, - // General Sound - output [20:0] GS_ADDR, - output [7:0] GS_DI, - input [7:0] GS_DO, - output GS_RD, - output GS_WR, - input GS_WAIT, - // Audio output [15:0] SOUND_L, output [15:0] SOUND_R, @@ -816,31 +808,38 @@ turbosound SE12 // General Sound +wire [20:0] gs_mem_addr; +wire [7:0] gs_mem_di; +wire [7:0] gs_mem_do; +wire gs_mem_rd; +wire gs_mem_wr; +wire gs_mem_wait; + wire [14:0] gs_l; wire [14:0] gs_r; wire [7:0] gs_do_bus; wire gs_sel = ~cpu_iorq_n & cpu_m1_n & (cpu_a_bus[7:4] == 'hB && cpu_a_bus[2:0] == 'h3); -gs #("rtl/sound/gs105b.mif") U15 +gs U15 ( .RESET(reset | 1'b1), .CLK(clk), .CE(ce), - + .A(cpu_a_bus[3]), .DI(cpu_do_bus), .DO(gs_do_bus), .CS_n(cpu_iorq_n | ~gs_sel), .WR_n(cpu_wr_n), .RD_n(cpu_rd_n), - - .MEM_ADDR(GS_ADDR), - .MEM_DI(GS_DI), - .MEM_DO(GS_DO), - .MEM_RD(GS_RD), - .MEM_WR(GS_WR), - .MEM_WAIT(GS_WAIT), - + + .MEM_ADDR(gs_mem_addr), + .MEM_DI(gs_mem_di), + .MEM_DO(gs_mem_do), + .MEM_RD(gs_mem_rd), + .MEM_WR(gs_mem_wr), + .MEM_WAIT(gs_mem_wait), + .OUTL(gs_l), .OUTR(gs_r) );