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

Subversion Repositories jt51

[/] [jt51/] [trunk/] [jt51/] [jt51_phasegen.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 gryzor
/*  This file is part of JT51.
2
 
3
    JT51 is free software: you can redistribute it and/or modify
4
    it under the terms of the GNU General Public License as published by
5
    the Free Software Foundation, either version 3 of the License, or
6
    (at your option) any later version.
7
 
8
    JT51 is distributed in the hope that it will be useful,
9
    but WITHOUT ANY WARRANTY; without even the implied warranty of
10
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
    GNU General Public License for more details.
12
 
13
    You should have received a copy of the GNU General Public License
14
    along with JT51.  If not, see <http://www.gnu.org/licenses/>.
15
 
16
        Author: Jose Tejada Gomez. Twitter: @topapate
17
        Version: 1.0
18
        Date: 27-10-2016
19
        */
20
 
21
`timescale 1ns / 1ps
22
 
23
/*
24
 
25
        tab size 4
26
 
27
*/
28
 
29
module jt51_phasegen(
30
        input                           clk,
31
        // Channel frequency
32
        input           [6:0]    kc,
33
        input           [5:0]    kf,
34
        // Operator multiplying
35
        input           [3:0]    mul,
36
        // Operator detuning
37
        input           [2:0]    dt1,
38
        input           [1:0]    dt2,
39
        // phase modulation from LFO
40
        input           [7:0]   pm,
41
        input           [2:0]   pms,
42
        // phase operation
43
        input                           keyon,
44
        output  reg [ 4:0]  keycode_III,
45
        output          [19:0]   phase_now
46
);
47
 
48
wire [19:0]      phase_drop;
49
 
50
reg [19:0]       phase_base_VI, phase_step, phase_step_VII;
51
reg [17:0]       phase_base_IV, phase_base_V;
52
wire keyon_VII;
53
assign  phase_now = keyon_VII ? 20'd0 : phase_drop + phase_step;
54
 
55
wire            [11:0]   phinc_III;
56
 
57
reg     [ 9:0]   phinc_addr_III;
58
 
59
reg     [13:0]   keycode_II;
60
reg [5:0]   dt1_kf_III;
61
reg [ 2:0]       dt1_kf_IV;
62
 
63
reg     [4:0]    pow2;
64
reg     [4:0]    dt1_offset_V;
65
reg     [2:0]    pow2ind_IV;
66
 
67
wire [3:0]       mul_V;
68
reg [2:0]        dt1_II, dt1_III, dt1_IV, dt1_V;
69
 
70
jt51_phinc_rom u_phinctable(
71
        // .clk         ( clk            ),
72
        .keycode( phinc_addr_III[9:0]  ),
73
        .phinc  ( phinc_III        )
74
);
75
 
76
always @(*) begin : calcpow2
77
        case( pow2ind_IV )
78
                3'd0: pow2 <= 5'd16;
79
                3'd1: pow2 <= 5'd17;
80
                3'd2: pow2 <= 5'd19;
81
                3'd3: pow2 <= 5'd20;
82
                3'd4: pow2 <= 5'd22;
83
                3'd5: pow2 <= 5'd24;
84
                3'd6: pow2 <= 5'd26;
85
                3'd7: pow2 <= 5'd29;
86
        endcase
87
end
88
 
89
reg [5:0] dt1_limit, dt1_unlimited;
90
reg [4:0] dt1_limited_IV;
91
 
92
always @(*) begin : dt1_limit_mux
93
        case( dt1_IV[1:0] )
94
                default: dt1_limit <= 5'd8;
95
                2'd1: dt1_limit <= 5'd8;
96
                2'd2: dt1_limit <= 5'd16;
97
                2'd3: dt1_limit <= 5'd22;
98
        endcase
99
        case( dt1_kf_IV )
100
                3'd0:   dt1_unlimited <= { 5'd0, pow2[4]   }; // <2
101
                3'd1:   dt1_unlimited <= { 4'd0, pow2[4:3] }; // <4
102
                3'd2:   dt1_unlimited <= { 3'd0, pow2[4:2] }; // <8
103
                3'd3:   dt1_unlimited <= { 2'd0, pow2[4:1] };
104
                3'd4:   dt1_unlimited <= { 1'd0, pow2[4:0] };
105
                3'd5:   dt1_unlimited <= { pow2[4:0], 1'd0 };
106
                default:dt1_unlimited <= 6'd0;
107
        endcase
108
        dt1_limited_IV <= dt1_unlimited > dt1_limit ?
109
                                                        dt1_limit : dt1_unlimited[4:0];
110
end
111
 
112
reg signed [8:0] mod;
113
 
114
always @(*) begin
115
        case( pms ) // comprobar en silicio
116
                3'd0: mod <= 9'd0;
117
                3'd1: mod <= { 7'd0, pm[6:5] };
118
                3'd2: mod <= { 6'd0, pm[6:4] };
119
                3'd3: mod <= { 5'd0, pm[6:3] };
120
                3'd4: mod <= { 4'd0, pm[6:2] };
121
                3'd5: mod <= { 3'd0, pm[6:1] };
122
                3'd6: mod <= { 1'd0, pm[6:0], 1'b0 };
123
                3'd7: mod <= {       pm[6:0], 2'b0 };
124
        endcase
125
end
126
 
127
 
128
reg [3:0]        octave_III;
129
 
130
wire [12:0] keycode_I;
131
 
132
jt51_pm u_pm(
133
        // Channel frequency
134
        .kc(kc),
135
        .kf(kf),
136
    .add(~pm[7]),
137
        .mod(mod),
138
        .kcex(keycode_I)
139
);
140
 
141
// limit value at which we add +64 to the keycode
142
// I assume this is to avoid the note==3 violation somehow
143
parameter dt2_lim2 = 8'd11 + 8'd64;
144
parameter dt2_lim3 = 8'd31 + 8'd64;
145
 
146
always @(posedge clk) begin : phase_calculation
147
        // I
148
        case ( dt2 )
149
                2'd0: keycode_II <=      { 1'b0, keycode_I } +
150
                        (keycode_I[7:6]==2'd3 ? 14'd64:14'd0);
151
                2'd1: keycode_II <=     { 1'b0, keycode_I } + 14'd512 +
152
                        (keycode_I[7:6]==2'd3 ? 14'd64:14'd0);
153
                2'd2: keycode_II <=     { 1'b0, keycode_I } + 14'd628 +
154
                        (keycode_I[7:0]>dt2_lim2 ? 14'd64:14'd0);
155
                2'd3: keycode_II <=     { 1'b0, keycode_I } + 14'd800 +
156
                        (keycode_I[7:0]>dt2_lim3  ? 14'd64:14'd0);
157
        endcase
158
        dt1_II <= dt1;
159
        // II
160
        phinc_addr_III  <= keycode_II[9:0];
161
        octave_III      <= keycode_II[13:10];
162
        keycode_III     <=      keycode_II[12:8];
163
        case( dt1_II[1:0] )
164
                2'd1:   dt1_kf_III      <=      keycode_II[13:8]        - (6'b1<<2);
165
                2'd2:   dt1_kf_III      <=      keycode_II[13:8]        + (6'b1<<2);
166
                2'd3:   dt1_kf_III      <=      keycode_II[13:8]        + (6'b1<<3);
167
                default:dt1_kf_III      <=      keycode_II[13:8];
168
        endcase
169
        dt1_III   <= dt1_II;
170
        // III          
171
        case( octave_III )
172
                4'd0:   phase_base_IV   <=      { 8'd0, phinc_III[11:2] };
173
                4'd1:   phase_base_IV   <=      { 7'd0, phinc_III[11:1] };
174
                4'd2:   phase_base_IV   <=      { 6'd0, phinc_III[11:0] };
175
                4'd3:   phase_base_IV   <=      { 5'd0, phinc_III[11:0], 1'b0 };
176
                4'd4:   phase_base_IV   <=      { 4'd0, phinc_III[11:0], 2'b0 };
177
                4'd5:   phase_base_IV   <=      { 3'd0, phinc_III[11:0], 3'b0 };
178
                4'd6:   phase_base_IV   <=      { 2'd0, phinc_III[11:0], 4'b0 };
179
                4'd7:   phase_base_IV   <=      { 1'd0, phinc_III[11:0], 5'b0 };
180
                4'd8:   phase_base_IV   <=      {               phinc_III[11:0], 6'b0 };
181
                default:phase_base_IV   <=  18'd0;
182
        endcase
183
        pow2ind_IV      <= dt1_kf_III[2:0];
184
        dt1_IV          <= dt1_III;
185
        dt1_kf_IV       <= dt1_kf_III[5:3];
186
        // IV LIMIT_BASE
187
        if( phase_base_IV > 18'd82976 )
188
                phase_base_V <= 18'd82976;
189
        else
190
                phase_base_V <= phase_base_IV;
191
        dt1_offset_V <= dt1_limited_IV;
192
        dt1_V <= dt1_IV;
193
        // V APPLY_DT1
194
        if( dt1_V[1:0]==2'd0 )
195
                phase_base_VI   <=      phase_base_V;
196
        else begin
197
                if( !dt1_V[2] )
198
                        phase_base_VI   <=      phase_base_V + dt1_offset_V;
199
                else
200
                        phase_base_VI   <=      phase_base_V - dt1_offset_V;
201
        end
202
        // VI APPLY_MUL
203
        if( mul_V==4'd0 )
204
                phase_step_VII  <= { 1'b0, phase_base_VI[19:1] };
205
        else
206
                phase_step_VII  <= phase_base_VI * mul_V;
207
        // VII have same number of stages as jt51_envelope
208
        phase_step      <= phase_step_VII;
209
                `ifdef DISPLAY_STEP
210
                                $display( "%d", phase_step );
211
                `endif
212
end
213
 
214
jt51_sh #( .width(4), .stages(5) ) u_mulsh(
215
        .clk    ( clk   ),
216
        .din    ( mul ),
217
        .drop   ( mul_V )
218
);
219
 
220
jt51_sh #( .width(20), .stages(32) ) u_phsh(
221
        .clk    ( clk   ),
222
        .din    ( phase_now ),
223
        .drop   ( phase_drop)
224
);
225
 
226
jt51_sh #( .width(1), .stages(7) ) u_kosh(
227
        .clk    ( clk   ),
228
        .din    ( keyon ),
229
        .drop   ( keyon_VII)
230
);
231
 
232
endmodule
233
 

powered by: WebSVN 2.1.0

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