Путаница процесса VHDL со списками конфиденциальности

Я изучаю VHDL, читая книги в Интернете (Free Range VHDL) и выполняя примеры на своем Nexsys2 через Xilinx ISE Webpack 14.7. Я перечитываю текст Free Range VHDL и сейчас обсуждаю в главе процессы. У меня есть четкое представление о том, что такое процесс и как он работает, но я реализовал пример и не понимаю результатов.

Я реализовал мультиплексор 8:1, используя следующий код.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux81 is
    port( d_in : in std_logic_vector(7 downto 0);
            sel : in std_logic_vector(2 downto 0);
            ce : in std_logic;
            F : out std_logic);
end mux81;

architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel, ce)
    begin
        if (ce = '1') then
            if (sel = "111") then
                F <= d_in(7);
            elsif (sel = "110") then
                F <= d_in(6);
            elsif (sel = "101") then
                F <= d_in(5);
            elsif (sel = "100") then
                F <= d_in(4);
            elsif (sel = "011") then
                F <= d_in(3);
            elsif (sel = "010") then
                F <= d_in(2);
            elsif (sel = "001") then
                F <= d_in(1);
            elsif (sel = "000") then
                F <= d_in(0);
            else
                F <= '0';   
            end if;
        else
            F <= '0';
        end if;
    end process mux_proc;
end my_mux81;

который выполняет операцию мультиплексирования, только если сигнал «ce» равен «1». Все работало, как и ожидалось. Затем я провел эксперимент, удалив сигнал «ce» из списка чувствительности. Насколько я понимаю оператор процесса, он должен выполняться только в том случае, если изменяется сигнал в списке чувствительности. При удалении сигнала «ce» схема не должна реагировать только на изменения «ce». Вот модифицированная схема:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux81 is
    port( d_in : in std_logic_vector(7 downto 0);
            sel : in std_logic_vector(2 downto 0);
            ce : in std_logic;
            F : out std_logic);
end mux81;

architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel)
    begin
        if (ce = '1') then
            if (sel = "111") then
                F <= d_in(7);
            elsif (sel = "110") then
                F <= d_in(6);
            elsif (sel = "101") then
                F <= d_in(5);
            elsif (sel = "100") then
                F <= d_in(4);
            elsif (sel = "011") then
                F <= d_in(3);
            elsif (sel = "010") then
                F <= d_in(2);
            elsif (sel = "001") then
                F <= d_in(1);
            elsif (sel = "000") then
                F <= d_in(0);
            else
                F <= '0';   
            end if;
        else
            F <= '0';
        end if;
    end process mux_proc;
end my_mux81;

Как видите, единственное изменение состоит в том, что «ce» удалено из списка чувствительности. Однако, когда я реализую эту схему, она работает точно так же, как и версия, в которой в списке чувствительности указано «ce». Другими словами, сохранение сигналов «d_in» и «sel» постоянными, но изменение «ce» приводит к выполнению оператора процесса и изменению выходного сигнала, как если бы «ce» все еще был в списке чувствительности. Я не получил никаких предупреждений, когда я запускал синтез. Это похоже на то, что программа сделала предположение, что «ce» также следует отслеживать, но я подумал, что это также должно генерировать предупреждение...

Спасибо за помощь!


person radensb    schedule 09.08.2014    source источник
comment
возможный дубликат , когда сигнал должен быть вставлен в список конфиденциальности процесса, что, как я полагаю, объясняет, что инструмент синтеза не обязан создавать логику, которая будет сохранять значения при изменении входных данных, не относящихся к списку конфиденциальности. .   -  person Chris Stratton    schedule 09.08.2014
comment
Этот текст Free Range довольно ужасен. Сделайте свой сел-порт подходящим ранжированным подтипом Natural, и весь этот внутренний оператор if уменьшится до F <= d_in(sel);!   -  person user_1818839    schedule 01.09.2014


Ответы (1)


Списки конфиденциальности игнорируются многими инструментами синтеза. Проверьте предупреждения вашего инструмента синтеза, и вы, вероятно, обнаружите, что он предупреждает об отсутствии сигнала CE.

Неполные списки чувствительности являются печально известной причиной проблем, потому что поведение моделирования и постсинтеза не одно и то же!

Обычно вы не хотите использовать защелки, чувствительные к уровню. Они вызывают всевозможные проблемы, и их труднее проверить, чем старую простую синхронную логику.

Если вы действительно хотите создать защелку, чувствительную к уровню, вам следует либо создать экземпляр, предоставленный вашим поставщиком FPGA, либо выяснить, какой стиль кодирования использовать, чтобы ваш инструмент синтеза вывел защелку.

person Philippe    schedule 09.08.2014
comment
Списки конфиденциальности игнорируются многими инструментами синтеза. Не имел представления! Тогда он в основном используется для моделирования? - person radensb; 13.08.2014
comment
@radensb да. каждый сигнал в списке чувствительности проверяется на наличие событий, и если да, то рассчитываются результаты. меньшее количество сигналов в этом списке означает меньше вычислений и может привести к более высокой скорости моделирования. это используется последовательными процессами (с часами), которые перечисляют только тактовый сигнал и, при необходимости, асинхронные сигналы, такие как сбросы, в списке чувствительности, потому что переходы сигнала могут происходить только при переключении часов. - person Paebbels; 16.08.2014