【问题标题】:VHDL integer'image Returns "0"VHDL integer'image 返回“0”
【发布时间】:2011-07-25 02:53:52
【问题描述】:

这是我的困境:

我对 VHDL 编程非常陌生,我目前正在为大学班级开展一个独立的学习项目。我已经取得了一些下降,但我遇到了一个我无法解决的问题。

我想做的是在 LCD 显示器上显示一个“寄存器”(或多个寄存器)并定期更新。目前,这些值将始终为整数。

我编写的代码可以在屏幕上正确显示数字如果该值作为永远不会更改的变量作为硬编码值传递。但是,我想通过添加来更新变量,然后将其传递给我的函数并显示它。

基本上我想要做的是:

每个 '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);

问题似乎源于整数'图像属性(或更准确地说,我对它的理解)。当我传入硬编码值或未更改的变量时,它会返回我期望的值。但是,一旦我以任何方式修改变量/信号,它似乎就会返回字符串“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):

我按照 Martin Thompson 的建议下载了 GHDL,但我还没有真正使用它,因为我不确定如何在我当前的 Quartus II 项目中使用它(或者我什至可以)。在它对我有用之前,我必须做一些阅读。然而,昨天我设法安装了 ModelSim-Altera,它直接与 Quartus II 一起工作,并允许我执行一些仿真。

我尽我所能设置了一些允许我进行测试的波形,并且我至少能够检查我认为失败的代码的执行情况。然而,在模拟过程中,我以多种方式验证了“screen”对象确实包含我希望它在 *screen_update* 函数运行后包含的值。但是,在 Altera DE2 上运行时,它仍然失败。

  • 注意:我确实通过直接将屏幕上特定元素的值设置为不同的值来验证屏幕是否确实更新,具体取决于 currentRegVal 是否为偶数或奇怪。

我计划明天发布一些代码,但现在:

模拟会提供不同结果的原因是什么?我的猜测与时间有关,但实际上只是猜测。如果我是正确的,我该如何解决这个问题?

【问题讨论】:

  • 更多可能对我们有帮助的信息:您使用的是什么 VHDL 编译器?是模拟的问题还是综合的问题?如果在综合中,它在模拟中可以正常工作吗?您是否正在进程中使用更新代码(第一个块)?
  • 我正在使用 Quartus II 免费(网络)版来设计/编译我的项目。更新变量的代码在一个进程中,但我们已经在下面的 cmets 中讨论了一点。目前我唯一做的就是编译我的代码并通过 Quartus II 软件对 ALtera DE2 FPGA 板进行编程(没有仿真……我现在不知道该怎么做,所以我想我会调查一下)。目前我没有任何模拟波形,所以我会看看我能做些什么来创建一些。与此同时……还有其他想法吗?
  • 感谢您的更新 - 请您将它们包含在您的问题正文中,并发表一条小评论说您已经这样做了,而不是在 cmets 中“交谈”。模拟是您的朋友 - 下载 GHDL 并查看其行为是否相同。如果您可以发布一个完整的(最小的 - 不是您的整个代码库!)示例代码失败,说明应该发生什么以及真正发生了什么,其他人可能能够在他们的工具上编译它并看到不同的行为,或者调试它你。我强调,small 示例代码 :)
  • 我在原始帖子中添加了一些更新,如果您对我有任何反馈,请告诉我。目前,它不包含代码,因为我需要上床睡觉,但如果我刚刚发布的内容无法让我们找到任何地方,我会在明天尝试发布一些代码。

标签: image attributes vhdl


【解决方案1】:

我猜这个问题与您将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;

【讨论】:

  • 我不这么认为,这个常数只是函数调用“持续时间”的常数,所以如果用不同的regVal调用它,strRegVal也应该改变。
【解决方案2】:

假设这段代码在一个进程中:

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

screenVal 尚未更新为新值(除非经过一段时间 - 写入和读取之间的 wait 语句)

【讨论】:

  • 代码在一个进程中,我认为信号可能是这种情况,但变量也会发生这种情况。我在那里放了一个信号作为测试,看看它是否有相同的结果。另外,即使在第一次屏幕更新期间未处理信号,我是否仍会看到屏幕更新(它不会每次都重置或任何东西,所以在某些时候似乎应该显示新值)?感谢您的回复!
  • 好的,是的,这是真的。也许您可以回答我作为评论添加到您的原始帖子的问题?他们可能会帮助...祈祷!有仿真波形吗?
  • 对不起,我没有看到你的原始帖子。我正在工作,会一直工作到今晚晚些时候,但我会在回家后尝试发布您要求的信息。
猜你喜欢
  • 2016-06-19
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2016-10-28
  • 2019-02-20
  • 2015-06-17
相关资源
最近更新 更多