当前位置:   article > 正文

基于FPGA的频率测量_fpga测量信号的频谱幅度

fpga测量信号的频谱幅度

正弦波由matlb产生;

  1. clc;
  2. clear all;
  3. close all;
  4. %Sin400hz.m程序清单
  5. %设置系统参数
  6. fi=400; %输入信号的频率
  7. Fs=8000; %采样频率
  8. L=10024; %数据长度
  9. N=10; %量化位数
  10. x=0:1/(100*fi):2/fi;
  11. figure('name','sin(2*pi*fi*x)');
  12. plot(x,sin(2*pi*fi*x));
  13. title('sin(2*pi*fi*x)');
  14. xlabel('x');
  15. ylabel('sin');
  16. %产生400hz正弦信号
  17. t=0:1/Fs:(1/Fs)*(L-1); %产生采样频率的时间序列
  18. si=sin(2*pi*fi*t);
  19. %归一化处理
  20. f_s=si/max(abs(si));
  21. %10bit量化
  22. Q_s=round(f_s*(2^(N-1)-1));
  23. %将生成的输入正弦信号数据,写入外部文本文件(din.txt)中
  24. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  25. %新建文本文件前,必须建好文件存放的目录文件夹,否则出现提示信息:
  26. %??? Error using ==> fprintf
  27. %Invalid file identifier
  28. fid=fopen('D:\a_FPGA\frequency_measure\sim\din.txt','w');
  29. for k=1:length(Q_s)
  30. B_s=dec2bin(Q_s(k)+(Q_s(k)<0)*2^N,N);
  31. for j=1:N
  32. if B_s(j)=='1'
  33. tb=1;
  34. else
  35. tb=0;
  36. end
  37. fprintf(fid,'%d',tb);
  38. end
  39. fprintf(fid,'\r\n');
  40. end
  41. fprintf(fid,';');
  42. fclose(fid);

Verilog源代码:

  1. module frequency_measure(
  2. //input
  3. clk,//8000Hz;
  4. rst_n, //0 valid;
  5. data_in,
  6. f
  7. );
  8. input clk,rst_n;
  9. input [9:0] data_in;//10bit digital data;
  10. output[9:0] f; //frequency,unit is Hz;
  11. //reg define
  12. reg [6:0] cnt0,cnt1;//the count of input signal's period needs
  13. reg [1:0] transfer;
  14. //main code;
  15. always @(posedge clk or negedge rst_n)
  16. if(!rst_n)
  17. transfer <= 2'b00;
  18. else
  19. begin
  20. transfer[0] <= data_in[9];
  21. transfer[1] <= transfer[0];
  22. end
  23. always @(posedge clk or negedge rst_n)
  24. if(!rst_n) //if reset ,cnt <= 0;
  25. begin
  26. cnt0 <= 7'b0;
  27. end
  28. else //not reset;
  29. begin
  30. if(transfer == 2'b01)
  31. begin
  32. cnt1<= cnt0 + 1'b1 ;
  33. cnt0 <= 7'b0;
  34. end
  35. else
  36. cnt0 <= cnt0 + 1'b1;
  37. end
  38. assign f = 8000/cnt1; //
  39. endmodule

测试代码:

  1. `timescale 1ns/1ns
  2. module tb_frequency_measure();
  3. //clk period;
  4. parameter clk_period = 125000;
  5. //data length;
  6. parameter data_num = 10000;
  7. //input;
  8. reg clk,rst_n;
  9. reg [9:0] data_in;
  10. //output;
  11. wire [9:0] f;
  12. //frequency_measure instance;
  13. frequency_measure u0_frequency_measure(
  14. .clk(clk),
  15. .rst_n(rst_n),
  16. .data_in(data_in),
  17. .f(f)
  18. );
  19. //clk;
  20. always #(clk_period/2) clk = ~clk;
  21. //parameter
  22. initial
  23. begin
  24. clk = 1'b0;
  25. rst_n = 1'b0;
  26. #(5*clk_period) rst_n = 1'b1;
  27. data_in = 10'd0;
  28. end
  29. //read din.txt as data_in;
  30. integer pattern;
  31. reg [9:0] stim_data[1:data_num];
  32. initial
  33. begin
  34. //din.txt and tb_frequency_measure.v must in a same folder;
  35. $readmemb("D:/a_FPGA/frequency_measure/sim/din.txt",stim_data);
  36. pattern = 0;
  37. repeat(data_num)
  38. begin
  39. pattern = pattern + 1;
  40. data_in = stim_data[pattern];
  41. #clk_period;
  42. end
  43. end
  44. endmodule

仿真结果:

起始因复位不能得到完整的1个周期的计数,所以计数会不对,计数结果为8,频率为1000;后面的都是对的,计数为20,频率为400。

仅供学习。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/966689
推荐阅读
相关标签
  

闽ICP备14008679号