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

Subversion Repositories jt51

[/] [jt51/] [trunk/] [contra/] [fake_tone.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 gryzor
`timescale 1ns / 1ps
2
 
3
module fake_tone(
4
        input rst,
5
        input clk,
6
        input ym_p1,
7
        output onebit
8
);
9
        wire [15:0] tone, linear;
10
        wire sh, so;
11
 
12
        ramp_a_tone tonegen( .rst(rst), .clk(clk), .tone(tone) );
13
        sh_encode encoder(   .rst(rst), .ym_p1(ym_p1), .data(tone), .sh(sh), .so(so) );
14
        ym_linearize linearizer( .rst(rst), .sh(sh), .ym_so(so), .ym_p1(ym_p1), .linear(linear) );
15
        sigma_delta1 sd1(    .rst(rst), .clk(clk), .data(linear), .sound(onebit) );
16
endmodule
17
 
18
module sh_encode(
19
        input rst,
20
        input ym_p1,
21
        input [15:0] data,
22
        output reg sh,
23
        output so
24
);
25
        reg [12:0] serial_data;
26
        reg [3:0] cnt;
27
 
28
        assign so = serial_data[0];
29
        always @(posedge rst or posedge ym_p1) begin
30
                if( rst ) begin
31
                        sh <= 1'b0;
32
                        cnt <= 0;
33
                end
34
                else begin
35
                        cnt <= cnt + 1'b1;
36
                        if( cnt==4'd2 ) begin
37
                                casex( data[15:10] )
38
                                        6'b1XXXXX: serial_data <= { 3'd7, data[15:6]};
39
                                        6'b01XXXX: serial_data <= { 3'd6, data[14:5]};
40
                                        6'b001XXX: serial_data <= { 3'd5, data[13:4]};
41
                                        6'b0001XX: serial_data <= { 3'd4, data[12:3]};
42
                                        6'b00001X: serial_data <= { 3'd3, data[11:2]};
43
                                        6'b000001: serial_data <= { 3'd2, data[10:1]};
44
                                        default:   serial_data <= { 3'd1, data[ 9:0]};
45
                                endcase
46
                        end
47
                        else serial_data <= serial_data>>1;
48
                        if( cnt==4'd10 ) sh<=1'b1;
49
                        if( cnt==4'd15 ) sh<=1'b0;
50
                end
51
        end
52
endmodule
53
 
54
// it produces a ~440Hz triangular signal at full scale for a 50MHz clock
55
module ramp_a_tone ( input rst, input clk, output reg [15:0] tone );
56
        reg up;
57
        always @(posedge rst or posedge clk) begin
58
                if( rst ) begin
59
                        up   <= 0;
60
                        tone <= 0;
61
                end
62
                else begin
63
                        if( tone == 16'hFFFE ) begin
64
                                up <= 1'b0;
65
                        end
66
                        else if( tone == 16'h1 ) begin
67
                                up <= 1'b1;
68
                        end
69
                        tone <= up ? (tone+1'b1) : (tone-1'b1);
70
                end
71
        end
72
endmodule

powered by: WebSVN 2.1.0

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