Как использовать общие параметры, которые зависят от других общих параметров для сущностей? - PullRequest
4 голосов
/ 24 мая 2011

Я пытаюсь преобразовать некоторый код Verilog, который производит более медленные часы из более быстрых часов для модуля UART.Оригинальный код verilog основан на модуле на сайте fpga4fun.com, и это моя попытка перевести его для моего VHDL-дизайна.

entity baud_generator is
generic(
    f_clk : integer := 50000000;  -- default: 50 MHz
    baud  : integer := 115200;    -- default: 115,200 baud
    accum_width : integer := 16;
    accum_inc : integer := (baud sll accum_width) / f_clk
);
port(
    clock : in std_logic;
    reset_n : in std_logic;
    enable : in std_logic;
    baud_clock : out std_logic
);  
end entity baud_generator;

Однако мой компилятор Aldec-HDLt, как следующая строка:

 accum_inc : natural := (baud sll accum_width) / f_clk

Вот точное сообщение об ошибке:

 # Error: COMP96_0300: baud_generator.vhd : (20, 52): Cannot reference "f_clk" until the interface list is complete.
 # Error: COMP96_0300: baud_generator.vhd : (20, 28): Cannot reference "baud" until the interface list is complete.
 # Error: COMP96_0071: baud_generator.vhd : (20, 28): Operator "sll" is not defined for such operands.
 # Error: COMP96_0104: baud_generator.vhd : (20, 27): Undefined type of expression.
 # Error: COMP96_0077: baud_generator.vhd : (20, 27): Assignment target incompatible with right side. Expected type 'INTEGER'.

В Verilog, у меня есть что-то вроде этого:это то, что мне нужно изменить в этой строке, чтобы сделать компилятор счастливым?Можно ли использовать дженерики, соединенные таким образом?

Ответы [ 2 ]

6 голосов
/ 24 мая 2011

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

Просто используйте accum_inc как константу, а не как обобщенную.

Кроме того, оператор SLL (логика сдвига влево) предназначен для битовых комбинаций (типы данных unsigned и signed в пакетах ieee.numeric_std и ieee.numeric_bit), а не для целых чисел. Вы можете сделать то же самое, умножив на степень два.

2 голосов
/ 24 мая 2011

Мне кажется, accum_inc является константой, а не параметром (так как он рассчитывается на основе обобщений, поэтому нет причин для его переопределения)

Так что он не хочет быть в общей части - просто перенесите его в архитектуру и сделайте его константой (и, как отметил Филипп, делайте сдвиг с умножением):

constant accum_inc : integer := (baud * (2**accum_width)) / f_clk;

Вы можете обнаружить, что вы переполняете возможности integer s, в зависимости от значений обобщений, поэтому вы можете обнаружить, что хотите использовать векторы unsigned в обобщениях и / или вычислениях.

...