(1)基于FPGA的沿检测设计实例
#######
说明:本次设计时基于按键的沿检测,这是一个很实用的FPGA设计技巧,在很多实用的工程中,我们可以通过检测其特定的上升沿或下降沿触发,来进行设计,本篇文章即是已按键为背景,来进行电平的沿检测,根据其原理可以应用到其他项目设计实例中去。
举例:在红外信号检测解码中,首先要检测前导码,此时就可以用沿检测去记录接收到的信号是否为真实红外信息的前导码,只有前导码检测成功之后,才继续进行下一步检测,直到最后32位数据全部检测结束。
代码实例
module edge_T(
input sys_clk50,
input rst_n,
input key,
output pos_flag, //上升沿
output neg_flag //下降沿
);
reg key_R; //缓存key的值
always@(posedge sys_clk50 or negedge rst_n)begin
if(!rst_n)begin
key_R <= 1;
end
else begin
key_R <= key;
end
end
reg key_edge;
always@(posedge sys_clk50 or negedge rst_n)begin
if(!rst_n)begin
key_edge <= 1;
end
else begin
key_edge <= key_R;
end
end
assign pos_flag = (~key_edge)&key_R;
assign neg_flag = key_edge&(~key_R);
endmodule
tb文件
module tb;
// Inputs
reg sys_clk50;
reg rst_n;
reg key;
// Outputs
wire pos_flag;
wire neg_flag;
// Instantiate the Unit Under Test (UUT)
edge_T uut (
.sys_clk50(sys_clk50),
.rst_n(rst_n),
.key(key),
.pos_flag(pos_flag),
.neg_flag(neg_flag)
);
initial begin
// Initialize Inputs
sys_clk50 = 0;
rst_n = 0;
key = 1;
// Wait 100 ns for global reset to finish
#100 rst_n = 1;
// Add stimulus here
#100 key = 1;
#1000 key = 0;
#1000 key = 1;
#2000 key = 0;
#2000 key = 1;
end
always #10 sys_clk50 = ~sys_clk50;
endmodule
#######
这是基于沿检测的一个小的设计实例,合理的应用于项目中会大大简化设计流程。