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

Subversion Repositories sqmusic

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

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

powered by: WebSVN 2.1.0

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