FPGA|CPLD|ASIC论坛
直播中

Harvestlamb

8年用户 20经验值
擅长:76517
私信 关注
[资料]

【AC620 FPGA试用体验】数字频率计

本帖最后由 Harvestlamb 于 2017-8-24 00:37 编辑



项目名称:基于FPGA的数字频率计

试用计划:基于fpga的数字频率计,能达到2015年全国大学生电子设计大赛频


率测量测技术指标(100M),并且达到精准测频,误差符合题目要求。





今天正式起笔,感谢朋友的支持让我得到了试用机会,其次感谢小梅哥能提供FPGA学习平台,首先进入硬件展示篇:正面

背面

附送模块


整体合影



  硬件上的优点外围芯片相比较其他类型产品很用心,比如dac芯片,比我的锆石好很多。同时引脚分配图在背面也能加分。
至于缺点,就是layout没那么精致(因人而异,500元级别还可以)
   教学上,我觉得实体教学最好,网络始终不能有那么好的效果,听说小梅哥最近开了实体课。但是现在网络课程中不得不说小梅哥的课程可以说通俗易懂,老少皆宜.







      数字频率计的代码部分.首先我想使用小梅哥板子上的数码管,数码管等视频讲解在购买后都会有的(设计与验证vip版群里有,这个PDF十分适合入门),弄了一下午代码,觉得位数不够,最终索性就不用数码管了,使用了uart发送给STM32.


   我想说说测频的方法,直接测频,周期测频,等精度测频。直接测频便是在自己定的1s闸门时间内,计数待测信号的上升沿个数。(这一测开发板上便是用这一方法。但是把 fre_in写入敏感事件列不是特别好。
  1. module fre(reset,clk,fre_in,zhiout);
  2.   input clk,reset;
  3.   input fre_in;
  4.   output [26:0]zhiout;
  5.   reg [26:0]i,j,l;
  6.    
  7.                 reg k;
  8.   always @(posedge clk or negedge reset)
  9.   if(!reset)
  10.     begin
  11.     i<=0;
  12.     l<=0;
  13.     k<=0;
  14.    end
  15.   else if(i==49999999)
  16.     begin
  17.     i<=0;
  18.     l<=j;
  19.     k<=1;
  20.      end
  21.   else
  22.     begin
  23.      i=i+1;
  24.      k<=0;
  25.    end
  26. always @(posedge fre_in or negedge reset or posedge k)
  27. if(!reset)
  28.   j<=0;
  29. else if(k==1)
  30.   j<=0;
  31. else
  32.   j<=j+1;
  33. assign zhiout=l;
  34. endmodule



周期测频是在一个被测信号的周期内测系统时钟clk的个数。(这里我把主频clk使用了pll 倍频到了500m,并且最后如果大家采用这种方法,自行处理数据读出的时间,否则数据通过uart发送时会比较乱。)


  1. module fre (
  2.         input clk,
  3.         input inpluse,
  4.    output  reg [26:0] cntout,
  5.         output reg cntok,
  6.         output  [26:0]  fre
  7.         );
  8.    
  9. reg [31:0] cnt;
  10. reg plusebuf;


  11. always @ (posedge clk)
  12.     begin
  13.         plusebuf <=  inpluse;
  14.     end

  15. always @ (posedge clk)
  16.     begin
  17.                 if ((plusebuf == 1'b0)&&(inpluse == 1'b1))
  18.                     begin
  19.                         
  20.                                                                   cntout <= cnt;
  21.                                                                   cnt <= 32'd1;
  22.                                                                   cntok <= 1'b1;
  23.                     end
  24.                 else
  25.                     begin
  26.                          cnt <= cnt + 32'd1;
  27.                                                                  cntok <= 1'b0;
  28.                                         end
  29.          end
  30.          
  31.          assign fre = 500000000/cntout;
  32.          
  33.          
  34. endmodule



等精度测频


这两张PPT便是等精度测频的核心精髓(此PPT源于武汉大学电赛培训)


至于uart发送部分的,先看看RTL视图

  1. module tx_module_start
  2. (
  3.    // input port
  4.         CLK_50M  ,  RST_N , data_tx ,
  5.         // output port
  6.         tx_start_flag , data_tx_div
  7. );

  8. //--------------------------------------------------------------------
  9. //                         外部端口定义
  10. //--------------------------------------------------------------------
  11. input                                     CLK_50M       ;         //  时钟输入
  12. input                                                         RST_N;                                           //复位的端口,低电平复位
  13. input           [26:0]                    data_tx       ;
  14. output                reg                 tx_start_flag ;
  15. output   reg    [7:0 ]                    data_tx_div   ;

  16. //--------------------------------------------------------------------
  17. //                         内部端口定义
  18. //--------------------------------------------------------------------
  19. reg                [20:0]         time_seconds;                                        //秒钟低位计数器
  20. reg                [20:0]         time_seconds_n;                                //time_seconds的下一个状态
  21. parameter SEC_TIME_1mS  = 20'd50_000;

  22. reg      [9:0]    num_cnt  ;                 //定义10位的加法计数器
  23. reg      [9:0]    num_cnt_n;                 //num_cnt的下一个状态
  24. parameter SET_NUM_1000  = 8'd10;
  25. //---------------------------------------------------------------------------
  26. //时序电路,用来给time_seconds寄存器赋值
  27. always @ (posedge CLK_50M or negedge RST_N)
  28. begin
  29.         if(!RST_N)                                                                                        //判断复位
  30.                 time_seconds <= 1'b0;                                                //初始化time_seconds值
  31.         else
  32.                 time_seconds <= time_seconds_n;                        //用来给time_seconds赋值
  33. end

  34. //组合电路,实现1s的定时计数器
  35. always @ (*)
  36. begin
  37.         if(time_seconds == SEC_TIME_1mS)                                //判断1s时间
  38.                 time_seconds_n = 1'b0;                                                //如果到达1s,定时计数器将会被清零
  39.         else                                                
  40.                 time_seconds_n = time_seconds + 1'b1;        
  41. end        

  42. //---------------------------------------------------------------------------
  43. //时序电路,用来给num_cnt寄存器赋值
  44. //时序电路,用来给num_cnt寄存器赋值
  45. always @ (posedge CLK_50M or negedge RST_N)
  46. begin
  47.         if(!RST_N)                                                                                        //判断复位
  48.                 num_cnt <= 1'b0;                                                //初始化time_seconds值
  49.         else
  50.                 num_cnt <= num_cnt_n;                        //用来给time_seconds赋值
  51. end
  52. //组合电路
  53. always @ (*)
  54. begin
  55.         if(time_seconds == SEC_TIME_1mS)                        
  56.                 num_cnt_n = num_cnt + 1'b1;                                                
  57.         else if(num_cnt == SET_NUM_1000)                                                                        
  58.                 num_cnt_n = 1'b0;                           
  59.         else
  60.                 num_cnt_n = num_cnt;                        //否则,定时计数器将会保持不变
  61. end        

  62. //---------------------------------------------------------------------------
  63. //组合电路,用来判断当前数据
  64. always @ (*)
  65. begin
  66.    if(num_cnt <= 4'd3)
  67.         tx_start_flag = 1'b1 ;
  68.         else
  69.         tx_start_flag = 1'b0 ;
  70. end

  71. //---------------------------------------------------------------------------
  72. //设置定时器用来设定当前发送数据
  73. reg       [2:0]     count_send ;
  74. reg       [2:0]     count_send_n ;
  75. always @ (posedge CLK_50M or negedge RST_N)
  76. begin
  77.         if(!RST_N)                                                                                        //判断复位
  78.                 count_send <= 1'b0;                                                
  79.         else
  80.                 count_send <= count_send_n;                        
  81. end
  82. //组合电路
  83. always @ (*)
  84. begin
  85.         if(num_cnt == SET_NUM_1000)                        
  86.                 count_send_n = count_send + 1'b1;                                                                 
  87.         else if (count_send == 3'd7)
  88.            count_send_n = 1'b0;
  89.         else
  90.                 count_send_n = count_send;                             //否则,定时计数器将会保持不变
  91. end        

  92. always @ (*)
  93. begin
  94.    case (count_send)
  95.         3'd0 : data_tx_div = 8'b11001100;//0xcc(stm32校验码,自行设置)
  96.         3'd1 : data_tx_div = {1'b0,1'b0,1'b0,1'b0,1'b0,data_tx[26],data_tx[25],data_tx[24]};
  97.         3'd2 : data_tx_div = {data_tx[23:16]};
  98.         3'd3 : data_tx_div = {data_tx[15:8]};
  99.         3'd4 : data_tx_div = {data_tx[7:0]};
  100.         3'd5 : data_tx_div = 8'b00001101;
  101.         3'd6 : data_tx_div = 8'b00001010;
  102.         endcase
  103. end

  104. endmodule
这个代码可以自行修改,发送10位数据都是可以的。由于篇幅限制,完整的代码我会开源的,压缩包的形式自行下载(stm32部分代码后续有需求的话会上传)。






整体效果展示



展示IMG_4969.JPG 展示IMG_4970.JPG 展示IMG_4972.JPG 展示IMG_4973.JPG





  • 展示IMG_4971.JPG

    fre.zip (2017-8-24 00:36 上传)

    5.02 MB, 阅读权限: 10, 下载次数: 1642

回帖(3)

那些年儿ing

2017-8-30 14:34:29
感谢分享哦
举报

yrzc

2017-10-31 22:58:13
感谢分享
举报

黄裕歌

2018-1-12 17:02:40
感谢主楼慷慨分享
举报

更多回帖

发帖
×
20
完善资料,
赚取积分