以下代码是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)
还选择了信号分配:
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')时生成警告.