41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
import math
|
|
addr_bits = 12
|
|
data_bits = 12
|
|
|
|
def to_bin(x, n):
|
|
return ('{0:0' + str(n) + 'b}').format(x)[-n:]
|
|
|
|
with open("dds-sine-table.gen.vhd", 'w') as f:
|
|
f.write("--Autogenerated sine table - do not modify\n")
|
|
f.write("library IEEE;\n")
|
|
f.write("use IEEE.STD_LOGIC_1164.ALL;\n")
|
|
f.write("use IEEE.NUMERIC_STD.ALL;\n\n")
|
|
f.write("entity dds_sine_table is\n")
|
|
f.write("\tport(\n")
|
|
f.write("\t\tclock : in std_logic;\n")
|
|
f.write("\t\taddress : in std_logic_vector(" + str(addr_bits - 1) + " downto 0);\n")
|
|
f.write("\t\tdata : out std_logic_vector(" + str(data_bits - 1) + " downto 0));\n")
|
|
f.write("end dds_sine_table;\n\n")
|
|
f.write("architecture Behavioral of dds_sine_table is\n")
|
|
f.write("begin\n")
|
|
f.write("\tprocess(clock)\n")
|
|
f.write("\tbegin\n")
|
|
f.write("\t\tif rising_edge(clock) then\n")
|
|
f.write("\t\t\tcase address is\n")
|
|
for x in range(0, 2**addr_bits):
|
|
val = math.sin(2.0 * math.pi * (x / float(2**addr_bits)))
|
|
val *= (2**(data_bits - 1) - 1)
|
|
val = int(val)
|
|
if val < 0:
|
|
val = abs(val)
|
|
val = val ^ ((2**data_bits) - 1)
|
|
val += 1
|
|
f.write("\t\t\t\twhen \"" + to_bin(x,addr_bits) + "\" => \n")
|
|
f.write("\t\t\t\t\tdata <= \"" + to_bin(val, data_bits) + "\";\n")
|
|
f.write("\t\t\t\twhen others => \n")
|
|
f.write("\t\t\t\t\tdata <= \"" + to_bin(0, data_bits) + "\";\n")
|
|
f.write("\t\t\tend case;\n")
|
|
f.write("\t\tend if;\n")
|
|
f.write("\tend process;\n")
|
|
f.write("end Behavioral;\n")
|