lanpad 发表于 2012-3-18 21:13:08

请问上升沿同步的两个信号为何在上升沿处输出结果不一致?

本帖最后由 lanpad 于 2012-3-18 21:18 编辑

如图所示:

clk33M为时钟信号
clk_en为使能信号
在红圈处clk33M与clk_en的上升沿精确对准
可是当程序如下时:
例:
always@(posedge clk33M) begin
    if(clk_en) begin
         xxxxxxxxx
    end
end
注:clk33M和使能信号clk_en均由另一高倍时钟clk100M驱动产生,二者上升沿精确对准。
程序中的“xxxxxxxxx”操作无法完成,貌似clk33M的上升沿无法捕获clk_en

但是,
在另一些程序里(不同的情形太多,不再举例子,只说明最相关的两个信号的情况),同样的情形,当clk33M与clk_en的上升沿精确对准时,在有些程序中上例中的操作是可以完成的,好像clk33M的上升沿又可以捕获clk_en。

试了许多不同的情况,总结不出规律,请问这是什么原因?

注:以上均为Modelsim前仿真的结果

yuxuejun1123 发表于 2012-3-22 11:28:53

这显然是没办法扑捉的,根据D触发器的知识(这里可以参考这个公式Q(n+1)=Q(n))可知,当前状态的值只与之前的状态有关,所以虽然对齐了,但是clk上升沿扑捉的实际上是clk_en上升沿之前的电平,所以就没有办法运行了。
“同样的情形,当clk33M与clk_en的上升沿精确对准时,在有些程序中上例中的操作是可以完成的”这种说法是不可能的,除非不是真正的对齐或者没有使用这种always语句结构,否则和你的结果一样

zombes 发表于 2012-3-23 22:46:56

以后尽量使用同源时钟,修改如下:
always@(posedge clk100M) begin
    if(clk_en & clk33M)
   begin
         xxxxxxxxx
    end
end

试试这个代码如何

OK!

lanpad 发表于 2012-3-26 21:19:33

这显然是没办法扑捉的,根据D触发器的知识(这里可以参考这个公式Q(n+1)=Q(n))可知,当前状态的值只与 ...
yuxuejun1123 发表于 2012-3-22 11:28 http://www.fpgaw.com/images/common/back.gif


    我所谓的“精确对准”是指modelsim前仿真的情况
可能在实际中不可能吧
这种方式确实不好

lanpad 发表于 2012-3-26 21:24:26

以后尽量使用同源时钟,修改如下:
always@(posedge clk100M) begin
    if(clk_en & clk33M)
   begin ...
zombes 发表于 2012-3-23 22:46 http://www.fpgaw.com/images/common/back.gif


    谢谢
但如果使能信号clk_en的上升沿与clk100M的上升沿恰好对准
而使能信号clk_en的脉冲宽度比较窄(例如只有一个clk100M时钟周期)
该如何是好呢?

有资料说用锁存方式
例如:
定义
reg clk_en_reg;

clk_en_reg <= clk_en;

然后用clk_en_reg作为使能信号

请问这样能改善么?看不出来有何好处啊?

zombes 发表于 2012-3-26 22:04:30

clk_en脉冲宽度比较窄,如果只有一个clk_100M时钟的话,使用clk_100M一般是可以采集到的,很多情况都会使用这种单周期信号作为flag,如果宽度小于一个 触发时钟 周期,这才需要考虑这个问题
页: [1]
查看完整版本: 请问上升沿同步的两个信号为何在上升沿处输出结果不一致?