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