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 19 to Rev 20
    Reverse comparison

Rev 19 → Rev 20

/sqmusic/trunk/sqm/sq_pg.v
18,12 → 18,35
input [10:0] fnumber,
input [2:0] block,
input [3:0] multiple,
output [12:0] linear
input [6:0] totallvl, // total level
output [13:0] linear
);
 
reg [7:0]state;
 
parameter st_pg_count = 8'h01;
parameter st_pow_read = 8'h04;
wire [9:0]phase;
wire [12:0] sin_log, sin_linear;
wire [13:0] sin_log, sin_linear;
reg pg_ce_n, pow_rd_n;
 
always @(posedge clk or negedge reset_n ) begin
if (!reset_n) begin
state <= 8'b0;
pg_ce_n <= 1'b1;
pow_rd_n<= 1'b1;
end
else begin
if( state == 8'd143 )
state <= 8'd0;
else
state <= state+1;
pg_ce_n <= state == st_pg_count ? 1'b0 : 1'b1;
pow_rd_n<= state == st_pow_read ? 1'b0 : 1'b1;
end
end
 
sq_pg pg(
.clk (clk),
.reset_n (reset_n),
30,6 → 53,7
.fnumber (fnumber),
.block (block),
.multiple(multiple),
.ce_n (pg_ce_n),
.phase (phase) );
 
sq_sin sin(
36,16 → 60,19
.clk (clk),
.reset_n (reset_n),
.phase (phase),
.gain (totallvl),
.val (sin_log) );
sq_pow pow(
.clk (clk),
.reset_n (reset_n),
.rd_n (pow_rd_n),
.x (sin_log),
.y (linear) );
 
endmodule
 
///////////////////////////////////////////////////////////////////
module sq_pg(
input clk,
input reset_n,
52,18 → 79,22
input [10:0] fnumber,
input [2:0] block,
input [3:0] multiple,
input ce_n, // count enable, active low
output [9:0]phase );
 
reg [19:0] count;
assign phase = count[19:10];
 
wire [19:0]fmult = fnumber << block;
wire [19:0]fmult = fnumber << (block-1);
 
always @(posedge clk or negedge reset_n ) begin
if( !reset_n )
count <= 20'b0;
else begin
count <= count + ( multiple==4'b0 ? fmult>> 1 : fmult*multiple);
if( !ce_n )
count <= count + ( multiple==4'b0 ? fmult>> 1 : fmult*multiple);
else
count <= count;
end
end
 
73,8 → 104,9
module sq_sin(
input clk,
input reset_n,
input [6:0]gain, // gain factor in log scale
input [9:0]phase,
output [12:0] val // LSB is the sign. 0=positive, 1=negative
output [13:0] val // LSB is the sign. 0=positive, 1=negative
);
 
reg [12:0] sin_table[1023:0];
83,7 → 115,7
$readmemh("../tables/sin_table.hex", sin_table);
end
reg [9:0]last_phase;
assign val = sin_table[last_phase];
assign val = sin_table[last_phase] + { gain, 6'h0 };
 
always @(posedge clk or negedge reset_n ) begin
if( !reset_n )
99,8 → 131,8
input clk,
input reset_n,
input rd_n, // read enable, active low
input [12:0]x, // LSB is the sign. 0=positive, 1=negative
output reg [12:0]y
input [13:0]x, // LSB is the sign. 0=positive, 1=negative
output reg [13:0]y
);
 
parameter st_input = 3'b000;
116,19 → 148,19
$readmemh("../tables/pow_table.hex", pow_table);
end
reg [7:0]index;
reg [3:0]exp;
reg [4:0]exp;
reg sign;
 
reg [12:0] raw, shifted, final;
reg [13:0] raw, shifted, final;
 
always @(posedge clk or negedge reset_n ) begin
if( !reset_n ) begin
index <= 8'b0;
exp <= 3'b0;
sign <= 1'b0;
raw <= 13'b0;
shifted <= 13'b0;
y <= 12'b0;
index <= 8'b0;
exp <= 3'b0;
sign <= 1'b0;
raw <= 14'b0;
shifted <= 14'b0;
y <= 14'b0;
state <= st_input;
end
else begin
135,12 → 167,12
case ( state )
st_input: begin
if( !rd_n ) begin
exp <= x[12:9];
exp <= x[13:9];
index <= x[8:1];
sign <= x[0];
state <= st_lut_read;
end
else state <= st_lut_read;
else state <= st_input;
end
st_lut_read: begin
raw <= pow_table[index];
158,6 → 190,9
y <= final;
state <= st_input;
end
default: begin
state <= st_input;
end
endcase
end
end
/sqmusic/trunk/ver/sq_opn_basic.v
15,10 → 15,11
module sq_opn_basic;
 
reg clk, reset_n;
wire signed [12:0] linear;
reg [6:0] gain;
wire signed [13:0] linear;
 
parameter fnumber = 11'h1;
parameter block = 3'h0;
parameter fnumber = 11'h40E;
parameter block = 3'h4;
parameter multiple= 4'h1;
 
initial begin
25,15 → 26,23
$dumpvars(0,sq_opn_basic);
$dumpon;
reset_n = 0;
gain = 7'd0;
#300 reset_n=1;
$display("SOUND START");
#(1e10)
$finish;
#0.01e9
forever #0.01e9 begin
if( gain == 7'h7F )
$finish;
else
gain <= gain + 1;
// if( $realtime > 64*0.01e9 ) $finish;
end
// $finish;
end
 
always begin
clk = 0;
forever #(125/2*144) clk = ~clk & reset_n;
forever #(125/2) clk = ~clk & reset_n;
end
 
sq_slot slot(
42,10 → 51,11
.fnumber (fnumber),
.block (block),
.multiple(multiple),
.totallvl(gain),
.linear (linear)
);
 
// always #(1e9/44100) $display("%d", linear);
//always #(1e9/44100) $display("%d", linear);
 
endmodule

powered by: WebSVN 2.1.0

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