VHDL中的Std_logic_vector与零和其他向量进行比较

时间:2014-05-13 18:24:27

标签: vhdl

when S3 =>

    NS<=S5;
    Rd_ack<='0';
    if (u=0) then
        send:=u;
        NS<=S4;
    end if;

    if (v=0) then
        send:=u;
        NS<=S4;
    end if;

when S4 =>

如何将u和v与0和u进行比较? 我想要以下陈述

if( v= u) then. ....
if( u= 0) then
u and v are signa

信号u,v:std_logic_vector(0到31);

在VHDL中,我可以使用send来存储值吗? send是一个变量。 如果我们进入状态s4,我们想要在发送中获取数据并将其分配给信号。

1 个答案:

答案 0 :(得分:1)

在没有提供数字文字的类型信息的情况下,您已经让某人回答了问题。

如果你真的想要针对整数类型测试std_logic_vector,你可以编写一个执行比较的相等运算符("=")函数:

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

entity fum is
end entity;

architecture foo of fum is
    signal u,v:     std_logic_vector (31 downto 0);
    signal NS,S4:   std_logic;
    function "=" (a:std_logic_vector; b: natural) return BOOLEAN is
        variable as_slv:    std_logic_vector(a'range);
    begin
        as_slv := std_logic_vector(to_unsigned(b,as_slv'length));
        for i in a'range loop
            if a(i) /= as_slv(i) then
                return FALSE;
            end if;
        end loop;

        return TRUE;
    end function;
begin
SOME_PROCESS:
    process(u,v,S4)
    variable send:  std_logic_vector (u'range);
    begin
        if u = 0  then
            send := u;
            NS <= S4;
        end if;

        if v = 0 then
            send := u;
            NS <= S4;
        end if;
    end process;
end architecture;

这个示例代码分析,阐述和模拟(尽管没有做任何有趣的事情)。

请注意,这个使用自然作为类型,std_logic_vector本质上是未签名的,它是一个比特包。

如果您只对测试所有&#39; 0&#39;而感兴趣?值:

architecture fee of fum is
    signal u,v:     std_logic_vector (31 downto 0);
    signal NS,S4:   std_logic;
    constant ZERO:  std_logic_vector (u'range) := (others => '0');
begin
SOME_PROCESS:
    process(u,v,S4)
    variable send:  std_logic_vector (u'range);
    begin
        if u = ZERO  then
            send := u;
            NS <= S4;
        end if;

        if v = ZERO then
            send := u;
            NS <= S4;
        end if;
    end process;
end architecture;

与建筑费有关的人也会在不做任何有趣的事情的同时进行分析,阐述和模拟。

表达式中不允许使用常量ZERO而不是等效的X"00000000"(others => '0')

此示例代码中变量send的范围仅限于声明性区域,在本例中仅限于流程语句SOME_PROCESS。假设有一个人用一个关于状态值的case语句充实了这个过程,send可以用来在那个过程中分配一个信号。

在比较数字文字时,您可以使用类型转换,而不是编写新的运算符"="函数:

architecture fie of fum is
    signal u,v:     std_logic_vector (31 downto 0);
    signal NS,S4:   std_logic;
begin
SOME_PROCESS:
    process(u,v,S4)
    variable send:  std_logic_vector (u'range);
    begin
        if unsigned (u) = 0  then
            send := u;
            NS <= S4;
        end if;

        if unsigned(v) = 0 then
            send := u;
            NS <= S4;
        end if;
        v <= send;
    end process;
end architecture;

模拟时有一个缺点:

  

david_koontz @ Macbook:ghdl -r fum
  ../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion
  警告):NUMERIC_STD。&#34; =&#34;:检测到元数值,返回FALSE
  ../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion
  警告):NUMERIC_STD。&#34; =&#34;:检测到元数值,返回FALSE
  david_koontz @ Macbook:

数值域中的比较(使用包numeric_std&#39; s&#34; =&#34;)对元值敏感。