clc;clear all;
table_index = 1 : 36;
z_width = 65;
z_frac = 63;
table_format = numerictype('signed',1,'WordLength',z_width,'FractionLength',z_frac);
table_math = fimath('CastBeforeSum',0,'OverflowMode','saturate','RoundMode','round');
% clarify the table variables as global variables
global table_cirl table_hyper table_lin;
% caculate table values for cordic
table_cirl = fi(atan(2.^-(table_index-1)),table_format,table_math);
% hyperbolic iteration starts from "j=1" not "j=0" !!!
table_hyper = fi(atanh(2.^-table_index),table_format,table_math);
table_lin = fi(2.^-(table_index-1),table_format,table_math);
addr_width =ceil( log2(length(table_index)+1));
module_name = strcat('angle_rom_','x',num2str(64),'bit');
file_name = strcat(module_name,'.v');
fid = fopen(file_name,'w');
data_width=65;
register_sel=0;
for ii = 1 : length(table_index)
get_angle = table_hyper(ii);
if register_sel == 0
fprintf(fid,' %d''d%d: data_out = %d''b%s;//[%d][angle=atan(2^-%d)=%f]\n',addr_width,(ii-1),data_width,get_angle.bin,ii,(ii-1), get_angle.double);
else
fprintf(fid,' %d''d%d: data_out <= %d''b%s;//[%d][angle=atan(2^-%d)=%f]\n',addr_width,(ii-1),data_width,get_angle.bin,ii,(ii-1), get_angle.double);
end
table_index = 1 : 36;
z_width = 65;
z_frac = 63;
table_format = numerictype('signed',1,'WordLength',z_width,'FractionLength',z_frac);
table_math = fimath('CastBeforeSum',0,'OverflowMode','saturate','RoundMode','round');
% clarify the table variables as global variables
global table_cirl table_hyper table_lin;
% caculate table values for cordic
table_cirl = fi(atan(2.^-(table_index-1)),table_format,table_math);
% hyperbolic iteration starts from "j=1" not "j=0" !!!
table_hyper = fi(atanh(2.^-table_index),table_format,table_math);
table_lin = fi(2.^-(table_index-1),table_format,table_math);
addr_width =ceil( log2(length(table_index)+1));
module_name = strcat('angle_rom_','x',num2str(64),'bit');
file_name = strcat(module_name,'.v');
fid = fopen(file_name,'w');
data_width=65;
register_sel=0;
for ii = 1 : length(table_index)
get_angle = table_hyper(ii);
if register_sel == 0
fprintf(fid,' %d''d%d: data_out = %d''b%s;//[%d][angle=atan(2^-%d)=%f]\n',addr_width,(ii-1),data_width,get_angle.bin,ii,(ii-1), get_angle.double);
else
fprintf(fid,' %d''d%d: data_out <= %d''b%s;//[%d][angle=atan(2^-%d)=%f]\n',addr_width,(ii-1),data_width,get_angle.bin,ii,(ii-1), get_angle.double);
end
end
以上是一段生成cordic angle_ROM的m代码,其中用到一些matlab自带定点处理函数fi。