用的是xilinx的spatan 3a
发现有个状态机工作不正常:
1.当我用ont-hot编码的时候,用chipscope观察,出现全是0的现象,我在状态机的when others中也加了状态的回复,但是还是不行。
2.然后我换了gray编码,这次状态停到了“011”就不走了,而这个状态仅仅起到一个延迟作用,没有任何条件语句。
程序平时是没有问题的,大概运行300次左右就出现一次跑飞。用FPGA1年了,属于初学者,从来没有遇到过这种问题。
请教个位高手,如何解决?
以下是代码
p_reg2:process(S_Lclk,reset)
begin
if (reset='0') then
state1<=0;
S_ccs<='Z';
S_ads_o<='Z';
S_blast_o<='Z';
S_wr_o<='Z';
S_la_o<=(others=>'Z');
S_command<=(others=>'Z');
S_command_en<='1';
elsif rising_edge (S_Lclk) then
case state1 is
when 0 =>
if S_PCI_usero='0' then
S_ads_o<='1';
state1<=1;
else
S_ccs<='Z';
S_ads_o<='Z';
S_blast_o<='Z';
S_wr_o<='Z';
S_la_o<=(others=>'Z');
S_command<=(others=>'Z');
S_command_en<='1';
end if;
when 1 =>
S_ccs<='0';
S_ads_o<='0';
S_wr_o<='0';
S_la_o<=G_C8;
state1<=2;
when 2 =>
S_ccs<='Z';
S_ads_o<='1';
S_blast_o<='0';
state1<=3;
when 3 =>
S_ccs<='Z';
state1<=4;
when 4=>
if S_ready_i='0' then
S_command<=pci_ld;
S_command_en<='0';
state1<=5;
else
null;
end if;
when 5=>
state1<=6;
when 6 =>
if S_PCI_usero='1' then
S_command_en<='1';
state1<=0;
else
null;
end if;
S_blast_o<='Z';
S_wr_o<='Z';
S_ads_o<='Z';
when others =>
state1<=0;
end case;
else
null;
end if;
end process p_reg2;
这个进程的时钟是我用40M分频产生的(不是用DCM,就是写了个简单的分频代码,即如果上升沿A<=not A),
它即作为本进程的时钟,又作为外部PCI LOCAL总线的时钟。
其它的进程采用的是40M时钟
状态机编码类型是在ise的综合选项中选的。
[
本帖最后由 qd0090 于 2011-3-22 20:19 编辑 ]
此帖出自
小平头技术问答
这个进程的时钟是我用40M分频产生的。利用分频时钟去驱动,会引入多时钟域问题,常会有时序不满足的情况。我原来就遇到过。。。处理方法可以用计数器产生一个enable信号,enable有效进行操作!
就像夏老师说的一样,我将状态机中外部的信号和它的时钟进行了一下同步
p_reg2_1: process(S_Lclk)
begin
if rising_edge(S_Lclk) then
S_PCI_usero<=PCI_usero;
S_ready_i<=ready;
else
null;
end if;
问题就解决了!
这一年多来学到了不少东西,也对fpga有了浓厚的兴趣,觉得fpga真的很有意思,可以做时序,可以做算法,可以嵌入Microblaze,可以嵌入DSP,而且听说xilinx以及开发了arm内核了。也就是说如果fpga玩好了,你可以做任何事情。
但是我发现fpga真是一个入门简单之极,深入了解需要下大工夫的东西。
FPGA是硬件,VHDL是硬件描述语言,但是我对什么语言对应什么硬件没有什么概念。
随着做东西的深入,这个缺点已经越来越明显了。
比如说今天的问题,我之前曾经在网上的代码中见到过对fpga外部的信号进行同步,但是我并没有重视,或者并不知道这么做的意义。
请教各位高手有没有相关的资料给我学习下?或者书籍也行。
还有,ise中的view/edit routed design(fpga editor)中可以看到语言最终生成的硬件,但是里边的模块我不知道对应什么东西,xilinx有相关的手册么?我认为写个代码,再看看生成的电路,会对我有很大帮助。
真的很想把fpga学好,我认为我也舍得下功夫学它,请各位指点!
[ 本帖最后由 qd0090 于 2011-3-23 10:49 编辑 ]
就是亚稳态问题! 所有进入的信号需要本级时钟两次同步!
一周热门 更多>