首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用VHDL对偶/奇元素进行切片

用VHDL对偶/奇元素进行切片
EN

Stack Overflow用户
提问于 2017-07-03 01:14:09
回答 3查看 1.1K关注 0票数 0

我正在尝试实现一个多级多路复用器,它在每一级选择输入信号的偶数/奇数行。例如,假设我有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,则第一级传递一个(0) a(2) a(4) a(6),否则它传递奇数元素a(1) a(3) a(5) a(7)。为此,我尝试将输入信号分成奇数和偶数元素,如下所示:

代码语言:javascript
运行
复制
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)。有没有人对如何做到这一点有什么建议?

EN

回答 3

Stack Overflow用户

发布于 2017-07-03 01:25:13

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

票数 0
EN

Stack Overflow用户

发布于 2017-07-03 05:13:38

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-07-03 19:36:13

所以你需要一个多路复用器。实际上是一个数组。您可以使用generate编写并发循环语句。示例:

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44873308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档