我试图写出我认为是一些简单的组合逻辑方程式。它是由CPLD执行地址解码。
所以我有一个地址总线:a: std_logic_vector(15 downto 0)
并且想要测试特定但部分(IO)的地址。 (mytemp是std_logic的信号)
mytemp <= a(11 downto 2) == "1111111111";
不会飞,我不明白为什么。我一直在寻找示例,但我尝试的所有内容都不起作用并且会出现语法错误。
我在这里做错了什么?
编辑:'=='我在互联网上的某个地方看到了,但应该是'='。答案 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) ;