如何等待始终阻止的边?

问题描述:

我想写的东西是这样的:如何等待始终阻止的边?

[email protected](posedge bus_start) 
begin 
    @(posedge scl) buffer[7] = sda; 
    @(posedge scl) buffer[6] = sda; 
    @(posedge scl) buffer[5] = sda; 
    @(posedge scl) buffer[4] = sda; 
    @(posedge scl) buffer[3] = sda; 
    @(posedge scl) buffer[2] = sda; 
    @(posedge scl) buffer[1] = sda; 
    @(posedge scl) buffer[0] = sda; 
end 

但是,根据我得到的错误是不是合成的。

我可以使用FSM来解决这个问题,但这可能会使它变得复杂,有什么办法可以使它合成吗?

+1

不,这是高层次的行为Verilog。它会为测试平台提供一个很好的参考模型,但它的详细程度不够可以合成。您需要编写可合成代码的抽象_级别(详细级别)称为RTL(寄存器传输级别),其中您几乎可以手动确定触发器的位置以及合成器填充组合逻辑的位置。对于这个I2C接口,你需要一个移位寄存器,你需要一个FSM,你可能需要一个计数器。请参阅[我公司的网站](https://www.doulos.com/knowhow/verilog_designers_guide/)。 –

它看起来像你试图从I2C接口捕获数据。 这是一个简单的解决方案,用于捕获来自sda的8位数据并将其存储到名为buffer的寄存器中。约的Verilog I2C

// starts on rising edge of scl or bus_start 
[email protected](posedge bus_start or posedge scl) 
begin 
    buffer[0] <= sda; // loads sda into the lowest bit of buffer 
    buffer[7:1] <= buffer[6:0]; // shifts the lower 6 bits one to 
           // the left, acting as a shift register 
end 

的更多信息可以发现here 此外,基本I2C从可以发现here(必须注册和登录查看源代码)。

您无法提供足够的信息。

来自@ Krabby127的答案也是不可合成的。

我想你还有很多工作要做。首先您应该了解Verilog和C之间的区别。 RTL代码是描述FPGA中的硬件。因此可合成的概念对你来说非常重要。

而你必须注意I2C信号的去抖动。保持三态信号。毕竟我建议你从opencores.org获得一些I2C项目来学习。 原谅我可怜的英语。

I2C从器件大多使用SCL以外的采样时钟。我不是说这是不可能的,但通常的做法是使用更快的时钟来采样SCL和SDA信号。

我绝对推荐以最低的端口开始设计。由于SDA是一个三态信号,我也建议在这个阶段不要处理它。您可以假设它已经完成了您的模块,并且可以继续使用单独的输入和输出端口。老实说,I2C并不是学习HDL(Verilog/SV/VHDL)和数字设计的好选择。它会带来一些复杂的问题。