Нарушение границ bit_vector статической константой

Размещение этого вопроса на SO, а не на EE связано с тем, что я борюсь с недостатками кодирования / программного обеспечения.


Я новичок в VHDL и прохожу книгу "Свободный диапазон VHDL". Играя с bit_vector Я обнаружил, что для доступа к одному проводу в синтаксисе шины bus_name(0) (0 только для примера).

Имея это в виду, я написал простое представление 4 входных мультиплексоров.

library ieee;
use ieee.std_logic_1164.all;

entity Multiplexer4_1 is
port
(   
    data    : in bit_vector(3 to 0);
    selector    : in bit_vector(1 to 0);
    output  : out bit
);
end entity Multiplexer4_1;

architecture m4_1 of Multiplexer4_1 is
begin
    output <= data(3) when (selector = "11") else
        data(2) when (selector = "10") else
        data(1) when (selector = "01") else
        data(0) when (selector = "00") else
        '0';
end architecture m4_1;

я использую ghdl обработать VHDL под linux следующей командой.

ghdl -a 4Multiplexer.vhdl

В результате я получаю 4 сообщения об ошибках, очевидно, из-за data(0), data(1) и другие, которые перечислены ниже.

4Multiplexer.vhdl:15:23: static constant violates bounds
4Multiplexer.vhdl:16:21: static constant violates bounds
4Multiplexer.vhdl:17:21: static constant violates bounds
4Multiplexer.vhdl:18:21: static constant violates bounds
ghdl: compilation error

Вопросы:

  • Как решить эту проблему?
  • Если bus_name(index) правильный синтаксис для этого?

Обновить:

Чтобы не повторить ту же ошибку, что и я, важно понять, как работают массивы / диапазоны в VHDL.

Спасибо за помощь!

1 ответ

Решение

Проблема с декларацией.

Вы определили данные и селектор как

data    : in bit_vector(3 to 0);
    selector    : in bit_vector(1 to 0);

Вы должны определить это как

data    : in bit_vector(3 downto 0);
selector    : in bit_vector(1 downto 0);

или же

data    : in bit_vector(0 to 3);
selector    : in bit_vector(0 to 1);

Разница между до и вниз:

Ссылка уже объясняет разницу между и до. Любая разница между "downto" и "to" появляется, когда мы хотим использовать битовый вектор не только для представления массива битов, где каждый бит имеет независимое поведение, но и для представления целого числа. Кроме того, есть разница в значении битов, поскольку методы обработки чисел такими схемами, как сумматоры, множители и т. Д. Я приведу еще один пример.

Допустим, вы хотите присвоить значение битового вектора = "0001", если использовать "3 downto 0", назначение будет

data<=(0 => '1', others => '0')

и в случае "от 0 до 3" назначение будет

data<=(3=>'1',others => '0')

Важно отметить, что всегда следует придерживаться либо восходящего, либо нисходящего диапазона. Программист может использовать комбинацию обоих. Однако это может сбивать с толку и может привести к ошибкам. Также, насколько мне известно, большинство автобусов пронумерованы по убыванию. Следовательно, программисты предпочитают нисходящий диапазон.

Другие вопросы по тегам