Arrays verilog中的数组存储与乘法

Arrays verilog中的数组存储与乘法,arrays,verilog,Arrays,Verilog,我有一个外设连接到我的altera fpga,可以使用SPI从中读取数据。我希望将这些传入数据存储到数组中,最好是作为浮点值。此外,我的计算机上有一个csv文件,希望将该数据存储在另一个阵列中,然后在触发“启动”信号后,将两个阵列相乘,并通过rs-232将输出发送到我的电脑。对此有何建议?从外设读取数据的代码如下: // we sample on negative edge of clock always @(negedge SCL) begin // data comes as

我有一个外设连接到我的altera fpga,可以使用SPI从中读取数据。我希望将这些传入数据存储到数组中,最好是作为浮点值。此外,我的计算机上有一个csv文件,希望将该数据存储在另一个阵列中,然后在触发“启动”信号后,将两个阵列相乘,并通过rs-232将输出发送到我的电脑。对此有何建议?从外设读取数据的代码如下:

// we sample on negative edge of clock
always @(negedge SCL) 
begin   
    // data comes as MSB first.
    MOSI_reg[31:0] <= {MOSI_reg[30:0], MOSI}; // left shift for MOSI data

    MISO_reg[31:0] <= {MISO_reg[30:0], MISO}; // left shift for MISO data

end

谢谢。

32位的1024x28矩阵每个元素需要917504位的FPGA内存,另外28*32=896位用于SPI数据。将这两个矩阵相乘将得到1024x1个元素的向量,从而为结果添加32768位。这总共是设备中需要的951168位。你的FPGA芯片有这个内存吗

如果你有,是的:你可以在你的设计中实例化一个ROM,并分别用$readmemh或$readmemb初始化二进制或十六进制的值

如果精度不是问题,那么就选择定点,因为在浮点运算中实现乘法和加法是一项艰巨的工作


然后需要一个FSM用SPI数据填充源向量,进行乘法运算,并将结果存储到目标向量中。你可以考虑实例化一个小处理器来更容易地完成这个工作:

乘法在硬件中是不平凡的,并且“分配c= a*b”不一定会产生你想要的。


如果您的FPGA有DSP块,您可以使用Altera的一个可定制IP核在DSP块中进行乘法运算。如果没有,您仍然可以使用IP核根据有符号/无符号、延迟等调整乘法器,并可能产生更好的结果。

FPGA设备内的内存很小。您计划从SPI设备读取多少数据?您的CSV文件中有多少数据?CSV文件中的数据存储为浮点还是整数?如果您的设备将第一个SPI数据乘以第一个CSV数据,第二个SPI数据乘以第二个CSV数据,依此类推,您只需要一个数组来存储CSV数据。我认为这个问题需要很多澄清。您唯一提供的是位移位器,我们从中收集的唯一有用数据是SPI数据是32位宽的。我计划读取28个32位的值。我的csv中有1024x28数组中的双精度浮点值。是的,我打算把这两个矩阵相乘。同时我做了一些搜索,发现我可以使用$readmem加载一个包含csv值的数组。对此有何评论?此外,由于我的SPI数据是固定点二进制的,所以我计划将csv中的数据转换为固定点二进制,将其加载到数组中,然后在正确的状态下进行乘法。这是个好主意吗?我明白了,我打算只使用无符号数据值作为操作数。另外,如上所述,我打算使用浮点乘法。我的印象是,这可以通过使用一个简单的乘数来实现。只是想知道我是否仍然需要使用IP核心乘数来实现这一点?是的,您已经清楚地理解了我的问题。我认为数据将小于0.1MB。我有一个altera cyclone IV E,带有2MB SRAM、2x64MB SDRAM和8MB闪存。我意识到所有这些都足以完成任务,但我只是想知道,当我使用$readmem实例化一个ROM时,实际使用的是哪一个?目前,精度不是问题。所以,是的,我将继续使用固定点。我想使用FPGA实现,因为我认为它会比小型处理器更快。速度是至关重要的,这是我想用于图像处理的东西。此外,正如上面的评论中提到的问题,我想知道定点二进制的乘法是否与使用常规乘法器相同?我的数字都没有签名,所以我觉得应该直截了当。我只是想听听你的意见。