VHDL:如何缩短32位表达式?

时间:2014-11-21 10:06:59

标签: vhdl

我有以下表达式,并希望将其缩短为较短的表达式。

任何人都可以帮助我吗?

architecture behavioral of mux4 is
begin
    with sel select
        y <= "a" when "00",
             "b" when "01",
             "c" when "10",
             "d" when "11",
             "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" when others;
end architecture behavioral

我想避免写32次角色X. 我知道它可以被另一个表达式替换,但我无法记住。

3 个答案:

答案 0 :(得分:2)

要缩短默认表达式,通常(others => 'X')会在所有未指定的成员中创建一个X的值(此处为所有成员,因为您尚未明确指定任何位。

architecture behavioral of mux4 is
begin
    with sel select
        y <= "a" when "00",
             "b" when "01",
             "c" when "10",
             "d" when "11",
             (others => 'X') when others;
end architecture behavioral;

注意:有些情况下VHDL无法从上下文中确定表达式的大小,因此这不会一直有效。还有另一种选择:因为很明显您希望该值与y的大小相同,所以您可以使用'X'非常轻松地创建一个充满'range的值属性,如:

    with sel select
        y <= "a" when "00",
             (y'range => 'X') when others;

答案 1 :(得分:1)

我仍然缺少一些背景来完全理解你正在做什么,但你可以分配&#34;其他人&#34;像这样:

architecture a of mux_example is
  signal y: std_logic_vector(31 downto 0);
  signal sel: std_logic;
begin
  y<=x"1234ABCD" when sel='1' else (others=>'X');
end architecture ; 

有什么好处吗?

答案 2 :(得分:0)

为了填充知道长度的'X',然后(如用户3065349指出)可以使用:

(others => 'X')  -- All elements with 'X'

为了生成具有特定长度和值的std_logic_vector,可以使用限定表达式,如:

std_logic_vector'(0 to 31 => 'X')  -- 32 times 'X'

对于其他用途,甚至可以在不同的位置给出不同的值:

std_logic_vector'(0 to 2 => 'X', 3 to 5 => 'Z', 6 to 8 => 'W')  -- "XXXZZZWWW"