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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2300|回复: 4

[求助] 求大神来看看我程序哪里有问题,为什么检测不到信号上升沿?

[复制链接]
发表于 2016-9-6 21:03:59 | 显示全部楼层 |阅读模式

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

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

x
写了一个程序仿真结果都正常,但把程序下载到FPGA里面就无法工作。下面是状态机的程序,现在是实际电路中检测不到S0状态中的triggle_rising,不知道程序哪里有问题,求大神来看看呐。



  1. module fsm(
  2.   output reg rw,
  3.   output reg endatapath,
  4.   input spi_cs,
  5.   input full,
  6.   input triggle,
  7.   input clk
  8.     );
  9.          
  10. reg[1:0] state,next_state;
  11. parameter S0 = 2'b00,
  12.           S1 = 2'b01,
  13.                          S2 = 2'b10,
  14.                          S3 = 2'b11;
  15. reg sync_cs1;
  16. reg sync_cs2;

  17. reg sync_triggle1;
  18. reg sync_triggle2;
  19. reg triggle_low;
  20. reg triggle_high;
  21. wire triggle_rising;

  22. always @(posedge clk)
  23. begin
  24.   sync_cs1 <= spi_cs;
  25.   sync_cs2 <= sync_cs1;
  26.   sync_triggle1 <= triggle;
  27.   sync_triggle2 <= sync_triggle1;
  28.   triggle_low <= sync_triggle2;
  29.   triggle_high <= triggle_low;
  30. end

  31. assign triggle_rising = (triggle_low)&(~triggle_high);
  32. always @(posedge clk)
  33. begin
  34.     state <= next_state;
  35. end

  36. always @(state,full,sync_cs2,triggle_rising)
  37. begin
  38.   rw = 1'b0;
  39.   endatapath = 1'b0;
  40.   next_state = S0;
  41.   case(state)
  42.     S0 : begin
  43.                 if(triggle_rising) next_state = S1;
  44.                           else next_state = S0;
  45.                         end
  46.          S1 : begin
  47.                 rw = 1'b1;
  48.                           endatapath = 1'b1;
  49.                           if(full) next_state = S2;
  50.                           else next_state = S1;
  51.                         end
  52.          S2 : begin
  53.                 next_state = S2;
  54.                 if(sync_cs2)
  55.                             next_state = S3;
  56.                         end
  57.          S3 : begin
  58.                 endatapath = 1'b1;
  59.                 rw = 1'b0;
  60.                           if(full) next_state = S0;
  61.                           else next_state = S3;
  62.                         end
  63.   endcase
  64. end
  65. endmodule


复制代码
发表于 2016-9-6 22:41:07 | 显示全部楼层
异步信号进行打拍同步,若你的triggle信号是单周期脉冲,则需要满足产生triggle的时钟慢于或等于同步时钟,所以采样不到triggle_rising 很大可能是triggle的持续时间小于同步时钟一个时钟周期。
发表于 2016-9-7 08:34:35 | 显示全部楼层
楼上正解
 楼主| 发表于 2016-9-7 08:53:05 | 显示全部楼层
回复 2# gdsgdj
哦哦 抱歉我忘说时钟和信号频率了,我的时钟频率是12.5MHZ,输入的triggle信号频率是1KHZ,感觉应该可以采集到的啊
发表于 2016-9-7 09:01:16 | 显示全部楼层
这个代码我看着累,为什么寄存器没有复位?
缺少注释,包括端口
不能罗列全的敏感变量还是用always (*) 代替
楼上说可能是triggle的持续时间小于同步时钟一个时钟周期,我觉得不是.
同一个时钟源下的触发,不会存在时钟的异步,根源可能在于输入信号triggle的持续时间,如果triggle是电平而不是只有一个时钟周期的脉冲,triggle_rising是会被拉高的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-25 10:05 , Processed in 0.029652 second(s), 8 queries , Gzip On, Redis On.

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