2012-10-05 34 views
2

在VHDL Testcase上运行modelsim时出现以上错误,我无法理解它为什么是错误。转换函数“To_bit”必须只有一个形式参数

测试用例:

LIBRARY IEEE; 
Use ieee.std_logic_1164.all; 

entity a is 
port (in11 : in std_logic 
); 
end a; 

架构一个的是:

component b_1 
port (in1 : in bit); 
end component; 


begin 
    inst : b_1 port map (in1=> **to_Bit**(in11)); 
end a; 

回答

4

这是一个ModelSim的错误,其实它应该报告你不能在一个端口来使用这个功能实际地图,这个作品:

LIBRARY IEEE; Use ieee.std_logic_1164.all; 

entity a is port (in11 : in std_logic); end a; 

architecture a of a is 
signal inBit : Bit; 
component b_1 port (in1 : in bit); end component; 

begin 
inBit <= to_bit(in11); 
inst : b_1 port map (in1=> inBit); end a; 

有限制,适用于实际港口地图,比较vhdlref:

实际的,如果端口或信号必须用静态名称 (见6.1)表示。实际的,如果一个表达式必须是全局静态的 表达式(见7.4)。

的事情是,这两种情况下应该是全局静态...

+0

如果我在包中编写一个包装函数来“to_bit”,然后如果我使用该函数,那么它就可以工作。 '代码 程序包: 程序包mgc_package为 函数mgc_to_Bit(p:std_ulogic)返回位; 封装; 包体mgc_package是 函数mgc_to_Bit(p:std_ulogic)返回位是 begin return to_bit(p); 结束; 封装体; VHDL案例: 图书馆工作; use work.mgc_package.all; 架构的是 .... 开始 研究所:B端口映射(IN11 => mgc_to_Bit(IN1)); end a; end a; ' 如果我能够在portmap中使用实际的函数,那么为什么我不能使用“to_bit”函数本身? – Dharmendra

+0

to_bit在标准包中定义,所以实际上它是相同的情况...不知道为什么应该起作用 – BennyBarns

+0

Christian U.答案说明了为什么转换函数可以工作。参见4.3.3.2关联列表*转换函数*(2007年的6.5.7.1),问题是在-2008(6.5.6.3端口子句)中通过将隐式声明的信号与正式的表达式值的并发赋值的目标(例如,针对返回类型标记的全局静态子类型的函数调用)。 – user1155120

1

VHDL-93允许类型转换和转换功能的关联列表。 转换函数是一个只有一个参数的函数的特例。

让我们看的to_bit声明:

function to_bit(s : std_ulogic; xmap : bit := '0') return bit; 

虽然to_bit(s)看起来像一个有效的转换功能,它不是,因为声明包含两个参数。 当is_x(s)为真时,将使用第二个参数xmap作为结果。

这是不是 ModelSim的错误,但也许错误信息有点神秘。 ModelSim认为to_bit是一个转换函数,但拒绝使用它,因为它有第二个参数,因此不是有效的转换函数。

一个简单的包装功能,可以解决这一问题:

function to_bit(s : std_ulogic) return bit is 
begin 
     return to_bit(s, '0'); 
end; 

注意函数也可以有名字to_bit,因为VHDL支持函数重载。在包std_logic_1164中有这个很好。

+0

xmap参数支持建模不同的逻辑铁路系统。参见IEEE Std 1076-2008 6.5.6.3端口子句,它使用隐式声明的信号为**形式中的模式**提供非静态表达式(例如,具有多个参数的函数调用)的使用,分配的目标该表达式与实际相关联(就像你明确做的那样)。尽管寻找综合支持可能会有问题,但您的问题已被归纳。这通常不是-2002至-2008工具实施的高优先级。 – user1155120

相关问题