怎么能不在VHDL中使用`using namespace std;`eqivalent?

时间:2016-08-09 19:40:37

标签: vhdl

基本上,我见过的每个VHDL文件都有一个类似的标题:

library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;

这似乎将相关库的全部内容分散到当前的命名空间模拟中(无论VHDL如何调用它,它在VHDL手册中似乎没有明确的名称,或者我在阅读错了)。

有没有办法只是将所有内容都放到当前的命名空间中?

删除.all后缀似乎部分有用(类型必须由它们的完整路径指定),但它似乎打破了相关类型完成的所有操作符重载。

1 个答案:

答案 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