2012-07-02 52 views
1

我是VHDL編程FPGA的新手,我的模塊(請參閱下面的完整代碼)不起作用。VHDL when else does not work

如果用戶I/O設置基於用戶可用的寄存器(因此可以通過寄存器更改模式而無需觸摸FPGA固件),該模塊應該注意。有8個輸入引腳和8個輸出引腳,以及4種操作模式:1x8,2x8,4x8,8x8。輸出進入延遲/門控發生器模塊,然後輸出。該模塊的另一個功能是轉換32位輸入向量,實際上只分配8個引腳,並將一個值(特定於FPGA板交互)轉換爲更有意義的值。

就像現在一樣,無論clockcontrolREG的值是多少,else都捕獲與1x8模式相對應的所有(00)模式正在工作。 (我正在觀察示波器上的正確輸出),所以引腳分配沒有任何問題。它看起來像是因爲某些原因,我所有的when子句都被忽略了。

我確實將clockcontrolREG的初始值設置爲「00000011」(應將模式設置爲8x8),並且我確實訪問了寄存器並檢查了值確實存在。

我嘗試了2種不同的語法方式來描述相同的行(signalforclkgen(1)),沒有任何效果。

它看起來像我缺少一些非常基礎的東西.....但它是第三天,我坐在它上面沒有結果。感謝您提前提供的所有幫助。

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 

entity clkgencontrol is 
    port(
     clockcontrolREG : in std_logic_vector(31 downto 0); 
     signalinput  : in std_logic_vector(31 downto 0); 
     signalforclkgen : out std_logic_vector(7 downto 0) 

     ); 
end clkgencontrol; 


architecture rtl of clkgencontrol is 

begin 


    signalforclkgen(0) <= signalinput(31); 

    signalforclkgen(1) <= signalinput(15) when (clockcontrolREG(0) = '1' and clockcontrolREG(1) = '1') else 
          signalinput(31); 

    signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = "00000011") else 
          signalinput(15) when (clockcontrolREG = "00000010") else 
          signalinput(31); 

    signalforclkgen(3) <= signalinput(14) when (clockcontrolREG = "00000011") else 
          signalinput(15) when (clockcontrolREG = "00000010") else 
          signalinput(31); 

    signalforclkgen(4) <= signalinput(19) when (clockcontrolREG = "00000011") else 
          signalinput(30) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 

    signalforclkgen(5) <= signalinput(3) when (clockcontrolREG = "00000011") else 
          signalinput(30)when (clockcontrolREG = "00000010") else 
          signalinput(15)when (clockcontrolREG = "00000001") else 
          signalinput(31); 


    signalforclkgen(6) <= signalinput(18) when (clockcontrolREG = "00000011") else 
          signalinput(14) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 

    signalforclkgen(7) <= signalinput(2) when (clockcontrolREG = "00000011") else 
          signalinput(14) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 
end rtl; 
+0

我沒有確認所有WHEN子句被忽略,通過修改signalforclkgen(7)分配,通過使捕捉一切0,而不是有效信號(並且爲reg值「00000000」添加一個選項)。實際上輸出是0。 –

+0

這是什麼工具鏈編譯? –

+0

Quartus II v 11.0 Web,FPGA是Cyclone,如果多數民衆贊成你問。 –

回答

4

您是否打算在比較中使用十六進制常量?你應該得到警告,在你對不匹配的長度編譯,如果你期待的0x00000010在clockcontrolREG(b00000000_00000000_00000000_00010000)十六進制值,這將不符合你比較二進制值:bxxxxxxxx_xxxxxxxx_xxxxxxxx_00000010

嘗試使用您clockcontrolREG比較,看看是否有幫助32位十六進制常量:

signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = x"00000011") else 
        signalinput(15) when (clockcontrolREG = x"00000010") else 
        signalinput(31); 
+1

你是我的英雄查爾斯,非常感謝你,現在這幫助和幫助了魅力。編譯時沒有這樣的警告,但... –