У меня есть код VHDL, в котором я пытаюсь умножить значения пикселей. У меня есть следующая сущность:
entity xGradient is
port(
clk : in std_logic;
x11, x12, x13, x21, x22, x23, x31, x32, x33 : in integer range 0 to 255;
gradientInX : out integer range 0 to 255
);
end xGradient;
Я делаю следующую операцию над ними:
gradientInX <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
Проблема, как вы можете заметить, заключается в том, что значения, полученные в результате операции, превышают диапазон возможных значений, которые могут быть у моего выходного целого числа. Моя симуляция вылетает, когда это происходит. Я не знаю подходящего слова для того, что я пытаюсь сделать, и поэтому не могу понять, как решить эту проблему, и это сводит меня с ума. В основном я просто хочу обрезать или уменьшить размер вывода, чтобы он соответствовал выходному порту градиентаInX. Я попытался использовать блок процесса следующим образом:
-- declared signals
signal gradientMem: integer;
--beginning of my architecture
begin
SobelOperator : process(gradientMem)
begin
gradientMem <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
if (gradientMem > 255) then
gradientMem <= 255;
elsif (gradientMem < 0) then
gradientMem <= 0;
end if;
end process SobelOperator;
затем присвоить градиентMem градиентуInX, но по какой-то причине это не работает. Любая помощь будет действительно оценена. Примечание. Я не включил весь код VHDL, так как думал, что он будет излишне длинным. Сообщение об ошибке, которое я получаю, заключается в том, что значение сигнала, полученное в результате операции, выходит за пределы диапазона (поскольку результирующее значение отрицательно, а выход имеет диапазон только от 0 до 255).
Мэтью
gradientMen
и 2) сообщение об ошибке. VHDL проверяет границы диапазона при назначении. Вы хотите создать арифметику насыщения. Поэтому определитеgradientMem
с большим диапазоном. - person Paebbels   schedule 09.04.2017