I2C有SCL,SDA这2根线,对这2个信号的处理如下:
always@(posedge clk or negedge rstn)begin
if(!rstn)begin
rg_sclD1<=1’b1;
rg_sclD2<=1’b1;
rg_sclD3<=1’b1;
rg_sclD4<=1’b1;
rg_sclD5<=1’b1;
rg_sclD6<=1’b1;
rg_sclD7<=1’b1;
rg_sclD8<=1’b1;
rg_sdaD1<=1’b1;
rg_sdaD2<=1’b1;
rg_sdaD3<=1’b1;
rg_sdaD4<=1’b1;
rg_sdaD5<=1’b1;
rg_sdaD6<=1’b1;
rg_sdaD7<=1’b1;
rg_sdaD8<=1’b1;
end
else begin
rg_sclD1<=xi_scl;
rg_sclD2<= rg_sclD1;
rg_sclD3<= rg_sclD2;
rg_sclD4<= rg_sclD3;
rg_sclD5<= wr_sclD5_nxt;
rg_sclD6<= rg_sclD5;
rg_sclD7<= rg_sclD6;
rg_sclD8<= rg_sclD7;
rg_sdaD1<=xi_sda;
rg_sdaD2<= rg_sdaD1;
rg_sdaD3<= rg_sdaD2;
rg_sdaD4<= rg_sdaD3;
rg_sdaD5<= wr_sdaD5_nxt;
rg_sdaD6<= rg_sdaD5;
rg_sdaD7<= rg_sdaD6;
rg_sdaD8<= rg_sdaD7;
end
end
assign wr_sclD5_nxt=(rg_sclD2==rg_sclD3&& rg_sclD3==rg_sclD4)? rg_sclD4:
rg_sclD5;
assignwr_sdaD5_nxt=(rg_sdaD2==rg_sdaD3&&rg_sdaD3==rg_sdaD4)? rg_sdaD4:rg_sclD5;
wr_sclD5_nxt,wr_sclD5_nxt这2个信号是当连续的三个延迟量相等则对其进行更新,否则不更新
上述代码中xi_scl,xi_sda分别是i2C的接口对外的2个信号
1431

被折叠的 条评论
为什么被折叠?



