vhdl测量频率并用数码管显示程序

vhdl测量频率并用数码管显示程序插图

0.png (71.57 KB, 下载次数: 28)

下载附件  保存到相册

2016-12-5 03:15 上传

资料下载:


vhdl测量频率并用数码管显示程序插图(1)
adc.rar (3.92 MB, 下载次数: 14) 2016-11-21 22:09 上传 点击文件名下载附件

adc转换

下载积分: 黑币 -5

  1. module adc (
  2.             clk,rst_n,clk_beep,
  3.             eoc,
  4.             start,oe,ale,adda,
  5.             data,data_r,led,
  6.             key_smg_n,
  7.             smg1,smg2,smg3,smg5,smg6,
  8.             led1,led2,led3,beep
  9.             );
  10. input key_smg_n;
  11. output reg beep;  // 蜂鸣器         
  12. input clk_beep;  //蜂鸣器时钟         
  13. output reg led2; //整形后得到的脉冲            
  14. output reg led1;//量程进位需要的小数点,用灯来控制
  15. output reg led3; //超量程警告           
  16. output reg[3:0]smg1; //smg1,smg2,smg3 数码管显示测得频率  具有自动转换量程的功能
  17. output reg[3:0]smg2;
  18. output reg[3:0]smg3;
  19. output reg[3:0]smg5; //smg5 smg6  数码管显示  占空比
  20. output reg[3:0]smg6;            
  21. output reg start,oe,ale,adda;
  22. input eoc,clk,rst_n;
  23. input [7:0] data;
  24. output reg led;
  25. //===========================================================================================================
  26. //ADC初始化,用来进行模数转化
  27. //===========================================================================================================
  28. output reg [7:0] data_r;
  29. reg[4:0] CS,NS;
  30. parameter IDLE = 5’b00001,START_H = 5’b00010,START_L = 5’b00100,CHECK_END = 5’b01000,GET_DATA = 5’b10000;
  31. always @ (posedge clk)
  32. case(CS)
  33. IDLE: NS = START_H;
  34. START_H: NS=START_L;
  35. START_L: NS=CHECK_END;
  36. CHECK_END: begin if(eoc==1’b1) NS=GET_DATA;
  37.                          else NS = CHECK_END;
  38.                    end
  39. GET_DATA:NS=IDLE;
  40. default : NS = IDLE;
  41. endcase
  42. always @ (posedge clk)
  43. if(!rst_n) CS<=IDLE;
  44. else CS<=NS;
  45. always @(posedge clk)
  46. case(NS)
  47. IDLE:begin oe<=0; start <=0; ale <= 0; adda<=1; end
  48. START_H: begin oe<=0; start<=1;ale<=1;adda<=1; end
  49. START_L: begin oe<=0; start<=0;ale<=1; end
  50. CHECK_END: begin oe <= 0; start<=0; ale<=0;end
  51. GET_DATA: begin oe<=1;data_r<=data;start<=0;ale<=0;end
  52. endcase
  53. //****************************************************************************************************
  54. //****************************************************************************************************
  55. //==========================================
  56. //整形模块,无论是方波还是三角波或者正选波,
  57. //都能变为高低脉冲
  58. //=======================================
  59. always @ (posedge clk)
  60. if(!rst_n) led <= 1’b0;
  61. else if(data_r<=8’d127) led <= 1’b0;
  62.           else led<=1’b1;
  63. //********************************************************************************
  64. /*===================================================================================================
  65. 测量频率模块
  66. 利用往后打一拍的原理,来控制信号
  67. ====================================================================================================*/
  68. parameter CLK_1HZ = 25’d3000000;
  69. reg[24:0] delay_cnt1;
  70. always@(posedge clk or negedge rst_n) begin
  71. if(!rst_n) delay_cnt1 <= 1’b0;
  72. else if(delay_cnt1<=CLK_1HZ)
  73.          delay_cnt1<=delay_cnt1+1’b1;
  74.          else
  75.          delay_cnt1<= 1’b0;
  76. end
  77. wire delay_1ss = (delay_cnt1==CLK_1HZ)?1’b1:1’b0;     //  利用该信号清零
  78. wire delay_1s  = (delay_cnt1==CLK_1HZ-1’b1)?1’b1:1’b0;//  利用该信号存储信号
  79. reg [24:0] cnt_n;
  80. always@(posedge clk or negedge rst_n) begin
  81. if(!rst_n) cnt_n <= 1’b0;
  82. else if(delay_1ss == 1’b0)begin  
  83.          if(count_an == 1’b1) //检测是否有下降沿
  84.                  cnt_n <= cnt_n+1’b1;
  85.                  
  86.          else cnt_n<=cnt_n;
  87.          end
  88.          else cnt_n <= 1’b0;
  89. end
  90. always@(posedge clk or negedge rst_n) begin
  91. if(!rst_n) begin smg1<=1’b0;smg2<=1’b0;smg3<=1’b0;smg5<=1’b0;smg6<=1’b0;led1<=1’b0;led2<=1’b0;led3<=1’b0; end
  92. else if(key_smg_n == 1)
  93.      
  94.       begin         smg5<=1’b0;
  95.                                         if(delay_1s == 1’b1) begin
  96.                                         if(cnt_n < 14’d999) begin  //低量程 0~999hz
  97.                                         led1<=1’b0;
  98.                                         led3<=1’b0;
  99.                                         smg6 <= cnt_n  % 4’d10;
  100.                                         smg1 <= cnt_n / 4’d10 %4’d10;
  101.                                         smg2 <= cnt_n /7’d100 %4’d10;
  102.                                         smg3 <= cnt_n /10’d1000 %4’d10;
  103.                                         end
  104.                                         else if(cnt_n<=15’d3000)begin // 高量程 1000~3000hz
  105.                                         led1<=1’b1;
  106.                                         led3<=1’b0;
  107.                                         smg1 <= cnt_n / 4’d10 % 4’d10;
  108.                                         smg2 <= cnt_n / 7’d100 %4’d10;
  109.                                         smg3 <= cnt_n /10’d1000 %4’d10;
  110.                                         smg6 <= cnt_n  % 4’d10;
  111.                                         end
  112.                                         else begin   //    超量程 蜂鸣器响,灯亮
  113.                                         beep <= clk_beep;
  114.                                         led3<=1’b1;
  115.                                         end
  116.                         end
  117.         end
  118.         else begin
  119.             smg1<=1’b0;smg2<=1’b0;smg3<=1’b0;
  120.             if(delay_1s) begin
  121.                
  122.                 smg5 <= (cnt_up *7’d100 / cnt_down) % 4’d10 ;
  123.                 smg6 <= (cnt_up *7’d100 / cnt_down) / 4’d10;
  124.             end
  125.             end
  126. end
  127. //**************************************************************************************************
  128. /*==================================================================================================
  129. 占空比测量信号
  130. 待测脉冲高电平的时候用一个计数器计数
  131. 低电平的时候用另一个计数器计数
  132. 高电平计数与总共的比值。
  133. ====================================================================================================*/
  134. reg [31:0] cnt_up;
  135. reg [31:0] cnt_down;
  136. always@(posedge clk or negedge rst_n) begin
  137. if(!rst_n) begin cnt_up<=1’b0; cnt_down<=1’b0; end
  138. else if(delay_1ss == 1’b0) begin
  139.          if(led == 1’b1)  begin cnt_up<=cnt_up+1’b1; cnt_down<=cnt_down+1’b1; end
  140.      else begin cnt_down <= cnt_down + 1’b1; cnt_up<=cnt_up; end
  141.          end
  142.          else begin  cnt_up <= 1’b0; cnt_down <= 1’b0;  end
  143. end
  144. /*
  145. always@(posedge clk or negedge rst_n) begin
  146. if(!rst_n)begin smg5<=1’b0;smg6<=1’b0; end
  147. else if(key_smg_n == 0) begin
  148.          if(delay_1s) begin
  149.                 smg5 <= (cnt_up *7’d100 /(cnt_up+cnt_down)) % 4’d10 ;
  150.                 smg6 <= (cnt_up *7’d100 /(cnt_up+cnt_down)) / 4’d10;
  151.         end
  152.         end
  153. end
  154. */
  155. //====================================================================
  156. //脉冲边沿检测模块
  157. //每来一个下降沿就会检测出来,利用这个
  158. //原理便能测量脉冲的频率   
  159. //===================================================================
  160. reg count_rst;  
  161. always @(posedge clk  or negedge rst_n)
  162.     if (!rst_n) count_rst <= 1’b1;
  163.     else count_rst <= led;
  164. reg count_rst_r;      
  165. always @ ( posedge clk  or negedge rst_n )
  166.     if (!rst_n) count_rst_r <= 1’b1;
  167.     else count_rst_r <= count_rst;
  168.    
  169. wire count_an = count_rst_r & (~count_rst);
  170. endmodule

复制代码

未经允许不得转载:视频教程学习资料分享与下载平台 » vhdl测量频率并用数码管显示程序

赞 (0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏