VHDL缓冲区变量vs输出变量

时间:2017-09-03 18:46:16

标签: vhdl fpga intel-fpga

我在VHDL程序中工作,我需要使用ALTERA DE2-115进行RAM 256。输出将显示在七段显示中。 问题是:我有一个dataout输出变量。然后该变量具有temp_ram数组的以下值:

dataout <= temp_ram(conv_integer(dir));

然后我想将dataout的vaules分成七段

dataout(7 downto 4)
dataout(3 downto 0)

这显示以下错误:

Error (10309): VHDL Interface Declaration error in RAM.vhd(45): interface object "dataout" of mode out cannot be read. Change object mode to buffer.

当我更改为缓冲区并且运行完美时,但我无法理解发生了什么

2 个答案:

答案 0 :(得分:2)

您正在使用Synopsys软件包中的conv_integer。请仅使用官方IEEE软件包。

dataout是一个信号,而不是变量,因为您使用信号赋值语句。此外,信号是模式out的端口。 (端口也是信号)。

除静态类型外,VHDL还检查端口信号的方向。您的信号处于out模式,因此无法读取。

这是一个解决方案,你可以:

  • 使用中间信号,
  • 使用模式buffer,所有综合工具均不支持
  • 使用VHDL-2008,它允许读取模式out的端口。

Quartus支持一些VHDL-2008功能。

答案 1 :(得分:1)

对于跨平台兼容性和代码可重用性,我建议使用中间信号(dataout_int可以被其他语句使用):

    dataout_int <= temp_ram(conv_integer(dir));

并将输出分配给此中间信号:

    dataout <= dataout_int;