2017-06-06 129 views
-1

我想寫的東西是這樣的:如何等待始終阻止的邊?

[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/)。 –

回答

0

它看起來像你試圖從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(必須註冊和登錄查看源代碼)。

1

您無法提供足夠的信息。

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

我想你還有很多工作要做。首先您應該瞭解Verilog和C之間的區別。 RTL代碼是描述FPGA中的硬件。因此可合成的概念對你來說非常重要。

而你必須注意I2C信號的去抖動。保持三態信號。畢竟我建議你從opencores.org獲得一些I2C項目來學習。 原諒我可憐的英語。

0

I2C從器件大多使用SCL以外的採樣時鐘。我不是說這是不可能的,但通常的做法是使用更快的時鐘來採樣SCL和SDA信號。

我絕對推薦以最低的端口開始設計。由於SDA是一個三態信號,我也建議在這個階段不要處理它。您可以假設它已經完成了您的模塊,並且可以繼續使用單獨的輸入和輸出端口。老實說,I2C並不是學習HDL(Verilog/SV/VHDL)和數字設計的好選擇。它會帶來一些複雜的問題。