用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.com

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_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控制模块工作于篇幅所限,略去该过程模块。

上一页  [1] [2] [3]  下一页


Tag:FPGAfpga是什么,fpga教程FPGA

《用Verilog HDL实现I2C总线功能》相关文章

分类导航
最新更新
热门排行