Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VHDL中多维数组的赋值_Arrays_Multidimensional Array_Vhdl_Variable Assignment_Circular Buffer - Fatal编程技术网

Arrays 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

我正在尝试用VHDL分配多维数组。我尝试了下面的代码,但是编译器抛出一个错误,说“赋值类型不同于表达式类型”。在中,
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;