关于i2c(1)

看到de2程序中wire I2C_SDAT=SDO?1'bz:0 ;当时觉得SD0的状态要是1的话,则高阻则做作为输入,而作为输出地话只有0状态,这样是不是不对??上网找了一些资料·~发现也是潜规则,同学说跟485的规则差不多~~

来自~~http://www.cnblogs.com/yuphone/archive/2010/11/01/1866662.html
解释如下:
对于主机来说,要使得SDA作为输入口,就必须先将其拉成高阻态。而SDA作为输出口的情况下,就有一个技巧,不仔细还真有点难以捉摸:主机输出高电平, 可以直接输出高电平;也可以输出高阻,由于接有上拉电阻,因此从机会接收到高电平。而主机输出想要输出低电平,为了摆脱上拉电阻的束缚,就必须直接输出低电平。

另外关于inout:

输入口din定义:input[7:0] din;当双向端口dinout作为输出口时,我们从din端口输入数据到模块中,让数据从dinout口出来。

输出口dout定义output[7:0] dout;当双向端口dinout作为输入口时,

我们让数据从dinout 口输入,从输出口dout 输出。
双向端口dinout定义: inout [7:0]  dinout;
三态门选通信号 z : input z ;
当z=1时,把三态门置为高阻态,这时dinout作为输入口用;当z=0时,开通三态门,这时dinout作为输出口用。
三态门控制语句为:
  assign  dinout = (!z) ? din_reg : 8'bz;
总的完整程序如下:

 moduled  inout(din,z,clk,dout,dinout);
  input [7:0]  din;
  input z;
  input clk;
  output [7:0]  dout;
  inout [7:0]  dinout;

  reg [7:0]  dout;
  reg [7:0]  din_reg;

  assign  dinout=(!z)? din_reg: 8'bz ;
always @(posedge clk)
  begin
    if(!z)
      din_reg=din;
    else
      dout=dinout;
  end
endmodule

oc门,高阻就是输入,其它就是输出

 

 

posted @ 2012-12-18 16:24  天马行空W  阅读(897)  评论(0编辑  收藏  举报