Перейти к содержанию
    

Что лучше в VHDL case или if-elsif

Вопрос что лучше использовать (при тестировании одного сигнала) - case или if-elsif. Читал всякие статьи на этот счёт. Большинство склоняется к case (типа он генерирует один MUX а if-elsif цепочку MUXов). А вы что думаете?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всего скорее, что пофиг, вся логика потом все равно сминимизируется и будет одно и тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут важно не путать с вериложным case - там разные варианты full parallel priority unique ... (и еще casex casez)

то что в vhdl - это parallel - разницы с if нет

upd: а какая разница между цепочкой муксов и большим муксом? ну кроме времянки.

другой вариант приоритетный энкодер - когда часть битов управления может игнорироваться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/9/2023 at 3:34 PM, DanilinS said:

Нужно смотреть, во что это синтезируется. Вполне возможно что синтез даст идентичные конструкции. А то иногда синтезатор творит очень странные вещи ...

я посмотрел. в обоих случаях куча муксов, только разводка отличается. но так чтоб оценить на глаз какой из них лучше это уже не в моей компетенции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Следовательно описания полностью идентичны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня такой опыт был:

Имеется некий входной вектор, например,

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. Чуть менее элегантно выглядит, зато работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...