在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2853|回复: 5

[求助] 【求助】大家帮我看看这个状态机

[复制链接]
发表于 2010-10-24 17:49:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x





  1. [code]module delay (
  2. //input
  3. clk, //输入时钟
  4. rst_n, //复位信号
  5. sync, //输入信号(需要延迟的信号)
  6. delays, //信号延迟时间调节
  7. pulsewide, //信号脉宽调节
  8. //output
  9. delay //输出信号
  10. );
  11. input clk;
  12. input rst_n;
  13. input sync;
  14. input [9:0] delays;
  15. input [9:0] pulsewide;
  16. output delay;
  17. reg delay;
  18. reg [2:0] current_state,next_state;
  19. parameter state0=3'b001,//状态0,1,2采用一位热码编码
  20. state1=3'b010,
  21. state2=3'b100;
  22. //标准状态机三段式写法
  23. //第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
  24. always @(posedge clk )
  25. begin
  26. if (load==1)
  27. current_state<=state0;
  28. else
  29. current_state<=next_state;
  30. end
  31. //第二个进程,组合逻辑always模块,描述状态转移条件判断
  32. reg [10:0] cnt;
  33. always @(current_state,cnt,load,delays,pulsewide)
  34. begin
  35. next_state=3'bx; //要初始化,使得系统复位后能进入正确的状态
  36. case(current_state )
  37. state0:begin
  38. if(cnt==delays) next_state=state1;
  39. else next_state=state0;
  40. end
  41. state1:begin
  42. if(cnt==delays+pulsewide) next_state=state2;
  43. else if(load==1) next_state=state0;
  44. else next_state=state1;//(cnt<(delays+pulsewide))
  45. end
  46. state2:begin
  47. if (load==1) next_state=state0;
  48. //else if(cnt>delays+pulsewide) next_state=state0;
  49. else next_state=state2;
  50. end
  51. default:next_state=state0;
  52. endcase
  53. end

  54. //第三个进程,状态机的输出
  55. always @(posedge clk or negedge rst_n )
  56. if (!rst_n)
  57. begin
  58. cnt<=11'b0;
  59. delay<=0;
  60. end
  61. else
  62. begin
  63. cnt<=0;
  64. delay<=0;
  65. case (next_state)
  66. state0: begin
  67. cnt<=cnt+11'b1;
  68. delay<=0;
  69. end
  70. state1: begin
  71. cnt<=cnt+11'b1;
  72. delay<=1;
  73. end
  74. state2: begin
  75. cnt<=11'b0;
  76. delay<=0;
  77. end
  78. default: begin
  79. cnt<=cnt+11'b1;
  80. delay<=0;
  81. end
  82. endcase
  83. end

  84. //sync上升沿捕获
  85. reg previous;
  86. wire load;
  87. always @(posedge clk)
  88. previous <= sync;
  89. //always @(posedge clk)
  90. assign load = (~previous)&sync;
  91. //load<=(~previous)&sync;

  92. endmodule


复制代码

[/code]

这是我写的一个状态机的代码,想实现下面所示的功能:

                               
登录/注册后可看大图

要求输出的out_pulse
1)delays < SYNC 半个周期;
2)delays + pulsewidth <SYNC的一个周期;

下面是我从网上一位版主提供的状态图:
S0: delay状态,控制计数器从 0 递增到 delays;
S1: pulsewidth状态,控制计数器从delays 递增到 delays + pulsewidth;
S2: 空闲状态。


                               
登录/注册后可看大图

当sync上升沿来到时load产生1个高电平脉冲
只要出现load 有效,状态机就进入S0,并且计数器同步清零。处于S0状态,计数器cnt递增计数,直到出现 cnt == delays,切换到S1,cnt继续递增计数,直到出现 cnt==delays+pulsewidth,切换到S2,一直维持在S2 直至load 有效,切换到S0。
S0 和S2 状态,输出脉冲为0,S1状态,输出脉冲为1。

但是我的代码就是实现不了那个波形!烦请各位高手帮忙看下!不甚感激!
发表于 2010-10-24 21:57:33 | 显示全部楼层
回复 1# hasea


    cnt 没有及时清零,可以根据load信号清零
 楼主| 发表于 2010-10-24 22:38:01 | 显示全部楼层
回复 2# zhaichunhua168


   还是没有看出来! 能不能详细说下!谢谢了!
发表于 2010-10-25 09:11:58 | 显示全部楼层
现在存在什么问题呢?
 楼主| 发表于 2010-10-25 17:21:53 | 显示全部楼层
回复 4# AmoiBB


    1.jpg
当delays较小时,前几个周期的波形出错!
发表于 2010-10-26 09:44:23 | 显示全部楼层
建议在delay模块中先将输入信号sync打一拍
还有就是计数器cnt用load信号来清零
祝你好运
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 15:42 , Processed in 0.020845 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表