状态机的状态变化为何不是在时钟的边沿呢?
本帖最后由 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
波形如图:
状态机的变化 不是在时钟的边沿 ?什么原因? 上面的时钟是50M么,如果是的话这延迟有点大啊 這個應該是 signaltap clock 造成的現象吧! 状态变化实在clk_50m(ts.u.c1)的上升沿,而不是ddr2_ip.u.c1的上升沿 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 18:57 编辑
我还实验了其他的情况,比这个 还混乱,状态变化 在任何位置,既不是 上升沿,也不是下降沿,哪里的问题
学习学习 把stp的inputclk也截图出来看一下,这种情况我估计是你的stp的采样时钟与状态机时钟不一致导致的。 SignalTap的采样时钟是200M的C0吧? 它跟50M的C1之间是的相位关系是怎样的?
状态机的时钟是C1, 实际上状态的变化会在C1上升沿之后延迟一点点, 在FPGA内部是ps级的延迟. 所以200M的采样时钟采到的C1上升沿跟状态寄存器之间有1个采样时钟周期的延迟.
严格来讲用C0去采样C1的做法是不正确的,尤其是这两个时钟相位相同的时候,根本满足不了Setup/Hold timing的要求.
感谢大家, 是 siganal tap ii 的显示问题,采样时钟用的不对 siganal tap ii 的显示偏差还是蛮大的
页:
[1]