我正在用累加器编写一个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;
输出:
- 编译binadder的架构binadder
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):
中缀运营商没有可行的条目 “异或”。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):
键入错误解析中缀表达式 “xor”类型为std.standard.bit。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
中缀运营商没有可行的条目 “和”
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
右操作数中的错误表达 中缀表达“或”。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
中缀运营商没有可行的条目 “和”
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
左操作数中的错误表达 中缀表达“或”。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
右操作数中的错误表达 中缀表达“或”。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
键入错误解析中缀表达式 “或”作为类型std.standard.bit。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):
中缀运营商没有可行的条目 “&安培;”。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):
键入错误解析中缀表达式 “&安培;”作为类型 ieee.std_logic_1164.std_logic_vector。
**错误:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(39):
VHDL编译器退出
我相信我没有正确处理std_logic_vector。请告诉我怎么样? :(
答案 0 :(得分:7)
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。
您遇到的具体问题是您使用的是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?
答案 1 :(得分:0)
查看逻辑 - 物理库映射。
检查物理库是否实际上已转储包。
确保您没有使用不同版本的预编译标头和不同版本的模拟器。
如果没有任何效果,只需制作ieee的本地副本,将std_logic_1164包编译成它,移动到工作库,然后编译你的设计。这个有可以工作。