Вот моя дилемма:
Я очень новичок в программировании на 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 четным или нечетное.
Я планирую опубликовать код завтра, но сейчас:
По каким причинам симуляция может дать разные результаты? Мое предположение связано со временем, но на самом деле это всего лишь предположение. Если я прав, как мне решить проблему?