【问题标题】:Driving bidirectional lines in Verilog在 Verilog 中驱动双向线路
【发布时间】:2011-02-21 04:32:53
【问题描述】:

这个问题可能不会很好地解释,那是因为我并不真正了解我的设计中发生了什么。

我需要使用 I2C 通信总线与相机 (Terasic D5M) 通信,因此我尝试使用 Verilog 编写一个。我只需要一个大师。在我的逻辑分析仪上,一切看起来都很棒,除了我不断从相机收到 NACK 信号。起初我不知道哪里出了问题,所以我把它放在一边。

今晚我尝试使用具有 D5M 模块的 Altera University IP 内核。将其设置为自动初始化后,我观察了分析仪上发生的情况。跟踪看起来与我的 I2C 模块的输出相同,但这是设备注册 ACK。

我的问题是,我一生都无法弄清楚为什么我没有得到确认。可能是我不允许相机将 sda 线拉低(scl 工作正常),但我不知道为什么会这样。

有没有人有类似的经历或知道我应该去哪里看/发帖/阅读?我会发布一些代码,但如果不是完整的,我不知道它会有多大用处。很抱歉这么含糊,但我真的很迷茫,甚至不知道我应该问什么;我想这是一个类似的效果请求。感谢您的帮助,这是 i2c 模块输出行的一些代码。


`define HIGH  1'bZ
`define TRUE  1'b1
`define FALSE 1'b0

inout sda;
assign sda = (ena_sda)?sda_bit:`HIGH;

inout scl;
assign scl = (ena_scl)?pSCL:`HIGH;

pSCL 是以所需速率运行的时钟,sda_bit 是运行期间 sda 线的值。这是释放和等待确认的部分。这嵌入在我的转换状态中,因此是 else if 的开始。


// Data shifting complete, check for ACK
// Release the SDA line and set our bit to high Z
else if(shiftComplete == `TRUE) begin
    ena_sda = `FALSE;
    sda_bit = `HIGH;
    if(negedge_SCL) begin
        ena_sda = `TRUE;                        
        case(i2cState)
            `DATA_STATE:
                begin
                    shiftComplete = `FALSE;
                    nxState = `DATA_STATE;
                end
            `START_STATE: nxState = `REPEAT_START_STATE;
             default: nxState = `STOP_STATE;
        endcase
    end
end /* end ACK */

我认为释放 ena_sda 足以让相机驱动模块。我想我之前把 sda_bit = HIGH 作为测试(我已经一个月没看这个了)。

我很乐意分享更多代码或显示我的逻辑跟踪,但我不想再把它弄得乱七八糟了。感谢阅读。

【问题讨论】:

  • 您是否模拟了您的反向注释网表?此外,对于 FSM 状态,请使用参数而不是 `defines,因为`defines 对于编译单元来说是全局的。
  • 我在将模块放入硅片之前对其进行了模拟,结果达到了我的预期。但是,我在模拟中完全忽略了 nack/ack 信号。我只担心模块释放了 sda 线。吸取教训吧?我想我应该回到模拟阶段并尝试模拟设备响应,而不是那么轻视这些事情。谢谢。

标签: embedded verilog fpga hdl intel-fpga


【解决方案1】:

我会将输入和输出分开并添加一个输出启用,基本上不使用输入输出。您的 altera 设备的 I/O 焊盘是否支持以这种方式使用? (他们应该)如果是这样,让 I/O 焊盘完成输入输出工作。您是否也将 I/O 焊盘定义为推挽或有线或弱上拉或任何这些?在某些情况下,您可以选择在启用输出时将其推挽,当输入时,它会处于三态以允许另一侧控制数据线。

【讨论】:

  • 我没想过要使用两行而不是一行。我只想从模块“黑匣子”中出来两行。我不确定这怎么可能,但我一定会尝试的。谢谢。
  • 我刚醒来,所以有点迷糊。我可以像你建议的那样从这个人那里用 OE 输出四条线路,并将它们正确连接到 I2C 线路!我希望这不需要完整的代码修订,但它至少是远离这个死胡同的一条道路。非常感谢。
  • 如果您在设计时将输入和输出分开并启用输出,那么如果您真的需要/想要一个输入输出,您总是可以将该模块与另一个模块包装在一起,将其变成一个输入输出。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2013-12-16
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多