请问上升沿同步的两个信号为何在上升沿处输出结果不一致?
本帖最后由 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前仿真的结果 这显然是没办法扑捉的,根据D触发器的知识(这里可以参考这个公式Q(n+1)=Q(n))可知,当前状态的值只与之前的状态有关,所以虽然对齐了,但是clk上升沿扑捉的实际上是clk_en上升沿之前的电平,所以就没有办法运行了。
“同样的情形,当clk33M与clk_en的上升沿精确对准时,在有些程序中上例中的操作是可以完成的”这种说法是不可能的,除非不是真正的对齐或者没有使用这种always语句结构,否则和你的结果一样 以后尽量使用同源时钟,修改如下:
always@(posedge clk100M) begin
if(clk_en & clk33M)
begin
xxxxxxxxx
end
end
试试这个代码如何
OK! 这显然是没办法扑捉的,根据D触发器的知识(这里可以参考这个公式Q(n+1)=Q(n))可知,当前状态的值只与 ...
yuxuejun1123 发表于 2012-3-22 11:28 http://www.fpgaw.com/images/common/back.gif
我所谓的“精确对准”是指modelsim前仿真的情况
可能在实际中不可能吧
这种方式确实不好 以后尽量使用同源时钟,修改如下:
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作为使能信号
请问这样能改善么?看不出来有何好处啊? clk_en脉冲宽度比较窄,如果只有一个clk_100M时钟的话,使用clk_100M一般是可以采集到的,很多情况都会使用这种单周期信号作为flag,如果宽度小于一个 触发时钟 周期,这才需要考虑这个问题
页:
[1]