fpga 頻率計實驗
實驗要求:實現等精度頻率計,通過數碼管顯示。
頻率計實驗又稱為頻率計數器,是一種專門對被測訊號進行測量的電子儀器。
計數法:直接計數單位時間內的被測訊號的脈衝數,這種方式測量精度高、速度快、適合不同頻率、不同精確度測頻的需要。
測待測頻率,需要有乙個基準時鐘,基準時鐘頻率設定為clk_fs,基準時鐘的脈衝數為fs_cnt,生成門控訊號為高,在門控訊號為高的時候,查待測訊號的脈衝數,設待測訊號的頻率為clk_fx,待測訊號的脈衝數為fx_cnt;
則滿足下列比例:
fs_cnt/clk_fs=fx_cnt/clk_fx;
這是乙個理想的公式
因為門控訊號拉高的長度不一定等於基準時鐘與待測訊號時鐘的整數倍。
等精度頻率計:是以待測訊號為基準,拉高門控訊號,保證門控訊號是待測訊號週期的整數倍,但是會對基準訊號產生誤差。
下面是頻率計的**:
測試頻率為基準時鐘/100的**
module frequency(clk,rst_n,data_fx); input clk,rst_n; output [19:0]data_fx;
//parameter define parameter clk_fs=26』d50000000; //基準時鐘頻率值
//wire define wire [19:0] data_fx; //被測訊號測量值
cymometer #(.clk_fs(clk_fs)) u_cymometer(
.clk(clk),
.rst_n(rst_n),
.clk_fx(clk_out),
.data_fx(data_fx)
);clk_test #(.div_n(7』d100) ) u_clk_test(
.clk(clk),
.rst_n(rst_n),
.clk_out(clk_out)
);endmodule
( input clk, input rst_n, output reg clk_out );module clk_test #(parameter div_n=7'd100)
reg [6:0] cnt;
always @(posedge clk or negedge rst_n)
begin if(!rst_n)
begin
cnt<=0;
clk_out<=0;
endelse begin
if(cnt==div_n/2-1)
begin
cnt<=0;
clk_out<=~clk_out;
endelse
begin
cnt<=cnt+1;
clk_out<=clk_out;
endend
endendmodule
module cymometer #(parameter clk_fs=50000000)( input clk, input rst_n, input clk_fx, output reg [19:0] data_fx );
parameter cnt_fs=500;
//define reg [19:0] cnt_fs;
//生成門訊號 reg gate;
reg gate_fs_reg; //中間暫存器
reg gate_fs;
reg gate_fx0;
reg gate_fx1;
reg gate_fs0;
reg gate_fs1;
reg [19:0] count_fx;
reg [19:0] count_fx_reg;
reg [19:0] count_fs;
reg [19:0] count_fs_reg;
wire gate_fs_en;
wire gate_fx_en; //cnt_fs
always @(posedge clk_fx or negedge rst_n)
begin
if(!rst_n)
cnt_fs<=0;
else
begin
if(cnt_fs==cnt_fs+20)
cnt_fs<=0;
else
cnt_fs<=cnt_fs+1;
endend
//gate
always @(posedge clk_fx or negedge rst_n)
begin if(!rst_n)
gate<=0;
else
begin
if(cnt_fs<20||cnt_fs>cnt_fs)
gate<=0;
else
gate<=1;
endend //gate_fs
always @(posedge clk or negedge rst_n)
begin if(!rst_n)
begin
gate_fs<=0;
gate_fs_reg<=0;
endelse begin
gate_fs_reg<=gate;
gate_fs<=gate_fs_reg;
endend
//基準訊號下降沿
always @(posedge clk or negedge rst_n)
begin if(!rst_n)
begin
gate_fs0<=0;
gate_fs1<=0;
endelse begin
gate_fs0<=gate_fs;
gate_fs1<=gate_fs0;
endend
assign gate_fs_en=~gate_fs0&&gate_fs1;
always @(posedge clk_fx or negedge rst_n)
begin if(!rst_n)
begin
gate_fx0<=0;
gate_fx1<=0;
endelse begin
gate_fx0<=gate;
gate_fx1<=gate_fx0;
endend
assign gate_fx_en=~gate_fx0&&gate_fx1;
always @(posedge clk_fx or negedge rst_n)
begin if(!rst_n)
begin
count_fx<=0;
count_fx_reg<=0;
endelse begin
if(gate==1)
count_fx_reg<=count_fx_reg+1;
else if(gate_fx_en)
begin
count_fx_reg<=0;
count_fx<=count_fx_reg;
endend
endalways @(posedge clk or negedge rst_n)
begin if(!rst_n)
begin
count_fs<=0;
count_fs_reg<=0;
endelse
begin if(gate_fs==1)
count_fs_reg<=count_fs_reg+1;
else if(gate_fs_en)
begin
count_fs_reg<=0;
count_fs<=count_fs_reg;
endend
end//輸出頻率 always @(posedge clk or negedge rst_n) begin if(!rst_n)
data_fx<=0;
else if(gate_fs==0)
data_fx<=clk_fs/(count_fs/count_fx);
endendmodule
`timescale 1ns/1nsmodule frequency_tb;
reg clk,rst_n;
wire [19:0]
data_fx;
always #5 clk=~clk;
initial
begin
rst_n=0; clk=0;
#100 rst_n=1;
#70000000 $stop;
endfrequency inst(clk,rst_n,data_fx);
endmodule
基於FPGA的數字頻率計(設計全過程)
小序 前幾天看全國大學生電子設計競賽 數字頻率計總體設計採用分塊的思想,自底向上設計方向,三個子模組包括頻率測量模組 fre meter 二進位製到十進位制轉換的模組 bin dec 和數碼管顯示模組 led 最後用乙個頂層模組 top 把三個子模組例化到一起。總體設計思路就是先通過測頻模組測得的頻...
51微控制器的簡易頻率計
一 單通道頻率計 include include int count 0,n 0,f 0 count 累計中斷次數 n 脈衝數,f 頻率 main void record interrupt 0 用外中斷0讀取訊號,並作記錄 void output interrupt 1 用定時器0中斷 二 雙通道...
等精度頻率計設計中的貓膩
最近檢視了一些關於等精度頻率計的文章,也找時間去關注一下 精度 問題 也就是說精度常使用三種方式來表徵。1 最大誤差佔真實值的百分比,如測量誤差3 2 最大誤差,如 測量精度 0.02mm 3 誤差 正態分佈 如誤差0 10 佔比例65 誤差10 20 佔比例20 誤差20 30 佔10 誤差30 ...