将无符号(包括元值)与位模式进行比较

时间:2012-11-27 15:10:26

标签: vhdl

我正在编写一个需要将输入值与零进行比较的VHDL过程。输入可能包含元值('U','X','L','H'等),在这种情况下不应声明零。

不幸的是,ModelSim会在每次比较时发出警告:

# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
#    Time: 14 ns  Iteration: 1  Instance: /tb/uut

有关如何编码以下内容的任何想法,以避免此类警告?全局关闭numeric_std警告不是一种选择。

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

entity Test is
    port (
        clk               : in std_logic;
        reset             : in std_logic;

        i_in_data         : in unsigned(31 downto 0);

        o_out_zero        : out std_logic
    );
end Test;

architecture rtl of Test is
begin
    process(clk, reset) begin
        if(reset='1') then
            o_out_zero <= '0';
        elsif(rising_edge(clk)) then
            if(i_in_data = (i_in_data'range=>'0')) then
                o_out_zero <= '1';
            else
                o_out_zero <= '0';
            end if;
        end if;
    end process;
end architecture;

1 个答案:

答案 0 :(得分:1)

如果o_out_zero的输出在元值存在的情况下无关紧要,那么来自numeric_std的有用函数to_01可用于在比较表达式中消除它们。另见to_01xz等用于类似目的......

替换

if(i_in_data = (i_in_data'range=>'0')) then

if to_01(i_in_data) = (i_in_data'range=>'0') then

它应该是好的。

你知道if语句中布尔表达式周围的括号是不必要的,对吧? VHDL看起来越少越好......