jenya7 0 9 февраля, 2023 Опубликовано 9 февраля, 2023 (изменено) · Жалоба Вопрос что лучше использовать (при тестировании одного сигнала) - case или if-elsif. Читал всякие статьи на этот счёт. Большинство склоняется к case (типа он генерирует один MUX а if-elsif цепочку MUXов). А вы что думаете? Изменено 9 февраля, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladec 10 9 февраля, 2023 Опубликовано 9 февраля, 2023 · Жалоба Всего скорее, что пофиг, вся логика потом все равно сминимизируется и будет одно и тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 9 февраля, 2023 Опубликовано 9 февраля, 2023 · Жалоба тут важно не путать с вериложным case - там разные варианты full parallel priority unique ... (и еще casex casez) то что в vhdl - это parallel - разницы с if нет upd: а какая разница между цепочкой муксов и большим муксом? ну кроме времянки. другой вариант приоритетный энкодер - когда часть битов управления может игнорироваться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DanilinS 4 9 февраля, 2023 Опубликовано 9 февраля, 2023 · Жалоба Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 февраля, 2023 Опубликовано 9 февраля, 2023 · Жалоба On 2/9/2023 at 3:34 PM, DanilinS said: Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ... я посмотрел. в обоих случаях куча муксов, только разводка отличается. но так чтоб оценить на глаз какой из них лучше это уже не в моей компетенции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hitch 0 14 февраля, 2023 Опубликовано 14 февраля, 2023 · Жалоба library ieee; use ieee.std_logic_1164.all; entity multiplexer is port( sel : in std_logic; in1 : in std_logic; in2 : in std_logic; out1 : out std_logic; out2 : out std_logic; out3 : out std_logic; out4 : out std_logic; out5 : out std_logic ); end multiplexer; architecture rtl of multiplexer is function mux(sel, in1, in2 : std_logic) return std_logic is type pattern is array (0 to 3) of std_logic; type truth_table_t is array (natural range <>) of pattern; constant truth_table : truth_table_t := -- sel in1 in2 out (('0', '0', '0', '0'), ('0', '0', '1', '0'), ('0', '1', '0', '1'), ('0', '1', '1', '1'), ('1', '0', '0', '0'), ('1', '0', '1', '1'), ('1', '1', '0', '0'), ('1', '1', '1', '1')); variable m : std_logic; begin for i in truth_table'range loop --if truth_table(i)(0 to 2) = (sel & in1 & in2) then if (sel & in1 & in2) = truth_table(i)(0 to 2) then m := truth_table(i)(3); end if; end loop; return m; end mux; begin mux1: process(sel, in1, in2) begin case sel is when '0' => out1 <= in1; -- Вариант 1 when others => out1 <= in2; -- Вариант 2 --when '1' => out1 <= in2; --when others => null; end case; end process; mux2: process(sel, in1, in2) begin if sel = '0' then out2 <= in1; -- Вариант 1 else out2 <= in2; -- Вариант 2 --elsif sel = '1' then --out2 <= in2; --else --out2 <= in2; end if; end process; mux3: with sel select out3 <= in1 when '0', -- Вариант 1 in2 when others; -- Вариант 2 --in2 when '1', --unaffected when others; mux4: out4 <= in1 when sel = '0' else -- Вариант 1 in2; -- Вариант 2 --in2 when sel = '1' else --unaffected; mux5: out5 <= mux(sel, in1, in2); end architecture; Авторский эксперимент с различными описаниями мультиплексора. Синтезируется в один ЛЭ, хотя выходов 5. Следовательно описания полностью идентичны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OparinVD 0 10 марта, 2023 Опубликовано 10 марта, 2023 · Жалоба У меня такой опыт был: Имеется некий входной вектор, например, signal vector_in : std_logic_vector(7 downto 0); для именования некоторых из его значений введены константы, например, constant s1 : std_logic_vector(7 downto 0) := x"02"; constant s2 : std_logic_vector(7 downto 0) := x"17"; constant s3 : std_logic_vector(7 downto 0) := x"8b"; и когда я захотел case'ом анализировать на соответствие этим значениям: case vector_in is when s1 => null; when s2 => null; when s3 => null; when others => null; end case; Получил от компилятора ошибку, что-то про то, что он не может перебрать все варианты, что надо использовать "when others", и вроде про vhdl2008 что-то. "when others" при этом присутствовал и никак не помогал. Если в том же case константы заменить фактическими значениями, то всё ок. case vector_in is when x"02" => null; when x"17" => null; when x"8b" => null; when others => null; end case; Пришлось заменить на if-elsif. Чуть менее элегантно выглядит, зато работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться