2017-07-02 59 views
0

我想實現一個多級多路複用器,在每個級選擇輸入信號的偶數/奇數行。假設例如我有8個輸入[a(0)a(2)a(3)a(4)a(5)a(6)a(7)]和三個輸入信號[s(0)s(1 )s(2)]。複用器的行爲應該如下:如果s(0)= 0,則第一階段通過[a(0)a(2)a(4)a(6)],否則它會通過奇數元素[a(1)a 3)a(5)a(7)]。要做到這一點,我想輸入的信號切成奇數和偶數元素是這樣的:在VHDL中切片偶/奇元素

entity mux is 
port(
    s  : in std_logic_vector(0 to 3); 
    vline : in std_logic_vector(0 to 8); 
    output : out std_logic 
    ); 
end mux; 

architecture multistage of mux32 is 

signal level0even : std_logic_vector(0 to 3); 
signal level0odd : std_logic_vector(0 to 3); 
signal temp0  : std_logic_vector(0 to 3); 
signal level1even : std_logic_vector(0 to 1); 
signal level1odd : std_logic_vector(0 to 1); 
signal temp1  : std_logic_vector(0 to 1); 
signal level2even : std_logic; 
signal level2odd : std_logic; 
signal temp2  : std_logic; 

begin 
    -- Slicing level0 
    for k in 0 to 3 loop 
     level0even(k) <= vline(2*k); 
     level0odd(k) <= vline(2*k+1); 
    end loop; 

with s(0) select 
    temp0 <= level0even when "0", 
      level0odd when "1", 
      "----" when others; 

    -- Slicing level1 
    for k in 0 to 1 loop 
     level1even(k) <= temp0(2*k); 
     level1odd(k) <= temp0(2*k+1); 
    end loop; 

with s(1) select 
    temp1 <= level1even when "0", 
      level1odd when "1", 
      "----" when others; 

[...] 

end multistage; 

可是我在寫前面的代碼時的Multisim給我的錯誤「非法併發聲明」,在0級切片。問題是:是否有一種更加優雅和緊湊的方式來分割矢量的奇偶元素?我試圖以參數化的方式編寫代碼來使用它來獲得更大的輸入矢量,但我不知道該怎麼做,因爲我需要聲明臨時矢量(levelxodd/even)逐個。有沒有人有任何建議如何做到這一點?

+0

您的代碼不是[最小,完整且可驗證的示例](https://stackoverflow.com/help/mcve)存在語法錯誤,而不僅僅是[...]循環語句是進程語句或子程序中的順序語句。注意兩個答案都來自那些知道的人,沒有人證明他們的解決方案有效。 – user1155120

+0

'temp1 <= [...]「----」當其他人;'。你想達到什麼目的,你使用'不關心'?順便說一下「0」 - >「0」。第一個是'std_logic_vector',第二個'std_logic'。 – JHBonarius

+0

P.s.你提出了兩個問題,這些問題會有完全不同的答案。更好地分離他們恕我直言。 但是你爲什麼要用VHDL構建整個多路複用器樹?你知道它將在FPGA中完全不同嗎? – JHBonarius

回答

0

這原則上是一個很好的解決方案。但是... for循環是一個順序語句 - 它需要在進程內。並使其可參數化查找關於VHDL 泛型和/或數組屬性

+0

我可能會更加寬廣,但在閒置的時候已經在我的手機上回復了。 –

0

您可以編寫一個函數來創建一個選擇的元素:

function even(slv : std_logic_vector) return std_logic_vector is 
    variable temp : std_logic_vector(slv'length/2 downto 0); 
begin 
    for i in slv'range loop 
    if (i mod 2 = 0) then 
     temp(i/2) := slv(i); 
    end if; 
    end loop; 
    return temp; 
end function; 
0

,所以你需要一個多路複用器。一個數組實際上。您可以使用generate編寫併發循環語句。例如:

array_of_muxes: for k in 0 to 1 generate 
    mux_even: level1even(k) <= level0even(2*k) when s(0)='0' else level0odd(2*k); 
    mux_odd: level1odd(k) <= level0even(2*k+1) when s(0)='0' else level0odd(2*k+1); 
end generate; 
相關問題