RFToolSDR/fpga/dds/sin-table-gen.py

41 lines
1.5 KiB
Python
Raw Normal View History

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")