VHDL integer'image Возвращает "0" - PullRequest
0 голосов
/ 25 июля 2011

Вот моя дилемма:

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

Я пытаюсь отобразить «регистр» (или регистры) на ЖК-мониторе и периодически обновлять его. В настоящее время эти значения всегда будут целыми числами.

У меня написан код, который правильно отображает числа на экране , если это значение передается как переменная, которая никогда не изменяется или как жестко закодированное значение. Однако я хочу обновить переменную, добавив к ней, а затем передать ее в мою функцию и отобразить ее.

По сути, я пытаюсь сделать следующее:

Каждые 'x' тактовые импульсы, увеличивают значение регистра, передают его в мою функцию update_screen, которая возвращает новый экран, а затем отображают это ниже. Однако, как только я увеличиваю или изменяю с помощью переназначения (кажется, не имеет значения, является ли он переменным или сигналом), все, что я вижу, это «0» на экране.

Итак ... Следующий код корректно обновляет мой дисплей, если я не раскомментирую закомментированные строки. В этот момент он просто показывает «0».

--currentRegVal := currentRegVal + 1;
--screenVal <= 25;

-- screen holds the values for the current screen
-- The second argument is the row on the screen to be updated
-- The third argument is the value to display there
screen := update_screen(screen, 1, currentRegVal);
screen := update_screen(screen, 0, screenVal + 25);

Проблема, похоже, связана с атрибутом integer'image (или, точнее, моим пониманием этого). Когда я передаю жестко закодированное значение или переменную, которая не была изменена, она возвращает то, что я ожидаю. Однако, как только я изменил переменную / сигнал ЛЮБОМ способом, он, похоже, возвращает строку «0».

Ниже моя функция update_screen:

function update_screen(screen: screenData; reg, regVal: integer) return screenData is
    -- A function may declare local variables. These do not retain their values between successive calls,
   -- but are re-initialised each time. Array-type parameters may be unconstrained:
    constant screenWidth: integer := screen'length(2);
    constant strRegVal: string := integer'image(regVal);
    constant strRegLen: integer := strRegVal'length;

    variable newScreen: screenData := screen;
begin
    for dex in 1 to screenWidth loop
        if dex <= strRegLen then
            newScreen(reg, dex-1) := strRegVal(dex);

        else
            newScreen(reg, dex-1) := ' ';
        end if;

        -- The next two ifs were my attempt to figure out what
        -- was going on... 

        --The value itself never seems to be 0... the screen is not all 5's
        if regVal = 0 then
            newScreen := (others => (others => '5'));
        end if;

        -- But the string value is "0" if the variable/signal is ever modified...
        -- 'd' shows up in the designated row.
        if strRegVal = "0" then
            newScreen(reg*3, 1) := 'd';
        end if;
    end loop;
    return newScreen;
end update_screen;

Пара важных моментов (добавлено 2011-07-26):

  • Я использую бесплатное (веб) издание Quartus II для разработки / компиляции своего проекта.
  • Код, который обновляет переменные, находится в процессе.
  • Во время первоначальной публикации единственными шагами, которые я предпринял, было скомпилировать мой код и запрограммировать плату Altera DE2 FPGA с результатом (я не был уверен, как выполнить какое-либо моделирование).

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

Обновление (2011-07-26):

Я скачал GHDL, как предложил Мартин Томпсон, но на самом деле я еще не использовал его, потому что я не уверен, как поступить с моим текущим проектом Quartus II (или, если смогу). Я должен сделать некоторое чтение, прежде чем это будет полезно для меня. Однако вчера мне удалось установить ModelSim-Altera, которая работает непосредственно с Quartus II и позволила мне провести некоторое моделирование.

Я приложил все усилия, чтобы настроить некоторые формы сигналов, которые позволили бы мне тестировать, и я, по крайней мере, смог проверить выполнение кода, который, по моему мнению, не выполнялся. Однако во время симуляции я несколько раз проверял, что объект «экран» содержит значение, которое я хочу, чтобы он содержал после запуска функции * screen_update *. Однако при работе на Altera DE2 он все равно не работает.

  • Примечание : я действительно проверял, что экран действительно обновляется, непосредственно устанавливая значение определенного элемента на экране в различные значения в зависимости от того, является ли currentRegVal четным или нечетное.

Я планирую опубликовать код завтра, но сейчас:

По каким причинам симуляция может дать разные результаты? Мое предположение связано со временем, но на самом деле это всего лишь предположение. Если я прав, как мне решить проблему?

Ответы [ 2 ]

0 голосов
/ 25 июля 2011

Предполагается, что этот код находится в процессе:

screenVal <= 25;
-... snip...    
screen := update_screen(screen, 0, screenVal + 25);

screenVal пока не обновится до нового значения (если не пройдет некоторое время - оператор wait между записью и чтением)

0 голосов
/ 25 июля 2011

Думаю, проблема связана с тем, что вы объявили strRegVal как constant.Я думаю, что это должно быть variable, например, что-то вроде этого может работать:

function update_screen(screen: screenData; reg, regVal: integer) return screenData is
  ...
  variable strRegVal: string;
  variable strRegLen: integer;
  ...
begin
  strRegVal := integer'image(regVal);
  strRegLen := strRegVal'length;
  ...
end update_screen;
...