关于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门,高阻就是输入,其它就是输出

 

 

转载于:https://www.cnblogs.com/woshitianma/archive/2012/12/18/2823535.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值