VHDL多路复用器实现?

Posted

技术标签:

【中文标题】VHDL多路复用器实现?【英文标题】:VHDL mux implementation? 【发布时间】:2011-04-10 04:13:11 【问题描述】:

是否可以实现具有多个控制信号的多路复用器?例如,我想做这样的事情:

with (sig1 & sig2) select  
output <= A when "00",  
B when "01",  
C when "10",  
D when "11",  
'0' when others;  

我知道我可以将它们分配给一个新信号并使用它,但如果可能的话,我想避免这种情况。

【问题讨论】:

你能解释一下为什么这是一个 MUX 吗?看起来已经实现了逻辑异或的行为。 这只是一个一般的例子。对于具有两个以上信号的更复杂的事物,更难弄清楚逻辑方程的含义。 【参考方案1】:

您需要在编译器上启用 VHDL2008 模式才能使其工作。

另一种选择(也是 2008 年):

muxing: process (sig1, sig2) is
begin  -- process muxing
    case sig1 & sig2 is
        when "00" => output <= '1';
        when "01" => output <= '0';
        when "10" => output <= '0';
        when "11" => output <= '1';
        when others => output <= '0';
    end case;
end process muxing;

如果您的编译器上没有 VHDL-2008 模式,它将失败并抱怨

Array type case expression must be of a locally static subtype.

或类似的。

如果您的编译器不能与 VHDL-2008 兼容,您必须通过创建一个类型来解决此问题,该类型可用于包围 sig1 &amp; sig2 以明确告诉编译器发生了什么:

subtype twobits is bit_vector(0 to 1);

然后:

with twobits'(sig1 & sig2) select  
    output <= '1' when "00",  
    -- etc.

或:

case twobits'(sig1 & sig2) is
     when "00" =>  -- etc.

【讨论】:

您好,感谢您的回复,但是您所说的“创建类型”是什么意思?我收到此错误:“中缀表达式中的类型不明确;ieee.std_logic_1164.std_ulogic_vector 或 ieee.std_logic_1164.std_logic_vector。在预期非数组类型(错误)的位置找到字符串文字。”对不起格式,这里是新的。另外,有没有一种纯粹的数据流方式来做到这一点? @Jonathan D:已更新以回答这些问题。如果您想要数据流,您应该能够保留原始代码。对于听起来像另一个问题的“中缀表达式中的歧义类型”,请发布一个新问题【参考方案2】:

看看这个,也许对你有帮助

entity MUX is
  port ( a, i0, i1 : in bit;
         o : out bit );
end MUX;

architecture behave of MUX is
begin
  process ( a, i0, i1 ) begin
    if  a = '1'  then
      o <= i1;
    else
      o <= i0;
    end if;
end process;
end behave;

【讨论】:

以上是关于VHDL多路复用器实现?的主要内容,如果未能解决你的问题,请参考以下文章

VHDL 多路复用和两个输出

VHDL:11 条总线之间的多路复用器 8 位宽输出

VHDL组件多路复用器不在modelsim中返回值

VHDL:当涉及时钟信号时,多路复用器输出不跟随输入

IO多路复用, 基于IO多路复用+socket实现并发请求(一个线程100个请求), 协程

IO多路复用/基于IO多路复用+socket实现并发请求/协程