【发布时间】: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 <= 0;。 -
可以很好地与 ISE 14.7 和 Quartus-II 13.1 进行综合。那么你使用的是哪个工具呢?当然,实际上没有硬件生成,因为设计没有输出。
标签: arrays multidimensional-array vhdl variable-assignment circular-buffer