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

Subversion Repositories sqmusic

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

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
  output [12:0] linear
22 18 gryzor
);
23
 
24
wire [9:0]phase;
25
wire [12:0] sin_log, sin_linear;
26
 
27
sq_pg pg(
28
  .clk     (clk),
29
  .reset_n (reset_n),
30
  .fnumber (fnumber),
31
  .block   (block),
32
  .multiple(multiple),
33
  .phase   (phase) );
34
 
35
sq_sin sin(
36
  .clk     (clk),
37
  .reset_n (reset_n),
38
  .phase   (phase),
39
  .val     (sin_log) );
40
 
41
sq_pow pow(
42
  .clk     (clk),
43
  .reset_n (reset_n),
44
  .x       (sin_log),
45 19 gryzor
  .y       (linear) );
46 18 gryzor
 
47
endmodule
48
 
49 12 gryzor
module sq_pg(
50
        input clk,
51
        input reset_n,
52
        input [10:0] fnumber,
53
        input [2:0] block,
54
  input [3:0] multiple,
55
        output [9:0]phase );
56
 
57
reg [19:0] count;
58
assign phase = count[19:10];
59
 
60 18 gryzor
wire [19:0]fmult = fnumber << block;
61 12 gryzor
 
62
always @(posedge clk or negedge reset_n ) begin
63
        if( !reset_n )
64
                count <= 20'b0;
65
        else begin
66 18 gryzor
          count <= count + ( multiple==4'b0 ? fmult>> 1 : fmult*multiple);
67 12 gryzor
        end
68
end
69
 
70
endmodule
71
 
72 18 gryzor
///////////////////////////////////////////////////////////////////
73 12 gryzor
module sq_sin(
74 18 gryzor
  input clk,
75
  input reset_n,
76 12 gryzor
  input [9:0]phase,
77 18 gryzor
  output [12:0] val // LSB is the sign. 0=positive, 1=negative
78
);
79 12 gryzor
 
80 18 gryzor
reg [12:0] sin_table[1023:0];
81 12 gryzor
 
82
initial begin
83 18 gryzor
  $readmemh("../tables/sin_table.hex", sin_table);
84 12 gryzor
end
85 18 gryzor
reg [9:0]last_phase;
86
assign val = sin_table[last_phase];
87 12 gryzor
 
88 18 gryzor
always @(posedge clk or negedge reset_n ) begin
89
        if( !reset_n )
90
                last_phase <= 10'b0;
91
        else begin
92
          last_phase <= phase;
93
        end
94
end
95
endmodule
96
///////////////////////////////////////////////////////////////////
97
// sq_pow => reverse the log2 conversion
98
module sq_pow(
99
  input clk,
100
  input reset_n,
101 19 gryzor
  input rd_n, // read enable, active low
102
  input [12:0]x, // LSB is the sign. 0=positive, 1=negative
103
  output reg [12:0]y
104 18 gryzor
);
105 12 gryzor
 
106 19 gryzor
parameter st_input    = 3'b000;
107
parameter st_lut_read = 3'b001;
108
parameter st_shift    = 3'b010;
109
parameter st_sign     = 3'b011;
110
parameter st_output   = 3'b100;
111
 
112
reg [2:0] state;
113 18 gryzor
reg [12:0] pow_table[255:0];
114
 
115
initial begin
116
  $readmemh("../tables/pow_table.hex", pow_table);
117 12 gryzor
end
118 18 gryzor
reg [7:0]index;
119 19 gryzor
reg [3:0]exp;
120 18 gryzor
reg sign;
121
 
122 19 gryzor
reg [12:0] raw, shifted, final;
123 18 gryzor
 
124
always @(posedge clk or negedge reset_n ) begin
125
        if( !reset_n ) begin
126
                index <= 8'b0;
127
                exp   <= 3'b0;
128
                sign  <= 1'b0;
129 19 gryzor
                raw   <= 13'b0;
130
                shifted <= 13'b0;
131
                y     <= 12'b0;
132
                state <= st_input;
133 18 gryzor
        end
134
        else begin
135 19 gryzor
          case ( state )
136
            st_input: begin
137
              if( !rd_n ) begin
138
                exp   <= x[12:9];
139
                index <= x[8:1];
140
                sign  <= x[0];
141
                state <= st_lut_read;
142
              end
143
              else state <= st_lut_read;
144
              end
145
           st_lut_read: begin
146
              raw   <= pow_table[index];
147
              state <= st_shift;
148
              end
149
           st_shift: begin
150
              shifted <= raw >> exp;
151
              state   <= st_sign;
152
              end
153
           st_sign: begin
154
              final <= sign ? ~shifted + 1'b1 : shifted;
155
              state <= st_output;
156
              end
157
           st_output: begin
158
              y     <= final;
159
              state <= st_input;
160
              end
161
          endcase
162 18 gryzor
        end
163
end
164
 
165 19 gryzor
always @(posedge clk or negedge reset_n ) begin
166
        if( !reset_n )
167
          raw <= 13'b0;
168
        else
169
          raw <= pow_table[index];
170
end
171
 
172
always @(posedge clk or negedge reset_n ) begin
173
        if( !reset_n )
174
          shifted <= 13'b0;
175
        else
176
          shifted <= raw >> exp;
177
end
178
 
179 18 gryzor
endmodule

powered by: WebSVN 2.1.0

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