|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 lingking 于 2019-9-26 14:41 编辑
最近看一个I2C的IP核的源码,为了滤波和去除亚稳态,代码里面用好多级触发器来保存I2C信号,还做了滤波处理。但是对于下面红色代码部分是如何滤波,还是不太清楚:以下是代码:
always@(posedge clk or negedge nReset) begin
if(!nReset)
begin
cSCL <= 2'b00; // 复位,全部清0
cSDA <= 2'b00; // 复位,全部清0
end
else if(rst)
begin
cSCL <= 2'b00; // 复位,全部清0
cSDA <= 2'b00; // 复位,全部清0
end
else
begin
cSCL <= {cSCL[0],scl_i};
cSDA <= {cSDA[0],sda_i};
end
end
// SCL和SDA滤波器的计数器
always@(posedge clk or negedge nReset)
begin
if(!nReset)
filter_cnt <= 14'd0;
else if(rst || (!ena))
filter_cnt <= 14'd0;
else if(~|filter_cnt) //
filter_cnt <= clk_cnt >> 2;
else
filter_cnt <= filter_cnt - 1;
end
always@(posedge clk or negedge nReset)
begin
if(!nReset)
begin
fSCL <= 3'b111;
fSDA <= 3'b111;
end
else if(rst)
begin
fSCL <= 3'b111;
fSDA <= 3'b111;
end
else if(~|filter_cnt)
begin
fSCL <= {fSCL[1:0],cSCL[1]};
fSDA <= {fSDA[1:0],cSDA[1]};
end
end
always@(posedge clk or negedge nReset)
begin
if(~nReset)
begin
sSCL <= 1'b1;
sSDA <= 1'b1;
dSCL <= 1'b1;
dSDA <= 1'b1;
end
else if(rst)
begin
sSCL <= 1'b1;
sSDA <= 1'b1;
dSCL <= 1'b1;
dSDA <= 1'b1;
end
else
begin
sSCL <= &fSCL[2:1] | &fSCL[1:0]|(fSCL[2] & fSCL[0]);
sSDA <= &fSDA[2:1] | &fSDA[1:0]|(fSDA[2] & fSDA[0]);
dSCL <= sSCL;
dSDA <= sSDA;
end
end
|
|