Skip to content

Commit

Permalink
[APU] Update TriangleWaveEnhanced
Browse files Browse the repository at this point in the history
  • Loading branch information
fjpolo committed Jun 16, 2024
1 parent 687e911 commit 92e17c3
Showing 1 changed file with 75 additions and 74 deletions.
149 changes: 75 additions & 74 deletions src/apu.v
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,12 @@ module TriangleChan_enhanced (
assign IsNonZero = lc;
assign subunit_write = (Addr == 0 || Addr == 3) & write;

assign Sample = (applied_period > 1 || allow_us) ? (SeqPos[7] ^ {7{~SeqPos[7]}}) : sample_latch;
wire applied_period_valid;
assign applied_period_valid = applied_period > 1;

assign Sample = ((applied_period_valid)||(allow_us)) ?
(SeqPos[6:0] ^ {7{~SeqPos[7]}}) :
sample_latch;

LenCounterUnit LenTri (
.clk (clk),
Expand Down Expand Up @@ -478,7 +483,8 @@ module TriangleChan_enhanced (
line_reload <= 0;
end

if (applied_period > 1) sample_latch <= Sample;
if (applied_period_valid)
sample_latch <= Sample;
end
endmodule

Expand Down Expand Up @@ -1190,7 +1196,7 @@ assign tri_lut = '{
};

// Enhanced APU
logic [7:0] tri_lut_enhanced[128]; // mix mixes @9bit so 8bit is the max resolution for the
logic [8:0] tri_lut_enhanced[128]; // mix mixes @9bit so 8bit is the max resolution for the
assign tri_lut_enhanced = '{
8'h00, 8'h02, 8'h04, 8'h06, 8'h08, 8'h0A, 8'h0C, 8'h0E,
8'h10, 8'h12, 8'h14, 8'h16, 8'h18, 8'h1A, 8'h1C, 8'h1E,
Expand Down Expand Up @@ -1306,69 +1312,69 @@ assign mix_lut = '{

logic [15:0] mix_lut_linear[512];
assign mix_lut_linear = '{
16'h0000, 16'h0096, 16'h012c, 16'h01c2, 16'h0258, 16'h2ee, 16'h0384, 16'h041a,
16'h04b0, 16'h0546, 16'h05dc, 16'h0672, 16'h708, 16'h079e, 16'h0834, 16'h08ca,
16'h0960, 16'h09f6, 16'h0a8c, 16'hb22, 16'h0bb8, 16'h0c4e, 16'h0ce4, 16'h0d7a,
16'h0e10, 16'h0ea6, 16'hf3c, 16'h0fd2, 16'h1068, 16'h10fe, 16'h1194, 16'h122a,
16'h12c0, 16'h1356, 16'h13ec, 16'h1482, 16'h1518, 16'h15ae, 16'h1644, 16'h16da,
16'h1770, 16'h1806, 16'h189c, 16'h1932, 16'h19c8, 16'h1a5e, 16'h1af4, 16'h1b8a,
16'h1c20, 16'h1cb6, 16'h1d4c, 16'h1de2, 16'h1e78, 16'h1f0e, 16'h1fa4, 16'h203a,
16'h20d0, 16'h2166, 16'h21fc, 16'h2292, 16'h2328, 16'h23be, 16'h2454, 16'h24ea,
16'h2580, 16'h2616, 16'h26ac, 16'h2742, 16'h27d8, 16'h286e, 16'h2904, 16'h299a,
16'h2a30, 16'h2ac6, 16'h2b5c, 16'h2bf2, 16'h2c88, 16'h2d1e, 16'h2db4, 16'h2e4a,
16'h2ee0, 16'h2f76, 16'h300c, 16'h30a2, 16'h3138, 16'h31ce, 16'h3264, 16'h32fa,
16'h3390, 16'h3426, 16'h34bc, 16'h3552, 16'h35e8, 16'h367e, 16'h3714, 16'h37aa,
16'h3840, 16'h38d6, 16'h396c, 16'h3a02, 16'h3a98, 16'h3b2e, 16'h3bc4, 16'h3c5a,
16'h3cf0, 16'h3d86, 16'h3e1c, 16'h3eb2, 16'h3f48, 16'h3fde, 16'h4074, 16'h410a,
16'h41a0, 16'h4236, 16'h42cc, 16'h4362, 16'h43f8, 16'h448e, 16'h4524, 16'h45ba,
16'h4650, 16'h46e6, 16'h477c, 16'h4812, 16'h48a8, 16'h493e, 16'h49d4, 16'h4a6a,
16'h4b00, 16'h4b96, 16'h4c2c, 16'h4cc2, 16'h4d58, 16'h4dee, 16'h4e84, 16'h4f1a,
16'h4fb0, 16'h5046, 16'h50dc, 16'h5172, 16'h5208, 16'h529e, 16'h5334, 16'h53ca,
16'h5460, 16'h54f6, 16'h558c, 16'h5622, 16'h56b8, 16'h574e, 16'h57e4, 16'h587a,
16'h5910, 16'h59a6, 16'h5a3c, 16'h5ad2, 16'h5b68, 16'h5bfe, 16'h5c94, 16'h5d2a,
16'h5dc0, 16'h5e56, 16'h5eec, 16'h5f82, 16'h6018, 16'h60ae, 16'h6144, 16'h61da,
16'h6270, 16'h6306, 16'h639c, 16'h6432, 16'h64c8, 16'h655e, 16'h65f4, 16'h668a,
16'h6720, 16'h67b6, 16'h684c, 16'h68e2, 16'h6978, 16'h6a0e, 16'h6aa4, 16'h6b3a,
16'h6bd0, 16'h6c66, 16'h6cfc, 16'h6d92, 16'h6e28, 16'h6ebe, 16'h6f54, 16'h6fea,
16'h7080, 16'h7116, 16'h71ac, 16'h7242, 16'h72d8, 16'h736e, 16'h7404, 16'h749a,
16'h7530, 16'h75c6, 16'h765c, 16'h76f2, 16'h7788, 16'h781e, 16'h78b4, 16'h794a,
16'h79e0, 16'h7a76, 16'h7b0c, 16'h7ba2, 16'h7c38, 16'h7cce, 16'h7d64, 16'h7dfa,
16'h7e90, 16'h7f26, 16'h7fbc, 16'h8052, 16'h80e8, 16'h817e, 16'h8214, 16'h82aa,
16'h8340, 16'h83d6, 16'h846c, 16'h8502, 16'h8598, 16'h862e, 16'h86c4, 16'h875a,
16'h87f0, 16'h8886, 16'h891c, 16'h89b2, 16'h8a48, 16'h8ade, 16'h8b74, 16'h8c0a,
16'h8ca0, 16'h8d36, 16'h8dcc, 16'h8e62, 16'h8ef8, 16'h8f8e, 16'h9024, 16'h90ba,
16'h9150, 16'h91e6, 16'h927c, 16'h9312, 16'h93a8, 16'h943e, 16'h94d4, 16'h956a,
16'h9600, 16'h9696, 16'h972c, 16'h97c2, 16'h9858, 16'h98ee, 16'h9984, 16'h9a1a,
16'h9ab0, 16'h9b46, 16'h9bdc, 16'h9c72, 16'h9d08, 16'h9d9e, 16'h9e34, 16'h9eca,
16'h9f60, 16'h9ff6, 16'ha08c, 16'ha122, 16'ha1b8, 16'ha24e, 16'ha2e4, 16'ha37a,
16'ha410, 16'ha4a6, 16'ha53c, 16'ha5d2, 16'ha668, 16'ha6fe, 16'ha794, 16'ha82a,
16'ha8c0, 16'ha956, 16'ha9ec, 16'haa82, 16'hab18, 16'habae, 16'hac44, 16'hacda,
16'had70, 16'hae06, 16'hae9c, 16'haf32, 16'hafc8, 16'hb05e, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h005e, 16'h00bc, 16'h011a, 16'h0178, 16'h01d6, 16'h0235, 16'h0293,
16'h02f1, 16'h034f, 16'h03ad, 16'h040c, 16'h046a, 16'h04c8, 16'h0526, 16'h0584,
16'h05e3, 16'h0641, 16'h069f, 16'h06fd, 16'h075b, 16'h07ba, 16'h0818, 16'h0876,
16'h08d4, 16'h0932, 16'h0991, 16'h09ef, 16'h0a4d, 16'h0aab, 16'h0b09, 16'h0b68,
16'h0bc6, 16'h0c24, 16'h0c82, 16'h0ce0, 16'h0d3f, 16'h0d9d, 16'h0dfb, 16'h0e59,
16'h0eb7, 16'h0f16, 16'h0f74, 16'h0fd2, 16'h1030, 16'h108e, 16'h10ed, 16'h114b,
16'h11a9, 16'h1207, 16'h1265, 16'h12c4, 16'h1322, 16'h1380, 16'h13de, 16'h143c,
16'h149b, 16'h14f9, 16'h1557, 16'h15b5, 16'h1613, 16'h1671, 16'h16d0, 16'h172e,
16'h178c, 16'h17ea, 16'h1848, 16'h18a7, 16'h1905, 16'h1963, 16'h19c1, 16'h1a1f,
16'h1a7e, 16'h1adc, 16'h1b3a, 16'h1b98, 16'h1bf6, 16'h1c55, 16'h1cb3, 16'h1d11,
16'h1d6f, 16'h1dcd, 16'h1e2c, 16'h1e8a, 16'h1ee8, 16'h1f46, 16'h1fa4, 16'h2003,
16'h2061, 16'h20bf, 16'h211d, 16'h217b, 16'h21da, 16'h2238, 16'h2296, 16'h22f4,
16'h2352, 16'h23b1, 16'h240f, 16'h246d, 16'h24cb, 16'h2529, 16'h2588, 16'h25e6,
16'h2644, 16'h26a2, 16'h2700, 16'h275f, 16'h27bd, 16'h281b, 16'h2879, 16'h28d7,
16'h2936, 16'h2994, 16'h29f2, 16'h2a50, 16'h2aae, 16'h2b0d, 16'h2b6b, 16'h2bc9,
16'h2c27, 16'h2c85, 16'h2ce3, 16'h2d42, 16'h2da0, 16'h2dfe, 16'h2e5c, 16'h2eba,
16'h2f19, 16'h2f77, 16'h2fd5, 16'h3033, 16'h3091, 16'h30f0, 16'h314e, 16'h31ac,
16'h320a, 16'h3268, 16'h32c7, 16'h3325, 16'h3383, 16'h33e1, 16'h343f, 16'h349e,
16'h34fc, 16'h355a, 16'h35b8, 16'h3616, 16'h3675, 16'h36d3, 16'h3731, 16'h378f,
16'h37ed, 16'h384c, 16'h38aa, 16'h3908, 16'h3966, 16'h39c4, 16'h3a23, 16'h3a81,
16'h3adf, 16'h3b3d, 16'h3b9b, 16'h3bfa, 16'h3c58, 16'h3cb6, 16'h3d14, 16'h3d72,
16'h3dd1, 16'h3e2f, 16'h3e8d, 16'h3eeb, 16'h3f49, 16'h3fa8, 16'h4006, 16'h4064,
16'h40c2, 16'h4120, 16'h417f, 16'h41dd, 16'h423b, 16'h4299, 16'h42f7, 16'h4355,
16'h43b4, 16'h4412, 16'h4470, 16'h44ce, 16'h452c, 16'h458b, 16'h45e9, 16'h4647,
16'h46a5, 16'h4703, 16'h4762, 16'h47c0, 16'h481e, 16'h487c, 16'h48da, 16'h4939,
16'h4997, 16'h49f5, 16'h4a53, 16'h4ab1, 16'h4b10, 16'h4b6e, 16'h4bcc, 16'h4c2a,
16'h4c88, 16'h4ce7, 16'h4d45, 16'h4da3, 16'h4e01, 16'h4e5f, 16'h4ebe, 16'h4f1c,
16'h4f7a, 16'h4fd8, 16'h5036, 16'h5095, 16'h50f3, 16'h5151, 16'h51af, 16'h520d,
16'h526c, 16'h52ca, 16'h5328, 16'h5386, 16'h53e4, 16'h5443, 16'h54a1, 16'h54ff,
16'h555d, 16'h55bb, 16'h561a, 16'h5678, 16'h56d6, 16'h5734, 16'h5792, 16'h57f1,
16'h584f, 16'h58ad, 16'h590b, 16'h5969, 16'h59c7, 16'h5a26, 16'h5a84, 16'h5ae2,
16'h5b40, 16'h5b9e, 16'h5bfd, 16'h5c5b, 16'h5cb9, 16'h5d17, 16'h5d75, 16'h5dd4,
16'h5e32, 16'h5e90, 16'h5eee, 16'h5f4c, 16'h5fab, 16'h6009, 16'h6067, 16'h60c5,
16'h6123, 16'h6182, 16'h61e0, 16'h623e, 16'h629c, 16'h62fa, 16'h6359, 16'h63b7,
16'h6415, 16'h6473, 16'h64d1, 16'h6530, 16'h658e, 16'h65ec, 16'h664a, 16'h66a8,
16'h6707, 16'h6765, 16'h67c3, 16'h6821, 16'h687f, 16'h68de, 16'h693c, 16'h699a,
16'h69f8, 16'h6a56, 16'h6ab5, 16'h6b13, 16'h6b71, 16'h6bcf, 16'h6c2d, 16'h6c8c,
16'h6cea, 16'h6d48, 16'h6da6, 16'h6e04, 16'h6e62, 16'h6ec1, 16'h6f1f, 16'h6f7d,
16'h6fdb, 16'h7039, 16'h7098, 16'h70f6, 16'h7154, 16'h71b2, 16'h7210, 16'h726f,
16'h72cd, 16'h732b, 16'h7389, 16'h73e7, 16'h7446, 16'h74a4, 16'h7502, 16'h7560,
16'h75be, 16'h761d, 16'h767b, 16'h76d9, 16'h7737, 16'h7795, 16'h77f4, 16'h7852,
16'h78b0, 16'h790e, 16'h796c, 16'h79cb, 16'h7a29, 16'h7a87, 16'h7ae5, 16'h7b43,
16'h7ba2, 16'h7c00, 16'h7c5e, 16'h7cbc, 16'h7d1a, 16'h7d79, 16'h7dd7, 16'h7e35,
16'h7e93, 16'h7ef1, 16'h7f50, 16'h7fae, 16'h800c, 16'h806a, 16'h80c8, 16'h8127,
16'h8185, 16'h81e3, 16'h8241, 16'h829f, 16'h82fe, 16'h835c, 16'h83ba, 16'h8418,
16'h8476, 16'h84d4, 16'h8533, 16'h8591, 16'h85ef, 16'h864d, 16'h86ab, 16'h870a,
16'h8768, 16'h87c6, 16'h8824, 16'h8882, 16'h88e1, 16'h893f, 16'h899d, 16'h89fb,
16'h8a59, 16'h8ab8, 16'h8b16, 16'h8b74, 16'h8bd2, 16'h8c30, 16'h8c8f, 16'h8ced,
16'h8d4b, 16'h8da9, 16'h8e07, 16'h8e66, 16'h8ec4, 16'h8f22, 16'h8f80, 16'h8fde,
16'h903d, 16'h909b, 16'h90f9, 16'h9157, 16'h91b5, 16'h9214, 16'h9272, 16'h92d0,
16'h932e, 16'h938c, 16'h93eb, 16'h9449, 16'h94a7, 16'h9505, 16'h9563, 16'h95c2,
16'h9620, 16'h967e, 16'h96dc, 16'h973a, 16'h9799, 16'h97f7, 16'h9855, 16'h98b3,
16'h9911, 16'h9970, 16'h99ce, 16'h9a2c, 16'h9a8a, 16'h9ae8, 16'h9b46, 16'h9ba5,
16'h9c03, 16'h9c61, 16'h9cbf, 16'h9d1d, 16'h9d7c, 16'h9dda, 16'h9e38, 16'h9e96,
16'h9ef4, 16'h9f53, 16'h9fb1, 16'ha00f, 16'ha06d, 16'ha0cb, 16'ha12a, 16'ha188,
16'ha1e6, 16'ha244, 16'ha2a2, 16'ha301, 16'ha35f, 16'ha3bd, 16'ha41b, 16'ha479,
16'ha4d8, 16'ha536, 16'ha594, 16'ha5f2, 16'ha650, 16'ha6af, 16'ha70d, 16'ha76b,
16'ha7c9, 16'ha827, 16'ha886, 16'ha8e4, 16'ha942, 16'ha9a0, 16'ha9fe, 16'haa5d,
16'haabb, 16'hab19, 16'hab77, 16'habd5, 16'hac34, 16'hac92, 16'hacf0, 16'had4e,
16'hadac, 16'hae0b, 16'hae69, 16'haec7, 16'haf25, 16'haf83, 16'hafe2, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000,
16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h0000
};

Expand All @@ -1382,14 +1388,9 @@ wire [15:0] ch2 = mix_lut[mix_normal];
wire [15:0] sample_normal = ch1 + ch2;

// Linear mixer + enhanced triangle wave
// dmc_lut is 8bit already, tri_lut_enhanced[triangle_enhanced] also.
// For linear mixing, noise_lut[noise] needs to be converted to 8bit
// by shifting to the left two bits, since it's 6bit wide now.
// After calculating the mix, for final mix with ch1, mix_enhanced
// needs to be shifted to the right by 1 bit, losing some minor resolution
// mix_lut[9'(mix_enhanced >> 1)] needed to take it to 16bit resolution (might need to be adapted)
wire [9:0] mix_enhanced = 10'(tri_lut_enhanced[triangle_enhanced]) + 10'(noise_lut[noise] << 2) + 10'(dmc_lut[dmc]);
wire [15:0] sample_linear = ch1 + mix_lut_linear[9'(mix_enhanced >> 1)];
wire [8:0] mix_enhanced = 9'(tri_lut_enhanced[triangle_enhanced]) + 9'(noise_lut[noise]) + 9'(dmc_lut[dmc]);
wire [15:0] ch2_enhanced = mix_lut_linear[mix_enhanced];
wire [15:0] sample_linear = ch1 + ch2_enhanced;

assign sample = (!apu_enhanced_ce ? sample_normal : sample_linear);

Expand Down

0 comments on commit 92e17c3

Please sign in to comment.