微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 上升沿的捕获电路(代码)

上升沿的捕获电路(代码)

时间:10-02 整理:3721RD 点击:
一个简单的上升沿检测代码:
reg RS_r1,RS_r2;
always @ (posedge CLKIN or posedge RESET)
    if(RESET)
        RS_r1 <= 1'b0;
    else
        RS_r1 <= RS;
always @ (posedge CLKIN or posedge RESET)
    if(RESET)
        RS_r2 <= 1'b0;
    else
        RS_r2 <= RS_r1;
        
wire pos_RS = RS_r1 & ~RS_r2;
然后我们使用pos_RS来在其他模块里做判断使用,
但这种方法实际检测到的上升沿会比实际上升沿延迟2个时钟
那用下面的方法不就可以直接检测上升沿了吗?

always @ (posedge RS or posedge RESET)//直接检测RS上升沿

这两种方法有什么具体区别吗?

方式1可以消除亚稳态

可是有些时候,第一种方法会有一定延时,影响到数据传输,可否用第二种方法呢?

用方法1 --〉同步设计
  方法2 --〉异步设计(RS 需要设置为clock)
一般用方法1 在延迟上处理,应该没有问题

第二种方法如果RS上有毛刺,会有误判断

全同步电路,不能随便使用posedge和negedge

对头

那要看具体的设计需求了。
第一种设计,是同步设计方法,不知道你说的延迟两个clock是怎么回事,因为检测到该信号的上升沿脉冲,即pos_RS信号,是在RS_r1这个信号0->1变化之后的一个clock边沿处,如果以clock的边沿来看,并没有延迟;
第二种设计实际上一般是不允许的,除非把这个pos_RS当作时钟。实际的设计中,如果当作时钟的话,需要使用DCM(Xilinx的FPGA)或者指定的时钟逻辑电路(ASIC)中。如果当作普通的控制信号或者数据信号,不允许这样的设计,综合也过不去。

没有延时吗?

o 受教了


不明白这个design为何对这个延时如此的在意?

难道一定要在上升沿发生的同时马上把数据发出去?
如果是这种情况,那就不能判断这个信号的上升沿来发数据;
而是用产生这个上升沿的信号来作为发送数据的trigger

之所以延迟就是为了去毛刺,这也算是经典用法了

学习学习



    最多也就是对产生的第一个时钟周期有延时,后面的都不会。除非你是第一个时钟周期的上升沿要跟其他信号对齐,要不这个延时不必在意

第一种消除不了亚稳态,那是经典的边沿检测
第二种可以,但是这样你的输出信号就会与你的主时钟不同步,在后面你还得做同步
晚两个时钟的问题,第一种方法的前提就是边沿检测的时钟必须要足够得快,晚的这两个时钟就可以不考虑了

很受8楼的启迪啊,处理异步的时候是不是选用高频率的clock就可以减小延迟了呢。
按我的理解,遇到上升沿的时候,两个always语句同时被触发,那么RS上一次时钟上升沿时的电平被存入RS_r2 ,本次时钟上升沿时的电平被存入RS_r1,通过比较可知电平是否跳变,延迟应该和选用的CLOCK信号有关吧,这个做法消除了一个时钟周期内的抖动的影响,带来的是一个在一个时钟时间范围内的任意时间的延迟加上寄存器赋值用的延迟加上寄存器一次非运算和一次与运算的延迟吧。

同步电路里,CLKIN至少比RS快2倍以上,就算有延迟,也是可以接受的。

    请问,这后面做同步,应该如何做?程序应该如何写呢?



            一般情况下内部时钟要比外部输入的信号频率高,你可以用三个移位寄存器对输入信号串行移位,或者两个,最低位的不用,用来消除亚稳态,用高位,判断若高两位都为1时输出为1,都为0时输出为0,其他保持,这样不仅消除亚稳态,消除了外部高频噪声,还同时使得输出信号与内部时钟同步!

虽然能看懂方法,但不知道原理是怎样的,尤其最后一句“还同时使得输出信号与内部时钟同步”没看懂。
谢谢wangxuede220


给你写个简单的程序,就能理解了
    always @(posedge clk)
{
     shift_in<={shift_in[1:0],data_from_out};
       if(shift_in[2:1]==2'b11)
         data_in<=1;
       else if(shift_in[2:1]==2'b00)
         data_in<=0;
}
这样以后,用data_in代替data_from_out输入到你的模块里面就行了,现在这个信号就与clk(内部时钟)同步了!



    谢谢wanxuede220的回复,您的回复让我受益匪浅
我还有个疑问,如果我的输入数据是datain[15:0]这样的,16位,那数据的每一位都要进入您写的那段程序模块中吗?

如果这是从外部输入到你的芯片内部的话,最好同步一下,要不然会出问题的。如果是两个模块连接,并且两个模块的时钟一致的话,就不用了。

懂了,谢谢

thanksgiving!

还是用第一种方法吧,使用第二种的话,出现问题的话你会很崩溃的.......



    总线的同步是不一样的做法,关于这方面的资料很多,找来看看就知道了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top