【问题标题】:Multiplexer on VHDLVHDL 上的多路复用器
【发布时间】:2014-10-13 16:05:02
【问题描述】:

我尝试创建多路复用器:

LIBRARY ieee;
USE ieee.std_logic_1164.all;


--  Entity Declaration

ENTITY multiplekser IS
-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
PORT
(
U : IN STD_LOGIC_VECTOR(2 downto 0);
V : IN STD_LOGIC_VECTOR(2 downto 0);
W : IN STD_LOGIC_VECTOR(2 downto 0);
X : IN STD_LOGIC_VECTOR(2 downto 0);
Y : IN STD_LOGIC_VECTOR(2 downto 0);
S : IN STD_LOGIC_VECTOR(2 downto 0);
CS : IN STD_LOGIC;
M : OUT STD_LOGIC_VECTOR(2 downto 0)
);
-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

END multiplekser;


--  Architecture Body

ARCHITECTURE multiplekser_architecture OF multiplekser IS


BEGIN
    PROCESS(CS)
    BEGIN
    if (CS = '1') then
        with S select
            M<=U when "000",
                V when "001",
                W when "010",
                X when "011",
                Y when others;
    else 
        M<="ZZZ";
    end if;
    END PROCESS;
END multiplekser_architecture;

但出现了一些错误:

我是在 Quartus II 64 位上完成的。这是我的框图:

CS 为使能信号。当 CS 为 0 时,M(output) 必须为高阻抗。

【问题讨论】:

  • 您的“With S select”看起来有问题。 (编辑:看到有人已经发布了更正)。

标签: vhdl fpga hdl intel-fpga quartus


【解决方案1】:

您正在使用并发语句,其中需要顺序语句

您应该使用一个 case 语句或一组 if 语句。例如:

architecture multiplekser_architecture of multiplekser is
begin
    process(cs, s, u, v, w, x, y)
    begin
        if cs = '1' then
            case S is
                when "000"  => m <= u;
                when "001"  => m <= v;
                when "010"  => m <= w;
                when "011"  => m <= x;
                when others => m <= y;
            end case;
        else
            m <= "ZZZ";
        end if;
    end process;
end architecture;

【讨论】:

  • 如果语言设置为 VHDL-2008(ModelSim 编译得很好),则支持 OP 的代码 应该,但我尝试使用 13.0(最近但不可否认不是最新版本),而且似乎 Altera 的 2008 合规性落后了。
  • @fru1tbat:啊。我的回复基于 VHDL 2002。感谢您收集额外的信息。
  • @Kulis:您是否尝试将语言设置为 2008 年?发生了什么?
  • 我只有 13.1 版。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多