微波EDA网,见证研发工程师的成长! 2025年03月03日 星期一
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 分频时钟出现不定态的问题?

分频时钟出现不定态的问题?

时间:10-02 整理:3721RD 点击:
各位晚上好,我在ModelSim仿真中遇到了下图1所示的问题:

加载中...


就是说我的一个时钟分频模块A,将CLK分频后得到分频时钟clk1和clk2,将clk1给模块B,将clk2给模块C,如下图2所示:


加载中...


仿真时,clk1的结果如上图1所示,其在由低电平跳到高电平的时候出现了不定态X,但是如果将A与B的连线去掉,得到clk1分频时钟就不存在这个问题,出来的分频时钟clk1正常。
我的clk1逻辑是如下面这样描述的:
always@(posedge CLK or negedge rst)
   begin
       if(!rst)
             begin
                   count <= 3'b0;
                   clk1    <= 1'b0;
             end
       else if(count == 3'b011)
             begin
                   clk1 <= ~clk1;
                   count <= 3'b0;
             end
              else
                   count <= count + 1'b1;
   end

请问有人知道出现这个问题的原因吗?

問題應該是在module B
我猜module B 的clk_in 應該有宣告錯誤或是 tie low 的情形

明显是模块B有问题,可能clk_in定义错了



   非常抱歉,请问“宣告错误”是什么呀?“tie low”又是什么?这两个不懂,还请大神再解释一下,谢谢!


我检查了一下,然后进行分区域排除,发现问题确实出现在模块B,但是我检查了一下模块B的clk_in,发现没有定义错误啊,定义的是input类型。(模块B由模块d和e组成,送给模块B的时钟实质上是送给了d和e),还是没有检查出问题所在。我实际的设计如下图所示:

加载中...


上述将的模块B就相当于这里的整个Digital模块,模块d和e就相当于这里的filter3_v7和spi_slave模块,前面两个D触发器是用作异步复位同步释放逻辑的。

非常感谢各位的帮助,问题已经找到了。原因是将A,B,C三个模块例化得到顶层的一个模块时(假设命名为U0),其主时钟定义为clk,然后内部模块B的时钟名称也是定义为clk,在编写整个顶层(针对U0)的Testbench时,输入reg clk应该是指U0的主时钟,但是后面又通过语句assign uut.uut_B.clk = 0将模块B的clk给引出来了,导致两个clk发生冲突,所以才产生了这个问题。

非常感谢各位的帮助,问题已经找到了。其原因是在将A,B,C三个模块例化封装成一个顶层模块(假设命名为U0)时,U0的时钟的名称被定义为clk,而此前Digital的时钟也被定义为clk,在编写Testbench的过程中,其内部本应该主时钟为U0的主时钟clk(定义为reg clk),这个没有问题,但是在内部却又通过语句assign
uut.uut_B.clk = 0 将模块B的时钟clk给印出来了,而且还是wire型,并赋了初始值0,这样就造成了U0和B的时钟clk定义冲突,所以才出现了上述问题。

B这一级没问题,可能是下面的D/E的问题。
前面的宣告,指的是定义,台湾那边的讲法。
tie low,是指固定接0。

assign uut.uut_B.clk = 0
這個描述就是tie low


恩恩,学习了,非常感谢,问题已经解决了,是Testbench中出现了整个系统的主时钟clk,又出现了模块B的主时钟clk,由于这两个时钟同名,且类型不同,所以就造成了冲突,导致出现了上述问题,非常感谢您!


搜嘎,这样子啊,果然如你们所说的那样子,谢谢啦,非常感谢!

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

网站地图

Top