adder / subtractor

时间:2015-07-14 06:59:05

标签: vhdl

我是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行:由于先前的错误而忽略了单位。

3 个答案:

答案 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。在典型设计中,您在架构的endmode之间的声明部分中没有变量。

std_logic的长度仅为1 xorgate port map(位),但qxorgate中的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 ...

虽然它会起作用,但它也值得一记耳光!