VHDL-标准逻辑向量问题

VHDL-标准逻辑向量问题,vhdl,Vhdl,我正在用累加器编码一个4位二进制加法器: library ieee; use ieee.std_logic_1164.all; entity binadder is port(n,clk,sh:in bit; x,y:inout std_logic_vector(3 downto 0); co:inout bit; done:out bit); end binadder; architecture binadder of binadde

我正在用累加器编码一个4位二进制加法器:

library ieee;
use ieee.std_logic_1164.all;

entity binadder is
    port(n,clk,sh:in bit;
        x,y:inout std_logic_vector(3 downto 0);
        co:inout bit;
        done:out bit);
end binadder;

architecture binadder of binadder is
    signal state: integer range 0 to 3;
    signal sum,cin:bit;
begin
    sum<= (x(0) xor y(0)) xor cin;
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);

    process
    begin
        wait until clk='0';
        case state is
            when 0=>
                if(n='1') then
                    state<=1;
                end if;
            when 1|2|3=>
                if(sh='1') then
                    x<= sum & x(3 downto 1);
                    y<= y(0) & y(3 downto 1);
                    cin<=co;
                end if;
                if(state=3) then
                    state<=0;
                end if;
        end case;
    end process;

    done<='1' when state=3 else '0';
end binadder;
ieee库;
使用ieee.std_logic_1164.all;
实体二进制数据是
端口(n、clk、sh):以位为单位;
x、 y:输入标准逻辑向量(3到0);
co:inout位;
完成:输出位);
末端二进器;
binadder的体系结构binadder是
信号状态:整数范围0到3;
信号和,cin:位;
开始

sumVHDL的一个特点是基本语言本身提供的功能很少。大部分是通过使用包提供的。代码的第二行就是一个例子(使用ieee.std_logic_1164.all)。这意味着您正在使用所有std_logic_1164包。有关此包的定义,请参见

在编写代码时,通常希望将信号存储在std_逻辑或std_逻辑向量中。这有两个原因。首先,std_逻辑还可以表示除“0”或“1”以外的值。例如,它也可以表示“Z”或“X”。第二,模拟器(如您正在使用的modelsim)经过优化,使用std_逻辑运行得更快

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;
一般来说,最好的做法是始终将实体的输入和输出设置为std_逻辑或std_逻辑向量

您遇到的具体问题是,将类型位(这是VHDL标准中定义的极少数类型之一)与xor一起使用

最简单的解决方案是将实体中的co输出更改为std_逻辑类型,并将sum和cin的声明更改为std_逻辑类型

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;
进一步的评论是,除非您有很好的理由这样做,否则将端口设置为inout通常是一种不好的做法,因为这会删除语言中内置的一些严格类型检查。最好的解决方案是在实体本身内创建一个信号,并将该信号直接分配给输出

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:out std_logic;
         done:out bit);
end binadder;

    signal co_int:std_logic;
 begin
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
    co <= co_int;
实体二进制数据是
端口(n、clk、sh):以位为单位;
x、 y:输入标准逻辑向量(3到0);
co:输出标准逻辑;
完成:输出位);
末端二进器;
信号接口:标准逻辑;
开始

查看逻辑物理库映射

检查物理库是否确实转储了包

确保您没有将不同版本的预编译头与不同版本的模拟器一起使用


如果没有任何效果,只需制作一份ieee本地副本,将std_logic_1164包编译到其中,转到工作库,然后编译您的设计。这必须奏效

多谢各位。是的,关于状态不递增,你是对的。我修好了。(虽然我仍然没有得到我需要的输出:()。但是谢谢:如果你发布更新的代码并告诉我你想要什么输出,我很乐意提供更多的帮助……我不同意让你的端口都是std_逻辑(_vector)的好做法。这是顶级POR的情况(即,那些在真正的硬件中是真正的管脚的端口)但在内部,使用与数据匹配的类型(因此使用整数、无符号向量、自定义类型、记录、工作)不要尝试将所有内容强制为std_逻辑类型。并且避免使用
bit
类型,除非您有很好的理由使用它们-它们不能很好地混合std_逻辑;