2016-10-12 48 views
0

我就必須在CLK的每個上升沿被添加4程序計數器工作:信號變爲0X00從0100

代碼:

if_CounterSum <= MemAddr + 4; 

process (Clk, Reset) 
begin 
    if Reset = '1' then 
     MemAddr <= (OTHERS => '0'); 
    elsif rising_edge(Clk) then 
     MemAddr <= if_CounterSum; 
    end if; 
end process; 

當ISIM模擬,

After Reset is set to 0: 
Initial state: 
MemAddr = 0 (0000) 
if_CounterSum = 4 (0100) 

First CLK rising_edge: 
MemAddr = X (0X00) 
if_CounterSum = X (XXXX) 

我已經工作了一段時間這個「簡單」的事情,我曾嘗試:

  1. 也將+4行更改爲同步(進入進程),但問題仍然存在。
  2. 其他一些沒有奏效的東西。

我該如何解決X?我已經測試了其他數字而不是4,並且我猜測了if_CounterSim中的所有'1',其中在賦值後轉換爲'X'。

回答

1

你沒有包括所有的代碼,所以下面是一個猜測。

這個問題可能是該信號,由此多個衝突的驅動器相同的信號作爲例如既'0''1'將導致'X'的VHLD分辨率的結果,但其中的'0'兩個驅動器將導致'0'

因此,查找模塊中分配了MemAddrif_CounterSum的所有地方,並刪除那些不必要的分配。

+1

工程,有不止一個進程重置MemAddr,但作爲重置是0我認爲這不會有問題。感謝和解決:9 – 0Zero0

+1

認爲硬件。每個進程都會生成一個單獨的硬件塊,如果多個驅動器MemAddr一起短路了它們的輸出,那麼'0x00'告訴你,這不是一件好事。 –

0

在進程外分配信號時,將字面連接到箭頭的右側。 在同步過程中分配信號時,您可以實現觸發器爲時鐘沿上的信號分配一個值。

對你而言,我建議你在你的過程中放入if_CounterSum <= MemAddr + 4;。這樣,增量將在每個時鐘上升沿完成。

process (Clk, Reset) 
begin 
    if Reset = '1' then 
     MemAddr <= (OTHERS => '0'); 
    elsif rising_edge(Clk) then 
     MemAddr <= MemAddr + 4; 
    end if; 
end process; 

如果你真的需要if_CounterSum您可以添加if_CounterSum <= MemAddr進程外的這個時候(因爲這將是有線)。

+0

我也試過,它不起作用,不是因爲它本身,因爲另一項任務正在摧毀其餘的。無論如何,謝謝你! – 0Zero0