Ошибка (10028): не удается разрешить несколько постоянных драйверов для net "ledr [7]" в uart_rl.vhd (77) - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь написать код UART, но получаю следующую ошибку:

Ошибка (10028): невозможно разрешить несколько постоянных драйверов для net "ledr [7]" в uart_rl.vhd (77)

Краткие пояснения:

  • сброс: сброс программы
  • нагрузка: получение данных от коммутатора
  • запуск: начало программы
  • сигнал запуска равен 1 = не отправляется с tx на rx, когда он переходит к 0, начинает отправку сигнала запуска 8 бит данных (получение от коммутатора), бит четности = если данные 0x111 бит парности = '1'2 остановка бит и 1 бит ошибки = если бит четности неверен / данные не отправляются.

гй + ТЙ:

            library ieee;
            use ieee.std_logic_1164.all;

            entity sertopar is
            port (txd : buffer  std_logic;
                    data_out: out std_logic_vector(7 downto 0);
                    p :out std_logic;
                    ending : out std_logic_vector(1 downto 0));
            end;
            architecture tow of sertopar is
            signal data_reg2: std_logic_vector (10 downto 0);
            signal cnt2: integer;
            signal flag2: std_logic:= '0';
            begin
            process (txd,flag2)
            begin
            if(txd = '0') then
                if(flag2 = '0') then
                    if(cnt2 = 0) then
                        flag2 <= '1'; 
                    end if;
                end if;
            end if;

            if(flag2 = '1') then
                if(cnt2 = 0) then
                    cnt2 <= cnt2 + 1;
                elsif((cnt2 > 0) and (cnt2 < 10)) then
                    data_reg2(cnt2-1) <= txd;
                    cnt2 <= cnt2 + 1;
                elsif(cnt2 = 10)  then 
                        data_reg2(cnt2-1) <= '1';
                        data_reg2(cnt2) <= '1';
                        flag2 <= '0';

                end if;
            end if; 

            if(flag2 = '0') then
                if(cnt2 = 10) then
                    cnt2 <= 0;
                    data_out <= data_reg2(7 downto 0);
                    p<=data_reg2(8);
                    ending<=data_reg2(10 downto 9);
                end if;
            end if;

            end process;
            end;
            ------------------------------------------------------------------

            library ieee;
            use ieee.std_logic_1164.all;
            entity partoser is
            port (data_in: in std_logic_vector(10 downto 0);
            clk, start: in std_logic;
            txd : buffer std_logic;
            txd_rdy : out std_logic);
            end;
            architecture one of partoser is
            signal data_reg: std_logic_vector (10 downto 0);
            signal cnt: integer;
            begin
            process (clk, start, data_in)
            begin
            if start = '1' then 
             cnt <=0; txd_rdy <='0'; data_reg <=data_in;
            elsif clk'event and clk = '1' then
              cnt <= cnt+1;
              if cnt = 11 then txd_rdy <='1';
              else txd_rdy <='0';
              end if;
            txd <= data_reg(0);
            data_reg (9 downto 0) <= data_reg(10 downto 1);
            end if;
            end process;
            end;
            -------------------------------------------------------

верхний уровень:

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;

    entity uart_rl is
    port(
    clock_50 : in std_logic;
    sw : in std_logic_vector (17 downto 9);
    key : in std_logic_vector (2 downto 0);
    ledr : out std_logic_vector (17 downto 0);
    ledg : out std_logic_vector (7 downto 0));
    end uart_rl;

    architecture txd of uart_rl is
    alias clk : std_logic is CLOCK_50;
    alias reset: std_logic is key(0);
    --alias load: std_logic is key(1);
    alias start: std_logic is key(2);
    alias par_type: std_logic is sw(9);-- 0 even
    --alias start: std_logic is sw(8);
    alias parallel: std_logic_vector(7 downto 0) is sw(17 downto 10);
    signal txd : std_logic is ledg(0);
    alias txd_rdy: std_logic is ledg(1);
    alias paritybit: std_logic is ledg(2);


    alias Rdata : std_logic_vector (7 downto 0) is ledr(7 downto 0);
    alias R_p : std_logic is ledg(7);
    alias Rend : std_logic_vector (1 downto 0) is ledg(6 downto 5);

    component partoser
    port (data_in: in std_logic_vector(10 downto 0);
    clk, start: in std_logic;
    txd : buffer std_logic;
    txd_rdy : out std_logic);
    end component;

    component sertopar
    port(txd : buffer  std_logic;
            data_out: out std_logic_vector(7 downto 0);
            p :out std_logic;
            ending : out std_logic_vector(1 downto 0));
    end component;

    signal parity_res: std_logic;
    signal Tframe: std_logic_vector (10 downto 0);
    --signal Rdata: std_logic_vector (7 downto 0);
    --signal R_p: std_logic;
    --signal Rend: std_logic_vector (1 downto 0);
    signal flag: std_logic := '0' ;
    begin
    process (clk,reset, start)  --without load
    variable temp: std_logic:='0';
    begin
    if (reset ='0') then         --to check
        Rdata<="00000000";
        R_P<= '0';
        Rend<= "00";
        paritybit<= '0';           
        txd <= '1';
        txd_rdy <= '1';
        flag <= '0';

    elsif (start='0') then 
         flag <= '1';     --when to off?
         temp := par_type;
         for i in 0 to 7 loop
         temp:= parallel (i) xor temp;
         end loop;
    end if;
    parity_res <= temp;
    end process;
    Tframe <='1'& parity_res & parallel & '0';

    u1: partoser port map (Tframe, clk, flag, txd_rdy, txd);
    u2: sertopar port map (txd, Rdata, R_p, Rend);
    paritybit <= parity_res;
    ledr(17 downto 9) <= sw(17 downto 9);

    --dataR_red<= Rdata;
    --dataR_green_P <= R_p;
    --dataR_green_end(1 downto 0) <= Rend;

    end;

1 Ответ

0 голосов
/ 29 апреля 2018

См. Стандарт IEEE 1076-2008. 6.4.2.3 Сигнальные декларации, пункт 9 (частично):

Сигнал может иметь один или несколько источников . Для сигнала скалярного типа каждый источник является либо драйвером (см. 14.7.2), либо out , inout , буфер или порт связывания экземпляра компонента или оператора блока, с которым связан сигнал.

Драйверы поступают из операторов присваивания в процессах. См. 14.7.2, пункт 1:

14.7.2 Драйверы Каждый оператор назначения сигнала в операторе процесса определяет набор драйверов для определенных скалярных сигналов. Существует один драйвер для данного скалярного сигнала S в операторе процесса, при условии, что в этом операторе процесса есть по крайней мере один оператор назначения сигнала и что самый длинный статический префикс целевого сигнала этого оператора назначения сигнала обозначает S или обозначает составной сигнал, S является субэлементом. Каждый такой оператор назначения сигнала называется связанным с этим драйвером. Выполнение оператора назначения сигнала влияет только на связанный драйвер (ы).

В этом случае ваша ошибка вызвана несколькими источниками (двумя портами буфера режима), один из которых не является производным от драйвера и оператора присваивания, имеет статическое значение по умолчанию («X» для моделирования и, вероятно, «» 0 'для синтеза).

Вы можете изменить режим портов буфера на режим в (sertopar) и режим в (partoser). Не забудьте обновить объявления компонентов, чтобы они соответствовали.

Обратите внимание, что они оба подключены к сигналу txd (который показывает синтаксическую ошибку в объявлении в uart_rl, которое должно быть:

    signal txd : std_logic;

и требует назначения для ledg (0):

    ledg(0) <= txd;

Использование того же сигнала для последовательного выхода из partoser, что и для последовательного входа в sertopar, обеспечит обратную связь через последовательный порт. Фактически все, что это делает, это мигает светодиодом.

Без тестового стенда нелегко определить, что в модели нет ничего структурно неправильного. Обычный случай ошибок приводит к тому, что некоторая его часть поглощается во время синтеза.

Глядя на это, мы видим, что есть два источника для Rdata. Процесс в uartrl (оператор присваивания, который должен быть удален с предоставлением статического значения всех нулей) и присвоение data_out в sertopar операторе процесса, обеспечивающем два источника.

Вы также можете заметить, что процесс в uart_rl имеет clk в списке чувствительности, пока он не оценивается в процессе. Это приводит к открытию, что txd_rdy имеет драйвер там, а также partoser. Мы также находим там драйвер для parity_bit, а также параллельный оператор после U2. Rend там также присваивается значение «00», а других значений нет. Казалось бы, дизайн не полностью функционален.

Никаких дальнейших ошибок не было найдено во время анализа проблемы. Самый простой способ найти дальнейшие ошибки - это симуляция.

Причина сообщаемой ошибки отличается от Ошибка (10028): не удается разрешить несколько постоянных драйверов для сети… VHDL ERROR в том, что один из статических источников вызван неуправляемым портом Предоставление буферизованного вывода с постоянным значением по умолчанию.

...