Vhdl 为什么**警告:数字标准到整数:检测到元值,返回0?

Vhdl 为什么**警告:数字标准到整数:检测到元值,返回0?,vhdl,modelsim,Vhdl,Modelsim,Modelsim为什么抱怨组件实例化i1 时间:0 ps迭代:1个实例:/vhdl2\u uppgift\u 1\u额外\u vhd\u tst/i1 **警告:数字标准到整数:检测到元值,返回0 ieee库; 使用ieee.std_logic_1164.all; 使用ieee.numeric_std.all; 图书馆工作; --外接程序do文件 --设置stdarithnowarning 1 ---运行0 ns; ---将StDarithNoWarning设置为0 ---运行20ms; 实体v

Modelsim为什么抱怨组件实例化i1

时间:0 ps迭代:1个实例:/vhdl2\u uppgift\u 1\u额外\u vhd\u tst/i1
**警告:数字标准到整数:检测到元值,返回0

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
图书馆工作;
--外接程序do文件
--设置stdarithnowarning 1
---运行0 ns;
---将StDarithNoWarning设置为0
---运行20ms;
实体vhdl2\u upplift\u 1\u extra\u vhd\u tst为
结束vhdl2\u升级\u 1\u额外的vhd\u tst;
vhdl2\u uppgift\u 1\u额外的架构vhdl2\u uppgift\u额外的架构vhd\u tst是
--常数
恒定系统时钟周期:时间=20纳秒;
--信号
信号时钟_50:标准_逻辑;
信号键:标准逻辑向量(2到0);
信号复位:标准逻辑;
信号VGA_B:STD_逻辑_矢量(7到0);
信号VGA_BLANK_N:标准逻辑;
信号VGA_时钟:标准逻辑;
信号VGA:STD逻辑向量(7到0);
信号VGA_HS:STD_逻辑;
信号VGA\u R:标准逻辑向量(7到0);
信号VGA_VS:STD_逻辑;
信号x:STD_逻辑_向量(9到0);
信号y:标准逻辑向量(9到0);
组件vhdl2\u升级礼物\u 1\u额外
港口(
时钟50:在标准逻辑中;
键:标准逻辑向量(2到0);
复位n:在标准逻辑中;
VGA_B:缓冲区标准逻辑向量(7到0);
VGA_BLANK_N:缓冲区标准逻辑;
VGA_时钟:缓冲区标准_逻辑;
VGA_G:缓冲器标准逻辑向量(7到0);
VGA_HS:缓冲区标准逻辑;
VGA_R:缓冲区标准逻辑向量(7到0);
VGA_VS:缓冲区标准逻辑;
x:缓冲器标准逻辑向量(9到0);
y:缓冲器标准逻辑向量(9到0)
);
端部元件;
开始
i1:vhdl2\u礼物\u 1\u额外
港口地图(
--列出主端口和信号之间的连接
时钟50=>时钟50,
KEY=>KEY,
重置\u n=>重置\u n,
VGA_B=>VGA_B,
VGA_BLANK_N=>VGA_BLANK_N,
VGA_-CLK=>VGA_-CLK,
VGA_G=>VGA_G,
VGA_HS=>VGA_HS,
VGA_R=>VGA_R,
VGA_VS=>VGA_VS,
x=>x,
y=>y
);
时钟:进程
--变量声明
开始

时钟50警告并不总是一个问题,例如在这种情况下。代码可能会模拟和合成等等

在这种情况下,之所以会出现警告,是因为
numeric\u std.to\u integer()
正在获取所谓的元值,这意味着它是一个无法转换为整数的输入。例如
'X'
'U'

如果您不希望收到错误消息,可以按照user1155120在注释中的描述执行:

…在modelsim.ini中取消注释或设置
NumericStdNoWarnings=1

他还描述了IEEE1076标准允许修改数字_std包,如IEEE1076-2008中所述:

16.8.5.2允许的修改 符合本标准的工具供应商不得修改包装声明。[...] NUMERIC_BIT和NUMERIC_STD包的包体声明一个名为NO_WARNING的常量,该常量的值为FALSE。用户可以将NO_WARNING设置为TRUE,并重新分析包体,以抑制调用这些包中的函数生成的警告消息。[…]

另一种选择是为
x
y
使用中间变量,并使用函数
is_x()
来检测和防止元值。然而,我不确定它是否能正确合成。例如:

x_nometa <= (others=>'0') when Is_X(x) else x;
x_nometa'0')何时是_x(x)else x;

我在代码中注意到的另一件事是,您使用了
缓冲区
类型的端口。你最好不要用那些。例如,FPGA供应商不适当地支持它们。例如。有很多方法可以解决这个问题:

您可以通过为所有信号指定一个默认值来消除大多数问题

SIGNAL x           : STD_LOGIC_VECTOR(9 DOWNTO 0) := (others => '0');
在某些情况下,模拟分辨率可以从层次结构中较低的块开始,这些仍然可能是一个问题,例如,FPGA供应商的模拟模型将在时间0时看到信号的未解析值。由于不建议完全关闭警告,您可以在模拟do文件中设置:

设置数字警告1
运行0 ps
设置NumericStdNoWarnings 0


因为,在0 ns时,您正在对无效值(可能是“uuu”)执行to_integer。在重置设计之前,可能会出现一些警告,并且不会指示任何错误。但是如果你在重置后得到它们,你就有问题了。但是我正在执行重置,它应该会停止相同类型的后续警告。无法解决此问题。警告可以被抑制。IEEE标准1076-2008 16.8.5.2允许的修改第2段(部分)数字_位和数字_标准包的包体声明了一个名为“无警告”的常数,其值为FALSE。用户可以将NO_WARNING设置为TRUE,并重新分析包体,以抑制调用这些包中的函数生成的警告消息。或在modelsim.ini中取消注释或设置NumericStdNoWarnings=1。它们是由有符号或无符号中存在的元值引起的,其二进制值通常在初始化时进行计算。看看你的组件。我强烈建议不要使用
Is\X
来显式过滤元数据;它们在那里是有原因的,对于0 ns以外的任何时间,你可能真的想要生成的警告。我同意,但是TS似乎被它们弄糊涂了,想要它们消失……不完全是这样:他想要它们在0 ns消失,这不同于让它们一起消失。如果你真的想要这样的东西,我宁愿说
x_nometa'0'),当是x(x),现在=0ns,否则x(警告,我的VHDL是
SIGNAL x           : STD_LOGIC_VECTOR(9 DOWNTO 0) := (others => '0');