无法处理注册的多个驱动程序

时间:2017-05-25 11:44:05

标签: vhdl

我从编译器获取所有“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; 

2 个答案:

答案 0 :(得分:1)

您有以下一行:

busreg <= "00000000";

如果您要一直将此信号驱动为低电平,那么另一条逻辑的重点是什么?

答案 1 :(得分:1)

您正在从两个进程驱动信号busreg:显式进程和隐式进程busreg <= "00000000";。换句话说,你有一个短路。

  

一个过程是一些软件,可以模拟一点点硬件。

因此,当您从多个进程驱动信号时,您正在建模一个由多个硬件块驱动的信号。通常,如果要从两个或更多块硬件驱动信号,则需要使用三态逻辑。我认为错误消息告诉您,您选择的FPGA器件无法实现三态逻辑,因此从多个位置驱动信号是错误的。

那么,为什么要写一行busreg <= "00000000";?如果您希望重置移位寄存器,则没有;你创造了一个短路。

BTW:您的流程是顺序流程。顺序进程的灵敏度列表应该只包含时钟,或者,如果存在异步复位,则只包含时钟和异步复位。 dir不应在您的敏感列表中。