在VHDL中切割偶数/奇数元素

时间:2017-07-02 17:14:09

标签: vhdl slice

我正在尝试实现一个多级多路复用器,它在每个级选择输入信号的偶数/奇数行。让我们假设我有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)]。为此,我试图将输入信号切片为奇数和偶数元素,如下所示:

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在写入前一代码时在level0切片时给出了错误“非法并发语句”。问题是:是否有更优雅和紧凑的方法来切割向量的偶数/奇数元素?

另外,我试图以参数方式编写代码以将其用于更大的输入向量,但我不知道如何做,因为我需要声明临时向量(levelxodd / even)一个人。有没有人对如何做到这一点有任何建议?

3 个答案:

答案 0 :(得分:0)

这原则上是一个很好的解决方案。但是...... for循环是一个顺序语句 - 它需要在进程中。并使其参数化可以找到有关VHDL 泛型和/或数组属性的信息。

答案 1 :(得分: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;

答案 2 :(得分: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;