gpt4 book ai didi

VHDL - std_logic_vector 问题

转载 作者:行者123 更新时间:2023-12-05 00:57:57 26 4
gpt4 key购买 nike

我正在用累加器编写一个 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;

输出:

-- 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。请告诉我怎么做? :(

最佳答案

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

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

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

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

最简单的解决方案是将实体中的共同输出更改为 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?

关于VHDL - std_logic_vector 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com