背景
最近写一个多路信号发生器的时候,发现用肉眼观察波形信号很麻烦,想着用SV写一个自动检测频率的设计让其自动输出。
设计思路
捕捉连续的两个下降沿,然后根据cnt计数值计算频率,误差范围测量Mhz以内的方波时较小。
因为设计思路较为简单,笔者在这就不放出状态机的FSM了
代码
module PWM_catch(
input clk_50m,
input rstn,
input io
);
reg io_d0;
reg io_d1;
wire catch_negedge;
int frequency_cycle;
int frequency_cnt;
int frequency_io;
always@(posedge clk_50m or negedge rstn) begin
if(!rstn) begin
io_d0 = 1'b0;
io_d1 = 1'b0;
end
else begin
io_d0 <= io;
io_d1 <= io_d0;
end
end
assign catch_negedge = io_d1 & (!io_d0);
always@(posedge clk_50m or negedge rstn) begin
if(!rstn) begin
frequency_cycle <= 32'd0;
frequency_cnt <= 32'd0;
end
else if(catch_negedge) begin
frequency_cycle <= frequency_cnt - 32'd1;
frequency_cnt <= 32'd0;
end
else begin
frequency_cnt <= frequency_cnt + 32'd1;
end
end
always@(posedge clk_50m or negedge rstn) begin
if(!rstn) begin
frequency_io <= 32'd0;
end
else if(catch_negedge)begin
frequency_io = 1000000000/(frequency_cnt*20);
$display("IO frequency is %f",frequency_io);
end
else begin
end
end
endmodule