Нарушение границ 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')
Важно отметить, что всегда следует придерживаться либо восходящего, либо нисходящего диапазона. Программист может использовать комбинацию обоих. Однако это может сбивать с толку и может привести к ошибкам. Также, насколько мне известно, большинство автобусов пронумерованы по убыванию. Следовательно, программисты предпочитают нисходящий диапазон.