atom100 发表于 2014-9-10 08:01:13

状态机的状态变化为何不是在时钟的边沿呢?

本帖最后由 atom100 于 2014-9-10 16:53 编辑

请教:用quartus ii 写了个简单的状态机,如下:
`timescale 1ns / 1ps
module ts(
                        input inclk_50m,
                        input rst_n);
                       
                //wire clk_50m;
          // wire clk_200m;       
pll   u(
        .inclk0(inclk_50m),
        .c0(clk_200m),
        .c1(clk_50m));
       
        reg state;
        wire clk_50m;
        always @(posedge clk_50m or negedge rst_n)
                begin
                        if(!rst_n)
                                state <=5'd0;
                        else
                                begin
                                        case(state)
                                                5'd0: state <= 5'd1;
                                               
                                                5'd1: state <= 5'd2;
                                               
                                                5'd2: state <= 5'd3;
                                               
                                                5'd3: state <= 5'd4;
                                               
                                                5'd4: state <= 5'd5;
                                               
                                                5'd5: state <= 5'd2;
                                        endcase
                               
                                end
                end
endmodule

波形如图:



状态机的变化 不是在时钟的边沿 ?什么原因?

chenchaoting 发表于 2014-9-10 09:00:02

上面的时钟是50M么,如果是的话这延迟有点大啊

jarodzz 发表于 2014-9-10 09:45:38

這個應該是 signaltap clock 造成的現象吧!

Nuker 发表于 2014-9-10 10:22:43

状态变化实在clk_50m(ts.u.c1)的上升沿,而不是ddr2_ip.u.c1的上升沿

atom100 发表于 2014-9-10 16:45:54

Nuker 发表于 2014-9-10 10:22
状态变化实在clk_50m(ts.u.c1)的上升沿,而不是ddr2_ip.u.c1的上升沿

你好,谢谢回复
开始我定义一个pll ,名字弄错了,写成了ddr2_ip,其实这是个pll的 ip核,后来在上传的时候,只改了程序,截图忘记改了,图中ddr2_ip 就是pll

atom100 发表于 2014-9-10 16:54:01

奇怪的是,同步状态机应该是在时钟上升沿 改变状态,为何这里不是?

atom100 发表于 2014-9-10 16:57:09

本帖最后由 atom100 于 2014-9-10 18:57 编辑




我还实验了其他的情况,比这个 还混乱,状态变化 在任何位置,既不是 上升沿,也不是下降沿,哪里的问题

chen_ym 发表于 2014-9-10 17:42:58

学习学习

tangkuan660 发表于 2014-9-11 08:51:26

把stp的inputclk也截图出来看一下,这种情况我估计是你的stp的采样时钟与状态机时钟不一致导致的。

Nuker 发表于 2014-9-11 13:58:13

SignalTap的采样时钟是200M的C0吧? 它跟50M的C1之间是的相位关系是怎样的?
状态机的时钟是C1, 实际上状态的变化会在C1上升沿之后延迟一点点, 在FPGA内部是ps级的延迟. 所以200M的采样时钟采到的C1上升沿跟状态寄存器之间有1个采样时钟周期的延迟.
严格来讲用C0去采样C1的做法是不正确的,尤其是这两个时钟相位相同的时候,根本满足不了Setup/Hold timing的要求.

atom100 发表于 2014-9-13 19:42:23

感谢大家, 是 siganal tap ii 的显示问题,采样时钟用的不对

lansen0815 发表于 2014-9-19 15:07:32

siganal tap ii 的显示偏差还是蛮大的
页: [1]
查看完整版本: 状态机的状态变化为何不是在时钟的边沿呢?