这个VHDL代码有什么问题

时间:2011-02-08 02:28:00

标签: 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;

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

2 个答案:

答案 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_stdI'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程序员:)