2015-12-06 5 views
1

Публикация этого вопроса на SO, а не EE, заключается в том, что я борюсь с недостатками кодирования/программного обеспечения.bit_vector ограничивает нарушение статической константой


Я новичок в VHDL и просматриваю книгу «Free range 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) является правильным синтаксисом для этого?

Update:

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

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

ответ

2

Проблема заключается в декларации.

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

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:

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

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

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

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

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

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

+0

IEEE Std 1076-2008, 5.2.1 «Диапазон от L до R называется восходящим диапазоном, если L> R, тогда диапазон является нулевым диапазоном». 5.3.2.2 «.... Если какой-либо из дискретных диапазонов определяет нулевой диапазон, любой ограниченный таким образом массив является нулевым массивом, не имеющим элементов». Почему при анализе? «9.4.1» ... Определенные формы выражения могут быть оценены во время анализа проектной единицы, в которой они появляются; такое выражение называется локально статическим. ", 9.4.2 Локально статические выражения, n)" Индексированное имя, префикс которого является локально статическим первичным, а индексные выражения - это все локально статические выражения ". – user1155120

+0

Битовый_вектор не имеет значащего бита или младшего значащего бита, а numeric_bit. подписанный или .unsigned (самый левый - MS). Использование bit_Vector с пакетом numeric_bit_unsigned сделает арифметически левой MS. Это не так. Предложение use для доступа к std_logic_1164 тоже не нужно. – user1155120

+0

Да. Это не так, как MSB и LSB. Это просто для интерпретации пользователя. Спасибо, что указали ошибку – Anonymous