用Verilog HDL实现I2C总线功能
[11-20 16:14:02] 来源:http://www.88dzw.com FPGA 阅读:8343次
文章摘要:begin tempsc1=0; //SCL 置零 send_byte_zt=delay_2; end delay_2: // 延时三个周期 begin if(delay_counter>=2) begin send_byte_zt=sendbit3; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; end end sendbit3: // 判断是否字节中所有位都发送完毕 begin if(send_byte_num<=8) begin send_by
用Verilog HDL实现I2C总线功能,标签:fpga是什么,fpga教程,http://www.88dzw.combegin
tempsc1=0; //SCL 置零
send_byte_zt=delay_2;
end
delay_2: // 延时三个周期
begin
if(delay_counter>=2)
begin
send_byte_zt=sendbit3;
delay_counter=0;
end
else
begin
delay_counter=delay_counter+1;
send_byte_zt=send_byte_zt;
end
end
sendbit3: // 判断是否字节中所有位都发送完毕
begin
if(send_byte_num<=8)
begin
send_byte_zt=sendbit1;
end
else
begin
send_byte_zt=ForACK1;
send_byte_num=0;
end
end
ForACK1:
begin
tempsda=1; // 释放数据线,等待应答信号
send_byte_zt=delay_ACK;
end
delay_ACK: // 延时
begin
if(delay_counter>=3)
begin
send_byte_zt=ForACK2;
delay_counter=0;
end
else
begin
delay_counter=delay_counter+1;
send_byte_zt=send_byte_zt;
tempscl=1;
end
end
ForACK2:
begin
send_byte_zt=AckYESNO;
tempen_sdao=0; // 输出 SDA 使能信号,控制 sdao 和 sdai
end
AckYESN
begin
if(sdai) // 如果应答信号 sdai 为1, NO_ACK 置1
begin
tempNO_ACK=1; // 设置未应答标志信号
end
tempsc1=0; // 终止应答位
send_byte_zt=Finish_delay;
end
Finish_delay: // 延时
begin
if(delay_counter>=2)
begin
tempsend_byte_over=1;
send_byte_zt=FinishACK1;
delay_counter=0;
end
else
begin
delay_counter=delay_counter+1 ;
send_byte_zt=send_byte_zt;
end
end
FinishACK1:
begin
send_byte_zt=sendbit1;
send_byte_num=0;
end
default:
begin
send_byte_zt=sendbit1;
send_byte_num=0;
end
endcase
end
程序中sdao、sclo为输出信号,sdai为应答信号,en_sdao是对sdao和sdai进行切换的信号。I2C总线具有SDA和SCL两根信号线,所以在整个模块设计中,把sdao/sclo和sdai/scli作为两组信号。当需要向外部SDA信号线上输出信息时,sdao连到SDA信号线上;当需要从外部SDA信号线上读入信息时,置sdao成高阻态,sdai连到SDA信号线上。en_sdao信号作为这一过程的切换信号。在程序中定义了一些状态信号:NO_ACK、send_byte_over。其中,NO_ACK信号判断从器件是否对发送的信号给予了应答。send_byte_over信号判断字节是否传输完毕。这些信号可以传递给上一层设计模块,以控制程序的流程。为了使I2C总线能够有效地通讯,必须考虑信号的建立和保持时间,所以程序中设置了相应的延时部分。另外,在以clk为触发信号的过程模块中,定义send_byte_clk信号为时钟信号的两倍频信号,并加入字节发送模块使能信号start_send_byte控制模块工作于篇幅所限,略去该过程模块。
《用Verilog HDL实现I2C总线功能》相关文章
- › 用Verilog HDL实现I2C总线功能
- › 使用Verilog实现基于FPGA的SDRAM控制器
- 在百度中搜索相关文章:用Verilog HDL实现I2C总线功能
- 在谷歌中搜索相关文章:用Verilog HDL实现I2C总线功能
- 在soso中搜索相关文章:用Verilog HDL实现I2C总线功能
- 在搜狗中搜索相关文章:用Verilog HDL实现I2C总线功能