2013-04-22 9 views
1

У меня есть список кодов, полный кода, такого как следующие, но более крупные куски.Избегайте дублирования кода в VHDL

if (m = '00000') then 
    done <= '1'; 
else 
    done <= '0'; 
end if; 

Есть ли способ сделать это, как функции с, как #define, так что я не должен писать один и тот же код повсюду?

ответ

4

Этот код не является VHDL в первую очередь, поэтому вам нужно беспокоиться о других вещах. (Это немного больше VHDL-подобных после редактирования)

К счастью, VHDL не имеет ничего общего с #define. Вместо этого у него есть инструменты для правильных абстракций, таких как пакеты (очень грубо говоря, пространства имен C++, но сделанные правильно), функции и процедуры.

Это позволяет писать

done <= test_zero(m); 

предполагая done сигнал (или done := test_zero(m);, если это переменная)

test_zero является функцией, что-то вроде

function test_zero (word : in std_logic_vector) return std_logic is 
begin 
    if word = (word'range => '0') then 
     return '1'; 
    else 
     return '0'; 
    end if; 
end test_zero; 

который (потому что он использует атрибут «range») будет работать с разными размерами «m».

В итоге вы получите набор полезных функций: храните их в пакете и используйте их во всем проекте.

пакет обычно появляется в виде двух частей: спецификации пакета (немного как заголовочный файл C сделано правильно)

package my_tools is 

    function test_zero (word : in std_logic_vector) return std_logic; 

end my_tools; 

и тела пакета, содержащего Реализации

package body my_tools is 

    function test_zero (word : in std_logic_vector) return std_logic is 
     ... 
    end test_zero; 

end my_tools; 

Чтобы использовать его , он скомпилирован в библиотеку (мы будем использовать библиотеку по умолчанию «work», которая уже объявлена ​​неявным library work; в каждом файле VHDL). Затем вы можете выбрать либо сделать все, что в пакете, видимой в вашем коде:

use work.my_tools.all; 

Или сделать только одна функция видна:

use work.my_tools.test_zero; 

Или сделать это очевидным для тех, кто читает код, где таинственный " test_zero ":

done <= my_tools.test_zero(m); 

Если вы использовали пространства имен C++, вы узнаете эти различные стратегии.

Что делает эквивалентные пространства имен VHDL выполненными правильно, заключается в том, что компилятор VHDL использует эти объявления для автоматического отслеживания зависимостей и компиляции правильных битов вместо необходимости использования дополнительных #includes и внешних инструментов, таких как make-файлы, которые необходимо синхронизировать с фактический код вручную.

Смежные вопросы