这个VHDL代码有什么问题

这个VHDL代码有什么问题,vhdl,Vhdl,我有这个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;

我有这个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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体addDecoder是
端口(addrInput:实型;
ROM选择、RAM选择、PIO选择、SIO选择、INT选择:输出位);
端加解码器;
addis解码器的结构
开始
AddSelect:进程(addrInput)为
开始
if(addrInput几个语法错误

位字符串文字应使用双引号书写:
X“0000”
,而不是单引号
X'0000'

您忘记关闭if语句:
end if;


另外,我建议您
使用ieee.numeric\u std.all;
而不是非标准库std\u LOGIC\u ARITH和std\u LOGIC\u UNSIGNED。

正如Philippe已经说过的,不要使用std\u LOGIC\u ARITH/UNSIGNED。使用
numeric\u std

如果要继续与向量进行比较(以及在值周围使用
而不是
),应将
addrInput
设置为
无符号的
向量

if addrInput < X"1FFF" then
此外,在使用
elsif
时,您可以简化您的语句,从而:

if addrInput <= X"3FFF" then
    ROM_sel_n <= '1';
elsif addrInput <= X"5FFF" then
    RAM_sel_n <= '1';
-- etc

如果addrInput检查addrInput的数据类型;我怀疑您想要的是std_logic_vector,而不是real。另外,地址解码通过屏蔽位而不是整数比较来更有效地实现。谢谢,我将研究屏蔽位。@Ian:使用整数比较的地址解码将产生与位屏蔽相同的结果(假设你有一个地址映射,这个地址映射已经可以用位屏蔽有效地完成了)-合成器将做正确的事情。我更喜欢它,因为它使地址在代码中更清晰,而不是必须解释掩码。感谢所有非常有帮助的评论。是的,我来自C编程语言背景。
if addrInput <= X"3FFF" then
    ROM_sel_n <= '1';
elsif addrInput <= X"5FFF" then
    RAM_sel_n <= '1';
-- etc