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

Subversion Repositories sqmusic

[/] [sqmusic/] [trunk/] [sqm/] [sq_pg.v] - Blame information for rev 20

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

Line No. Rev Author Line
1 16 gryzor
/*
2
        SQmusic
3
 
4
  (c) Jose Tejada Gomez, 9th May 2013
5
  You can use this file following the GNU GENERAL PUBLIC LICENSE version 3
6
  Read the details of the license in:
7
  http://www.gnu.org/licenses/gpl.txt
8
 
9
  Send comments to: jose.tejada@ieee.org
10
 
11
*/
12
 
13 18 gryzor
`timescale 1ns/1ps
14
 
15
module sq_slot(
16 19 gryzor
        input  clk,
17
        input  reset_n,
18
        input  [10:0] fnumber,
19
        input  [2:0]  block,
20
  input  [3:0]  multiple,
21 20 gryzor
  input  [6:0]  totallvl, // total level
22
  output [13:0] linear
23 18 gryzor
);
24 20 gryzor
 
25
reg [7:0]state;
26
 
27
parameter st_pg_count  = 8'h01;
28
parameter st_pow_read  = 8'h04;
29 18 gryzor
 
30
wire [9:0]phase;
31 20 gryzor
wire [13:0] sin_log, sin_linear;
32
reg  pg_ce_n, pow_rd_n;
33 18 gryzor
 
34 20 gryzor
always @(posedge clk or negedge reset_n ) begin
35
  if (!reset_n) begin
36
    state   <= 8'b0;
37
    pg_ce_n <= 1'b1;
38
    pow_rd_n<= 1'b1;
39
  end
40
  else begin
41
    if( state == 8'd143 )
42
      state <= 8'd0;
43
    else
44
      state <= state+1;
45
    pg_ce_n <=  state == st_pg_count ? 1'b0 : 1'b1;
46
    pow_rd_n<=  state == st_pow_read ? 1'b0 : 1'b1;
47
  end
48
end
49
 
50 18 gryzor
sq_pg pg(
51
  .clk     (clk),
52
  .reset_n (reset_n),
53
  .fnumber (fnumber),
54
  .block   (block),
55
  .multiple(multiple),
56 20 gryzor
  .ce_n    (pg_ce_n),
57 18 gryzor
  .phase   (phase) );
58
 
59
sq_sin sin(
60
  .clk     (clk),
61
  .reset_n (reset_n),
62
  .phase   (phase),
63 20 gryzor
  .gain    (totallvl),
64 18 gryzor
  .val     (sin_log) );
65
 
66
sq_pow pow(
67
  .clk     (clk),
68
  .reset_n (reset_n),
69 20 gryzor
  .rd_n    (pow_rd_n),
70 18 gryzor
  .x       (sin_log),
71 19 gryzor
  .y       (linear) );
72 18 gryzor
 
73
endmodule
74
 
75 20 gryzor
///////////////////////////////////////////////////////////////////
76 12 gryzor
module sq_pg(
77
        input clk,
78
        input reset_n,
79
        input [10:0] fnumber,
80
        input [2:0] block,
81
  input [3:0] multiple,
82 20 gryzor
  input ce_n, // count enable, active low
83 12 gryzor
        output [9:0]phase );
84
 
85
reg [19:0] count;
86
assign phase = count[19:10];
87
 
88 20 gryzor
wire [19:0]fmult = fnumber << (block-1);
89 12 gryzor
 
90
always @(posedge clk or negedge reset_n ) begin
91
        if( !reset_n )
92
                count <= 20'b0;
93
        else begin
94 20 gryzor
          if( !ce_n )
95
          count <= count + ( multiple==4'b0 ? fmult>> 1 : fmult*multiple);
96
        else
97
          count <= count;
98 12 gryzor
        end
99
end
100
 
101
endmodule
102
 
103 18 gryzor
///////////////////////////////////////////////////////////////////
104 12 gryzor
module sq_sin(
105 18 gryzor
  input clk,
106
  input reset_n,
107 20 gryzor
  input [6:0]gain, // gain factor in log scale
108 12 gryzor
  input [9:0]phase,
109 20 gryzor
  output [13:0] val // LSB is the sign. 0=positive, 1=negative
110 18 gryzor
);
111 12 gryzor
 
112 18 gryzor
reg [12:0] sin_table[1023:0];
113 12 gryzor
 
114
initial begin
115 18 gryzor
  $readmemh("../tables/sin_table.hex", sin_table);
116 12 gryzor
end
117 18 gryzor
reg [9:0]last_phase;
118 20 gryzor
assign val = sin_table[last_phase] + { gain, 6'h0 };
119 12 gryzor
 
120 18 gryzor
always @(posedge clk or negedge reset_n ) begin
121
        if( !reset_n )
122
                last_phase <= 10'b0;
123
        else begin
124
          last_phase <= phase;
125
        end
126
end
127
endmodule
128
///////////////////////////////////////////////////////////////////
129
// sq_pow => reverse the log2 conversion
130
module sq_pow(
131
  input clk,
132
  input reset_n,
133 19 gryzor
  input rd_n, // read enable, active low
134 20 gryzor
  input [13:0]x, // LSB is the sign. 0=positive, 1=negative
135
  output reg [13:0]y
136 18 gryzor
);
137 12 gryzor
 
138 19 gryzor
parameter st_input    = 3'b000;
139
parameter st_lut_read = 3'b001;
140
parameter st_shift    = 3'b010;
141
parameter st_sign     = 3'b011;
142
parameter st_output   = 3'b100;
143
 
144
reg [2:0] state;
145 18 gryzor
reg [12:0] pow_table[255:0];
146
 
147
initial begin
148
  $readmemh("../tables/pow_table.hex", pow_table);
149 12 gryzor
end
150 18 gryzor
reg [7:0]index;
151 20 gryzor
reg [4:0]exp;
152 18 gryzor
reg sign;
153
 
154 20 gryzor
reg [13:0] raw, shifted, final;
155 18 gryzor
 
156
always @(posedge clk or negedge reset_n ) begin
157
        if( !reset_n ) begin
158 20 gryzor
                index   <=  8'b0;
159
                exp     <=  3'b0;
160
                sign    <=  1'b0;
161
                raw     <= 14'b0;
162
                shifted <= 14'b0;
163
                y       <= 14'b0;
164 19 gryzor
                state <= st_input;
165 18 gryzor
        end
166
        else begin
167 19 gryzor
          case ( state )
168
            st_input: begin
169
              if( !rd_n ) begin
170 20 gryzor
                exp   <= x[13:9];
171 19 gryzor
                index <= x[8:1];
172
                sign  <= x[0];
173
                state <= st_lut_read;
174
              end
175 20 gryzor
              else state <= st_input;
176 19 gryzor
              end
177
           st_lut_read: begin
178
              raw   <= pow_table[index];
179
              state <= st_shift;
180
              end
181
           st_shift: begin
182
              shifted <= raw >> exp;
183
              state   <= st_sign;
184
              end
185
           st_sign: begin
186
              final <= sign ? ~shifted + 1'b1 : shifted;
187
              state <= st_output;
188
              end
189
           st_output: begin
190
              y     <= final;
191
              state <= st_input;
192
              end
193 20 gryzor
           default: begin
194
              state <= st_input;
195
              end
196 19 gryzor
          endcase
197 18 gryzor
        end
198
end
199
 
200 19 gryzor
always @(posedge clk or negedge reset_n ) begin
201
        if( !reset_n )
202
          raw <= 13'b0;
203
        else
204
          raw <= pow_table[index];
205
end
206
 
207
always @(posedge clk or negedge reset_n ) begin
208
        if( !reset_n )
209
          shifted <= 13'b0;
210
        else
211
          shifted <= raw >> exp;
212
end
213
 
214 18 gryzor
endmodule

powered by: WebSVN 2.1.0

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