搜索
bottom↓
回复: 4

【求助】把主时钟分频出来的信号用作时钟时出现的奇怪...

[复制链接]

出0入0汤圆

发表于 2012-11-28 20:49:36 | 显示全部楼层 |阅读模式
在鼓捣一个串口发送程序,我没像例程中那么用时钟(例程的运行结果没问题)。 而是用从主时钟分频出来的等于波特率的时钟频率,驱动状态机,发送数据到TX引脚。虽然用ModelSim仿真时TX波形和例程的仿真波形完全一致,但结果还是不对。但怎么弄也不对,发的数据很混乱。

最后把问题缩小到了时钟问题。写了这个测试程序。这个程序让LED亮一秒,再灭一秒,不断循环。时钟源是从主时钟分频得到。只有三个module,一个分频,一个翻转LED和一个顶层模块。

//顶层模块
module clockDivDriveTest(
        input sys_clk,
        input RSTn,
        output o_invertWave       
        );

        wire odivClock;
       
        invertMod u2(
                .divClk(odivClock),
                .RSTn(RSTn),
                .invertWave(o_invertWave)
                );
               
        dividedClock u1(
                .CLK(sys_clk),
                .RSTn(RSTn),
                .divClock(odivClock)
                );
               
endmodule


//在输入的时钟上升沿,让invertWave翻转,以驱动LED亮灭循环。
module invertMod(
        input divClk,
        input RSTn,
        output invertWave
        );
       
        reg r_invertWave;
        always@(posedge divClk  or  negedge RSTn)
        begin
                if( !RSTn )
                        r_invertWave <= 0;
                else
                        r_invertWave <= ~r_invertWave;       
        end
       
        assign invertWave = r_invertWave;

endmodule

//将频率为50MHz的时钟分频。为了用肉眼就能看见问题,输出的divClock周期为2s。
module dividedClock
                (
                         input CLK, input RSTn,
                         output divClock
                );         

        reg [26:0]count_clk;
       
        //循环计数器
        always@( posedge CLK or negedge RSTn )
        begin
            if( !RSTn )
                     count_clk <= 27'd0;
                 else if( count_clk == 27'd100_000_000 )                  
                     count_clk <= 27'd0;
                 else
                     count_clk <= count_clk + 1'b1;
        end               
        //分频部分
        assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
       
endmodule


把o_invertWave分配给驱动LED的引脚,在开发板上测试时,能明显看见LED灭的时候有一个突然的闪亮,和SignalTap抓取的波形上的那个突变完全对应。分析问题的原因时弄不明白了。如果是分频后的时钟有毛刺,为何SignalTap上看不出来?或者是这个分频时钟没问题,而是FPGA中其他部分有问题?这个问题折磨我好几天了

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-28 21:49:08 | 显示全部楼层
assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
这种分频是不可可靠的 吴厚航那本书上分析过这个时钟分频的问题
一般大家都不是用这种方法去分频!

出0入0汤圆

发表于 2012-11-28 22:59:06 | 显示全部楼层
assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
这句写错了。应该是
assign divClock = ( count_clk == 27'd50_000_000 ) ? 1'b1 : 1'b0;

出0入0汤圆

 楼主| 发表于 2012-12-2 15:01:14 | 显示全部楼层
看了书,是不能这样用,但没说根本原因,也没哪个资料上说明了原因。应该用使能时钟。我用时序仿真也没仿真出碰到的现象。

出0入0汤圆

发表于 2012-12-2 20:38:21 | 显示全部楼层
两个原因:1直接使用时钟分频出来的信号,误差比较大;他是两个组合电路之和,不好控制;2:时钟先好的扇出不够;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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