FPGA学习系列:12. 边沿检测设计

描述

设计背景:

    在我们工程设计中,有时会需要到上升沿和下降沿这么一个说法,通过上升沿和下降沿来驱动一个电路,那么学习边沿检测就非常的重要了。

 

设计原理: 

    在学习边沿检测前我们先学习一下下面的电路,这样方便我们学习,边沿检测。







 

FPGA

    这个电路的意思就是,输入一个信号后我们经过一个寄存器,然后把这个寄存器的输出,和下次输出的值取反后相与,那么我们就可以这么想,如果一个高平的值经过这个寄存器后延迟一个上升沿后输出也为高电平,那么当输出的时候会有一个新的电平值,也就是一个电平的到来,然后通过低电平的值取反后和寄存器输出的高电平值得与得到一个高电平的脉冲值,然后对低电平转化为高电平也是一样的道理,这样我们就可以得到时钟上升沿和下降沿的高脉冲,这样就得到了我们设计的目的。

    

设计架构图:

FPGA

设计代码:

    设计模块

0 module edge_jiance(clk,rst_n,signle,nege_dge,pose_dge);

1 

2  input clk;

3  input rst_n;

4  input signle;   //输入信号

5 

6  output  nege_dge;  //输出下降沿的脉冲

7  output  pose_dge;  //输出上升沿的脉冲

8 

9  reg [1:0] signle_s;

10 always @ (posedge clk or negedge rst_n)

11  if(!rst_n)

12   begin

13    signle_s <= 2'b11;

14   end

15  else

16   begin

17    signle_s[0] <= signle;     //把输入信号给一个寄存器

18    signle_s[1] <= signle_s[0];

19   end

20

21 assign pose_dge = signle_s[0] && ~signle_s[1];   //取反相与得到上  升沿的高脉冲

22 assign nege_dge = ~signle_s[0] && signle_s[1];   //取反相与得到下  降沿的高脉冲

23 endmodule 

 

测试模块

0 `timescale 1ns/1ps

1 

2 module edge_tb();

3 

4  reg clk;

5  reg rst_n;

6  reg signle;

7 

8  wire  nege_dge;

9  wire  pose_dge;

10

11 initial begin

12  clk = 1'b1;

13  rst_n = 1'b0;

14  signle <= 1'b1;    //复位赋值

15

16  #100.1 rst_n = 1'b1; 

17

18  #36 signle <= 1'b1;  //模拟下降沿

19  #36 signle <= 1'b0;

20

21  #100 

22  #36 signle <= 1'b0;  //模拟上升沿

23  #36 signle <= 1'b1;

24

25  #100

26   $stop;

27  end

28

29 always #10 clk = ~clk;   //产生晶振时钟

30

31 edge_jiance edge_dut(    //模块例化

32   .clk(clk),

33   .rst_n(rst_n),

34   .signle(signle),

35   .nege_dge(nege_dge),

36   .pose_dge(pose_dge)

37  );

38 endmodule 

 

仿真图:

    我们模拟的上升沿和下降沿在仿真中可以清楚的看到,然后我们通过边沿检测电路,可以得出我们一个高电平的上升沿,和一个低电平的下降沿。

   

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分