2009-12-01 249 views
2

我编码一个4位二进制加法器,蓄能器:VHDL - 问题与std_logic_vector

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; 

输出:

-- Compiling architecture binadder of binadder

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):

No feasible entries for infix operator "xor".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):

Type error resolving infix expression "xor" as type std.standard.bit.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

No feasible entries for infix operator "and".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in right operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

No feasible entries for infix operator "and".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in left operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Bad expression in right operand of infix expression "or".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

Type error resolving infix expression "or" as type std.standard.bit.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

No feasible entries for infix operator "&".

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

Type error resolving infix expression "&" as type ieee.std_logic_1164.std_logic_vector.

** Error: C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(39):

VHDL Compiler exiting

我相信我不会处理std_logic_vector的正确。请告诉我如何? :(

回答

7

VHDL的一个特点是基本语言本身提供的功能非常少,大部分是通过使用包提供的,代码的第二行就是一个例子(使用ieee.std_logic_1164这意味着你正在使用所有的std_logic_1164包,见here这个包定义的内容

当你编写代码时,你通常希望将你的信号存储在std_logic或std_logic_vector中。第一个是std_logic也可以代表'0'或'1'以外的值,例如它也可以代表'Z'或'X';第二个是模拟器(比如modelsim,你是使用)经过优化,可以使用std_logic运行更快。

作为一般惯例,最好始终将实体的输入和输出作为std_logic或std_logic_vector。

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

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

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; 

最后一点评论是,一旦状态值为1,它将如何变成2或3?

+0

谢谢。而且,是的,你说国家没有增加是正确的。我修正了这一点。 (虽然我仍然没有得到我需要的输出:()但是,谢谢:D – Bojack

+0

如果你发布你的更新代码并告诉我你要找什么输出,我会很乐意提供更多的帮助...... – Justin

+1

我' d不同意将端口全部设置为std_logic(_vector)是一种很好的做法。顶级pors(即真实硬件中真正的引脚)就是这种情况。但是在内部,使用与你的数据匹配的类型(所以使用整数,无符号向量,自定义类型,记录,作品)。不要试图强制所有东西变成std_logic类型。 避免使用'bit'类型,除非您有充分的理由使用它们 - 它们不能很好地混合使用std_logic; –

0

查看您的逻辑物理库映射。

检查物理库实际上是否已经转储了包。

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

如果什么都行不通,只需制作ieee的本地副本,将std_logic_1164软件包编译进它,移动到工作库,然后编译您的设计。这工作。