2016-05-24 62 views
0

我正在使用一些VHDL代碼(在FPGA上)讀取16位數字信號,做一些處理,然後寫出16位處理後的信號。目前它的設置應該是每10個時鐘週期讀一次輸入,在下一個時鐘週期進行一些處理(目前它什麼都不做,只是輸出輸入),然後在剩下的8個時鐘週期內遞增計數器。使用If條件每10個時鐘週期執行一次「某事」。如果「某事」需要超過1個時鐘週期,該怎麼辦?

如果處理需要超過一個時鐘週期才能完成(會如何),它會一直持續到完成並停止計數器遞增直到它結束爲止?或者計數器在處理信號時保持並行遞增?

我將它設置爲在8個時鐘週期結束之前完成該過程(及時寫入輸出)。

的僞代碼看起來是這樣的:

Do (on rising clock edge): 
if (n = 10) then 
    n <= 1; 
    Output <= ProcessedSignal; 
    InputSignal <= Input; 
elsif (n = 1) then 
    n <= n + 1 
    Output <= Output; 
    -- do some signal processing here (e.g. a filter) 
    ProcessedSignal <= InputSignal; 
else 
    n <= n + 1; 
    Output <= Output; 
    ProcessedSignal <= ProcessedSignal; 
end if; 
+2

你的問題似乎爲時過早。請參見[我如何提出一個好問題?](http://stackoverflow.com/help/how-to-ask)您可以編寫一些實際的VHDL代碼並進行模擬,以便您可以針對可複製的問題提出具體問題通過一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve)。 – user1155120

回答

1

這一切都取決於你如何編寫代碼;任何一種行爲都是可能的。你的僞代碼幾乎是有效的VHDL,並且如果我正確理解你的話就會做你想做的事。這裏是真正的代碼的建議:(不含建築/信號的聲明,也缺少復位)

process (clock) 
begin 
    if rising_edge(clock) then 
    n <= n + 1; -- default assignment 

    if (n = 10) then 
     n <= 1; -- overrides default assignment 
     Output <= ProcessedSignal; 
     InputSignal <= Input; 
    elsif (n = 1) then 
     -- do some signal processing here (e.g. a filter) 
     ProcessedSignal <= InputSignal; 
    elsif (n = 2) then 
     -- do more processing 
    end if; 
    end if; 
end process; 

注意,沒有必要給信號寫入自身以時鐘控制的過程,除非你想讓它明確信號保持其舊值。

+0

謝謝,這真的很有幫助。如果我沒有明確說明信號保持舊值,我不確定輸出是否會保持時鐘週期之間的值。我也很高興知道我可以覆蓋默認任務,因爲我先學習了SystemVerilog,但我不確定你可以在SystemVerilog中做到這一點,因爲我相信它會給你一個錯誤,說你正在向同一輸出寫入2種不同的東西。 – SomeRandomPhysicist

相關問題