Jump to content
    

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...