Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL相等运算符:标准逻辑和标准逻辑的不同行为_Vhdl_Behavior_Modelsim - Fatal编程技术网

VHDL相等运算符:标准逻辑和标准逻辑的不同行为

VHDL相等运算符:标准逻辑和标准逻辑的不同行为,vhdl,behavior,modelsim,Vhdl,Behavior,Modelsim,我有两种设计: library ieee; use ieee.std_logic_1164.all; entity eq_test1 is port (a,b : IN std_logic_vector (1 downto 0); o : OUT std_logic); end eq_test1; architecture strange_behavior of eq_test1 is begin P: process (a,b) begin

我有两种设计:

library ieee;
use ieee.std_logic_1164.all;

entity eq_test1 is

  port (a,b : IN std_logic_vector (1 downto 0);
        o   : OUT std_logic); 
end eq_test1;

architecture strange_behavior of eq_test1 is
begin  
    P: process (a,b)
    begin
        if a = b then o <= '1';
        else o <= '0';
        end if;
    end process P;
end strange_behavior;
对于列表,行为是不同的。 然后00=0L返回true,因此L与0相同,0变为“1”。 如果包含未签名的包,则即使0X=0Z也会返回true

有人能解释一下原因吗?

看看这个词的定义。它替换了=的原始定义,如下所示

function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
    return   UNSIGNED(L) = UNSIGNED(R);
end;
由于类型UNSIGNED是一个整数类型,它不知道文字“h”和“l”,因此它被解析为一个整数值,因此“l”变为“0”,UNSIGNED中的语义等价物添加使用ieee.std_logic_UNSIGNED.all;就像打开潘多拉的盒子 Synopsys图书馆。经过如下所示的深度潜水后,得出的结论是 在本例中,std_logic_unsigned package使值“0”和“L”相等 通过一张桌子

当=运算符重新定义为:

function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
    return   UNSIGNED(L) = UNSIGNED(R);
end;
不过,这只是开始,因为std_logic_unsigned包括 使用IEEE.std_logic_arith.all;,它定义了类型:

type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;
在这个函数中,CONV_UNSIGNED很有趣:

function CONV_UNSIGNED(ARG: UNSIGNED; SIZE: INTEGER) return UNSIGNED is
    constant msb: INTEGER := min(ARG'length, SIZE) - 1;
    subtype rtype is UNSIGNED (SIZE-1 downto 0);
    variable new_bounds: UNSIGNED (ARG'length-1 downto 0);
    variable result: rtype;
    -- synopsys built_in SYN_ZERO_EXTEND
    -- synopsys subpgm_id 372
begin
    -- synopsys synthesis_off
    new_bounds := MAKE_BINARY(ARG);
    if (new_bounds(0) = 'X') then
        result := rtype'(others => 'X');
        return result;
    end if;
    result := rtype'(others => '0');
    result(msb downto 0) := new_bounds(msb downto 0);
    return result;
    -- synopsys synthesis_on
end;
现在我们已经接近了,因为上面提到:

function MAKE_BINARY(A : UNSIGNED) return UNSIGNED is
    -- synopsys built_in SYN_FEED_THRU
    variable one_bit : STD_ULOGIC;
    variable result : UNSIGNED (A'range);
begin
    -- synopsys synthesis_off
        for i in A'range loop
            if (IS_X(A(i))) then
                assert false
                report "There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es)."
                severity warning;
                result := (others => 'X');
                return result;
            end if;
            result(i) := tbl_BINARY(A(i));
        end loop;
        return result;
    -- synopsys synthesis_on
end;
在这里,我们有理由让“L”等于“0”,因为tbl_二进制 是一个常数,定义为:

type tbl_type is array (STD_ULOGIC) of STD_ULOGIC;
constant tbl_BINARY : tbl_type :=
    ('X', 'X', '0', '1', 'X', 'X', '0', '1', 'X');
为了理解这种映射,与 标准逻辑中的值:

std_ulogic: ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');

tbl_BINARY: ( 'X', 'X', '0', '1', 'X', 'X', '0', '1', 'X');
这表明,通过tbl_二进制转换后,则为等效组 它们是“U”、“X”、“Z”、“W”、““-”、“0”、“L”和“1”、“H”

结束语是,即使通过std_logic_unsigned包也存在 在一个名为ieee的库中,包不是像VHDL那样的ieee标准,而是一个 Synopsys软件包。该软件包以及其他相关的Synopsys软件包 已经存在了一段时间,并且被广泛使用

但是,您可以考虑使用IEEE标准包NigICIOSTSTD。

< P>简短的回答是STDYLogICICUnStandard及其预期的替换NealIdStdUnSube正确处理“H”和“L”为“1”和“0”。p> 无符号包将std_logic_unsigned视为无符号数值。以下是一些好处:

正确处理“H”和“L” 输入的数字处理,尤其是当输入大小不同时 支持将标准逻辑向量与整数Addr=0而不是Addr=0000混合
过载>,>=,=?L为下拉式,意思是:通过电阻器连接到地。如果您将其插入一个门,它将被中断为“0”,与verilog的弱0相同。它需要无符号的原因是因为VHDL是强类型的,您需要一个特殊的函数来将“L”转换为“0”。您可以查看std_logic_无符号包,通过modelsim轻松访问它-只需选择ieee->the lib,并查看其中定义的哪些函数同意“0”=“L”ok,thx。我会的。这可能有助于理解两个相等运算符之间的差异无符号类型不是整数类型,但仍然是位数组,而是在某些算术运算中使用时可以解释为无符号值的位数组。因此,在无符号中的位仍然可以有值作为STDyLogic,如“L”、“X”和“Z”,并且没有长度限制,如整数类型的31位。您认为STDYLogiCixUnSaleStdLogLogiCUnSub有什么缺点是非标准的,因此,在最坏的情况下,设计者可能会在模拟器中使用std_logic_unsigned软件包的一个版本,而在他们的合成工具中使用另一个版本,最坏的情况下,结果是仿真行为不会导致硬件合成行为。如果测试依赖于模拟,最坏的情况可能是您签下了一个在模拟中工作但在真实硬件中不工作的ASIC。标准的想法应该是行为定义良好,以避免此类差异。“邪恶”:IEEE Std 1076-2008,9.2.1关系运算符,第3段,第2句-相同类型的两个复合值相等,当且仅当左操作数的每个元素都有右操作数的匹配元素,反之亦然,并且匹配元素的值相等,如元素类型的预定义相等运算符所示。在这种情况下,复合意义是标准逻辑向量。参见第2段第1句,等式和不等式运算符=和/=是为除文件类型和受保护类型以外的所有类型定义的。按位_eql违反了。现在,您可以了解为什么-2008添加了匹配的相等运算符?=它给出了与std_logic_unsigned=相同的答案。第三段第二句自1987年起就出现在标准中。我认为所有未签名的std_逻辑都是邪恶的,这取决于你做了什么。如果您只是使用STD_LOGIC_VECTOR作为只包含0和1元素的位向量,并且您只想执行无符号算术,而不是在同一实体/体系结构中执行这两种运算,那么STD_LOGIC_unsigned是非常方便的,因为您不需要像处理数字_STD.I那样在无符号/有符号/STD_LOGIC_VECTOR之间进行类型转换
当然,如果你以更复杂的方式使用STD_逻辑_向量,那么你就有麻烦了。但无论如何,您都会遇到麻烦,因为不清楚合成将做什么…直到供应商合成,或使用函数返回std_logic_vector;在std_logic_1164中,称为“强度剥离器”。
type tbl_type is array (STD_ULOGIC) of STD_ULOGIC;
constant tbl_BINARY : tbl_type :=
    ('X', 'X', '0', '1', 'X', 'X', '0', '1', 'X');
std_ulogic: ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');

tbl_BINARY: ( 'X', 'X', '0', '1', 'X', 'X', '0', '1', 'X');