基本上,我见过的每个VHDL文件都有一个类似的标题:
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
这似乎将相关库的全部内容分散到当前的命名空间模拟中(无论VHDL如何调用它,它在VHDL手册中似乎没有明确的名称,或者我在阅读错了)。
有没有办法不只是将所有内容都放到当前的命名空间中?
删除.all
后缀似乎部分有用(类型必须由它们的完整路径指定),但它似乎打破了相关类型完成的所有操作符重载。
答案 0 :(得分:2)
只需扩展评论,您只需从.all
子句中删除use
,然后只导入您需要的内容。
如果包含运算符和文字,编译器会告诉你缺少的内容......
ghdl -a test_qualified.vhd
test_qualified.vhd:14:10:没有操作符“not”的函数声明
test_qualified.vhd:15:10:无法将字符文字'0'与std_ulogic类型匹配
test_qualified.vhd:15:21:运算符“=”的函数声明没有 test_qualified.vhd:15:30:无法将字符文字'1'与std_ulogic类型匹配
ghdl:编译错误
只需导入它们。
library ieee;
use ieee.std_logic_1164;
use ieee.std_logic_1164."not";
use ieee.std_logic_1164."=";
use ieee.std_logic_1164.'0';
-- use ieee.std_logic_1164.'1';
entity test_qualified is
end test_qualified;
architecture test of test_qualified is
signal a,b,c : ieee.std_logic_1164.std_logic;
begin
a <= not b;
c <= '0' when a = b else ieee.std_logic_1164.'1';
end test;
显然,没有多少人认为他们需要对命名空间进行这种级别的控制。但这是有可能的。
如果我发现自己在不同的编译单元中重复这个精细控制,我将学习VHDL-2008的context
关键字,并声明一个特定于我的应用程序的context
。