Что происходит, когда целое число выходит за пределы диапазона в VHDL?
Допустим, у вас есть сигнал, определенный следующим образом:
signal test_count : integer range 0 to 11;
Теперь, если test_count когда-либо опускается ниже 0 или выше 11 в симуляции, это немедленно приведет к сбою симуляции. Что мне интересно, что происходит, когда это синтезируется? Что произойдет, если test_count увеличивается после 11 или уменьшается ниже 0? Будут ли инструменты синтеза заставлять сигнал оборачиваться? Обратите внимание, что я выбрал пример, в котором нелегко вернуться к 0000.
1 ответ
Инструмент предполагает, что сигнал остается в пределах диапазона по конструкции, поэтому в случае, если это не так, схема может выдавать любые выходные данные на внутренней шине, используемые для реализации целочисленного значения. В этом случае от 0 до 11 это будет 4-битная шина, и если схема не поддерживает значение в диапазоне от 0 до 11, то даже "недопустимые" значения в диапазоне от 12 до 15 могут быть представлены в схеме, составленной синтезом.,
Кроме того, в случае, если значение увеличивается больше 11, должен ли счетчик быть насыщающим или обернуться? Это просто не определено.
Результат от Altera QII о счетчике с явным указанием ниже:
architecture syn of mdl is -- Counter with clear
signal test_count : integer range 0 to 11;
begin
process (clk_i) is
begin
if rising_edge(clk_i) then
if clr_i = '1' then -- Clear
test_count <= 0;
else -- Increment
test_count <= test_count + 1;
end if;
end if;
end process;
z_o <= std_logic_vector(to_unsigned(test_count, 4));
end architecture;
показано как результат RTL на этом рисунке:
Таким образом, в этом случае результатом синтеза является 4-битный счетчик с инкрементом и значением очистки от мультиплексора, выбранным с помощью сигнала clr_i
и без какой-либо проверки диапазона. Так что, если дизайн, контролирующий clr_i
Сигнал не сохраняет значение в диапазоне от 0 до 11, он может выводить значения вне заявленного диапазона от 0 до 11, таким образом, даже значения в диапазоне от 12 до 15.