FPGA等精度測頻率實驗, 鑒于fpga的數學運算不是很友好,本程式的最終結果只有時鐘信號和被測信號在閘門時間內的脈沖計數值。
module test_f(
input clk_50M,//定義系統時鐘50M
input signal,//被測量信號
//output wire uart 計數值進行串口發送,在此省略此部分,不作贅述
);
parameter GATE_TIME =49_999_999;
wire[31:0] CNTCLK;//系統時鐘計數值
wire[31:0] CNTSIG;//被測信號計數值
reg [27:0] cnt1 = 28'd0; //產生 1s 的閘門信號的計數器reg
reg gate = 1'b0; //閘門信號
reg signal_r0 = 1'b0;
reg signal_r1 = 1'b0;
reg signal_r2 = 1'b0;
reg signal_r3 = 1'b0;
reg gatesyn = 1'b0; //與方波同步之后的閘門信號
reg gatesyn1 = 1'b0;//同步閘門信號延時一拍
reg [31:0] cnt2 = 32'd0;
reg [31:0] cnt2_r = 32'd0;
reg [31:0] cnt3 = 32'd0;
reg [31:0] cnt3_r =32'd0;
wire signal_pose,signal_nege;
always @(posedge clk_50M)begin
if(cnt1==GATE_TIME)begin
cnt1 <= 28'd0;
gate <= ~gate;//產生 1s 的閘門信號
end
else begin
cnt1 <= cnt1 + 1'b1;
end
end
always @ (posedge clk_50M)begin//檢測輸入信號的上升沿和下降沿,以便于將閘門時間與待測方波同步
signal_r0 <= signal;
signal_r1 <= signal_r0;//將外部輸入的方波打兩拍
signal_r2 <= signal_r1;
signal_r3 <= signal_r2;
end
assign signal_pose = signal_r2 & ~signal_r3;
assign signal_nege = ~signal_r2 & signal_r3;
always @ (posedge clk_50M )//使閘門信號與待測方波同步,保證一個閘門包含整數個方波周期
begin
if(signal_pose == 1'b1)begin
gatesyn <= gate;
end
gatesyn1 <= gatesyn;//將同步之后的閘門信號打一拍,用于捕捉閘門信號的邊沿
end
assign gate_start = gatesyn & ~gatesyn1;//表示閘門開始時刻
assign gate_end = ~gatesyn & gatesyn1;//閘門結束時刻
//計數系統時鐘
always @ (posedge clk_50M)
begin
if(gate_start == 1'b1)begin
cnt2 <= 32'd1;
end
else if(gate_end == 1'b1)begin
cnt2_r <= cnt2;//將所得結果保存在cnt2_r中,并將計數器清零
cnt2 <=32'd0;
end
else if(gatesyn1 == 1'b1)begin//在閘門內計數系統時鐘周期
cnt2 <= cnt2 + 1'b1;end
end
//計數待測驗時鐘
always @ (posedge clk_50M )
begin
if(gate_start == 1'b1)begin
cnt3 <= 32'd0;
end
else if(gate_end == 1'b1)begin
cnt3_r <= cnt3;//將所得結果保存在cnt3_r中,并將計數器清零
cnt3 <= 32'd0;
end
else if(gatesyn1 == 1'b1 && square_nege == 1'b1)begin//在閘門內計數待測方波周期數(數閘門內方波的下降沿)
cnt3 <= cnt3 + 1 'b1;
end
end
assign CNTCLK = cnt2_r;
assign CNTSIG = cnt3_r;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/106922.html
標籤:硬件使用
