问题描述
我正在创建一个简单的 VHDL 代码,它应该使用 8 个输入(每个输入 4 个)创建两个 4 位二进制数(A 和 B),然后根据按下的三个按钮之一,在 A 和B、AND、OR 或 XOR。
我担心的是我试图将多个输入信号映射到一个端口,将多个输出信号映射到一个端口,但是我的困惑在于我已经成功地实现了一个非常相似的描述而没有任何错误,我将在最后显示非错误描述。如果我的怀疑是正确的,请有人向我解释为什么底部代码没有出现错误?
有错误的代码:
use IEEE.STD_LOGIC_1164.ALL;
entity Lab_2_Source_File is
port(A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
btnd : in STD_LOGIC;
btnl : in STD_LOGIC;
btnr : in STD_LOGIC;
led : out STD_LOGIC_VECTOR(3 downto 0)
);
end Lab_2_Source_File;
architecture Behavioral of Lab_2_Source_File is
begin
process(btnd)
begin
led(0) <=A(0) and B(0);
led(1) <=A(1) and B(1);
led(2) <=A(2) and B(2);
led(3) <=A(3) and B(3);
end process;
process(btnl)
begin
led(0) <=A(0) or B(0);
led(1) <=A(1) or B(1);
led(2) <=A(2) or B(2);
led(3) <=A(3) or B(3);
end process;
process(btnr)
begin
led(0) <=A(0) xor B(0);
led(1) <=A(1) xor B(1);
led(2) <=A(2) xor B(2);
led(3) <=A(3) xor B(3);
end process;
end Behavioral;
我相应地修改了约束文件
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS25 } [get_ports { led }]; #IO_L15P_T2_DQS_13 Sch=led[0]
## Switches
set_property -dict { PACKAGE_PIN E22 IOSTANDARD LVCMOS12 } [get_ports { A }]; #IO_L22P_T3_16 Sch=sw[0]
set_property -dict { PACKAGE_PIN F21 IOSTANDARD LVCMOS12 } [get_ports { B }]; #IO_25_16 Sch=sw[1]
这里是错误
[DRC MDRV-1] 多个驱动网络:Net led_OBUF[0] 有多个驱动:led_OBUF[0]_inst_i_1/O、led_OBUF[0]_inst_i_3/O 和 led_OBUF[0]_inst_i_2/O。
第二个代码,没有错误。我显示此代码是因为我不确定如何将 4 个输入 (3 downto 0)
映射到单个输入。我已使用约束文件中的原始端口名称命名端口。
port(sw0 : in STD_LOGIC_VECTOR(3 downto 0);
led0: out STD_LOGIC_VECTOR(3 downto 0)
);
end Lab_2_Source_File;
architecture Behavioral of Lab_2_Source_File is
begin
process(sw0)
begin
led0<=sw0;
end process;
end Behavioral;
如上所述,错误使我相信这是由于尝试将多个信号映射到 LED 输出,但是虽然这是有道理的,但我感到困惑,因为当我将多个信号映射到时不会发生相同的错误其他代码的输出。请有人帮我解释一下这是怎么回事吗?
解决方法
该错误使我相信这是由于尝试将多个信号映射到 LED 输出所致
这是正确的。
虽然这是有道理的,但我很困惑,因为当我将多个信号映射到其他代码的输出时不会发生相同的错误。
在最后一个例子中,
led0<=sw0;
led0(0)
的唯一驱动程序是 sw0(0)
,led0(1)
的唯一驱动程序是 sw0(1)
,依此类推。因此,一个网络没有多个驱动程序,如第一个示例所示,这就是没有错误的原因。