VHDL:组合逻辑中{std_logic_vector的等同性

时间:2016-04-20 10:16:52

标签: vhdl

我试图写出我认为是一些简单的组合逻辑方程式。它是由CPLD执行地址解码。 所以我有一个地址总线:a: std_logic_vector(15 downto 0)并且想要测试特定但部分(IO)的地址。 (mytemp是std_logic的信号)

mytemp <= a(11 downto 2) == "1111111111";

不会飞,我不明白为什么。我一直在寻找示例,但我尝试的所有内容都不起作用并且会出现语法错误。

我在这里做错了什么?

编辑:'=='我在互联网上的某个地方看到了,但应该是'='。

4 个答案:

答案 0 :(得分:2)

为了澄清Brian的观点,让我们说你有一个像这样的组件:

entity cpld is
  port
  (
    ...
    a : in std_logic_vector(15 downto 0);
    ...
    nIOREQ : out std_logic;
    ...
  );
end entity cpld;

现在,如何使用a的子范围设置nIOREQ?让我数一下方法:

architecture rtl of cpld is
  signal mytemp : boolean;
  signal mytemp2 : std_logic;
begin
  -- One way, using a boolean intermediate
  mytemp <= a(11 downto 2) = "1111111111";
  nIOREQ <= '0' when mytemp else '1';

  -- Another way, using a std_logic intermediate
  mytemp2 <= '1' when a(11 downto 2) = "1111111111" else '0';
  nIOREQ <= not(mytemp2);

  -- Another way deriving it directly
  nIOREQ <= '0' when a(11 downto 2) = "1111111111" else '1';

  -- Another way to derive directly
  with a(11 downto 2) select
    nIOREQ <= '0' when "1111111111",
              '1' when others;

  -- Another direct method, using VHDL-2008's and reduction operator
  nIOREQ <= not(and a(11 downto 2));
end architecture rtl;

很多的方法可以做到这一点。我还没有接近这些方法。

希望这有帮助。

答案 1 :(得分:0)

由于mytemp是std_logic_vector,你需要一个if语句来检查地址:

if a(11 downto 2) = "1111111111" then
  mytemp <= '1';
else
  mytemp <= '0';
end if;

以上代码需要在进程内部。如果你想要一个简单的组合语句,那么使用:

mytemp <= '1' when a(11 downto 2) = "1111111111" else '0';

答案 2 :(得分:0)

Renato的另一个选择是:

with a(11 downto 2) select
  mytemp <= '1' when "1111111111",
            '0' when others;

我更喜欢将这种类型的构造用于更复杂的表达式,因为当不需要或没有优先级编码器时,你不会冒优先级编码器的风险。

答案 3 :(得分:0)

在VHDL-2008中,当输入为std_logic_vector时,使用匹配的关系运算符,因为它们返回std_logic:

mytemp <= a(11 downto 2) ?= "1111111111";

此外,由于您所比较的所有值均为“1”,因此您还可以使用以下(也是VHDL-2008):

mytemp <= and a(11 downto 2) ;