我是VHDL语言的新手,所以请耐心等待,请帮助我。
我已经编写了一个加法/减法单元的代码,它将对有符号整数进行操作,但是在" if else"在最后,编译器发出错误。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder is
port(A,B : in std_logic_vector(3 downto 0);
SUM : out std_logic_vector(3 downto 0);
mode: in std_logic_vector(0 downto 0));
end adder;
architecture behave of adder is
component xorgate is
port( p,q: in std_logic_vector(3 downto 0);
r: out std_logic_vector(3 downto 0));
end component;
signal a1,b1,sum1,output1,mode1:integer;
signal tmp: std_logic_vector(3 downto 0);
variable output: std_logic_vector(3 downto 0);
begin
u1: xorgate port map (B, mode, output);
output1 <= to_integer(signed (output));
a1 <= to_integer(signed(A));
b1 <= to_integer(signed(B));
mode1 <= to_integer(signed(mode));
process(a1,output1,b1,tmp,mode1)
begin
if ( mode1 <= '1') then
sum1 <= a1 + output1 ;
else
sum1 <= a1 + b1;
end if;
tmp <= std_logic_vector(to_signed(sum1,4));
SUM <= tmp( 3 downto 0);
end process;
end behave;
XST错误消息:
错误:HDLC编译器:1731 - &#34; E:\ XILINX PROGRAM \ FULLADD \ FULLADD.vhd&#34;第31行:发现&#39; 0&#39; operator&#34;&lt; =&#34;的定义无法确定&#34;&lt; =&#34;的确切重载匹配定义;
错误:HDLC编译器:854 - &#34; E:\ XILINX PROGRAM \ FULLADD \ FULLADD.vhd&#34;第11行:由于先前的错误而忽略了单位。
答案 0 :(得分:1)
第31行:if ( mode1 <= '1') then
你的意思是:if ( mode1 = 1) then
第11行:这只是意味着由于上一个错误,编译器放弃了&#39;。
答案 1 :(得分:0)
<=
中的mode1 <= '1'
运算符与'1'
的整数的小于或等于,它没有定义,因此found '0' definitions of operator "<="
。将'1'
更改为simply the integer literal
1`。
下面列出了代码的其他问题。
signal output:
在output
的端口映射中使用xorgate
作为实际值时,'变量输出:...'必须为begin
。在典型设计中,您在架构的end
和mode
之间的声明部分中没有变量。
std_logic
的长度仅为1 xorgate port map
(位),但q
中xorgate
中的mode
模式的实际值为4位。您可能打算在3 downto 0
的端口声明中将adder
设为mode1 <= 1
,因为如果mode
为1位,则像*1
这样的比较将是微不足道的。 / p>
如果流程使用signed
包中的numeric_std
个添加内容,则实际上不需要名为process(A, B, mode, output) is
begin
if signed(mode) <= 1 then
SUM <= std_logic_vector(signed(A) + signed(output));
else
SUM <= std_logic_vector(signed(A) + signed(B));
end if;
end process;
的中间整数信号和其他信号:
output
这甚至可以简化为以下,只有SUM <= std_logic_vector(signed(A) + signed(output)) when (signed(mode) <= 1)
else std_logic_vector(signed(A) + signed(B));
作为中间信号:
mode
最后,如果unsigned(mode)
要像无符号一样进行处理,则替换为unsigned
,因为numeric_std
包中也定义了bc = VerticalBarChart()
...
bc.valueAxis.valueMin = -5 (or set it dynamically)
bc.valueAxis.valueMax = 50
bc.valueAxis.valueStep = 10
。
答案 2 :(得分:0)
这个谜题可能是错误信息无法找到重载运算符的原因
'1'
至少有两个定义,首先是字符文字,然后是一个字面文字。这些都没有<=
运算符将它们与Integer类型进行比较,而 就是编译器放弃的原因。
如果您使用了整数文字1
,编译器可能很容易找到<=
运算符......所以if mode1 <= '1' then
可以正常工作。
或者,您可以编写自己的<=
运算符,接受这两种类型的输入并返回布尔值:
function "<=" (a : Integer; b : Bit) return Boolean is ...
虽然它会起作用,但它也值得一记耳光!