求大神来看看我程序哪里有问题,为什么检测不到信号上升沿?
时间:10-02
整理:3721RD
点击:
写了一个程序仿真结果都正常,但把程序下载到FPGA里面就无法工作。下面是状态机的程序,现在是实际电路中检测不到S0状态中的triggle_rising,不知道程序哪里有问题,求大神来看看呐。
- module fsm(
- output reg rw,
- output reg endatapath,
- input spi_cs,
- input full,
- input triggle,
- input clk
- );
-
- reg[1:0] state,next_state;
- parameter S0 = 2'b00,
- S1 = 2'b01,
- S2 = 2'b10,
- S3 = 2'b11;
- reg sync_cs1;
- reg sync_cs2;
- reg sync_triggle1;
- reg sync_triggle2;
- reg triggle_low;
- reg triggle_high;
- wire triggle_rising;
- always @(posedge clk)
- begin
- sync_cs1 <= spi_cs;
- sync_cs2 <= sync_cs1;
- sync_triggle1 <= triggle;
- sync_triggle2 <= sync_triggle1;
- triggle_low <= sync_triggle2;
- triggle_high <= triggle_low;
- end
- assign triggle_rising = (triggle_low)&(~triggle_high);
- always @(posedge clk)
- begin
- state <= next_state;
- end
- always @(state,full,sync_cs2,triggle_rising)
- begin
- rw = 1'b0;
- endatapath = 1'b0;
- next_state = S0;
- case(state)
- S0 : begin
- if(triggle_rising) next_state = S1;
- else next_state = S0;
- end
- S1 : begin
- rw = 1'b1;
- endatapath = 1'b1;
- if(full) next_state = S2;
- else next_state = S1;
- end
- S2 : begin
- next_state = S2;
- if(sync_cs2)
- next_state = S3;
- end
- S3 : begin
- endatapath = 1'b1;
- rw = 1'b0;
- if(full) next_state = S0;
- else next_state = S3;
- end
- endcase
- end
- endmodule
异步信号进行打拍同步,若你的triggle信号是单周期脉冲,则需要满足产生triggle的时钟慢于或等于同步时钟,所以采样不到triggle_rising 很大可能是triggle的持续时间小于同步时钟一个时钟周期。
楼上正解
哦哦 抱歉我忘说时钟和信号频率了,我的时钟频率是12.5MHZ,输入的triggle信号频率是1KHZ,感觉应该可以采集到的啊
这个代码我看着累,为什么寄存器没有复位?
缺少注释,包括端口
不能罗列全的敏感变量还是用always (*) 代替
楼上说可能是triggle的持续时间小于同步时钟一个时钟周期,我觉得不是.
同一个时钟源下的触发,不会存在时钟的异步,根源可能在于输入信号triggle的持续时间,如果triggle是电平而不是只有一个时钟周期的脉冲,triggle_rising是会被拉高的.
