我有这个VHDL代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity addDecoder is
port(addrInput : in real;
ROM_sel_n, RAM_sel_n, PIO_sel_n, SIO_sel_n, INT_sel_n : out bit);
end addDecoder;
architecture Behavioral of addDecoder is
begin
AddSelect : process(addrInput) is
begin
if(addrInput <= X'3FFF') then
ROM_sel_n <= '1';
elsif(addrInput > X'3FFF' and addrInput <= X'5FFF') then
RAM_sel_n <= '1';
elsif(addrInput > X'5FFF' and addrInput <= X'8FFF') then
PIO_sel_n <= '1';
elsif(addrInput > X'8FFF' and addrInput <= X'9FFF') then
SIO_sel_n <= '1';
elsif(addrInput > X'9FFF' and addrInput <= X'FFFF') then
INT_sel_n <= '1';
end process AddSelect;
end Behavioral;
它有什么问题。我在比较十六进制值时遇到错误。我没有这样做吗?错误是这样的:解析错误,意外的INTEGER_LITERAL,期待OPENPAR或IDENTIFIER
答案 0 :(得分:4)
多种语法错误。
位字符串文字应该用双引号括起来:X"0000"
,而不是单引号X'0000'
。
您忘记关闭if语句:end if;
另外,我建议您使用use ieee.numeric_std.all;
而不是非标准库STD_LOGIC_ARITH和STD_LOGIC_UNSIGNED。
答案 1 :(得分:4)
正如Philippe已经说过的,不要使用std_logic_arith / unsigned。使用numeric_std
。 I've written about why...
如果您想继续与向量进行比较(以及在值周围使用"
而不是'
),您应该使addrInput
成为unsigned
向量。
if addrInput < X"1FFF" then
或者将其设为natural
并与整数值进行比较:
if addrInput < 8191 then
此外,当您使用elsif
时,您可以简化语句:
if addrInput <= X"3FFF" then
ROM_sel_n <= '1';
elsif addrInput <= X"5FFF" then
RAM_sel_n <= '1';
-- etc
最后,将()
s放在if
条件周围,它会让你看起来像一个C程序员:)