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