初来FPGA板块,献上I2C。

[复制链接]
2881|5
 楼主| taishan3703 发表于 2011-2-25 02:16 | 显示全部楼层 |阅读模式
FPGA, I2c, ST, sd, RS
module test05(sclk, ack, scl, sda, rst, data);
input sclk, rst;
input[3:0] data;
output ack, scl;
inout sda;
reg scl, ack;
reg link_sda, sdabuf;
reg[3:0] databuf;
reg[7:0] state;
assign sda = link_sda ? sdabuf : 1'bz;
parameter ready = 8'b0000_0000,
          start = 8'b0000_0001,
           bit1 = 8'b0000_0010,
           bit2 = 8'b0000_0100,
           bit3 = 8'b0000_1000,
           bit4 = 8'b0001_0000,
           bit5 = 8'b0010_0000,
           stop = 8'b0100_0000,
           IDLE = 8'b1000_0000;
always @(posedge sclk or negedge rst)
begin
  if (!rst) // reset
    scl <= 1'b1;
  else
    scl <= ~scl;
end            
always @(posedge ack)
begin
  databuf <= data;  
end
always @(negedge sclk or negedge rst)
begin
  if (!rst) //reset
    begin
      link_sda <= 0;
      state = ready;
      sdabuf <= 1'b1;
      ack <= 1'b0;
    end
  else
    begin
      case (state)
        ready: if (!scl && !ack)
                 begin
                   link_sda <= 1'b1;
                   state <= start;
                   ack <= 1'b1;
                 end
               else
                 begin
                   link_sda <= 1'b0;
                   state <= ready; // ??
                 end
        start: if (scl && ack)
                 begin
                   sdabuf <= 1'b0;
                   state <= bit1;
                 end
               else
                 state = start; // ??
        bit1:  if (!scl)
                 begin
                   sdabuf <= databuf[3];
                   state <= bit2;
                 end
               else
                 state <= bit1;
        bit2:  if (!scl)
                 begin
                   sdabuf <= databuf[2];
                   state <= bit3;
                 end
               else
                 state <= bit2;
        bit3:  if (!scl)
                 begin
                   sdabuf <= databuf[1];
                   state <= bit4;
                 end
               else
                 state <= bit3;
        bit4:  if (!scl)
                 begin
                   sdabuf <= databuf[0];
                   state <= bit5;
                 end
               else
                 state <= bit4;
        bit5:  if (!scl)
                 begin
                   sdabuf <= 1'b0;
                   state <= stop;
                   ack <= 1'b0;
                 end
               else
                 state <= bit5;
        stop:  if (scl)
                 begin
                   sdabuf <= 1'b1;
                   state <= IDLE;
                 end
               else
                 state <= stop;
        IDLE:  begin
                   link_sda <= 1'b0;
                   state <= ready;
               end
        default: begin
                   link_sda <=1'b0;
                   sdabuf <= 1'b1;
                   state <= ready;
                 end
      endcase
    end
end
endmodule
shihun009 发表于 2011-2-27 10:50 | 显示全部楼层
sinetech 发表于 2011-2-28 11:36 | 显示全部楼层
感谢taishan3703的贡献!
armsnow 发表于 2011-3-2 16:04 | 显示全部楼层
先收藏了,过几天写一下
xubuwei 发表于 2011-3-11 22:26 | 显示全部楼层
恩,学习了
岚369 发表于 2011-5-14 17:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

108

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部