直接測頻法


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寬的閘門而言)。其相對誤差則隨着被測頻率的升高而降低,故此法適於測高頻而不適於測低頻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM