Arrays VHDL中多维数组的赋值
我正在尝试用VHDL分配多维数组。我尝试了下面的代码,但是编译器抛出一个错误,说“赋值类型不同于表达式类型”。在中,Arrays VHDL中多维数组的赋值,arrays,multidimensional-array,vhdl,variable-assignment,circular-buffer,Arrays,Multidimensional Array,Vhdl,Variable Assignment,Circular Buffer,我正在尝试用VHDL分配多维数组。我尝试了下面的代码,但是编译器抛出一个错误,说“赋值类型不同于表达式类型”。在中,data\u的数据类型是std\u逻辑,因此我试图在环形缓冲区中保存一个位 有人对如何做到这一点有什么建议吗 问候,, 托比 ieee库; 使用ieee.std_logic_1164.all; 使用ieee.numeric_std.all; 实体传感器是 港口( clk:标准逻辑中; 数据输入:标准逻辑输入 ); 末端传感器; 传感器的结构特性是 类型ram是标准逻辑向量(7到0
data\u的数据类型是std\u逻辑,因此我试图在环形缓冲区中保存一个位
有人对如何做到这一点有什么建议吗
问候,,
托比
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体传感器是
港口(
clk:标准逻辑中;
数据输入:标准逻辑输入
);
末端传感器;
传感器的结构特性是
类型ram是标准逻辑向量(7到0)的数组(0到255);
信号ram:ram_t:=(其他=>(其他=>“0”);
信号ram_写入_指针:自然:=0;
开始
控制流程:流程(clk)
开始
如果上升沿(clk),则
--填充环缓冲器
ram(ram_write_pointer/8)(ram_write_pointer mod 8)ghdl0.33编译得很好。您使用的是哪种编译器
同时,我将大胆猜测,您正在使用合成工具进行编译(可以选择它支持的VHDL),并且它不支持字节范围内存中的位级寻址
如果是这种情况,那么将缓冲区映射到2048*1位宽的RAM应该可以很好地工作。作为奖励,您的写指针代码将变得更简单,更不容易出现错误(目前我认为,当ram\u write\u pointer
hits 2040时,它会做错误的事情)对此进行MCVE。请参见(是否有任何理由只使用1/8的缓冲区?)几乎在MCVE中,现在显示整个错误消息。这段代码分析,尽管mod运算符不是您想要的。type ram\t是数组(0到255)…
不是多维数组,它是一个具有数组类型的元素类型的一维数组。参见IEEE标准1076-2008 5.3.2阵列类型。多维数组类型将有一个带有逗号分隔的离散范围的索引约束。您可能试图同时按元素和元素的元素进行访问。一个字节宽的RAM可能缺少位的写控制,这意味着要么是汇编缓冲区(移位寄存器),要么是读修改写。移位寄存器更容易。如果ram_write_指针=2047,则应为,然后ram_write_指针与ISE 14.7和Quartus II 13.1很好地合成。那么你用的是哪种工具呢?当然,实际上没有硬件生成,因为设计没有输出。
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;