我有一个二进制字符串,如" 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 ;; 此信号连接到多个驱动程序。
这是什么意思?我该如何解决?
答案 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包。