標(biāo)題: vhdl測(cè)量頻率并用數(shù)碼管顯示程序 [打印本頁(yè)]

作者: Jeremy12345    時(shí)間: 2016-11-21 22:10
標(biāo)題: vhdl測(cè)量頻率并用數(shù)碼管顯示程序

資料下載:
adc.rar (3.92 MB, 下載次數(shù): 18)

  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;  //蜂鳴器時(shí)鐘         
  13. output reg led2; //整形后得到的脈沖            
  14. output reg led1;//量程進(jìn)位需要的小數(shù)點(diǎn),用燈來(lái)控制
  15. output reg led3; //超量程警告           
  16. output reg[3:0]smg1; //smg1,smg2,smg3 數(shù)碼管顯示測(cè)得頻率  具有自動(dòng)轉(zhuǎn)換量程的功能
  17. output reg[3:0]smg2;
  18. output reg[3:0]smg3;
  19. output reg[3:0]smg5; //smg5 smg6  數(shù)碼管顯示  占空比
  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初始化,用來(lái)進(jìn)行模數(shù)轉(zhuǎn)化
  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. //整形模塊,無(wú)論是方波還是三角波或者正選波,
  57. //都能變?yōu)楦叩兔}沖
  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. 測(cè)量頻率模塊
  66. 利用往后打一拍的原理,來(lái)控制信號(hào)
  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;     //  利用該信號(hào)清零
  78. wire delay_1s  = (delay_cnt1==CLK_1HZ-1'b1)?1'b1:1'b0;//  利用該信號(hào)存儲(chǔ)信號(hào)

  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) //檢測(cè)是否有下降沿
  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. 占空比測(cè)量信號(hào)
  130. 待測(cè)脈沖高電平的時(shí)候用一個(gè)計(jì)數(shù)器計(jì)數(shù)
  131. 低電平的時(shí)候用另一個(gè)計(jì)數(shù)器計(jì)數(shù)
  132. 高電平計(jì)數(shù)與總共的比值。
  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. //脈沖邊沿檢測(cè)模塊
  157. //每來(lái)一個(gè)下降沿就會(huì)檢測(cè)出來(lái),利用這個(gè)
  158. //原理便能測(cè)量脈沖的頻率   
  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
復(fù)制代碼







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1