mirror of
https://github.com/MiSTer-devel/SMS_MiSTer.git
synced 2026-05-17 03:04:32 +00:00
Technically, `Clk’event and clk = ‘1’` can result in non-`0` triggers (e.g. `1`, `U`, `H`, `X`, `Z`, `W`, etc...), whereas `rising_edge(clk)` does not.
160 lines
6.6 KiB
VHDL
160 lines
6.6 KiB
VHDL
--
|
||
-- AttackTable.vhd
|
||
-- Envelope attack shaping table for VM2413
|
||
--
|
||
-- Copyright (c) 2006 Mitsutaka Okazaki (brezza@pokipoki.org)
|
||
-- All rights reserved.
|
||
--
|
||
-- Redistribution and use of this source code or any derivative works, are
|
||
-- permitted provided that the following conditions are met:
|
||
--
|
||
-- 1. Redistributions of source code must retain the above copyright notice,
|
||
-- this list of conditions and the following disclaimer.
|
||
-- 2. Redistributions in binary form must reproduce the above copyright
|
||
-- notice, this list of conditions and the following disclaimer in the
|
||
-- documentation and/or other materials provided with the distribution.
|
||
-- 3. Redistributions may not be sold, nor may they be used in a commercial
|
||
-- product or activity without specific prior written permission.
|
||
--
|
||
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||
-- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||
-- OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
-- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||
-- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||
-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
--
|
||
--
|
||
|
||
--
|
||
-- modified by t.hara
|
||
--
|
||
|
||
-------------------------------------------------------------------------------
|
||
library ieee;
|
||
use ieee.std_logic_1164.all;
|
||
use ieee.std_logic_signed.all;
|
||
|
||
entity attack_table_mul is
|
||
port(
|
||
i0 : in std_logic_vector( 7 downto 0 ); -- 符号無し 8bit (整数部 0bit, 小数部 8bit)
|
||
i1 : in std_logic_vector( 7 downto 0 ); -- 符号付き 8bit (整数部 8bit)
|
||
o : out std_logic_vector( 13 downto 0 ) -- 符号付き14bit (整数部 8bit, 小数部 6bit)
|
||
);
|
||
end attack_table_mul;
|
||
|
||
architecture rtl of attack_table_mul is
|
||
signal w_mul : std_logic_vector( 16 downto 0 );
|
||
begin
|
||
|
||
w_mul <= ('0' & i0) * i1;
|
||
o <= w_mul( 15 downto 2 ); -- bit16 は bit15 と同じなのでカット。bit1~0 (小数部) は切り捨て。
|
||
end rtl;
|
||
|
||
-------------------------------------------------------------------------------
|
||
library ieee;
|
||
use ieee.std_logic_1164.all;
|
||
use ieee.std_logic_unsigned.all;
|
||
use ieee.std_logic_arith;
|
||
|
||
entity AttackTable is
|
||
port(
|
||
clk : in std_logic;
|
||
clkena : in std_logic;
|
||
addr : in std_logic_vector( 21 downto 0 ); -- 小数部 15bit
|
||
data : out std_logic_vector( 12 downto 0 ) -- 小数部 6bit
|
||
);
|
||
end AttackTable;
|
||
|
||
architecture rtl of attacktable is
|
||
|
||
component attack_table_mul
|
||
port(
|
||
i0 : in std_logic_vector( 7 downto 0 ); -- 符号無し 8bit (整数部 0bit, 小数部 8bit)
|
||
i1 : in std_logic_vector( 7 downto 0 ); -- 符号付き 8bit (整数部 8bit)
|
||
o : out std_logic_vector( 13 downto 0 ) -- 符号付き 8bit (整数部 8bit, 小数部 6bit)
|
||
);
|
||
end component;
|
||
|
||
type ar_adjust_array is array ( 0 to 127 ) of std_logic_vector( 6 downto 0 );
|
||
constant ar_adjust : ar_adjust_array :=(
|
||
"0000000", "0000000", "0000000", "0000000", "0000000", "0000001", "0000001", "0000001",
|
||
"0000001", "0000001", "0000010", "0000010", "0000010", "0000010", "0000011", "0000011",
|
||
"0000011", "0000011", "0000100", "0000100", "0000100", "0000100", "0000100", "0000101",
|
||
"0000101", "0000101", "0000110", "0000110", "0000110", "0000110", "0000111", "0000111",
|
||
"0000111", "0000111", "0001000", "0001000", "0001000", "0001001", "0001001", "0001001",
|
||
"0001001", "0001010", "0001010", "0001010", "0001011", "0001011", "0001011", "0001100",
|
||
"0001100", "0001100", "0001101", "0001101", "0001101", "0001110", "0001110", "0001110",
|
||
"0001111", "0001111", "0001111", "0010000", "0010000", "0010001", "0010001", "0010001",
|
||
"0010010", "0010010", "0010011", "0010011", "0010100", "0010100", "0010101", "0010101",
|
||
"0010101", "0010110", "0010110", "0010111", "0010111", "0011000", "0011000", "0011001",
|
||
"0011010", "0011010", "0011011", "0011011", "0011100", "0011101", "0011101", "0011110",
|
||
"0011110", "0011111", "0100000", "0100001", "0100001", "0100010", "0100011", "0100100",
|
||
"0100100", "0100101", "0100110", "0100111", "0101000", "0101001", "0101010", "0101011",
|
||
"0101100", "0101101", "0101111", "0110000", "0110001", "0110011", "0110100", "0110110",
|
||
"0111000", "0111001", "0111011", "0111101", "1000000", "1000010", "1000101", "1001000",
|
||
"1001011", "1010000", "1010100", "1011010", "1100010", "1101100", "1110101", "1111111"
|
||
);
|
||
|
||
signal ff_w : std_logic_vector( 7 downto 0 );
|
||
signal ff_d1 : std_logic_vector( 6 downto 0 );
|
||
signal ff_d2 : std_logic_vector( 6 downto 0 );
|
||
|
||
signal w_addr1 : std_logic_vector( 6 downto 0 );
|
||
signal w_addr2 : std_logic_vector( 6 downto 0 );
|
||
signal w_sub : std_logic_vector( 7 downto 0 ); -- 符号付き
|
||
signal w_mul : std_logic_vector( 13 downto 0 ); -- 符号付き
|
||
signal w_inter : std_logic_vector( 13 downto 0 );
|
||
begin
|
||
|
||
w_addr1 <= addr( 21 downto 15 );
|
||
w_addr2 <= (others => '1') when( addr( 21 downto 15 ) = "1111111" )else
|
||
w_addr1 + 1;
|
||
|
||
process( clk )
|
||
begin
|
||
if rising_edge(clk) then
|
||
if( clkena = '1' )then
|
||
ff_d1 <= ar_adjust( conv_integer( w_addr1 ) );
|
||
ff_d2 <= ar_adjust( conv_integer( w_addr2 ) );
|
||
end if;
|
||
end if;
|
||
end process;
|
||
|
||
process( clk )
|
||
begin
|
||
if rising_edge(clk) then
|
||
if( clkena = '1' )then
|
||
ff_w <= addr( 14 downto 7 ); -- データ自体のビット数が 7bit なので 8bit で十分
|
||
end if;
|
||
end if;
|
||
end process;
|
||
|
||
-- 補間 (※符号をまたがる場所では 0 になるから ff_sign は気にしない)
|
||
-- o = i1 * (1 - k) + i2 * w = i1 - w * i1 + w * i2 = i1 + w * (i2 - i1)
|
||
w_sub <= ('0' & ff_d2) - ('0' & ff_d1);
|
||
|
||
u_attack_table_mul: attack_table_mul
|
||
port map (
|
||
i0 => ff_w,
|
||
i1 => w_sub,
|
||
o => w_mul
|
||
);
|
||
|
||
w_inter <= ('0' & ff_d1 & "000000") + w_mul;
|
||
|
||
process( clk )
|
||
begin
|
||
if rising_edge(clk) then
|
||
if( clkena = '1' )then
|
||
data <=w_inter( 12 downto 0 ); -- MSB は必ず 0
|
||
end if;
|
||
end if;
|
||
end process;
|
||
|
||
end rtl;
|