【问题标题】:Assigning Multidimensional Array in VHDL在 VHDL 中分配多维数组
【发布时间】:2016-05-12 17:34:42
【问题描述】:

我正在尝试在 VHDL 中分配一个多维数组。我已经尝试了下面的代码,但编译器会抛出一个错误,提示“赋值类型与表达式类型不同”。 data_in 的数据类型是 std_logic,所以我试图在环形缓冲区中保存一个位。

有人对如何做到这一点有任何建议吗?

问候, 托比

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Sensor is 
    port(
    clk : in std_logic;
    data_in : in std_logic
);

end Sensor;

architecture BEHAVIOR of Sensor is

type ram_t is array (0 to 255) of std_logic_vector(7 downto 0);
signal ram : ram_t := (others => (others => '0'));
signal ram_write_pointer : natural := 0;

begin

CONTROL_PROCESS : process(clk)
begin

  if rising_edge(clk) then
     -- fill ring buffer            
     ram(ram_write_pointer / 8 )(ram_write_pointer mod 8) <= data_in;
     ram_write_pointer <= ram_write_pointer + 1;
     if ram_write_pointer > 2040 then
        ram_write_pointer <= 0;
     end if;
  end if;
 end process;

end BEHAVIOR;

【问题讨论】:

  • 制作一个 MCVE。见stackoverflow.com/help/mcve(还有什么理由只使用1/8的缓冲区吗?)
  • MCVE 差不多了,现在显示整个错误消息。这段代码分析,虽然 mod 操作符不是你想要的。
  • type ram_t is array (0 to 255) of ... 不是多维数组,它是一个元素类型为数组类型的一维数组。请参阅 IEEE Std 1076-2008 5.3.2 数组类型。多维数组类型将具有以逗号分隔的离散范围的索引约束。您可能会尝试按元素和元素的元素进行访问。一个字节宽的 RAM 可能缺乏位的写入控制,这意味着组装缓冲区(移位寄存器)或读取-修改-写入。移位寄存器更容易。应该是if ram_write_pointer = 2047 then ram_write_pointer &lt;= 0;
  • 可以很好地与 ISE 14.7 和 Quartus-II 13.1 进行综合。那么你使用的是哪个工具呢?当然,实际上没有硬件生成,因为设计没有输出。

标签: arrays multidimensional-array vhdl variable-assignment circular-buffer


【解决方案1】:

ghdl 0.33 编译得很好。您使用的是哪个编译器?

同时我会大胆猜测您正在使用综合工具进行编译(允许选择它支持的 VHDL)并且它不支持字节范围内的位级寻址回忆。

如果是这种情况,那么将缓冲区映射到 2048 * 1 位宽的 RAM 应该可以正常工作。作为奖励,您的写指针代码将变得更简单且不易出错(目前我认为当ram_write_pointer 达到 2040 时它会做错事)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多