VHDL:条件信号分配的简明表达

Max*_*nov 1 syntax vhdl

以下代码是4:1多路复用器.如果dis信号为"1",则所有输出引脚上的输出应为0.是否有一种简洁的方式来表明如果dis为高,则输出应该为0,无论如何sel,而不必通过每个组合进行置换sel

我知道在某些情况下,如果条件赋值不明确,则可能会出现意外的锁存器生成以及其他不希望的副作用.

architecture dataflow of mux8_4 is
begin
    q <=d0 when sel = "00" and dis = '0' else
        d1 when sel = "01" and dis = '0' else
        d2 when sel = "10" and dis = '0' else
        d3 when sel = "11" and dis = '0' else
        "00000000" when sel = "00" and dis = '1' else
        "00000000" when sel = "01" and dis = '1' else
        "00000000" when sel = "10" and dis = '1' else
        "00000000" when sel = "11" and dis = '1';
end architecture dataflow;
Run Code Online (Sandbox Code Playgroud)

我的尝试(我理解遗漏所有可能的陈述是不好的做法,但是)

architecture dataflow of mux8_4 is
begin
    q <=    "00000000" when dis = '1' else
        d0 when sel = "00" and dis = '0' else
        d1 when sel = "01" and dis = '0' else
        d2 when sel = "10" and dis = '0' else
        d3 when sel = "11" and dis = '0';
end architecture dataflow;
Run Code Online (Sandbox Code Playgroud)

use*_*120 6

还选择了信号分配:

architecture foo of mux8_4 is
    subtype choice_type is std_logic_vector (2 downto 0);
begin
    with choice_type'(dis & sel) select
        q <= d0          when "000",
             d1          when "001",
             d2          when "010",
             d3          when "011",
             "00000000"  when others;
end architecture;
Run Code Online (Sandbox Code Playgroud)

case表达式可以是具有类型标记的限定表达式,该类型标记具有局部静态子类型.

参见IEEE Std 1076-1993 9.5.2选择的信号分配,8.8案例陈述或IEEE Std 1076-2008 11.6并发信号分配陈述,10.5.4选定的信号分配陈述,10.9案例陈述.

此(和您的)并发信号赋值语句具有包含等效顺序信号赋值语句的等效进程.条件和选定的信号赋值语句都允许作为-2008中的顺序语句.所选信号分配有一个等效的案例陈述.

仅为dis和select提供二进制值可用于合成,其中弱值"H"和"L"分别映射到强值"1"和"0".对于模拟,您可以使用转换函数来确保dis和sel表示二进制值,如果它们可以具有弱值.

如果您的四个多路复用数据输入可以表示为数组值,那么您可以更紧凑地描述多路复用器:

architecture fum of mux8_4 is
    type mux4 is array (0 to 3) of std_logic_vector(7 downto 0);
    use ieee.numeric_std.all;
    signal mux:      mux4;
begin
    mux <= (d0, d1, d2, d3);
    q <= mux(to_integer(unsigned(sel))) when dis = '0' else (others => '0');

end architecture;
Run Code Online (Sandbox Code Playgroud)

索引名称需要具有本地静态名称的数组对象,因此在声明分配了mux4类型的聚合值的数组对象(mux)时使用类型声明.

之后,当条件信号赋值中dis ='0'时,我们可以使用从sel转换为自然的索引作为索引,其中else值为全'0'.

这两种架构都在分析.如果您提供了一个包含实体声明和测试平台的Minimal,Complete和Veriable示例,则可以对它们进行详细说明和模拟,从而演示功能.(他们都用增加的实体声明进行分析).

如果您的sel信号是受约束的整数子类型,则索引名称索引将更加紧凑和可读.在包numeric_std中找到的to_integer转换函数将表示二进制值的弱级别映射到strong,并在sel包含元值元素值(将映射到'0')时生成警告.