当前位置:   article > 正文

FPGA使用查表法实现正弦和余弦函数 - 变形方法2的一点扩展_verilog查表法求正余弦

verilog查表法求正余弦

在前面几篇文章中,输出数据量化位数都是16bit,但如果想实现非半字节的量化位数,比如18bit,那怎么办呢?只需要修改下matlab程序,产生18bit的输出数据,verilog程序修改起来就比较简单了。

修改后的matlab程序如下所示:

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %% Zheng Wei, 2022/12/08
  3. %%
  4. %% 输入角度范围:[0,pi/4); 输入数据量化位数:10bit;
  5. %% 输出结果范围:[0,1]; 输出数据量化位数:18bit;
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7. clc; % 清理命令行
  8. close all; % 关闭所有图形窗口
  9. clear all; % 清理所有工作区变量
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. %% 参数定义
  12. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  13. in_quantify_bit = 10; % 输入数据量化位数(无符号数)
  14. alpha = 0:(pi/4/2^in_quantify_bit):(pi/4-pi/4/2^in_quantify_bit); % 弧度
  15. out_quantify_bit = 18; % 输出数据量化位数(有符号数)
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %% 获取三角函数值
  18. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  19. cos_alpha = cos(alpha); % 获得cos函数值
  20. sin_alpha = sin(alpha); % 获得sin函数值
  21. cos_alpha_q = round(cos_alpha *(2^(out_quantify_bit-1)-1)); % 18bit量化
  22. sin_alpha_q = round(sin_alpha *(2^(out_quantify_bit-1)-1)); % 18bit量化
  23. % figure(1); subplot(2,1,1);plot(alpha,cos_alpha);subplot(2,1,2);plot(alpha,cos_alpha_q);
  24. % figure(2); subplot(2,1,1);plot(alpha,sin_alpha);subplot(2,1,2);plot(alpha,sin_alpha_q);
  25. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  26. %% 生成coe文件,第一行定义数据格式, 16代表ROM的数据格式为16进制。
  27. %% 高16bit代表sin值,低16bit代表cos值,各自最高的1bit是符号位。
  28. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  29. % 因为都是正数,所以不需要取补码
  30. % for i = 1:1:(2^in_quantify_bit)
  31. % if (cos_alpha_q(i)<0)
  32. % cos_alpha_q(i) = cos_alpha_q(i) + 2^(out_quantify_bit); % 负数用补码表示
  33. % else
  34. % cos_alpha_q(i) = cos_alpha_q(i); % 正数的补码为原码
  35. % end
  36. %
  37. % if (sin_alpha_q(i)<0)
  38. % sin_alpha_q(i) = sin_alpha_q(i) + 2^(out_quantify_bit); % 负数用补码表示
  39. % else
  40. % sin_alpha_q(i) = sin_alpha_q(i); % 正数的补码为原码
  41. % end
  42. % end
  43. cos_alpha_q = dec2bin(cos_alpha_q,18);
  44. sin_alpha_q = dec2bin(sin_alpha_q,18);
  45. s=strcat(sin_alpha_q,cos_alpha_q);
  46. s=bin2dec(s);
  47. s=dec2hex(s);
  48. % 将cos和sin拼接为36bit(各自18bit),此数据输出到FPGA
  49. fid=fopen('cos_sin_lut_4.coe','wt');
  50. fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 16;\n');
  51. fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
  52. for i = 1:1:(2^in_quantify_bit)
  53. fprintf(fid,'%c%c%c%c%c%c%c%c',s(i,:));
  54. if (i < 2^in_quantify_bit)
  55. fprintf(fid,',\n');
  56. else
  57. fprintf(fid,';\n'); % 分号(;) 结束标志位
  58. end
  59. end
  60. fclose(fid);

有几点需要注意的地方:

  1. 因为是非半字节,所以不能直接去做数据拼接,而是需要先将10进制转换成2进制;
  2. 因为matlab没有2进制直接转16进制的函数,所以拼接完了之后需要先将2进制转换成10进制,然后再将10进制转成16进制;
  3. 10进制转2进制的时候注意制定转换位宽,否则数据拼接的结果就会出现问题。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/625441
推荐阅读
相关标签
  

闽ICP备14008679号