河马在泡澡 发表于 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 divClkornegedge 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 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中其他部分有问题?这个问题折磨我好几天了{:dizzy:}

wangshaosh123 发表于 2012-11-28 21:49:08

assign divClock = ( count_clk <= 27'd50_000_000 ) ? 1'b1 : 1'b0;
这种分频是不可可靠的 吴厚航那本书上分析过这个时钟分频的问题
一般大家都不是用这种方法去分频!

浮云残雪 发表于 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;

河马在泡澡 发表于 2012-12-2 15:01:14

看了书,是不能这样用,但没说根本原因,也没哪个资料上说明了原因。应该用使能时钟。我用时序仿真也没仿真出碰到的现象。{:2_29:}

jm2011 发表于 2012-12-2 20:38:21

两个原因:1直接使用时钟分频出来的信号,误差比较大;他是两个组合电路之和,不好控制;2:时钟先好的扇出不够;
页: [1]
查看完整版本: 【求助】把主时钟分频出来的信号用作时钟时出现的奇怪...