Вы управляете красным, зеленым и синим цветом от нескольких процессов.
После поиска по текущим 152 сообщениям по нескольким драйверам не было ни одного опубликованного вопроса с ответом, который бы адекватно объяснял, почему и как вы возвращаетесь ' U (или в некоторых случаях X).
IEEE Std 1076-2008
14.7 Выполнение модели
14.7.2 Драйверы
Каждый оператор назначения сигнала в оператор процесса определяет набор драйверов для определенных скалярных сигналов. Существует единственный драйвер для данного скалярного сигнала S в операторе процесса при условии, что в этом операторе процесса есть хотя бы один оператор назначения сигнала и что самый длинный префикс stati c целевого сигнала этого оператора назначения сигнала обозначает S или обозначает составной сигнал, подэлементом которого является S. Каждый такой оператор присвоения сигнала называется связанным с этим драйвером. Выполнение оператора назначения сигнала влияет только на соответствующий драйвер (ы).
14.7.3.2 Управляющие значения
> Управляющее значение любого сигнала S определяется следующими шагами:
...
e) Если S является базовым c сигналом:
...
- Если S является разрешенный сигнал и имеет один или несколько источников, затем исследуются управляющие значения источников S. ... управляющее значение S получается путем выполнения функции разрешения, связанной с S, где эта функция вызывается с входным параметром, состоящим из конкатенации управляющих значений источников S, за исключением значения любого источник S, текущее значение которого определяется нулевой транзакцией.
Как работает эта функция разрешения, описано в 14.7.3.2 Привод значений.
тип или подтип std_logic_vector (-2008) - это разрешенный составной тип или sutype с разрешенным типом элемента (-2008), который использует функцию разрешения для его элементов, предоставленных в пакете IEEE std_logic_1164, тело пакета:
-------------------------------------------------------------------
-- resolution function
-------------------------------------------------------------------
constant resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'), -- | U |
('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'), -- | X |
('U', 'X', '0', 'X', '0', '0', '0', '0', 'X'), -- | 0 |
('U', 'X', 'X', '1', '1', '1', '1', '1', 'X'), -- | 1 |
('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'), -- | Z |
('U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X'), -- | W |
('U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'), -- | L |
('U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'), -- | H |
('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X') -- | - |
);
function resolved (s : STD_ULOGIC_VECTOR) return STD_ULOGIC is
variable result : STD_ULOGIC := 'Z'; -- weakest state default
begin
-- the test for a single driver is essential otherwise the
-- loop would return 'X' for a single driver of '-' and that
-- would conflict with the value of a single driver unresolved
-- signal.
if (s'length = 1) then return s(s'low);
else
for i in s'range loop
result := resolution_table(result, s(i));
end loop;
end if;
return result;
end function resolved;
Одно за другим каждое значение драйвера сравнивается с разрешенным значением предыдущих драйверов, чтобы определить разрешенное значение, включая каждый новый драйвер.
Обновление сигнала выполняется элементом из-за характеристики c, известной как самая длинная статистика c префикс (8. Имена), где используются индексированные имена (8.4) или имена срезов ( 8.5) привязывают детализацию драйверов для составных массивов к элементам (что также соответствует определению подэлементов). (Присваивания элементам записей содержат драйверы для всех элементов композиции записи и любых подэлементов. См. Раздел 8.3. Выбранные имена. У записей нет подмножеств элементов.)
Разрешение нескольких драйверов имитирует то, что происходит, когда два выхода связаны вместе. Связывание нескольких выходов вместе может быть нарушением проектных ограничений в инструментах синтеза FPGA, например, для внутренних цепей.
В вашем проекте у вас есть назначения для драйверов в нескольких процессах (и параллельные операторы также предоставляют операторы процесса).
Два процесса не влияют ни на какое назначение красного, зеленого или синего в зависимости от значения режима, которое не обновляется. Разрешение «U» с любым другим значением std_ulogi c приводит к «U».
Если ваша тестовая среда вызвала присвоение красного, зеленого или синего цвета более чем в одном процессе, то «0» для один драйвер скалярных элементов в одном процессе будет преобразован с «1» от другого драйвера к «X».
Многие целевые семейства устройств не позволяют внутренним сигналам иметь несколько источников (драйверов) . Это довольно часто встречается, например, в ПЛИС (в то время как Xilinx поддерживает автоматическое c преобразование нескольких взаимно исключающих друг друга источников для преобразования в источники, выбранные мультиплексором, с помощью процесса, запатентованного программным обеспечением для некоторых семейств устройств).
Одним из решений ограничения синтеза для нескольких драйверов может быть объединение первых двух процессов в один, при этом назначения разделяются условным выбором значений режима.
Другим решением может быть присвоение уникальных сигналов в каждом процессе и присвоение этим значениям красного, зеленого и синего цветов в другом процессе, управляемом значением модуса (эмуляция патента на программное обеспечение вручную, что также должно вызывать сомнения это действительность).
Хотя циклы исторически не приемлемы для синтеза, в то время как для циклов с фиксированным диапазоном l oop параметры всегда поддерживались. Сегодня некоторые инструменты синтеза поддерживают циклы while, в которых условие выхода может быть определено с помощью относительно небольшого числа l oop итераций. (Циклы разворачиваются в синтезе.) По крайней мере, один из ваших циклов while, вероятно, потребует переписывания реализуемого алгоритма.