集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2124|回复: 1

fpga初学者请教三段状态机的问题

[复制链接]
沉醉夕阳下 发表于 2010-6-25 23:30:41 | 显示全部楼层 |阅读模式
这几天刚刚看到了三段状态机写法,使用写了一个程序锻炼以下,但是出了很多问题.希望高手帮忙,以下是我写的程序:



`definedelay_max19 //采样脉冲的宽度

module dengxiao(
input _200MHz_clk,//系统时钟
input chufa,
output reg ad_clk,
output reg[7:0] count_max, //count_max,count,delay设置为输出口,方便仿真观察
output reg[8:0] count,
output reg[5:0] delay
);

reg rest;
reg k,c_en;   //触发控制 k为屏蔽触发控制端,c_en为触发等待控制
reg[5:0] current_state,next_state;
parameter [5:0]
  wait_chufa  = 6'b000001,
  count_200  = 6'b000010,
  count_finish= 6'b000100,
  delay_count= 6'b001000,
  delay_finish = 6'b010000,
  clr      = 6'b100000;
  
//*******************时序状态转换******************//
[email=always@(posedge]always@(posedge[/email] _200MHz_clk or posedge rest)
begin
if(rest) current_state<=clr;
elsecurrent_state<=next_state;
end

//*******************触发状态控制*******************//
[email=always@(posedge]always@(posedge[/email] chufa or negedge k )
begin
if(!k)c_en<=1;
else begin c_en<=0;end
end

//************状态的逻辑转换条件**************//

[email=always@(count]always@(count[/email] or delay or c_en or count_max or current_state)
begin
next_state=3'bx;
case(current_state)
wait_chufa: if(c_en) next_state=count_200;
       else next_state=wait_chufa;

count_200: if(count==199+count_max) next_state=count_finish;
       else next_state=count_200;
  
count_finish:next_state=delay_count;

delay_count:if(delay==`delay_max) next_state=delay_finish;
        else next_state=delay_count;
  
delay_finish:if(count_max==199) next_state=clr;
       else next_state=wait_chufa;
     
clr:     next_state = wait_chufa;   
endcase



end
//**********每个状态的输出********//
[email=always@(posedge]always@(posedge[/email] _200MHz_clk)
begin
case(next_state)
wait_chufa:
  begin
    k<=0;
    rest<=0;
  end
count_200:
  begin
    k<=1;
     count<=count+1;
  end
  
count_finish:begin count<=0; count_max<=count_max+8'd1; end

delay_count:
    begin
    ad_clk<=1;
    delay<=delay+1;
    end
  
delay_finish:
   begin
    ad_clk<=1'd0;
    delay<=6'd0;
   end
clr:
  begin
    count_max<=0;
    ad_clk<=0;
   count<=0;
   delay<=0;
  end
endcase
end
endmodule

这个程序是顺序等效采样的.触发到来时开始采样,每次采样都比上一次采样延迟一个时钟周期(由于采样200MHz时钟,故延迟5ns),采样够200个点之后(即count_max=199),count_max清零,又重新开始采样.而采样时钟限制在1MHz,故计数时count至少每次要计数200次..

最终结果是ad_clk第一次输出是在count=199时,第二次在count=200,第3次在201....
但是出不了结果..郁闷!请高手帮忙
蓝雪 发表于 2010-6-26 01:19:47 | 显示全部楼层

状态机

我已经找到问题了,关键是我将计数器和输出放在一个always模块理..害我想了很久
       
...
总结一下经验,我也是初学者,希望我这样的错误可用给其他初学者提醒一下!
当状态机里有计数器或者延迟时,可以独立分离出去一个always计数,并且要用当前状态(current_state)去计数! 另外,我在输出寄存器,即最后一个always模块中,只能做输出,我以前就是在最后一个输出模块中进行计数..(我是初学者,这样低级错误经常范..)..晕!!
...暂时不清楚如何在状态机中计数又不用分离出一个always计数的方法,希望高手指点一下!
关于简化one-hot码问题,我还不是很清楚!希望有人可以发资料给我!谢谢了!邮箱:260378337@qq.com
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-23 15:22 , Processed in 0.148056 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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