167 lines
4.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from math import cos, sin
from math import pi
import matplotlib.pyplot as plt
import logic as lc
total=11
owidth=12 # 实际输出数据的有效位数
M=pow(2, owidth-1)-1
template = '''
`timescale 1ns/1ps
module ftwiddle #(
parameter FTWI_STAGE = 11, // stage of twiddle
parameter REAL_WIDTH = 12, // data width of real
parameter IMGN_WIDTH = 12 // data width of imgn
) (
input [FTWI_STAGE-1:0] idx, // index (head addr) input
output [REAL_WIDTH-1:0] ore, // output part of real (signed)
output [IMGN_WIDTH-1:0] oim // output part of imgn (signed)
);
wire [REAL_WIDTH:0] re;
wire [IMGN_WIDTH:0] im;
localparam DATA_WIDTH = REAL_WIDTH + IMGN_WIDTH;
localparam DATA_DEPTH = 2**(FTWI_STAGE-3)-1;
wire [DATA_WIDTH-1:0] rom[DATA_DEPTH:0];
wire [1:0] haddr = idx[FTWI_STAGE-1:FTWI_STAGE-2];
wire [FTWI_STAGE-3:0] addr = idx[FTWI_STAGE-3:0];
assign {ore, oim} = haddr == 2'b00 ? { re, im } :
haddr == 2'b01 ? { im, -re } :
haddr == 2'b10 ? { -re, -im } :
haddr == 2'b11 ? { -im, re } :
0;
assign {re, im} = rom[addr];
generate
if(FTWI_STAGE == 3) begin : stage3
// stage 3 rom
end
else if(FTWI_STAGE == 4) begin : stage4
// stage 4 rom
end
else if(FTWI_STAGE == 5) begin : stage5
// stage 5 rom
end
else if(FTWI_STAGE == 6) begin : stage6
// stage 6 rom
end
else if(FTWI_STAGE == 7) begin : stage7
// stage 7 rom
end
else if(FTWI_STAGE == 8) begin : stage8
// stage 8 rom
end
else if(FTWI_STAGE == 9) begin : stage9
// stage 9 rom
end
else if(FTWI_STAGE == 10) begin : stage10
// stage 10 rom
end
else if(FTWI_STAGE == 11) begin : stage11
// stage 11 rom
end
endgenerate
endmodule
'''
ofbin = "./bin/twiddle"
ftwid = open("../../src/Parallel_FFT_IFFT/ptwiddle.sv",'w')
# 输入路径
ifre = open("./example/re",'r')
ifim = open("./example/im",'r')
# 用于直接进行画图
def show(x, y):
# plt.savefig("Figure_r.png")
plt.plot(list(range(1, x)), y)
plt.show()
# 虽然是18位的但没实际用满只用了16位
def test():
i=0;
for line in ifre :
str = line.strip()
out = lc.str2dec(str, 16, 18, True)
print("%d : %s",i, out)
i=i+1
i=0;
for line in ifim :
str = line.strip()
out = lc.str2dec(str, 16, 18, True)
print("%d : %s",i, out)
i=i+1
def twiddle(m, N, width):
T = pow(2, width-1)-1
re = round(T*cos(2*pi*m/N))
im = -round(T*sin(2*pi*m/N))
# print('re:%d, im:%d\n' % (re, im))
reStr = lc.dec2bin(re, width, True)
imStr = lc.dec2bin(im, width, True)
return reStr + imStr
def rtwiddle(m, N, width):
T = pow(2, width-1)-1
re = round(T*cos(2*pi*m/N))
im = -round(T*sin(2*pi*m/N))
# print('re:%d, im:%d\n' % (re, im))
reStr = lc.dec2bin(re, width, True)
return reStr
def itwiddle(m, N, width):
T = pow(2, width-1)-1
re = round(T*cos(2*pi*m/N))
im = -round(T*sin(2*pi*m/N))
# print('re:%d, im:%d\n' % (re, im))
imStr = lc.dec2bin(im, width, True)
return imStr
def generate(step):
str = ''
index = pow(2, step)
# fbin = open('%s%d' % (ofbin, step), 'w')
for i in range(int(index/4)):
re = round(M*cos(2*pi*i/index))
im = -round(M*sin(2*pi*i/index))
re = lc.dec2bin(re, owidth, True)
im = lc.dec2bin(im, owidth, True)
str += ' assign rom[%d] = %d\'b%s%s;\n' % (i, 2*owidth, re, im)
# fbin.write(str)
# re = str2dec(re, 2, owidth, True)
# im = str2dec(im, 2, owidth, True)
# print(i, re, im)
# fbin.close()
return str
# test()
# generate(8)
# for i in range(3, total+1) :
# flag = '// stage %d rom\n' % (i)
# template = template.replace(flag, flag + generate(i))
# ftwid.write(template)
# ftwid.close()
str = f'''module ptwiddle (
output [12:0] rtwiddle [63:0],
output [12:0] itwiddle [63:0]
);
'''
for m in range(8) :
for n in range(8) :
str += ' assign rtwiddle[%d] = 13\'b%s;\n' % ((m*8+n), rtwiddle(n*m, 64, 13))
str += ' assign itwiddle[%d] = 13\'b%s;\n' % ((m*8+n), rtwiddle(n*m, 64, 13))
str += 'endmodule'
print(str)
ftwid.write(str)
ftwid.close()