---------------------------------------------------------------------------------- -- Company: -- Engineer: -- -- Create Date: 17:47:28 05/18/2015 -- Design Name: -- Module Name: sine_table - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity sine_table is port ( clk : in std_logic; reset_n : in std_logic; data_request : in std_logic; amplitude : in std_logic_vector (2 downto 0); addr : in std_logic_vector (12 downto 0); data_out : out std_logic_vector(11 downto 0) ); end sine_table; architecture rtl of sine_table is signal delta : std_logic_vector (11 downto 0); signal sine_total : std_logic_vector (11 downto 0); --signal data_out : std_logic_vector (7 downto 0); type table is array (1499 downto 0) of std_logic_vector(11 downto 0); constant sine_tbl : table := ( X"FFF", X"FFE", X"FFD", X"FFC", X"FFB", X"FFA", X"FF9", X"FF8", X"FF7", X"FF6", -- 1500 X"FF5", X"FF4", X"FF3", X"FF1", X"FF0", X"FEF", X"FEE", X"FED", X"FEC", X"FEB", -- 1490 X"FEA", X"FE9", X"FE8", X"FE7", X"FE6", X"FE5", X"FE4", X"FE3", X"FE1", X"FE0", -- 1480 X"FDF", X"FDE", X"FDD", X"FDC", X"FDB", X"FDA", X"FD9", X"FD8", X"FD7", X"FD6", -- 1470 X"FD5", X"FD4", X"FD3", X"FD2", X"FD1", X"FCF", X"FCE", X"FCD", X"FCC", X"FCB", -- 1460 X"FCA", X"FC9", X"FC8", X"FC7", X"FC6", X"FC5", X"FC4", X"FC3", X"FC2", X"FC1", -- 1450 X"FC0", X"FBF", X"FBE", X"FBD", X"FBC", X"FBB", X"FBA", X"FB9", X"FB8", X"FB7", -- 1440 X"FB5", X"FB4", X"FB3", X"FB2", X"FB1", X"FB0", X"FAF", X"FAE", X"FAD", X"FAC", -- 1430 X"FAB", X"FAA", X"FA9", X"FA8", X"FA7", X"FA6", X"FA5", X"FA4", X"FA3", X"FA2", -- 1420 X"FA1", X"FA0", X"F9F", X"F9E", X"F9D", X"F9C", X"F9B", X"F9A", X"F99", X"F98", -- 1410 X"F97", X"F96", X"F95", X"F94", X"F94", X"F93", X"F92", X"F91", X"F90", X"F8F", -- 1400 X"F8E", X"F8D", X"F8C", X"F8B", X"F8A", X"F89", X"F88", X"F87", X"F86", X"F85", -- 1390 X"F84", X"F83", X"F82", X"F81", X"F80", X"F80", X"F7F", X"F7E", X"F7D", X"F7C", -- 1380 X"F7B", X"F7A", X"F79", X"F78", X"F77", X"F76", X"F76", X"F75", X"F74", X"F73", -- 1370 X"F72", X"F71", X"F70", X"F6F", X"F6E", X"F6E", X"F6D", X"F6C", X"F6B", X"F6A", -- 1360 X"F69", X"F68", X"F67", X"F67", X"F66", X"F65", X"F64", X"F63", X"F62", X"F61", -- 1350 X"F61", X"F60", X"F5F", X"F5E", X"F5D", X"F5C", X"F5C", X"F5B", X"F5A", X"F59", -- 1340 X"F58", X"F58", X"F57", X"F56", X"F55", X"F54", X"F54", X"F53", X"F52", X"F51", -- 1330 X"F50", X"F50", X"F4F", X"F4E", X"F4D", X"F4D", X"F4C", X"F4B", X"F4A", X"F4A", -- 1320 X"F49", X"F48", X"F47", X"F47", X"F46", X"F45", X"F44", X"F44", X"F43", X"F42", -- 1310 X"F42", X"F41", X"F40", X"F3F", X"F3F", X"F3E", X"F3D", X"F3D", X"F3C", X"F3B", -- 1300 X"F3B", X"F3A", X"F39", X"F39", X"F38", X"F37", X"F37", X"F36", X"F35", X"F35", -- 1290 X"F34", X"F33", X"F33", X"F32", X"F31", X"F31", X"F30", X"F30", X"F2F", X"F2E", -- 1280 X"F2E", X"F2D", X"F2C", X"F2C", X"F2B", X"F2B", X"F2A", X"F2A", X"F29", X"F28", -- 1270 X"F28", X"F27", X"F27", X"F26", X"F26", X"F25", X"F24", X"F24", X"F23", X"F23", -- 1260 X"F22", X"F22", X"F21", X"F21", X"F20", X"F20", X"F1F", X"F1F", X"F1E", X"F1E", -- 1250 X"F1D", X"F1D", X"F1C", X"F1C", X"F1B", X"F1B", X"F1A", X"F1A", X"F19", X"F19", -- 1240 X"F18", X"F18", X"F18", X"F17", X"F17", X"F16", X"F16", X"F15", X"F15", X"F15", -- 1230 X"F14", X"F14", X"F13", X"F13", X"F12", X"F12", X"F12", X"F11", X"F11", X"F11", -- 1220 X"F10", X"F10", X"F0F", X"F0F", X"F0F", X"F0E", X"F0E", X"F0E", X"F0D", X"F0D", -- 1210 X"F0D", X"F0C", X"F0C", X"F0C", X"F0B", X"F0B", X"F0B", X"F0B", X"F0A", X"F0A", -- 1200 X"F0A", X"F09", X"F09", X"F09", X"F09", X"F08", X"F08", X"F08", X"F08", X"F07", -- 1190 X"F07", X"F07", X"F07", X"F06", X"F06", X"F06", X"F06", X"F05", X"F05", X"F05", -- 1180 X"F05", X"F05", X"F04", X"F04", X"F04", X"F04", X"F04", X"F04", X"F03", X"F03", -- 1170 X"F03", X"F03", X"F03", X"F03", X"F03", X"F02", X"F02", X"F02", X"F02", X"F02", -- 1160 X"F02", X"F02", X"F02", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", -- 1150 X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", -- 1140 X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", -- 1130 X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", -- 1120 X"F01", X"F01", X"F01", X"F01", X"F01", X"F01", X"F02", X"F02", X"F02", X"F02", -- 1110 X"F02", X"F02", X"F02", X"F02", X"F03", X"F03", X"F03", X"F03", X"F03", X"F03", -- 1100 X"F03", X"F04", X"F04", X"F04", X"F04", X"F04", X"F04", X"F05", X"F05", X"F05", -- 1090 X"F05", X"F05", X"F06", X"F06", X"F06", X"F06", X"F07", X"F07", X"F07", X"F07", -- 1080 X"F08", X"F08", X"F08", X"F08", X"F09", X"F09", X"F09", X"F09", X"F0A", X"F0A", -- 1070 X"F0A", X"F0B", X"F0B", X"F0B", X"F0B", X"F0C", X"F0C", X"F0C", X"F0D", X"F0D", -- 1060 X"F0D", X"F0E", X"F0E", X"F0E", X"F0F", X"F0F", X"F0F", X"F10", X"F10", X"F11", -- 1050 X"F11", X"F11", X"F12", X"F12", X"F12", X"F13", X"F13", X"F14", X"F14", X"F15", -- 1040 X"F15", X"F15", X"F16", X"F16", X"F17", X"F17", X"F18", X"F18", X"F18", X"F19", -- 1030 X"F19", X"F1A", X"F1A", X"F1B", X"F1B", X"F1C", X"F1C", X"F1D", X"F1D", X"F1E", -- 1020 X"F1E", X"F1F", X"F1F", X"F20", X"F20", X"F21", X"F21", X"F22", X"F22", X"F23", -- 1010 X"F23", X"F24", X"F24", X"F25", X"F26", X"F26", X"F27", X"F27", X"F28", X"F28", -- 1000 X"F29", X"F2A", X"F2A", X"F2B", X"F2B", X"F2C", X"F2C", X"F2D", X"F2E", X"F2E", -- 990 X"F2F", X"F30", X"F30", X"F31", X"F31", X"F32", X"F33", X"F33", X"F34", X"F35", -- 980 X"F35", X"F36", X"F37", X"F37", X"F38", X"F39", X"F39", X"F3A", X"F3B", X"F3B", -- 970 X"F3C", X"F3D", X"F3D", X"F3E", X"F3F", X"F3F", X"F40", X"F41", X"F42", X"F42", -- 960 X"F43", X"F44", X"F44", X"F45", X"F46", X"F47", X"F47", X"F48", X"F49", X"F4A", -- 950 X"F4A", X"F4B", X"F4C", X"F4D", X"F4D", X"F4E", X"F4F", X"F50", X"F50", X"F51", -- 940 X"F52", X"F53", X"F54", X"F54", X"F55", X"F56", X"F57", X"F58", X"F58", X"F59", -- 930 X"F5A", X"F5B", X"F5C", X"F5C", X"F5D", X"F5E", X"F5F", X"F60", X"F61", X"F61", -- 920 X"F62", X"F63", X"F64", X"F65", X"F66", X"F67", X"F67", X"F68", X"F69", X"F6A", -- 910 X"F6B", X"F6C", X"F6D", X"F6E", X"F6E", X"F6F", X"F70", X"F71", X"F72", X"F73", -- 900 X"F74", X"F75", X"F76", X"F76", X"F77", X"F78", X"F79", X"F7A", X"F7B", X"F7C", -- 890 X"F7D", X"F7E", X"F7F", X"F80", X"F81", X"F81", X"F82", X"F83", X"F84", X"F85", -- 880 X"F86", X"F87", X"F88", X"F89", X"F8A", X"F8B", X"F8C", X"F8D", X"F8E", X"F8F", -- 870 X"F90", X"F91", X"F92", X"F93", X"F94", X"F94", X"F95", X"F96", X"F97", X"F98", -- 860 X"F99", X"F9A", X"F9B", X"F9C", X"F9D", X"F9E", X"F9F", X"FA0", X"FA1", X"FA2", -- 850 X"FA3", X"FA4", X"FA5", X"FA6", X"FA7", X"FA8", X"FA9", X"FAA", X"FAB", X"FAC", -- 840 X"FAD", X"FAE", X"FAF", X"FB0", X"FB1", X"FB2", X"FB3", X"FB4", X"FB5", X"FB7", -- 830 X"FB8", X"FB9", X"FBA", X"FBB", X"FBC", X"FBD", X"FBE", X"FBF", X"FC0", X"FC1", -- 820 X"FC2", X"FC3", X"FC4", X"FC5", X"FC6", X"FC7", X"FC8", X"FC9", X"FCA", X"FCB", -- 810 X"FCC", X"FCD", X"FCE", X"FCF", X"FD1", X"FD2", X"FD3", X"FD4", X"FD5", X"FD6", -- 800 X"FD7", X"FD8", X"FD9", X"FDA", X"FDB", X"FDC", X"FDD", X"FDE", X"FDF", X"FE0", -- 790 X"FE1", X"FE3", X"FE4", X"FE5", X"FE6", X"FE7", X"FE8", X"FE9", X"FEA", X"FEB", -- 780 X"FEC", X"FED", X"FEE", X"FEF", X"FF0", X"FF1", X"FF3", X"FF4", X"FF5", X"FF6", -- 770 X"FF7", X"FF8", X"FF9", X"FFA", X"FFB", X"FFC", X"FFD", X"FFE", X"FFF", X"000", -- 760 X"001", X"002", X"003", X"004", X"005", X"006", X"007", X"008", X"009", X"00A", -- 750 X"00B", X"00C", X"00D", X"00F", X"010", X"011", X"012", X"013", X"014", X"015", -- 740 X"016", X"017", X"018", X"019", X"01A", X"01B", X"01C", X"01D", X"01F", X"020", -- 730 X"021", X"022", X"023", X"024", X"025", X"026", X"027", X"028", X"029", X"02A", -- 720 X"02B", X"02C", X"02D", X"02E", X"02F", X"031", X"032", X"033", X"034", X"035", -- 710 X"036", X"037", X"038", X"039", X"03A", X"03B", X"03C", X"03D", X"03E", X"03F", -- 700 X"040", X"041", X"042", X"043", X"044", X"045", X"046", X"047", X"048", X"049", -- 690 X"04B", X"04C", X"04D", X"04E", X"04F", X"050", X"051", X"052", X"053", X"054", -- 680 X"055", X"056", X"057", X"058", X"059", X"05A", X"05B", X"05C", X"05D", X"05E", -- 670 X"05F", X"060", X"061", X"062", X"063", X"064", X"065", X"066", X"067", X"068", -- 660 X"069", X"06A", X"06B", X"06C", X"06C", X"06D", X"06E", X"06F", X"070", X"071", -- 650 X"072", X"073", X"074", X"075", X"076", X"077", X"078", X"079", X"07A", X"07B", -- 640 X"07C", X"07D", X"07E", X"07F", X"080", X"080", X"081", X"082", X"083", X"084", -- 630 X"085", X"086", X"087", X"088", X"089", X"08A", X"08A", X"08B", X"08C", X"08D", -- 620 X"08E", X"08F", X"090", X"091", X"092", X"092", X"093", X"094", X"095", X"096", -- 610 X"097", X"098", X"099", X"099", X"09A", X"09B", X"09C", X"09D", X"09E", X"09F", -- 600 X"09F", X"0A0", X"0A1", X"0A2", X"0A3", X"0A4", X"0A4", X"0A5", X"0A6", X"0A7", -- 590 X"0A8", X"0A8", X"0A9", X"0AA", X"0AB", X"0AC", X"0AC", X"0AD", X"0AE", X"0AF", -- 580 X"0B0", X"0B0", X"0B1", X"0B2", X"0B3", X"0B3", X"0B4", X"0B5", X"0B6", X"0B6", -- 570 X"0B7", X"0B8", X"0B9", X"0B9", X"0BA", X"0BB", X"0BC", X"0BC", X"0BD", X"0BE", -- 560 X"0BE", X"0BF", X"0C0", X"0C1", X"0C1", X"0C2", X"0C3", X"0C3", X"0C4", X"0C5", -- 550 X"0C5", X"0C6", X"0C7", X"0C7", X"0C8", X"0C9", X"0C9", X"0CA", X"0CB", X"0CB", -- 540 X"0CC", X"0CD", X"0CD", X"0CE", X"0CF", X"0CF", X"0D0", X"0D0", X"0D1", X"0D2", -- 530 X"0D2", X"0D3", X"0D4", X"0D4", X"0D5", X"0D5", X"0D6", X"0D6", X"0D7", X"0D8", -- 520 X"0D8", X"0D9", X"0D9", X"0DA", X"0DA", X"0DB", X"0DC", X"0DC", X"0DD", X"0DD", -- 510 X"0DE", X"0DE", X"0DF", X"0DF", X"0E0", X"0E0", X"0E1", X"0E1", X"0E2", X"0E2", -- 500 X"0E3", X"0E3", X"0E4", X"0E4", X"0E5", X"0E5", X"0E6", X"0E6", X"0E7", X"0E7", -- 490 X"0E8", X"0E8", X"0E8", X"0E9", X"0E9", X"0EA", X"0EA", X"0EB", X"0EB", X"0EB", -- 480 X"0EC", X"0EC", X"0ED", X"0ED", X"0EE", X"0EE", X"0EE", X"0EF", X"0EF", X"0EF", -- 470 X"0F0", X"0F0", X"0F1", X"0F1", X"0F1", X"0F2", X"0F2", X"0F2", X"0F3", X"0F3", -- 460 X"0F3", X"0F4", X"0F4", X"0F4", X"0F5", X"0F5", X"0F5", X"0F5", X"0F6", X"0F6", -- 450 X"0F6", X"0F7", X"0F7", X"0F7", X"0F7", X"0F8", X"0F8", X"0F8", X"0F8", X"0F9", -- 440 X"0F9", X"0F9", X"0F9", X"0FA", X"0FA", X"0FA", X"0FA", X"0FB", X"0FB", X"0FB", -- 430 X"0FB", X"0FB", X"0FC", X"0FC", X"0FC", X"0FC", X"0FC", X"0FC", X"0FD", X"0FD", -- 420 X"0FD", X"0FD", X"0FD", X"0FD", X"0FD", X"0FE", X"0FE", X"0FE", X"0FE", X"0FE", -- 410 X"0FE", X"0FE", X"0FE", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", -- 400 X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", -- 390 X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", -- 380 X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", -- 370 X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FF", X"0FE", X"0FE", X"0FE", X"0FE", -- 360 X"0FE", X"0FE", X"0FE", X"0FE", X"0FD", X"0FD", X"0FD", X"0FD", X"0FD", X"0FD", -- 350 X"0FD", X"0FC", X"0FC", X"0FC", X"0FC", X"0FC", X"0FC", X"0FB", X"0FB", X"0FB", -- 340 X"0FB", X"0FB", X"0FA", X"0FA", X"0FA", X"0FA", X"0F9", X"0F9", X"0F9", X"0F9", -- 330 X"0F8", X"0F8", X"0F8", X"0F8", X"0F7", X"0F7", X"0F7", X"0F7", X"0F6", X"0F6", -- 320 X"0F6", X"0F5", X"0F5", X"0F5", X"0F5", X"0F4", X"0F4", X"0F4", X"0F3", X"0F3", -- 310 X"0F3", X"0F2", X"0F2", X"0F2", X"0F1", X"0F1", X"0F1", X"0F0", X"0F0", X"0EF", -- 300 X"0EF", X"0EF", X"0EE", X"0EE", X"0EE", X"0ED", X"0ED", X"0EC", X"0EC", X"0EB", -- 290 X"0EB", X"0EB", X"0EA", X"0EA", X"0E9", X"0E9", X"0E8", X"0E8", X"0E8", X"0E7", -- 280 X"0E7", X"0E6", X"0E6", X"0E5", X"0E5", X"0E4", X"0E4", X"0E3", X"0E3", X"0E2", -- 270 X"0E2", X"0E1", X"0E1", X"0E0", X"0E0", X"0DF", X"0DF", X"0DE", X"0DE", X"0DD", -- 260 X"0DD", X"0DC", X"0DC", X"0DB", X"0DA", X"0DA", X"0D9", X"0D9", X"0D8", X"0D8", -- 250 X"0D7", X"0D6", X"0D6", X"0D5", X"0D5", X"0D4", X"0D4", X"0D3", X"0D2", X"0D2", -- 240 X"0D1", X"0D0", X"0D0", X"0CF", X"0CF", X"0CE", X"0CD", X"0CD", X"0CC", X"0CB", -- 230 X"0CB", X"0CA", X"0C9", X"0C9", X"0C8", X"0C7", X"0C7", X"0C6", X"0C5", X"0C5", -- 220 X"0C4", X"0C3", X"0C3", X"0C2", X"0C1", X"0C1", X"0C0", X"0BF", X"0BE", X"0BE", -- 210 X"0BD", X"0BC", X"0BC", X"0BB", X"0BA", X"0B9", X"0B9", X"0B8", X"0B7", X"0B6", -- 200 X"0B6", X"0B5", X"0B4", X"0B3", X"0B3", X"0B2", X"0B1", X"0B0", X"0B0", X"0AF", -- 190 X"0AE", X"0AD", X"0AC", X"0AC", X"0AB", X"0AA", X"0A9", X"0A8", X"0A8", X"0A7", -- 180 X"0A6", X"0A5", X"0A4", X"0A4", X"0A3", X"0A2", X"0A1", X"0A0", X"09F", X"09F", -- 170 X"09E", X"09D", X"09C", X"09B", X"09A", X"099", X"099", X"098", X"097", X"096", -- 160 X"095", X"094", X"093", X"092", X"092", X"091", X"090", X"08F", X"08E", X"08D", -- 150 X"08C", X"08B", X"08A", X"08A", X"089", X"088", X"087", X"086", X"085", X"084", -- 140 X"083", X"082", X"081", X"080", X"07F", X"07F", X"07E", X"07D", X"07C", X"07B", -- 130 X"07A", X"079", X"078", X"077", X"076", X"075", X"074", X"073", X"072", X"071", -- 120 X"070", X"06F", X"06E", X"06D", X"06C", X"06C", X"06B", X"06A", X"069", X"068", -- 110 X"067", X"066", X"065", X"064", X"063", X"062", X"061", X"060", X"05F", X"05E", -- 100 X"05D", X"05C", X"05B", X"05A", X"059", X"058", X"057", X"056", X"055", X"054", -- 90 X"053", X"052", X"051", X"050", X"04F", X"04E", X"04D", X"04C", X"04B", X"049", -- 80 X"048", X"047", X"046", X"045", X"044", X"043", X"042", X"041", X"040", X"03F", -- 70 X"03E", X"03D", X"03C", X"03B", X"03A", X"039", X"038", X"037", X"036", X"035", -- 60 X"034", X"033", X"032", X"031", X"02F", X"02E", X"02D", X"02C", X"02B", X"02A", -- 50 X"029", X"028", X"027", X"026", X"025", X"024", X"023", X"022", X"021", X"020", -- 40 X"01F", X"01D", X"01C", X"01B", X"01A", X"019", X"018", X"017", X"016", X"015", -- 30 X"014", X"013", X"012", X"011", X"010", X"00F", X"00D", X"00C", X"00B", X"00A", -- 20 X"009", X"008", X"007", X"006", X"005", X"004", X"003", X"002", X"001", X"000" -- 10 ); begin -- data <= data_out; process(clk, reset_n) begin if(reset_n = '0') then delta <= (others => '0'); sine_total <= (others => '0'); data_out <= (others => '0'); elsif(clk 'event and clk = '1') then if(data_request = '1') then if(addr < "0010111011011") then sine_total <= sine_tbl(conv_integer(addr)); case amplitude is when "000" => if(sine_total(11) = '0') then data_out <= "0000" & sine_total(11 downto 4); else data_out <= "1111" & sine_total(11 downto 4); end if; when "001" => if(sine_total(11) = '0') then data_out <= "000" & sine_total(11 downto 3); else data_out <= "111" & sine_total(11 downto 3); end if; when "010" => if(sine_total(11) = '0') then data_out <= "00" & sine_total(11 downto 2); else data_out <= "11" & sine_total(11 downto 2); end if; when "011" => if(sine_total(11) = '0') then data_out <= '0' & sine_total(11 downto 1); else data_out <= '1' & sine_total(11 downto 1); end if; when "100" => data_out <= sine_total; when others => data_out <= (others => 'X'); end case; else data_out <= (others => 'X'); end if; end if; end if; end process; end rtl;