jenya7 0 February 9 Posted February 9 (edited) · Report post Вопрос что лучше использовать (при тестировании одного сигнала) - case или if-elsif. Читал всякие статьи на этот счёт. Большинство склоняется к case (типа он генерирует один MUX а if-elsif цепочку MUXов). А вы что думаете? Edited February 9 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
vladec 1 February 9 Posted February 9 · Report post Всего скорее, что пофиг, вся логика потом все равно сминимизируется и будет одно и тоже. Quote Share this post Link to post Share on other sites More sharing options...
yes 4 February 9 Posted February 9 · Report post тут важно не путать с вериложным case - там разные варианты full parallel priority unique ... (и еще casex casez) то что в vhdl - это parallel - разницы с if нет upd: а какая разница между цепочкой муксов и большим муксом? ну кроме времянки. другой вариант приоритетный энкодер - когда часть битов управления может игнорироваться Quote Share this post Link to post Share on other sites More sharing options...
DanilinS 3 February 9 Posted February 9 · Report post Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ... Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 February 9 Posted February 9 · Report post On 2/9/2023 at 3:34 PM, DanilinS said: Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ... я посмотрел. в обоих случаях куча муксов, только разводка отличается. но так чтоб оценить на глаз какой из них лучше это уже не в моей компетенции. Quote Share this post Link to post Share on other sites More sharing options...
hitch 0 February 14 Posted February 14 · Report post 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. Следовательно описания полностью идентичны. Quote Share this post Link to post Share on other sites More sharing options...
OparinVD 0 March 10 Posted March 10 · Report post У меня такой опыт был: Имеется некий входной вектор, например, 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. Чуть менее элегантно выглядит, зато работает Quote Share this post Link to post Share on other sites More sharing options...