集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1975|回复: 5

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

[复制链接]
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前仿真的结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
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



    我所谓的“精确对准”是指modelsim前仿真的情况
可能在实际中不可能吧
这种方式确实不好
 楼主| lanpad 发表于 2012-3-26 21:24:26 | 显示全部楼层
以后尽量使用同源时钟,修改如下:
always@(posedge clk100M) begin
    if(clk_en & clk33M)
   begin ...
zombes 发表于 2012-3-23 22:46



    谢谢
但如果使能信号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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-25 11:00 , Processed in 0.068808 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表