我想實現一個多級多路複用器,在每個級選擇輸入信號的偶數/奇數行。假設例如我有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)逐個。有沒有人有任何建議如何做到這一點?
您的代碼不是[最小,完整且可驗證的示例](https://stackoverflow.com/help/mcve)存在語法錯誤,而不僅僅是[...]循環語句是進程語句或子程序中的順序語句。注意兩個答案都來自那些知道的人,沒有人證明他們的解決方案有效。 – user1155120
'temp1 <= [...]「----」當其他人;'。你想達到什麼目的,你使用'不關心'?順便說一下「0」 - >「0」。第一個是'std_logic_vector',第二個'std_logic'。 – JHBonarius
P.s.你提出了兩個問題,這些問題會有完全不同的答案。更好地分離他們恕我直言。 但是你爲什麼要用VHDL構建整個多路複用器樹?你知道它將在FPGA中完全不同嗎? – JHBonarius