OpenCores
URL https://opencores.org/ocsvn/sqmusic/sqmusic/trunk

Subversion Repositories sqmusic

[/] [sqmusic/] [trunk/] [1942/] [1942.v] - Blame information for rev 4

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 gryzor
/*
2
        1942 simple board setup in order to test SQMUSIC.
3
 
4
        Requirements:
5
                  TV80, Z80 Verilog module
6
                        Dump of Z80 ROM from 1942 board
7
 
8
  (c) Jose Tejada Gomez, 9th May 2013
9
  You can use this file following the GNU GENERAL PUBLIC LICENSE version 3
10
  Read the details of the license in:
11
  http://www.gnu.org/licenses/gpl.txt
12
 
13
  Send comments to: jose.tejada@ieee.org
14
 
15
*/
16
 
17
`timescale 1ns / 1ps
18
 
19
module sound1942;
20
  // inputs to Z80
21 4 gryzor
  reg reset_n, clk, int_n, sound_clk;
22 3 gryzor
 
23
  initial begin
24
    //$dumpfile("dump.lxt");
25
    //$dumpvars(1,map.ym2203_0);    
26
//              $dumpvars();
27
//    $dumpon;
28
//              $shm_open("1942.shm");
29
//              $shm_probe( sound1942, "ACTFS" );
30
    reset_n=0;
31
    #1500 reset_n=1;
32
                // change finish time depending on song
33 4 gryzor
                //#4e6 $finish;
34
    #5e9 $finish;
35 3 gryzor
  end
36
 
37
  always begin // main clock
38
    clk=0;
39
    forever clk = #167 ~clk;
40
  end
41
 
42
  always begin // sound clock
43
    sound_clk=0;
44
    forever sound_clk = #334 ~sound_clk;
45
  end
46
 
47
        parameter int_low_time=167*2*80;
48
 
49
  always begin // interrupt clock
50
    int_n=1;
51
    forever begin
52
                        #(4166667-int_low_time) int_n=0; // 240Hz
53
                        //$display("IRQ request @ %t us",$time/1e6);
54
                        #(int_low_time) int_n=1;
55
                end
56
  end
57
 
58 4 gryzor
        always #22676 $display("%d", amp0_y+amp1_y ); // 44.1kHz sample
59
 
60
        wire [3:0] ay0_a, ay0_b, ay0_c, ay1_a, ay1_b, ay1_c;
61
  computer_1942 #(0) game( .clk(clk), .sound_clk(sound_clk),
62
    .int_n(int_n), .reset_n(reset_n),
63
    .ay0_a(ay0_a), .ay0_b(ay0_b), .ay0_c(ay0_c),
64
    .ay1_a(ay1_a), .ay1_b(ay1_b), .ay1_c(ay1_c) );
65
  // sound amplifier:
66
  wire [15:0] amp0_y, amp1_y;
67
        SQM_AMP amp0( .A(ay0_a), .B(ay0_b), .C(ay0_c), .Y( amp0_y ));
68
        SQM_AMP amp1( .A(ay1_a), .B(ay1_b), .C(ay1_c), .Y( amp1_y ));
69 3 gryzor
endmodule
70
 
71
/////////////////////////////////////////////////////
72 4 gryzor
module computer_1942
73
#(parameter dump_regs=0) // set to 1 to dump sqmusic registers
74
(
75 3 gryzor
  input clk,
76
        input sound_clk,
77
        input reset_n,
78 4 gryzor
        input int_n,
79
        output [3:0] ay0_a,
80
        output [3:0] ay0_b,
81
        output [3:0] ay0_c,
82
        output [3:0] ay1_a,
83
        output [3:0] ay1_b,
84
        output [3:0] ay1_c
85
);
86
  reg wait_n, nmi_n, busrq_n;
87
 
88
  wire [7:0]cpu_in, cpu_out;
89
  wire [15:0]adr;
90
  wire m1_n, mreq_n, iorq_n, rd_n, wr_n, rfsh_n, halt_n, busak_n;
91
  wire bus_error;
92
 
93 3 gryzor
 
94
        wire [3:0] ay0_a, ay0_b, ay0_c, ay1_a, ay1_b, ay1_c;
95
        wire [15:0] amp0_y, amp1_y;
96
 
97
  wire [7:0]ram_out, rom_out, latch_out;
98
  wire rom_enable = adr<16'h4000 ? 1:0;
99
  wire ram_enable = adr>=16'h4000 && adr<16'h4800 ? 1:0;
100
  wire latch_enable = adr==16'h6000 ? 1 : 0;
101
  wire ay_0_enable = adr==16'h8000 || adr==16'h8001 ? 1:0;
102
  wire ay_1_enable = adr==16'hC000 || adr==16'hC001 ? 1:0;
103
  assign bus_error = ~ram_enable & ~rom_enable & ~latch_enable &
104
    ~ay_0_enable & ~ay_1_enable;
105 4 gryzor
  assign cpu_in=ram_out | rom_out | latch_out;
106 3 gryzor
/*
107
        always @(negedge rd_n)
108
                if( !rd_n       && adr==8'h38 )
109
                        $display("IRQ processing started @ %t us",$time/1e6);
110
*/
111 4 gryzor
  initial begin
112
    nmi_n=1;
113
    wait_n=1;
114
  end
115
 
116
  tv80n cpu( //outputs
117
  .m1_n(m1_n), .mreq_n(mreq_n), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n),
118
  .rfsh_n(rfsh_n), .halt_n(halt_n), .busak_n(busak_n), .A(adr), .do(cpu_out),
119
  // Inputs
120
  .reset_n(reset_n), .clk(clk), .wait_n(wait_n),
121
  .int_n(int_n), .nmi_n(nmi_n), .busrq_n(busrq_n), .di(cpu_in) );
122
 
123
  RAM ram(.adr(adr[10:0]), .din(cpu_out), .dout(ram_out), .enable( ram_enable ),
124 3 gryzor
    .clk(clk), .wr_n(wr_n), .rd_n(rd_n) );
125
  ROM rom(.adr(adr[13:0]), .data(rom_out), .enable(rom_enable),
126
   .rd_n(rd_n), .clk(clk));
127
  SOUND_LATCH sound_latch( .dout(latch_out), .enable(latch_enable),
128
    .clk(clk), .rd_n(rd_n) );
129
 
130
//      fake_ay ay_0( .adr(adr[0]), .din(din), .clk(clk), .wr_n(~ay_0_enable|wr_n) );
131
 
132 4 gryzor
        AY_3_8910_capcom #(dump_regs,0) ay_0( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
133
                .din(cpu_out), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_0_enable),
134 3 gryzor
                .A(ay0_a), .B(ay0_b), .C(ay0_c) );
135 4 gryzor
        AY_3_8910_capcom #(dump_regs,1) ay_1( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
136
                .din(cpu_out), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_1_enable),
137 3 gryzor
                .A(ay1_a), .B(ay1_b), .C(ay1_c) );
138
endmodule
139
 
140
//////////////////////////////////////////////////////////
141
// this module is used to check the communication of the
142
// Z80 with the AY-3-8910
143
// only used for debugging
144
module fake_ay(
145
        input adr,
146
  input [7:0] din,
147
  input clk,
148
  input wr_n );
149
 
150
        reg [7:0] contents[1:0];
151
        wire sample = clk & ~wr_n;
152
 
153
        always @(posedge sample) begin
154
//              if( contents[adr] != din ) begin
155
                $display("%t -> %d = %d", $realtime/1e6, adr, din );
156
                if( !adr && din>15 ) $display("AY WARNING");
157
                contents[adr] = din;
158
        end
159
 
160
endmodule
161
 
162
//////////////////////////////////////////////////////////
163
module RAM(
164
  input [10:0] adr,
165
  input [7:0] din,
166
  output reg [7:0] dout,
167
  input enable,
168
  input clk,
169
  input rd_n,
170
  input wr_n );
171
 
172
reg [7:0] contents[2047:0];
173
wire sample = clk & (~rd_n | ~wr_n );
174
 
175
initial dout=0;
176
 
177
always @(posedge sample) begin
178
  if( !enable )
179
    dout=0;
180
  else begin
181
    if( !wr_n ) contents[adr]=din;
182
    if( !rd_n ) dout=contents[adr];
183
  end
184
end
185
endmodule
186
 
187
//////////////////////////////////////////////////////////
188
module ROM(
189
  input  [13:0] adr,
190
  output reg [7:0] data,
191
  input enable,
192
  input rd_n,
193
  input clk );
194
 
195
reg [7:0] contents[16383:0];
196
 
197
wire sample = clk & ~rd_n;
198
 
199
initial begin
200
  $readmemh("../rom/sr-01.c11.hex", contents ); // this is the hex dump of the ROM
201
  data=0;
202
end
203
 
204
always @( posedge sample ) begin
205
  if ( !enable )
206
    data=0;
207
  else
208
    data=contents[ adr ];
209
end
210
endmodule
211
 
212
//////////////////////////////////////////////////////////
213
module SOUND_LATCH(
214
  output reg [7:0] dout,
215
  input enable,
216
  input clk,
217
  input rd_n );
218
 
219
wire sample = clk & ~rd_n;
220
reg [7:0]data;
221
 
222
initial begin
223
        dout=0;
224
        data=0;
225
        #100e6 data=8'h12; // enter the song/sound code here
226
end
227
 
228
always @(posedge sample) begin
229
  if( !enable )
230
                dout=0;
231
  else begin
232
    if( !rd_n ) begin
233
                        // $display("Audio latch read @ %t us", $realtime/1e6 );
234
//                      if( data != 0 ) 
235
//                        $display("Audio latch read (%X) @ %t us", data, $realtime/1e6 );
236
                        dout=data;
237
                end
238
  end
239
end
240
endmodule
241
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.