URL
https://opencores.org/ocsvn/sqmusic/sqmusic/trunk
Subversion Repositories sqmusic
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 18 to Rev 19
- ↔ Reverse comparison
Rev 18 → Rev 19
/sqmusic/trunk/sqm/sq_pg.v
13,11 → 13,12
`timescale 1ns/1ps |
|
module sq_slot( |
input clk, |
input reset_n, |
input [10:0] fnumber, |
input [2:0] block, |
input [3:0] multiple |
input clk, |
input reset_n, |
input [10:0] fnumber, |
input [2:0] block, |
input [3:0] multiple, |
output [12:0] linear |
); |
|
wire [9:0]phase; |
41,7 → 42,7
.clk (clk), |
.reset_n (reset_n), |
.x (sin_log), |
.y (sin_linear) ); |
.y (linear) ); |
|
endmodule |
|
97,10 → 98,18
module sq_pow( |
input clk, |
input reset_n, |
input [12:0]x, |
output [12:0]y // LSB is the sign. 0=positive, 1=negative |
input rd_n, // read enable, active low |
input [12:0]x, // LSB is the sign. 0=positive, 1=negative |
output reg [12:0]y |
); |
|
parameter st_input = 3'b000; |
parameter st_lut_read = 3'b001; |
parameter st_shift = 3'b010; |
parameter st_sign = 3'b011; |
parameter st_output = 3'b100; |
|
reg [2:0] state; |
reg [12:0] pow_table[255:0]; |
|
initial begin |
107,11 → 116,10
$readmemh("../tables/pow_table.hex", pow_table); |
end |
reg [7:0]index; |
reg [2:0]exp; |
reg [3:0]exp; |
reg sign; |
|
wire [12:0] raw = pow_table[index] >> exp; |
assign y = sign ? ~raw+13'b1 : raw; // regular 2's complement |
reg [12:0] raw, shifted, final; |
|
always @(posedge clk or negedge reset_n ) begin |
if( !reset_n ) begin |
118,12 → 126,54
index <= 8'b0; |
exp <= 3'b0; |
sign <= 1'b0; |
raw <= 13'b0; |
shifted <= 13'b0; |
y <= 12'b0; |
state <= st_input; |
end |
else begin |
exp <= x[12:10]; |
index <= x[9:1]; |
sign <= x[0]; |
case ( state ) |
st_input: begin |
if( !rd_n ) begin |
exp <= x[12:9]; |
index <= x[8:1]; |
sign <= x[0]; |
state <= st_lut_read; |
end |
else state <= st_lut_read; |
end |
st_lut_read: begin |
raw <= pow_table[index]; |
state <= st_shift; |
end |
st_shift: begin |
shifted <= raw >> exp; |
state <= st_sign; |
end |
st_sign: begin |
final <= sign ? ~shifted + 1'b1 : shifted; |
state <= st_output; |
end |
st_output: begin |
y <= final; |
state <= st_input; |
end |
endcase |
end |
end |
|
always @(posedge clk or negedge reset_n ) begin |
if( !reset_n ) |
raw <= 13'b0; |
else |
raw <= pow_table[index]; |
end |
|
always @(posedge clk or negedge reset_n ) begin |
if( !reset_n ) |
shifted <= 13'b0; |
else |
shifted <= raw >> exp; |
end |
|
endmodule |
/sqmusic/trunk/cpp/sintable.cc
90,9 → 90,14
} |
|
void dump_composite() { |
// cout.setf( ios::hex, ios::basefield ); |
for( int i=0; i<SIN_LEN; i++ ) { |
cout << sin_tab[i] << "," << tl_tab[ sin_tab[i] ] << "\n"; |
int v = sin_tab[i]; |
int m = (v>>1)&0xFF; |
int lin = tl_tab[m]; |
int exp = v>>9; |
int adj0 = lin>>exp; |
int adj1 = (v&1) ? -1*adj0 : adj0; |
cout << v << "," << lin << "," << exp << "," << adj0 << "," << adj1 << "\n"; |
} |
} |
|
109,13 → 114,16
"dump sine wave" ); |
argument_t arg_pow( legal_args, "pow", argument_t::flag, |
"dump power table" ); |
argument_t arg_comp( legal_args, "composite", argument_t::flag, |
"dump pow[ sine ] composite function" ); |
Args args_parser( argc, argv, legal_args ); |
if( args_parser.help_request() ) { return 0; } |
if( argc==1 ) { args_parser.show_help(); return 0; } |
init_tables(); |
//dump_composite(); |
|
if( arg_hex.is_set() ) cout.setf( ios::hex, ios::basefield ); |
if( arg_pow.is_set() ) dump_tl_tab(); |
if( arg_sin.is_set() ) dump_sin_tab(); |
if( arg_sin.is_set() ) dump_sin_tab(); |
if( arg_comp.is_set() ) dump_composite(); |
return 0; |
} |
/sqmusic/trunk/ver/sin_pow.v
0,0 → 1,75
/* |
SQmusic |
|
(c) Jose Tejada Gomez, 9th May 2013 |
You can use this file following the GNU GENERAL PUBLIC LICENSE version 3 |
Read the details of the license in: |
http://www.gnu.org/licenses/gpl.txt |
|
Send comments to: jose.tejada@ieee.org |
|
*/ |
|
`timescale 1ns/1ps |
|
module sin_pow; |
|
reg clk, reset_n; |
|
parameter fnumber = 11'h1; |
parameter block = 3'h0; |
parameter multiple= 4'h1; |
|
reg [10:0] phase; |
reg [3:0] clk2; |
|
initial begin |
$dumpvars(0,sin_pow); |
$dumpon; |
reset_n = 0; |
#10 reset_n = 1; |
#20 reset_n = 0; |
#1000 reset_n=1; |
$display("SOUND START"); |
end |
|
|
always begin |
clk = 0; |
forever #(400) clk = ~clk & reset_n; |
end |
|
always @(posedge clk or negedge reset_n) begin |
if( !reset_n) |
clk2 <= 2'b0; |
else |
clk2 <= clk2+1'b1; |
end |
|
always @(posedge clk2[3] or negedge reset_n) begin |
if( !reset_n) |
phase<=11'b0; |
else begin |
phase <= phase+1; |
$display("%d, %d, %d", phase, sin_log, linear ); |
if( phase[10] ) $finish; |
end |
end |
|
wire [12:0] sin_log, linear; |
|
sq_sin sin( |
.clk (clk2[3]), // slow clock |
.reset_n (reset_n), |
.phase (phase[9:0]), |
.val (sin_log) ); |
|
sq_pow pow( |
.clk (clk), |
.reset_n (reset_n), |
.rd_n ( 1'b0 ), |
.x (sin_log), |
.y (linear) ); |
|
// always #(1e9/44100) $display("%d", linear); |
endmodule |
/sqmusic/trunk/ver/sq_opn_basic.v
15,9 → 15,10
module sq_opn_basic; |
|
reg clk, reset_n; |
wire signed [12:0] linear; |
|
parameter fnumber = 11'h40E; |
parameter block = 3'h4; |
parameter fnumber = 11'h1; |
parameter block = 3'h0; |
parameter multiple= 4'h1; |
|
initial begin |
25,13 → 26,14
$dumpon; |
reset_n = 0; |
#300 reset_n=1; |
#1e8 // 10ms |
$display("SOUND START"); |
#(1e10) |
$finish; |
end |
|
always begin |
clk = 0; |
forever #(125/2) clk = ~clk & reset_n; |
forever #(125/2*144) clk = ~clk & reset_n; |
end |
|
sq_slot slot( |
39,8 → 41,11
.reset_n (reset_n), |
.fnumber (fnumber), |
.block (block), |
.multiple(multiple) |
.multiple(multiple), |
.linear (linear) |
); |
|
// always #(1e9/44100) $display("%d", linear); |
|
|
endmodule |
/sqmusic/trunk/ver/sin_pow.gather
0,0 → 1,2
sin_pow.v |
../sqm/sq_pg.v |