mrbpost 发表于 2012-7-28 23:42:14

怎么解决CPLD时钟歪斜问题,可以给出具体的方法吗?

用一片EPM240,全局时钟1MHZ,做12路时序输出波形时用到了12个15位的定时器,由于资源限制,我将1MHZ时钟50分频后作为其中8路时序控制的时钟,另外2路仍用1MHZ时钟,结果采用分频的二次时钟作为触发时钟的8路时序输出波形总是随机的缺少一个周波,而另两路用1MHZ时钟路触发得到的波形没有发现丢失的情况,我觉得是由于二次时钟歪斜造成计数过程数据丢失而导致时序波形不正确的,请问大家在设计时序过程中出现过类似的问题吗?怎么来解决?我如果把1MHZ晶振换成20K晶振可以解决此问题吗?有20K的有源晶振吗??

NJ8888 发表于 2012-7-29 08:35:33

应当是分频计数器写的不好,1MHz很慢了,根本不用考虑啥歪斜

mysunmax 发表于 2012-7-29 08:40:10

ls有理                        

mrbpost 发表于 2012-7-29 09:58:04

NJ8888 发表于 2012-7-29 08:35 static/image/common/back.gif
应当是分频计数器写的不好,1MHz很慢了,根本不用考虑啥歪斜

分频的程序如下,可以指点一下吗?谢谢。
reg counter = 5'b00000;

always @(posedge CLK)   //clk --1MHZ--ius
begin
      if(counter==24) //
            counter <= 0;
          else
            counter <= counter+1;
          end

reg CLK_K = 1'b0 ;
always @(posedge CLK)

    begin
      if(counter==24) //
            CLK_K <= ~CLK_K;///分频,CLK_K=CLK/50---50us
      else
            CLK_K <= CLK_K ;
    end

wye11083 发表于 2012-7-29 09:58:46

知道为什么吗?不是时钟skew,而是你的分频有问题,直接使用计数器产生的时钟是不可靠的,必须使用寄存器输出。

mrbpost 发表于 2012-7-29 10:04:28

wye11083 发表于 2012-7-29 09:58 static/image/common/back.gif
知道为什么吗?不是时钟skew,而是你的分频有问题,直接使用计数器产生的时钟是不可靠的,必须使用寄存器输 ...

我把分频的程序贴上了,然后把分频CLK_K作为后面程序的时钟,谢谢您的指点,怎么用寄存器输 出?对这不是很懂,可以指点一下吗?
            

mrbpost 发表于 2012-7-29 11:50:23

wye11083 发表于 2012-7-29 09:58 static/image/common/back.gif
知道为什么吗?不是时钟skew,而是你的分频有问题,直接使用计数器产生的时钟是不可靠的,必须使用寄存器输 ...

用CLK_K做为后面模块的时钟,上升沿触发,always @(posedge CLK_K),有什么不对的吗?

zkf0100007 发表于 2012-7-29 13:07:29

计数器就是寄存器输出的,实在不行,可以考虑1mhz作时钟,20khz作时钟使能,但是分频的时候20khz的占空比不能用1:1,其高电平只能持续一个1mhz周期

mrbpost 发表于 2012-7-29 13:26:04

zkf0100007 发表于 2012-7-29 13:07 static/image/common/back.gif
计数器就是寄存器输出的,实在不行,可以考虑1mhz作时钟,20khz作时钟使能,但是分频的时候20khz的占空比不 ...

通过quartus II波形仿真,时序均正确,但是一到设备上测波形,示波器就可以观察到少半个周波,而且出现的时间是没有规律的,偶发的,第一次用CPLD作时序就出现这样的问题,真搞不明白问题出在哪里?是因为分频程序有问题吗?

zkf0100007 发表于 2012-7-29 15:35:51

那是有点神奇,这样分频也没什么不妥啊,你也可以用内部的pll分频

mrbpost 发表于 2012-7-29 15:45:55

zkf0100007 发表于 2012-7-29 15:35 static/image/common/back.gif
那是有点神奇,这样分频也没什么不妥啊,你也可以用内部的pll分频

epm240内部有PLL吗?如何使用PLL产生20KHZ的时钟?谢谢指点。

Arrowzhang 发表于 2012-7-29 15:57:53

mrbpost 发表于 2012-7-29 15:45 static/image/common/back.gif
epm240内部有PLL吗?如何使用PLL产生20KHZ的时钟?谢谢指点。

没有PLL的

Arrowzhang 发表于 2012-7-29 16:03:33

mrbpost 发表于 2012-7-29 11:50 static/image/common/back.gif
用CLK_K做为后面模块的时钟,上升沿触发,always @(posedge CLK_K),有什么不对的吗? ...

建议不要这么用,建议直接使用clk,试试下面这样怎么样:
always @ (posedge clk)
if(分频条件)
      计数器<=计数器+1'b1;
else begin
       要使用分频的部分;
       计数清零;
       end

wangshaosh123 发表于 2012-7-29 16:35:03

计数器<=计数器+1'b1;

然后计数器的某一位拉出来   这样只能实现2的N次方分频
还有任意整数分频,你看下《深入浅出玩转FPGA》
时钟用起来很有讲究的

sadlife1000 发表于 2012-7-29 20:57:59

always @(posedge CLK)   //clk --1MHZ--ius
begin
      if(counter==49) //
            counter <= 0;
          else
            counter <= counter+1;
          end

reg CLK_K = 1'b0 ;
always @(posedge CLK)

    begin
   
      if(counter>=24) //
            CLK_K <= 1'b0;///分频,CLK_K=CLK/50---50us
      else
            CLK_K <= 1'b1 ;
    end



我看你们的技术好差。哈哈。时钟歪斜指的是两个寄存器之间的时钟偏差问题。cpld的布线延时是固定的,我用过的ep240m的芯片,不会超过7ns。

mrbpost 发表于 2012-7-29 22:25:14

是我技术很差,跟别人没关系呀,请问是因为我写的分频程序有问题吗?我把CLK_K
输出到别的引脚上用示波器观察到的分频波形也正确呀。

mrbpost 发表于 2012-7-30 18:23:44

本帖最后由 mrbpost 于 2012-7-30 18:31 编辑

今天改了分频程序问题犹在,觉得又跟分频无关了,当仅仅只作4路输出时无论分频还是不分频输出都是正确的,但路数多了输出就有问题了,还有EPM240输出接在74HC244上,通过244输出,QUARTUS II的输入输出I/O口设置均设置为LVTTL电平,请问跟电平设置有关系吗?通常该怎么设置?我输入端接的信号有3.3思密特触发器输出信号和5V通过电阻分压的信号.

wye11083 发表于 2012-7-31 21:18:32

你注意,240/570也是FPGA的一种,直接用计数器输出,结果是一个比较器,是组合逻辑。要想变成可用的时钟源,必须用高频时钟把低频时钟打一拍。
页: [1]
查看完整版本: 怎么解决CPLD时钟歪斜问题,可以给出具体的方法吗?