module cepin( clk,rst_n, ad_data,ad_clk,cnt_ms, pinlv,cepin_buffer ); input clk; input rst_n; input [9:0] ad_data; output ad_clk; output [39:0] pinlv; output reg [23:0] cepin_buffer; output reg [23:0] cnt_ms; assign ad_clk =~ clk; //計數 parameter CE_WAN = 24'd10_000_000; reg flag_cnt; always @(posedge clk or negedge rst_n) if(!rst_n) cnt_ms <= 'd0; else if(flag_cnt) cnt_ms <= 'd0; else cnt_ms <= cnt_ms + 1'b1; //檢測上升沿 reg [9:0] ad_data_r; reg [2:0] state; reg [23:0] cnt_cepin; always @(posedge clk or negedge rst_n) if(!rst_n)begin state <= 'd0; ad_data_r <= ad_data; cnt_cepin <= 'd0; cepin_buffer <= 'd0; end else case(state) 3'd0:begin ad_data_r <= ad_data; if(ad_data_r < ad_data) state <= 3'd1; else state <= 3'd0; end 3'd1:begin ad_data_r <= ad_data; if(ad_data_r > ad_data) state <= 3'd2; else state <= 3'd1; end 3'd2:begin if(cnt_ms > CE_WAN)begin cepin_buffer <= cnt_cepin; cnt_cepin <= 'd0; flag_cnt <= 1'd1; end else begin cepin_buffer <= cepin_buffer; cnt_cepin <= cnt_cepin + 1'b1; flag_cnt <= 'd0; end state <= 3'd0; end endcase assign pinlv = 5*cepin_buffer; //assign pinlv = CE_P / cnt_r; endmodule
.直接測頻法:由時基信號形成閘門,對被測信號進行計數。當閘門寬度為1s時可直接從計數器讀出被測信號頻率。計數值存在正負一個脈沖的誤差是可能的,故此法的絕對誤差就是1Hz(對1s寬的閘門而言)。其相對誤差則隨着被測頻率的升高而降低,故此法適於測高頻而不適於測低頻。