2014-09-03 77 views
0

我有一個組件,我想有2個實例化,我想每隔一個時鐘週期交替發送/接收數據。事情是這樣的:VHDL。組件之間每隔一個時鐘週期交替

component piece is 
    port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : in std_logic_vector(7 downto 0); 
    d : in std_logic_vector(7 downto 0) 
); 
end component; 

piece_0 : if clk='0' generate 
    U_0: piece 
    port map(
     clk => clk, 
     a => a, 
     b => b, 
     c => c, 
     d => d 
    ); 
end generate; 

piece_1 : if clk='1' generate 
    U_1: piece 
    port map(
     clk => clk, 
     a => a, 
     b => b, 
     c => c, 
     d => d 
    ); 
end generate; 

我編譯時收到警告。
當我合成它崩潰...

關於如何實現這一點的任何想法?

謝謝!

+0

你的'piece'應該沒有輸出嗎?你想在時鐘低電平時運行一位代碼,而另一個時鐘處於高位(所謂的雙倍數據速率) - 這就是你的僞代碼的樣子。或者在另一個時鐘刻度上,這是你的文字說的...? – 2014-09-04 16:00:59

回答

1

A generate語句在編譯期間被評估,所以信號的值沒有相關性。它用於實例化代碼塊,可以選擇性地(在if ... generate的情況下)根據一些靜態值(例如常量或通用值)或循環(在for ... generate的情況下),對於同一個塊的重複實例的代碼。

您正試圖使用​​它來控制運行時的行爲,這是無效的。你想要的是實例化這兩個組件並用多路複用器選擇輸出。當你的piece組件沒有產出,這是一個有點難以提供直接適用於你的問題的一些代碼,但一般:

U_0 : piece 
    port map (
    clk => clk, 
    a => a, 
    ... 
    q => q0 
); 

U_1 : piece 
    port map (
    clk => clk, 
    a => a, 
    ... 
    q => q1 
); 

q_muxed <= q0 when clk = '0' else q1; 

我已經寫了使用簡單的併發聲明覆用,但也有其他方法來做到這一點。您也可以考慮使用clk以外的信號作爲您的選擇/開關。在大多數設備中,在邏輯操作中使用clk可能會產生不良後果,如果它工作的話。

+1

@ user1993270:如果意圖是從設備實現雙倍數據速率(DDR)輸出,其中輸出值與時鐘的高值和低值不同,那麼您應該查看專用DDR輸出元件目標技術,例如所選擇的FPGA,因爲這將確保它由綜合工具正確實施。 – 2014-09-03 16:15:07

+0

OP表示「每隔一個週期」...不交替時鐘邊沿。介意你的代碼意味着不同! – 2014-09-04 16:02:27