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

时间:2017-04-02 19:30:54

标签: 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;

我的尝试(我理解遗漏所有可能的陈述是坏的 但是,练习

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;

1 个答案:

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

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;

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

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

这两种架构都在分析。如果您提供了Minimal, Complete and Veriable example实体声明和测试平台,则可以对其进行详细说明和模拟,以展示功能。 (他们都用增加的实体声明进行分析)。

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