2011-06-16 132 views
3

因此我遇到了一些舊代碼,我必須複製,但它不會用新的Xilinx編譯器編譯,所以我需要弄清楚它是什麼確實。我有這樣的事情:嵌套如果(rising_edge(clk))陳述在VHDL

if rising_edge(clk) then 
    —do some things 
    if rising_edge(clk) then 
     —do some other things 
    end if 
end if 

是否需要2個時鐘週期才能到達內部if語句,或者是第二個if語句是否簡單冗餘?

此外,賽靈思給出錯誤:「邏輯的信號是由一個時鐘控制的,但似乎不是有效的順序描述」

感謝,任何幫助表示讚賞。

回答

1

如果它合成之前它是一個合成器故障/錯誤。你如何確定代碼與經過測試並確定工作的代碼相匹配? (這聽起來像你只有人的話是這是之前合成的正確代碼。)

現有系統是否可用於比較和測試?涉及的工具版本是什麼?你可以使用舊的工具,並驗證它的綜合和它提供了什麼樣的警告?根據您使用的版本,您可能可以使用綜合報告fpgaeditor(或類似)來查看實際合成的內容。
或者您可以分析代碼以查看設計者的意圖,並使用有效的HDL複製該代碼。

如果沒有完成您所剩下的就是試錯。 嘗試假設:

  1. 嵌套上升沿內的語句始終處於活動狀態。 (刪除嵌套的上升沿,如果語句離開它包圍的代碼塊)。
  2. 嵌套上升沿內的語句從不激活。刪除整個嵌套的上升沿塊。
  3. 你可以嘗試一下,但我真的無法想象合成器會如何產生2週期延遲。你可能會減少嘗試這種或其他更不可能的情況。很難預測這種故障模式是什麼。
+0

感謝這麼好的答覆!我非常肯定,我能夠確定原作者的意圖來自其他代碼(沒有評論,關注你),我將嘗試並實現它,並看看會發生什麼。謝謝您的幫助! – Jamal 2011-06-17 15:37:51

+1

我不太確定如果合成器會接受這個錯誤,那將會是一個錯誤。第二個if語句總是通過模擬(測試相同的條件)。雖然合成工具拒絕兩個嵌套邊緣條件是合理的,但忽略第二個條件也是有意義的。也就是說,代碼應該真正改變,以便它只有一個邊緣檢測。 – Philippe 2011-06-19 06:24:31

1

這只是簡單的不會在我見過的任何工具中綜合。不要這樣做,即使是模擬。

第二個語句rising_edge不是一個順序語句,例如,一項任務。這是一個涉及時間的陳述,因此您可以確定這一點。

+0

我不能讓它合成兩種,老老實實這不是什麼我會永遠想寫作。我只是想確定原作者的意圖,所以我可以重新編寫代碼。顯然,這個曾經工作過的老式合成器,或者我被告知。 – Jamal 2011-06-16 17:49:55

+0

第二個如果不涉及時間傳遞,它與第一個測試相同(如果clk ='1'和clk'event) – 2011-06-17 11:00:04

5

鑑於rising_edge(clk)true第一個if,當然它仍然在第二嵌套if如此。假定在-- do some stuff部分內沒有時間,這可能是這種情況。

因此,第二個如果可能被if true then替代......或者確實被遺漏了!

0

實際上你想要推斷的是嵌套時鐘進程。

這不應該合成,因爲它不代表有意義的硬件。

您應該根據xst.pdf重新編寫代碼(例如,如果您使用Xilinx ISE)。

親切的問候, 尼可拉斯Kavvadias