VHDL Реализация исключений или данных как функции - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь упаковать простой код в функцию. Вот код VHDL:

process(CLK, RST)
    variable newdata : std_logic_vector(7 downto 0)  := (others => '0');
    variable tempdata : std_logic_vector(7 downto 0) := (others => '0');
begin

    if (RST = '1') then
       tempdata := (others => '0');
       newdata  := (others => '0');
    elsif rising_edge(CLK) then
        tempdata := DIN;    
        newdata  := newdata XOR tempdata;
    end if;
    DOUT <= newdata;
end process;

Моделирование кода

Модель RTL

Все работает отлично, как я хотел,Но если попытаться реализовать этот код как функцию, он потерпит неудачу

function f_MOD2ALG (foo : std_logic_vector) 
return std_logic_vector;
...
function f_MOD2ALG (foo : std_logic_vector) 
return std_logic_vector is
    variable tempdata : std_logic_vector(foo'range);
    variable newdata  : std_logic_vector(foo'range);
begin
    tempdata := foo;
    newdata := newdata xor tempdata;
    return newdata;
end function;

Fail моделирование

Fail RTL модель

Нет ошибок, нет предупреждений.

На модели RTL выглядит так, будто он просто вводит данные, но я не понимаю, почему. Может кто-нибудь объяснить мне, почему это произошло? И как правильно создать функцию, которая реализует мой код? Спасибо!

Вот вызов функции:

...
signal temp     : std_logic_vector(7 downto 0) := (others => '0');

begin

process(CLK, RST)
begin
    if (RST = '1') then
        temp <= (others => '0');
    elsif rising_edge(CLK) then
        temp <= f_MOD2ALG(DIN);
    end if;
end process;
DOUT <= temp;
...

1 Ответ

0 голосов
/ 06 ноября 2019

Как уже написано в моем комментарии, проблема с вашим кодом заключается в том, что переменная newdata внутри вашей функции всегда будет "UUUUUUUU", потому что она никогда не инициализируется и не сохраняет свое значение между двумя вызовами функций. И XORing что-то с U всегда будет давать U.

Если вы инициализируете newdata для всех нулей, выход будет соответствовать входному, потому что XORing foo с 0 даст foo.

Я знаю генератор CRC Easics. В своей функции они передают предыдущее значение CRC в качестве аргумента. Вы могли бы сделать что-то подобное:

function f_MOD2ALG (foo : std_logic_vector; last_bar: std_logic_vector) 
return std_logic_vector is
    variable new_bar  : std_logic_vector(foo'range);
begin
    new_bar := foo xor last_bar;
    return new_bar;
end function;

И назвать это как-то так:

signal bar : std_logic_vector(31 downto 0) := (others=>'0');
...
process(clk)
begin
   if rising_edge(clk) then
      bar <= f_MOD2ALG(foo, bar);
   end if;
end process;
...