目录
- 1前言
- 2.原理
- 3.代码
- 4仿真
1前言
今天分享一个FPGA设计中很常用的边沿检测电路,并参数化封装成自己的IP核。该电路的作用是输入一个信号,在其上升沿或者下降沿时(可选)输出一个时钟周期脉冲。时序图如下:
2.原理
利用FPGA中寄存器的特性,即在always块中使用非阻塞赋值’<=',将输入待边沿检测电路打一拍,然后与下一个周期的输入做逻辑运算得检测结果。
上升沿:前一个周期为低电平,后一个周期为高电平。那么,有
edge_pluse = ~edge_din_r & edge_din
下降沿:前一个周期为高电平,后一个周期为低电平。那么,有
edge_pluse = ~edge_din_r & edge_din
3.代码
`timescale 1ns / 1psmodule edge_detection(input clk ,input edge_din ,output edge_pluse);parameter POSEDGE = 1'b1;//1为上升沿检测,0为下降沿检测
reg edge_din_r; always @(posedge clk)edge_din_r <= edge_din;assign edge_pluse = POSEDGE ? (~edge_din_r & edge_din) : edge_din_r & ~edge_din;endmodule
4仿真
`timescale 1ns / 1ps
module edge_detection_tb;
parameter T = 10;
reg clk ;
reg edge_din ;
wire pos_edge_pluse ;
wire neg_edge_pluse ;edge_detection #(.POSEDGE(1'b1))
u_edge_detection0(.clk (clk ), .edge_din (edge_din ),.edge_pluse (pos_edge_pluse )
);
edge_detection #(.POSEDGE(1'b0))
u_edge_detection1(.clk (clk ), .edge_din (edge_din ),.edge_pluse (neg_edge_pluse )
);
always #(T/2) clk = ~clk;initial beginclk = 1'b0;edge_din = 1'b0;#(10*T)edge_din = 1'b1;#(10*T)edge_din = 1'b0;
end
endmodule
仿真结果如下:
学习FPGA的时候很多常用的模块可以将其参数化,形成自己的ip,以后方便调用。做FPGA设计是一个逐渐积累的过程。相比于官方提供的封闭的IP核,自己设计的IP核虽然性能比不过,但是更灵活,方便进行个性化修改。FPGA其实就像搭积木一样,只要自己的代码库够丰富,设计只会越来越轻松!点击下面链接查看合集
此合集持续分享一些笔者自己设计的可复用硬件模块点击进入:FPGA搭积木