为什么我的XOR减少实现有多个驱动程序?

时间:2016-03-01 21:55:01

标签: vhdl

我有一个二进制字符串,如" 11000110"。 我试图将所有位混合在一起。

我有这段代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity e_circuit is
  generic(n : INTEGER:=8);
  port(
    d1:in std_logic_vector(n-1 downto 0);
    result:out std_logic
  );
end e_circuit;

architecture structure of e_circuit is
    signal temp:std_logic;
begin

    temp<=d1(0);
    loop1:for i in 1  to n-1 generate
        temp<= d1(i) or d1(i-1);
    end generate;
    result<=temp;
end structure;

但是,当我尝试编译它时,我得到以下错误:

  

错误:Xst:528 - 单位中的多源&lt; e_circuit&gt; on signal&lt; result&gt ;;   此信号连接到多个驱动程序。

这是什么意思?我该如何解决?

2 个答案:

答案 0 :(得分:1)

这意味着您要多次分配信号(temp)(直接将它们的输出连接在一起),而不使用任何组合电路或if子句。当合成器合成结果电路时,for...generate语句中的所有语句都会同时执行。您可以尝试以下解决方案:

首先,您可以使用VHDL-2008缩减运算符:

result <= xor d1;

或者,如果您的合成器不支持,请创建一个函数来为您完成:

function xor_reduct(slv : in std_logic_vector) return std_logic is
  variable res_v : std_logic := '1';  -- Null slv vector will also return '1'
begin
  for i in slv'range loop
    res_v := res_v xor slv(i);
  end loop;
  return res_v;
end function;

并在相应的架构中调用它:

result <= xor_reduct(d1);

或手动执行电路,(temp为与std_logic_vector大小相同的d1

temp(0) <= d1(0);
gen: for i in 1 to n-1 generate
    temp(i) <= temp(i-1) xor d1(i);
end generate; 
result <= temp(n-1);

答案 1 :(得分:0)

  

这是什么意思?

您同时在代码中的多个位置分配了信号temp(并且没有一个被if ... generate屏蔽)。每个并发分配组成一个驱动程序。

for generate在给定范围内为i的每个值重复块内的并发语句。因此,对于n = 8,您的代码类似于:

temp <= d1(0);
temp <= d1(1) or d1(1-1);
temp <= d1(2) or d1(2-1);
temp <= d1(3) or d1(3-1);
temp <= d1(4) or d1(4-1);
temp <= d1(5) or d1(5-1);
temp <= d1(6) or d1(6-1);
temp <= d1(7) or d1(7-1);

因此,您已将8个驱动程序连接到temp。第一个是输入d1(0)和其他或7个OR门的输出。

仅针对Spartan-3类似设​​备的旧ISE解析器报告发布的错误消息。你应该切换到新的。右键单击Synthesize - &gt;属性 - &gt;综合选择。设置选项&#34;其他XST命令行选项&#34;到

-use_new_parser YES

然后,您会收到更有意义的错误消息:

  

错误:HDLC编译器:636 - &#34; /home/zabel/tmp/xor_reduction/e_circuit.vhdl"第23行:Net已由输入端口驱动。

第23行是for ... generate语句中的一行。

  

我该如何解决?

首先,您的代码必须使用XOR而不是OR。 ISE不支持VHDL&#08; 08的XOR减少运算符,因此,您必须手动描述它。一种解决方案是在一个流程中使用顺序语句,@ user1155120也在评论中提出了这一点:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity e_circuit is
    generic(n : INTEGER := 8);
    port(d1     : in  std_logic_vector(n-1 downto 0);
         result : out std_logic);
end e_circuit;

architecture structure of e_circuit is
begin
    process(d1)
        variable temp : std_logic;
    begin
        temp := d1(0);
        for i in 1 to n-1 loop
            temp := temp xor d1(i);
        end loop;
        result <= temp;
    end process;
end structure;

这里,变量temp在执行过程期间顺序更新(就像在命令式软件编程语言中一样)。然后将最终值分配给信号result

我也省略了所有不需要的VHDL包。