OpenCores
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

powered by: WebSVN 2.1.0

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