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

Slice even/odd elements in VHDL

提问人:Ryuzaky 提问时间:7/3/2017 最后编辑:xhienneRyuzaky 更新时间:2/16/2021 访问量:1493

问:

我正在尝试实现一个多级多路复用器,该多路复用器在每个阶段选择输入信号的偶数/奇数线。例如,假设我有 8 个输入 [a(0), a(2), a(3), a(4), a(5) a(6), a(7)] 和 3 个输入信号 [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)。有人对如何做到这一点有任何建议吗?

VHDL Slice Multisim

评论

0赞 7/3/2017
您的代码不是一个最小、完整和可验证的示例,存在语法错误,而不仅仅是 [...],循环语句是进程语句或子程序中的顺序语句。请注意,这两个答案都来自那些知道这一点的人,没有人证明他们的解决方案有效。
0赞 JHBonarius 7/3/2017
temp1 <= [...] "----" when others;.你想实现什么,你正在使用“不在乎”?顺便说一句,“0”->“0”。第一是,第二。std_logic_vectorstd_logic
0赞 JHBonarius 7/3/2017
附言你问了两个问题,答案会完全不同。恕我直言,最好将它们分开。但是,为什么要在VHDL中构建整个多路复用器树呢?你知道它在FPGA中的实现会完全不同吗?

答:

0赞 Matthew Taylor 7/3/2017 #1

原则上,这是一个很好的解决方案。但。。。for 循环是一个顺序语句 - 它需要位于进程内部。为了使其可参数化,请了解 VHDL 泛型和/或数组属性

评论

0赞 Matthew Taylor 7/3/2017
我本可以更广阔,但在空闲的时刻用手机接听了。
0赞 Paebbels 7/3/2017 #2

您可以编写一个函数来创建元素选择:

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赞 JHBonarius 7/3/2017 #3

所以你需要一个多路复用器。实际上是一个数组。您可以使用 编写并发循环语句。例: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;