我从编译器获取所有“busreg”位的信息:
topld:busshift.vhd:(E463)'busreg(7)' - 无法处理注册的多驱动程序。
topld:busshift.vhd:(E446)无法处理所选设备中“busreg(7)”的多个驱动程序。
根据我的选择取决于DIR,我被要求从两侧进行移位操作。
我的代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_arith.all;
ENTITY shiftbus IS
PORT
(
busreg : inout std_logic_vector(7 downto 0);
dir,clk : IN std_logic;
pinL,pinR : inout std_logic
);
END shiftbus;
ARCHITECTURE behavioral OF shiftbus IS
BEGIN
busreg<="00000000";
process(clk,dir)
begin
if (rising_edge(clk)) then
if(dir='1') then --1 we input from right
busreg<=busreg(6 downto 0)&pinR;
else-- else is 0 and we input from left
busreg<=pinL & busreg(7 downto 1);
end if;
end if;
end process;
END behavioral;
答案 0 :(得分:1)
您有以下一行:
busreg <= "00000000";
如果您要一直将此信号驱动为低电平,那么另一条逻辑的重点是什么?
答案 1 :(得分:1)
您正在从两个进程驱动信号busreg
:显式进程和隐式进程busreg <= "00000000";
。换句话说,你有一个短路。
一个过程是一些软件,可以模拟一点点硬件。
因此,当您从多个进程驱动信号时,您正在建模一个由多个硬件块驱动的信号。通常,如果要从两个或更多块硬件驱动信号,则需要使用三态逻辑。我认为错误消息告诉您,您选择的FPGA器件无法实现三态逻辑,因此从多个位置驱动信号是错误的。
那么,为什么要写一行busreg <= "00000000";
?如果您希望重置移位寄存器,则没有;你创造了一个短路。
BTW:您的流程是顺序流程。顺序进程的灵敏度列表应该只包含时钟,或者,如果存在异步复位,则只包含时钟和异步复位。 dir
不应在您的敏感列表中。