Я новичок в VHDL и я пытаюсь моделировать блок следующим образом:«нарушение ограничения диапазона» ошибка при попытке смоделировать схему в VHDL
- Он имеет четыре
std_logic_vector
входа имениa
,b
,c
иd
. Входыa
иb
обозначены номерами и входамиc
иd
являются неподписанные номера. - Он имеет четыре выхода с именем
u
,v
,w
иx
. Выходыu
иv
- это номера и выходы с подписьюw
иx
- это номера без знака. Выходы определяются следующим образом:
= а + Ь
V = а/2
ш = с * D
х = с * 2
Внутренние сигналы являются целыми числами.
Я могу скомпилировать как модуль, так и стенд. У меня есть проблема в том, что, когда я пытаюсь моделировать схемы выводится следующее сообщение об ошибке:
ncsim: *E,TRRANGEC: range constraint violation.
File: ./operator2.vhd, line = 38, pos = 36
Scope: :inst_operator:$PROCESS_007
Time: 0 FS + 0
Как следствие, симулятор не запускается. Я не понимаю, как эта линия может быть неправильно:
x <= std_logic_vector(to_unsigned(sx, 17));
Я попытался, изменив эту строку с другими те, которые делают то же самое, и я получаю ошибку в одной и той же линии. Если я удалю эту строку, ошибка сообщается в строке 37. Не могли бы вы дать мне подсказку, чтобы узнать мою ошибку? Ниже приведен код для модуля:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity operator2 is
port(
a: in std_logic_vector(15 downto 0);
b: in std_logic_vector(15 downto 0);
c: in std_logic_vector(15 downto 0);
d: in std_logic_vector(15 downto 0);
u: out std_logic_vector(16 downto 0);
v: out std_logic_vector(14 downto 0);
w: out std_logic_vector(31 downto 0);
x: out std_logic_vector(16 downto 0)
);
end entity operator2;
architecture a2 of operator2 is
signal su: integer;
signal sv: integer;
signal sw: integer;
signal sx: integer;
begin
--signals affectation
su <= to_integer(signed(a)) + to_integer(signed(b));
sv <= to_integer(signed(a))/2;
sw <= to_integer(unsigned(c)) * to_integer(unsigned(d));
sx <= to_integer(unsigned(c)) * 2;
--outputs affectation
u <= std_logic_vector(to_signed(su, 17));
v <= std_logic_vector(to_signed(sv, 15));
w <= std_logic_vector(to_unsigned(sw, 32));
x <= std_logic_vector(to_unsigned(sx, 17)); --This is the line reporting the error during the simulation**
end architecture a2;
Либо инициализируйте 'sw' и' sx' значения в пределах natural'left и natural'right включительно, либо определите их как тип natural: 'signal sw: natural; сигнал sx: natural; '. Проблема заключается в том, что значение по умолчанию для 'sw' и' sx' находится за пределами естественного для преобразования 'to_unsigned'. Заметим, что w (31) всегда будет «0». – user1155120
@ user1155120: вы уверены, что w (31) всегда будет '0', учитывая (скажем) c = d = x "ffff" (оба действительных 16-битных значения без знака)? –
'sw' как целое число может передавать только 31 бит (естественный диапазон) в беззнаковое. Отрицательное число дает ошибку проверки границ, которую мы видим здесь. (И все это предполагает, что целое число имеет минимальный гарантированный диапазон от -2147483647 до +2147483647, что является универсальным среди обычных симуляторов. Положительное число может быть только 31 бит). – user1155120