|
本帖最后由 wuyuehang 于 2012-12-28 20:51 编辑
这几天在参考IIC协议写SCCB总线时候遇到这样一个问题:
reg GO_R;
always @ (posedge iCLK or negedge iRST_N)
begin
if(!iRST_N) begin GO_R <= 1'b1;end
else begin GO_R <= GO;end
end
//Generate SD_CNT;
always @ (posedge iCLK or negedge iRST_N)
begin
if(!iRST_N) begin SD_CNT <= 7'b1111_111; end
else begin
if(!GO_R) begin SD_CNT <= 7'b0000_000; end
else begin
if(SD_CNT > 7'd32) begin SD_CNT <= 7'b1111111; end
else begin SD_CNT <= SD_CNT + 1'b1; end end
end
end
GO_R低电平触发一次传输,将SD_CNT清零计数直到超过32。但是我用signal tap 2采样的时候发现,按下GO低电平触发之后,SD_CNT的值并没有变为零,else begin SD_CNT <= SD_CNT + 1'b1综合的效果用stp2采样出来的确实从63递减1的逻辑。不知道为什么出现这么诡异的现象,是软件设置问题还是其他,求高手解答?
刚刚经过楼下几位指点,感觉好像问题找到了根源了。
就是iRST_N有效一般是将寄存器清零,但是我却是要进行置位。if(!iRST_N) begin SD_CNT <= 7'b1111_111;
我后来把这个逻辑改过了,后面代码都不变就一切正常了。
好奇怪,是不是altera的寄存器不支持异步下降沿置位,还没仔细去看。
VERSION 2.0
reg GO_R1,GO_R2;
wire GO_R;
always @ (posedge iCLK)
begin
GO_R1 <= GO;
GO_R2 <= GO_R1;
end
assign GO_R = ~GO_R1 & GO_R2;
//Generator cnouter
always @ (posedge iCLK)
begin
if(GO_R==1'b1)
SD_CNT <= 6'd0;
else if(SD_CNT_DONE == 1'b0)
SD_CNT <= SD_CNT + 1'b1;
else SD_CNT <= SD_CNT;
end
wire SD_CNT_DONE = (SD_CNT > 6'd32)?1'b1:1'b0;
解决办法:将异步置全一的逻辑改正了,干脆不用它。因为只要那么采样的结果就是寄存器不能被置位。
嗖了一下altera的寄存器或者说le,说是支持同步异步置位,但是置多位情况下就会出现楼主的问题。按理说单单一个SD_CNT没有被弄成RAM(因为以前弄过片上RAM出现异步不能置位或者清零的问题)。
现在的波形已经正确,sccb协议弄完了~呼
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|